تشخیص پلاک در آگهی‌های خودرو با استفاده از بینایی ماشین-بخش اول

درباره‌ی نویسنده (نیما سارنگ)

من نزدیک به یک سال در جمع دیواری‌ها بودم. در سه ماه اول حضورم در دیوار، به عنوان کارآموز دیتا فعالیت میکردم و پس از آن به تیم خودروی دیوار پیوستم.
قبل از ورودم به دیوار، تجربه‌ام در زمینه‌‌ یادگیری ماشین محدود به پروژه‌هایی نظیر Protein Design و بازی‌های Augmented Reality بود. این تجربه کمک کرد تا درباره‌ی مباحث Semantic Segmentation و Object Tracking و استفاده از کتاب‌خانه‌ی Keras دید خوبی داشته باشم.
اما در دیوار بود که این فرصت فراهم شد تا در حوزه‌های Object Detection و Data Analysis و Client-side AI و مدل‌های Multi-task تجربه کسب کنم و مهارت برنامه‌نویسی با استفاده از کتاب‌خانه‌های PyTorch و TensorFlow را تمرین کنم. جلسات هم‌افزایی و اشتراک دانش که با تیم‌های دیتایی داشتم، تاثیر زیادی در سرعت یادگیری‌ام داشت.

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

مقدمه

در این مقاله می‌خواهیم مروری بر سرویس محو پلاک خودرو، یکی از ‌سرویس‌های کاربردی تیم خودروی دیوار داشته باشیم. ما در تیم خودرو همواره در تلاشیم تا به واسطه‌ی بهره‌گیری از ظرفیت‌های فناوری و ایجاد شفافیت و اطمینان، تجربه‌ی خرید و فروش خودرو را از فرآیندی پیچیده، طولانی و پراسترس به تجربه‌ای لذت‌بخش تبدیل کنیم. برای پیاده‌سازی و اجرایی کردن سرویس محو پلاک در دیوار حدود ۶ ماه وقت گذاشتیم. مدت کوتاهی از اجرایی شدن این سرویس در دسته بندی سواری دیوار می گذرد. با توجه به تازگی اجرایی شدن این پروژه، می‌خواهیم به توضیح جزئیات فنی آن و تجربیاتی که حین پیاده‌سازی آن کسب کردیم، بپردازیم.

این مطلب برای شما نوشته شده!

اگر به الگوریتم‌های پردازش تصویر و مدل‌های شبکه‌ عصبی در زمینه بینایی ماشین (Computer Vision) علاقه‌مندید، این مطلب برای شما نوشته شده :) به دلیل طولانی شدن مقاله، تصمیم گرفتیم که آن را به دو نوشته تقسیم کنیم؛

  • در نوشته اول (همین نوشته)، به تشخیص مسئله و بیان اهداف می‌پردازیم. سپس چند مفهوم ابتدایی و روش‌های موجود برای حل مسئله مورد‌نظر‌مان را توضیح داده و از تحقیقاتی که در این رابطه انجام داده‌ایم صحبت می‌کنیم تا پیش‌زمینه علمی مناسب را پیدا کنید. به طور خاص، نگاهی گذرا بر تعدادی از الگوریتم پردازش تصویر کلاسیک خواهیم داشت و سپس سراغ بحث اصلی که مدل‌های شبکه عصبی تشخیص شئ هستند خواهیم رفت و دو روش حل بنیادی که معماری‌های Faster R-CNN و EfficientDet بوده را شرح خواهیم داد. در انتها بخش کوتاهی را به معرفی مدل‌های شبکه عصبی بخش‌بندی اختصاص داده‌ایم.

از خواننده انتظار داریم که با مفهوم Convolutional Neural Network و همچنین برخی مفاهیم پردازش تصویر مانند Edge Detection و Contours تا حدودی آشنا باشد.

  • در نوشته دوم، درباره استفاده از این روش‌ها در پروژه‌مان صحبت می‌کنیم و مسیری را که طی کردیم تا به نقطه‌ی‌ فعلی برسیم، بررسی خواهیم کرد. پیشنهاد می‌کنیم اگر پیش‌‌زمینه لازم را دارید، مستقیما به سراغ این نوشته بروید.

تلاش بر این بوده که تا حد امکان، مطالب را به منابع اصلی یا آموزشی ارجاع دهیم. بنابراین اگر در مواردی توضیحات کافی نبود، می‌توانید به آن‌ها مراجعه کنید.

چرا محو پلاک؟

یکی از دغدغه‌های مهم ما در تیم خودرو دیوار، عدم نمایش پلاک خودروها در آگهی‌ها است. نمایش پلاک خودرو می‌تواند نگرانی‌هایی را برای کاربران بابت نقض حریم شخصی‌‌شان به وجود بیاورد؛ اما از طرفی دیگر کاربران برای آنکه بتوانند تصاویر مناسبی را از خودروی خود بگیرند، در بیشتر موارد ناچارند که پلاک را نیز در کادر قرار دهند. این تناقض باعث شده بعضی مواقع کاربران عکس را به ‌گونه‌ای ثبت کنند که پلاک در آن دیده نشود یا اگر پلاک در کادر قرار گیرد، آن را به شیوه‌های مختلف از جمله رنگ‌آمیزی، قرار دادن شئ مانع و … مخدوش کنند تا اعداد آن مشخص نباشد. در نهایت هر دو مورد باعث افت کیفیت آگهی می‌شود که اتفاق مطلوبی نیست. در زیر چند مثال از تاثیر آن را می‌توانید مشاهده کنید.

نمونه‌هایی از تصویر دست‌کاری شده توسط کاربران به منظور حذف پلاک
نمونه‌هایی از تصویر دست‌کاری شده توسط کاربران به منظور حذف پلاک

اهداف

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

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

  • قابل اطمینان بودن: یکی از مهم‌ترین ویژگی‌های این سرویس، توانایی آن برای محو تقریبا تمامی پلاک‌های خودرو در آگهی‌هاست. اگر فرضا ما سرویسی را اجرایی کنیم که قابلیت محو کردن ۸۰٪ پلاک‌ها را داشته باشد، ۲۰٪ تصاویر بدون محو پلاک منتشر شده و این موجب نگرانی کاربران عدم اطمینان آن‌ها به سرویس‌مان خواهد شد. بنابراین دو معیار سنجش را در نظر گرفتیم:
    • بازیابی (Recall)ا ۹۵٪ : بتوانیم همه‌ی پلاک‌های مهم را محو کنیم.
    • دقت (Precision)ا ۹۹.۵٪ : به اشتباه بخشی از تصویر غیر مرتبط را پلاک تشخیص ندهیم و محو نکنیم!
  • سرعت اجرا: با توجه به حجم آگهی‌هایی که در دقیقه منتشر می‌شوند، انتظار داریم پردازش هر عکس آگهی بر روی CPU به طور ماکزیمم ۳۰۰-۴۰۰ میلی‌ثانیه طول بکشد. این یکی از دشوار ترین معیار‌هایی بود که برای سرویس در نظر گرفتیم.
  • دقت محو پلاک: مقدار Intersection over Union) IoU) را ۰.۸ در نظر گرفتیم؛ یعنی اشتراک مستطیل پلاک تشخیص داده شده با پلاک واقعی، تقسیم بر اجتماع آن‌ها از ۰.۸ بیشتر شود که این میزان دقت قابل توجهی است.

تعریف مسئله به عنوان یک مسئله بینایی ماشین

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

۱. مشخص‌کردن چهارضلعی پلاک: پلاک را یک چهار‌ضلعی در نظر بگیریم که با توجه به زاویه‌ی عکس ثبت شده، این چهار‌ضلعی می‌تواند مستطیل، متوازی الاضلاع یا یک چهارضلعی بی‌قاعده باشد. یکی از شیوه‌های مشخص کردن این چهارضلعی، مشخص کردن ۴ راس آن است.

۲. مشخص کردن مستطیل محیطی (Bounding Box or BBox): مستطیلی که همه‌ی قسمت‌های پلاک را در بر می‌گیرد و مساحت آن کمینه ممکن است. به طور کلی، یافتن BBox یکی از رایج‌ترین روش‌های تشخیص شئ است.

۳. تخمین حدود پلاک به کمک ویژگی‌های آن: از روش‌های دیگر می‌توان به استفاده از ابزارهای تشخیص متن برای یافتن حروف پلاک و سپس تخمین زدن محدوده پلاک اشاره کرد. از دیگر ویژگی‌های قابل استفاده برای تخمین، نماد آبی رنگ ایران در سمت چپ پلاک است.

قول معروفی است که می‌گوید «شناخت مسئله نیمی از حل آن است.» این نکته که ما مسئله را به چه شکلی طرح کنیم، اهمیت ویژه‌ای در نوع راه‌حلی که برای مسئله ارائه می‌دهیم دارد. در ادامه راهکارهای موجود را در قالب طرح‌های فوق بررسی می‌کنیم.

بررسی راه‌حل‌ها

در این قسمت به مرور راه‌حل‌هایی می‌پردازیم که طی تحقیقات‌مان با آن‌ها برخورد داشتیم. از آن‌جایی که در نهایت به سمت انتخاب مدل‌های تشخیص شئ رفتیم، در اینجا تمرکز ویژه‌ای بر این مدل‌ها خواهیم داشت.

روش‌های پردازش تصویر کلاسیک

این روش‌ها الگوریتم‌های ساده‌ای‌اند که در بسیاری از مسائل پردازش تصویر کاربرد دارند. در اغلب این روش‌ها، یکی از اولین پیش‌پردازش‌ها این است که با استفاده از الگوریتم‌های Edge Detection نظیر Canny و Sobel، کرانه‌های اشیا موجود در تصویر را مشخص می‌کنند. خروجی این عمل، تصویری باینری خواهد بود که تنها پیکسل‌های مربوط به کرانه‌های اشیا سفید است. با در دست داشتن کرانه‌ها می‌توانیم الگوریتم‌های زیر را اجرا کنیم:

۱. یافتن خطوط به وسیله الگوریتم Hough Transform: با استفاده از این الگوریتم می‌توان خطوط موجود در تصویر را به صورت تقریبی پیدا کرد. این الگوریتم دارای چندین هایپرپارامتر است که با توجه به مسئله می‌بایست مقادیر بهینه‌ آن‌ها را مشخص کرد. پس از انجام این کار می‌توانیم دسته خطوطی را که تشکیل چهارضلعی می‌دهند پیدا کنیم و سپس به نحوی تعیین کنیم که این چهار‌ضلعی پلاک است یا خیر.

۲. یافتن نقاط گوشه به وسیله الگوریتم Harris Corner Detection: الگوریتم هریس روشی مناسب برای پیدا کردن نقاط گوشه در تصویر است. اما از آن‌جایی که تعداد نقاط گوشه در تصویر خیلی زیاد است، در ابتدا باید بتوانیم محل تقریبی پلاک در تصویر را مشخص کنیم و سپس با اجرای این الگوریتم، چهارضلعی دقیق پلاک را بدست بیاوریم.

۳. یافتن کانتور پلاک: با داشتن کرانه‌های اشیا موجود در تصویر، می‌توانیم با استفاده از الگوریتم Suzuki، تمام منحنی‌های پیوسته را بدست آورده و کانتور هر شئ را به صورت جداگانه داشته باشیم. سپس می‌توانیم چندضلعی هر کانتور را به کمک اجرای الگوریتم Douglas-Peucker و سپس به کمک Convex Hull خروجی آن تخمین بزنیم و کانتورهایی که شبیه مستطیلند را جدا کنیم تا به یافتن پلاک واقعی نزدیک‌تر شویم.

۴. یافتن کاراکترهای پلاک: از روش‌های جالب دیگر این است که مانند روش قبل، کانتور تمام شئ‌ها را پیدا کنیم و از میان آن‌ها، عدد یا حرف را تشخیص دهیم. برای این کار کافی‌ست کانتور‌ها را به یک مدل ساده Classifier که بر روی اعداد و حروف فارسی آموزش داده شده بدهیم تا نوع هر کانتور مشخص شود. سپس تبیین کنیم کدام دسته از این کانتورها می‌توانند متعلق به یک پلاک باشند.

مدل شبکه‌های عصبی تشخیص شئ Object Detection

مفهوم تشخیص شئ به معنای یافتن و مشخص کردن موقعیت اشیائی از یک کلاس خاص (مانند انسان، لپ‌تاپ، میز و..) در تصویر و ویدئو است. در این بخش به طور خاص می‌خواهیم درباره‌ی مدل‌های شبکه عصبی تشخیص شئ صحبت کنیم. این مجموعه از مدل‌ها با توجه به مجموعه داده‌ای که بر روی آن آموزش داده می‌شوند، وظیفه دارند مستطیل محیطی (Bounding Box / BBox) تمام اشیا موجود در تصویر را -که مطابق با دسته‌های تعریف شده است- تشخیص دهند. به طور مثال، مدلی که آموزش داده شده تا بتواند درخت‌ها و انسان‌ها را تشخیص دهد، می‌بایست برای هر یک از درخت‌ها و انسان‌ها یک BBox متمایز محاسبه کند. برای هر شئ دیگری که جزء این دو دسته نباشد، نباید تشخیصی را اعلام کند. پس به طور کلی این مدل‌ها باید دو چیز را مشخص کند:

۱. مختصات BBox مربوط به تمام اجسامی که جزء دسته‌بندی‌های تعریف شده هستند. (Regression)

۲. مشخص کردن این که هر BBox به کدام دسته تعلق دارد و نوع شئ آن چیست. (Classification)

برای مسئله‌ی تشخیص پلاک، دسته‌بندی‌های تعریف تنها دو دسته‌ی «پلاک» و «غیر پلاک» خواهند بود. حال اگر بخواهیم از میان انبوهی از شبکه‌های عصبی تشخیص شئ، یک مورد را انتخاب کنیم، علاوه بر مقایسه دقت آن‌ها بر روی دیتاست معتبری مثل COCO، می‌بایست سرعت آن‌ها را نیز در نظر داشته باشیم. تقسیم‌بندی‌ای که در ادامه قرار است داشته باشیم، می‌تواند دید خوبی به ما دهد که یک معماری شبکه تشخیص شئ در چه جایگاهی از نظر سرعت و دقت قرار دارد.

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

۱. مبتنی بر لنگر (Anchor-Based)

۲. بدون لنگر (Anchor-Free)

مدل‌های تشخیص شئِ مبتنی بر لنگر دارای سابقه‌ی بیشتری هستند و مقاله‌های متعددی در رابطه‌ با آن‌ها منتشر شده است. اما حدود دو سالی می‌شود که مدل‌های بدون لنگر نیز وارد عرصه رقابت شده و فاصله خود را از نظر دقت و سرعت اجرا کمتر کرده اند. برای اینکه با مفهوم لنگر آشنا شویم، لازم است چند معماری معروف را بررسی کنیم. واژه لنگر (Anchor) ابتدا در شبکه‌ی Faster-RCNN معرفی شد و پس از آن در مقاله‌های متعددی ایده آن ادامه پیدا کرد. معماری‌های مبتنی بر لنگر به دو دسته‌ی تک‌مرحله‌ای و دومرحله‌ای تقسیم می‌شوند. معمولا شبکه‌های مبتنی بر لنگرِ تک‌مرحله‌ای، از دو مرحله‌ای ها سریع‌ترند اما دقت پایین‌تری دارند. شبکه‌های بدون لنگر نیز جایگاهی بین این دو دارند.

ممکن است این تقسیم‌بندی‌ها تا حدی پیچیده به‌نظر برسد. برای مشخص کردن این تفاوت، از هر دسته یک پرچم‌دار را انتخاب کرده و به توضیح آن‌ها می‌پردازیم.

مدل Faster R-CNN - یک شبکه مبتنی بر لنگرِ دو مرحله‌ای

شبکه‌ی Faster R-CNN یکی از معروف‌ترین شبکه‌های تشخیص شئ است. مقاله آن در سال ۲۰۱۵ منتشر شد و تا امروز تحقیقات برای بهبود آن ادامه دارد (به عنوان مثال، FPN, Composite Backbone, Cascade R-CNN). از این معماری حتی در شبکه‌های قطعه‌بندی مانند Mask R-CNN نیز استفاده می‌شود.

این شبکه از نوادگان شبکه‌های R-CNN و Fast R-CNN است. اگر علاقه‌مندید تا درباره سیر تحول این شبکه بیشتر بدانید، پیشنهاد می‌کنیم نگاهی به مقاله‌های آن‌ها بیندازید. اینجا تنها مروری کلی بر ساختار شبکه خواهیم داشت.

معماری این شبکه را می‌توان به ۴ بخش زیر تقسیم کرد:

  • بخش Backbone: بک‌بن یک شبکه CNN است، که با گرفتن تصویر ورودی، ویژگی‌های ابتدایی (Low-Level) و معنی‌دار را استخراج می‌کند. در ادامه با استفاده از این ویژگی‌ها می‌توان راحت‌تر درباره ورودی نظر داد. به خروجی بک‌بن، یک Feature Map گفته می‌شود.
    امروزه بیشتر از معماری ResNet برای بک‌بن این شبکه استفاده می‌شود. اما به طور کلی هر شبکه CNN دیگری که برای مسئله Classification طراحی شده، با حذف لایه‌های Fully Connected انتهایی می‌توان از آن به عنوان بک‌بن این مدل شبکه‌های تشخیص شئ استفاده کرد.
  • بخش (Region Proposal Network (RPN: در اینجا مدل می‌خواهد تشخیص دهد که چه قسمت‌هایی از تصویر، ارزش و محتوای بیشتری دارند تا با تمرکز بر آن بخش‌ها، اشیا را پیدا کند. این بخش از شبکه در نظر دارد فریم‌های مستطیل شکلی از تصویر را که در آن شئ وجود دارد (کلاس آن شئ مهم نیست)، پیدا کند که به اصطلاح به این فریم‌ها Region Proposal گفته می‌شود.
  • بخش ROI Align: در این بخش تعداد ثابتی از بهترین Region Proposal ‌ها (آن‌هایی که مدل پیش‌بینی کرده احتمال حضور شئ داخل شان بیشتر است.) انتخاب می‌شوند و سپس مدل با استفاده از Feature Map ای که در بخش اول بدست آورده، ویژگی‌های مربوط به هر Region را از آن کراپ می‌کند و به دلیل اینکه اندازه این Regionها یکسان نیست، اندازه ویژگی‌های استخراج شده را ابتدا یکسان کرده و سپس تحویل بخش بعدی می‌دهد.
  • بخش Detection Head: برای Proposal ‌های انتخاب شده مشخص می‌کند که شئ موجود در آن قسمت متعلق به کدام دسته است و همچنین BBox آن شئ رو به طور دقیق محاسبه می‌کند.

اما جایگاه لنگر در این معماری کجاست؟

نکته‌ای که در رابطه با ماژول RPN وجود دارد این است که در آن واحد بر روی تمام Feature Map اجرا نمی‌شود. بلکه یک شبکه CNN کوچک بر روی Feature Map حرکت داده شده (Sliding Window) و برای پنجره کوچکی از آن (یک مربع ۳*۳) Proposal تولید می‌کند. اما تولید Proposal برای هر پنجره به چه صورت است؟ مستطیل‌هایی با اشکال مختلف -که اندازه آن از پیش می‌بایست تعریف شود- بر روی این پنجره قرار داده شده و مدل برای هر کدام‌ از این مستطیل‌ها بایستی پیش‌بینی کند که آیا شئ‌ در داخل آن قرار می‌گیرد یا خیر. به این مستطیل‌ها لنگر گفته می‌شود. پس از آن که مشخص شد شئ در داخل لنگر قرار دارد، Proposal مربوط به آن با استفاده از موقعیت و اندازه لنگر محاسبه می‌شود.

چرا به این شبکه، دو مرحله‌ای گفته می‌شود؟

زیرا پیش‌بینی BBox ها در دو مرحله انجام می‌شود؛ در مرحله اول پیش‌بینی Proposal ها و در مرحله دوم پیش‌بینی BBox برای هر Proposal انجام می‌شود.

مدل EfficientDet - یک شبکه مبتنی بر لنگرِ تک مرحله‌ای

شبکه‌ی EfficientDet یکی از جدید‌ترین شبکه‌های تشخیص شئ است که زمان کمی از معرفی آن می‌گذرد. در این شبکه توجه ویژه‌ای به کم کردن تعداد پارامتر‌های مدل و بیش‌تر کردن سرعت اجرای آن شده است. سیر تحول این شبکه به صورت SSD => FPN => RetinaNet => EfficientDet است که در صورت علاقه می‌توانید بیشتر راجع به آن مطالعه کنید.

به این شبکه‌ها تک‌ مرحله‌ای گفته می‌شود زیرا برخلاف شبکه Faster R-CNN، مجموعه Region Proposal تولید نمی‌کنند و به طور مستقیم BBox های مربوط به اشیا را پیش‌بینی می‌کنند. این مهم‌ترین دلیل سریع‌تر بودن شبکه‌های تشخیص شئ تک‌ مرحله‌ای نسبت به دو مرحله‌ای است.

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

معماری

این شبکه را می‌توان به ۳ زیرشبکه تقسیم کرد:

۱. زیرشبکه Backbone: از معماری EfficientNet برای جمع آوری ویژگی‌های اولیه از تصویر ورودی استفاده می‌شود. EfficientNet شبکه‌ای است که معماری آن به کمک Neural Architecture Search بدست آمده و بسیار سبک و با تعداد پارامتر کم است.

۲. زیر شبکه (Bidirectional Feature Pyramid Network (BiFPN: در این قسمت ویژگی‌هایی‌ که در مقیاس‌های مختلف از بک‌بن بدست آمده، به صورت دوطرفه با هم ترکیب می‌شوند تا ویژگی‌های غنی در مقیاس‌های مختلف نسبت به قبل به وجود آید.
به طور دقیق‌تر، خروجی بک‌بن از تعدادی لایه کانولوشن عبور می‌کند که بعضی‌ از آن‌ها با stride برابر با ۲ هستند. پس از این عمل، Feature Map هایی خواهیم داشت که نسبت طول و عرض آن به تصویر ورودی ۱/۲، ۱/۴، … و ۱/۸ خواهد بود تا ویژگی‌هایی در مقیاس‌های مختلف داشته باشیم. مزیت این‌ عمل این است که ویژگی‌های در مقیاس ۱/۲ غالب تمرکزشان بر روی الگو‌ها و پیکسل‌های محلی است، در حالی که ویژ‌گی‌های با مقیاس ۱/۸ سعی می‌کنند بر روی مفهوم کلی تصویر (Global context) نظر بدهند.

۳. زیرشبکه Detection Head: انتظار داریم این زیر‌شبکه با ثبت ویژگی‌ها در مقیاس‌های مختلف، برای تعداد زیادی لنگر که هر کدام به بخش‌های مختلفی از تصویر اختصاص داده شده اند، تعیین کند که در این لنگرها شئ از کدام دسته است (این یک مسئله طبقه‌بندی است). همچنین به صورت همزمان می‌بایست پیش‌بینی کند که این لنگر در چه جهت و اندازه‌ای جابجا شود تا دقیقا برای همان شئ که در داخل آن قرار دارد، به اندازه باشد تا کاملا تطابق با BBox پیدا کند.

شبکه‌های عصبی بخش‌بندی Segmentation

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

۱. بخش‌بندی معنایی (Semantic Segmentation)

هدف مدل‌های بخش‌بندی این است که مشخص کنند هر پیکسل در تصویر متعلق به چه کلاسی است. آیا پیکسل متعلق به دسته انسان است؟ یا متعلق به خودرو؟ یا متعلق به هیچ شئ تعریف‌شده‌ای نیست؟ (متعلق به کلاس پس‌زمینه است.) بنابراین در حالت ساده می‌توان به آن به عنوان مسئله طبقه‌بندی (Classification) هر پیکسل نگاه کرد. ‌دسته‌بندی‌های تعریف شده نیز وابسته به مجموعه داده‌ای است که مدل بر روی آن آموزش داده می‌شود. یکی از معروف‌ترین مدل‌های بخش‌بندی معنایی، U-Net است که طراحان این معماری از آن برای بخش‌بندی پیکسل‌های دیواره‌ سلولی استفاده کرده بودند. از قدرتمندترین مدل‌هایی که امروزه وجود دارد می‌توان به DeepLabV3+ و HRNetV2 اشاره کرد.

۲. بخش بندی نمونه‌ای (Instance Segmentation)

مشابه بخش‌بندی معنایی است با این تفاوت که علاوه بر اینکه پیش‌بینی می‌کند هر پیکسل متعلق به چه دسته‌ای است، همچنین می‌بایست میان نمونه‌های موجود در تصویر نیز تمایز قائل شود. به طور مثال فرض کنید ۲ شخص در یک تصویر حضور دارند. در بخش‌بندی معنایی فقط می‌توان مشخص کرد که کدام پیکسل‌ها مربوط به انسان هستند اما این تمایز را نمی‌توان قائل شد که کدام پیکسل مربوط به شخص شماره ۱ است و کدام مربوط به شخص شماره ۲. در بخش‌بندی نمونه‌ای، این تمایز میان نمونه‌ها نیز اعمال می‌شود.

نکته‌ای حائز اهمیت این است که شبکه‌های بخش‌بندی نمونه‌ای غالبا از الگوی شبکه‌های تشخیص شئ برای بخش‌بندی تصویر استفاده می‌کنند. به این صورت که در ابتدا اشیا موجود در تصویر را پیدا کرده و BBox هر یک را محاسبه می‌کنند. به این شکل، نمونه‌ها از یکدیگر متمایز می‌شوند. سپس برای هر شئ تشخیص داده شده، برای پیکسل درون BBox آن بخش‌بندی معنایی انجام می‌دهند. پس می‌توان نتیجه گرفت که این مدل‌ها غالبا ترکیبی از شبکه‌های تشخیص شئ و بخش‌بندی معنایی هستند. یکی از معروف‌ترین ‌مدل‌های بخش‌بندی نمونه‌ای، Mask R-CNN بوده که ساختار آن بر پایه شبکه Faster R-CNN شکل گرفته‌است. از بین مدل‌های قدرت‌مند می‌توان به BlendMask و همچنین CenterMask اشاره کرد که دومی بر پایه شبکه‌‌ تشخیص شئ FCOS است.

کاربرد این شبکه‌ها برای یافتن پلاک در تصویر چیست؟

با آموزش مدل‌های بخش‌بندی می‌توانیم تمامی پیکسل‌های مربوط به پلاک رو بدست بیاوریم. وقتی که تمام پیکسل‌های مربوطه را داشته باشیم، به راحتی می‌توانیم چهارضلعی پلاک را مشخص کرده و برای محو کردن از آن استفاده کنیم.

جمع‌بندی

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