مهدی رحمانی
مهدی رحمانی
خواندن ۴ دقیقه·۳ سال پیش

پردازشی به پهنای پاسخنامه‌ها

همه چی از اونجایی شروع شد که بهم پیام داد و گفت تو حوزه تصویر هم کار میکنی؟ منم که درگیر درس و دانشگاه بودم. دو دل بودم. دلو زدم به دریا و گفتم آره! قبلا تو یه شرکت خصوصی با هم کار می کردیم. من گفتم آره. اما گذشت و خبری نشد. تا اینکه بعد یکی دو هفته خبر داد که یه پروژه پردازش تصویره. برا یه استارتاپه. تشخیص گزینه های علامت زده شده پاسخنامه های تستی! تا حالا همچین پروژه ای نداشتم. پروژه هایی که کار کرده بودم تو حوزه یادگیری ماشین بود و برای این پروژه به خاطر این که زمان اجرا خیلی مهم بود، مجبور بودن برن سمت پردازش تصویر. که همین مسئله سرعت، کلی cpu ذهنو درگیر کرد تا با یه الگوریتم خفن یه خروجی مناسب حاصل بشه.

این پروژه به ظاهر ساده چالش های زیادی داشت. از جمله اینکه بعضی از پاسخ نامه ها کلا برعکس بود. در قدم اول باید چرخش مناسب اتفاق می افتاد. گام بعدی کیفیت های متفاوت با وجود نویز های زیاد بود. تو فضای RGB کار کردن برای این پروژه اصلا جواب نبود. برای یه آدم با شرایط بصری موجود(:)) RGB عالیه! اما به کار کامپیوتری که فهمی از زیبایی نداره و فقط میگه یه چی بده من محاسبه کنم(!)، اصلا جواب نبود!! باید اولا تبدیل به Gray Scale می شد. دلیل این موضوع اینه که برای ما مهم نیست که رنگ بندی صفحه به چه شکله! تنها چیزی که برامون مهمه اینه که یه خونه از گزینه ها پر شده یا نه! اینجوری بهتر میشه با کامپیوتر هم زاد پنداری کرد:)) اما Gray Scale هم جواب کار ما نبود! چرا که همه با یه میزان رنگ گزینه ها رو پر نمیکنن و یا شاید کیفیت اسکن ها متفاوت باشه. حتا یک فرد هم هر گزینه رو با شرایط مختلفی پر می کنه! شناسوندن این فضا به کامپیوتر مثل درخواست تفکیک رنگ «بژ تیره» و «حنایی روشن» از یه مَرده! پس باید به فهم ماشین نزدیک تر می شدم. خیلی نزدیک تر. فضای صفر و یک :) پس با یه Threshold تصویر رو از Gray Scaleبه Binary تبدیل می کنیم.

مثل نمونه زیر که تصویر از فضای RGB(تصویر سمت چپ) به تصویر Binary(تصویر سمت راست) تبدیل میشه:

تو تبدیلی که انجام شده، علاوه بر تشخیص میزان چرخش، با بدست آوردن مقدار حد آستانه مناسب (Threshold)، که به صورت تجربی بدست میاد، نویز تصویر گرفته میشه و البته کیفیت گزینه های تیک خورده شده هم تا حد خیلی خوبی برای تشخیص ماشین(کامپیوتر) آماده سازی میشه.

همه این چیزایی که گفته شد، تنها Preprocessing تصویر بود! تصویر رو پیش پردازش کردیم تا برای مراحل بعدی کارمون راحت تر باشه...

اگه بتونیم تو مرحله بعدی جای تک تک گزینه ها رو تشخیص بدیم، با محاسبه تعداد پیکسل های مشکی هر گزینه و البته مقایسه با یه حد آستانه مربوط به هر گزینه، کار تمومه. اما مسئله اساسی اینجاست که اولا اندازه جعبه یا Box مربوط به هر پاسخنامه با پاسخنامه بعدی متفاوته. و دوما اگر هم اندازه اونا یکی باشه، باز مسئله زاویه های متفاوت پیش میاد که میتونه تو تشخیص مشکل ایجاد کنه. برا همین اولین کار اینه که گوشه های پاسخنامه رو تشخیص بدیم، و بعد بخش پاسخنامه رو به مقیاس استاندارد مد نظرمون تبدیل کنیم. همچنین تو این تبدیل باید زوایا رو هم به شکل مناسب تبدیل کنیم.

تصویر زیر خروجی نهایی این بخشه:

اتفاقی که الآن افتاده اتفاق خیلی مبارکه:))) الآن مردا می تونن پایکوبی کنن و خانم هام اگر دوس داشتن کِل بکشن:) [البته اینو در نظر داشته باشید که با توجه به محدودیت زمانی تعریف شده در پروژه، پیدا کردن الگوریتمی که این کار رو با دقت صد در صدی انجام بده، پیچیدگی های زیادی داره که با توجه به عام بودن مخاطب این مقاله، از ذکر جزئیات اجتناب شده]

اتفاقی که افتاده اینه که بخش اصلی پاسخنامه رو از فضای به شدت متغیر تصویر اولیه به فضای استاندارد خودمون منتقل کردیم. تو این مرحله تنها اتفاقی که باید بیفته اینه که با استفاده از ابزاری مثل فتوشاپ، موقعیت مرکزی هر گزینه رو مشخص کنیم و با تست کردن Thresholdهای مختلف تو برنامه اصلی، حد آستانه تشخیص گزینه پر شده، سفید و مشکوک رو به صورت تجربی(:|) و البته طاقت فرسا به دست بیاریم.

در این حد بهتون بگم که این دو تا کار آخر باعث میشه چشماتون از کاسه دربیاد، چرا که باید با دقت خیلی زیاد به صفحه نمایشگر لپ تاپ زل بزنید تا خدای نکرده حتا یه پیکسل هم اینور اونور نشه!

تشخیص نهایی برای تصویر اولیه رو در زیر می تونید ببینید:

و در نهایت این خروجی رو از فضای استاندارد خودمون به فضای صفحه اولیه بر می گردونیم تا به کاربر نمایش داده بشه:

زمان اجرای این کد برای نمونه های 300 تایی در نهایت روی CPU Corei5 دو هسته ای به متوسط زمان 1.25 ثانیه رسید. با توجه به قدرت پایین این CPU زمان مورد نظر کاملا قابل قبول بود. و دقت نهایی برای گزینه های کاملا مشکی و کاملا نزده، صد در صد شد. و بقیه گزینه ها به عنوان گزینه مثل حالتی که خط خطیه یا کم رنگه یا کامل پر نشده، به عنوان مشکوک در نظر گرفته میشه.

به نظرم الآن درک این مسئله که میگن تو آزمونا حتما گزینه مد نظرتون رو با مداد نرم پر رنگ مشکی پر کنید، براتون شفاف تر شده :)))


گیتهاب پروژه:

https://github.com/MahdiRahmani/detect_the_marked_answer_sheet_options

در صورتی که مایلید بیشتر با هم آشنا بشیم یا کامنت بذارید یا ایمیل بدید:)

MahdiRahmani1375@gmail.com

پردازش تصویرکنکورکنکور آزمایشی
HiddenCluster.ir
شاید از این پست‌ها خوشتان بیاید