در این مطلب، تشخیص اشیا در تصاویر با پایتون همراه با ارائه چند مثال به طور کامل مورد بررسی قرار گرفته است. تشخیص اشیا در تصاویر، یکی از وظایفی است که در «بینایی کامپیوتری» (Computer Vision) انجام می‌شود و شامل شناسایی «وجود» (Presence)، «موقعیت» (Location) و نوع یک یا تعداد بیشتری از اشیا در یک تصویر است.

تشخیص اشیا در تصاویر کار چالش برانگیزی است و شامل ساخت روش‌هایی برای تشخیص اشیا (برای مثال محل قرار گرفتن آن‌ها)، «محلی‌سازی شی» (برای مثال، دامنه آن‌ها چیست) و دسته‌بندی اشیا (برای مثال، چه هستند)‌ می‌شود. در سال‌های اخیر، روش‌های «یادگیری عمیق» (Deep Learning) به نتایج علمی قابل توجهی در زمینه تشخیص اشیا دست پیدا کرده‌اند. در عین حال، مجموعه داده‌های بنچ‌مارک استاندارد برای این کار ساخته شده است و رقابت‌های جذاب و گوناگونی در حوزه بینایی ماشین برگزار می‌شود. در این مطلب، به موضوع تشخیص اشیا در تصاویر با پایتون پرداخته خواهد شد.

«شبکه‌های عصبی پیچشی مبتنی بر منطقه ماسک» (Mask Region-Based Convolutional Neural Networks | Mask R-CNN) از جمله روش‌هایی محسوب می‌شوند که می‌توانند به نتایج قابل توجهی در مسائل تشخیص اشیا در تصاویر دست پیدا کنند. در این مطلب، موارد زیر مورد بررسی قرار گرفته‌اند:

  • خانواده مدل‌های شبکه‌های عصبی پیچشی مبتنی بر منطقه برای تشخیص اشیا و جدیدترین گونه از آن‌ها با عنوان Mask R-CNN
  • استفاده از کتابخانه‌های «یادگیری عمیق» (Deep Learning) «متن‌باز» (Open Source) «کرس» (Keras) جهت پیاده‌سازی روش
  • استفاده از یک Mask R-CNN از پیش آموزش دیده شده برای محلی‌سازی اشیا و شناسایی اشیا در تصاویر جدید

به طور کلی، این مطلب به سه بخش R-CNN و Mask R-CNN، پروژه Matterport Mask R-CNN و شناسایی اشیا با Mask R-CNN پرداخته می‌شود.

Mask R-CNN برای تشخیص اشیا در تصاویر

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

یک افزونه از تشخیص اشیا شامل نشانه‌گذاری پیکسل‌های خاصی در تصویر است که به هر شی شناسایی شده تعلق دارند. این کار به جای استفاده از جعبه‌های محصور کننده، ضمن موقعیت‌یابی اشیا استفاده می‌شود. این نسخه سخت‌تر از برنامه، معمولا «قطعه‌بندی اشیا» (Object Segmentation) یا «بخش‌بندی معنایی» (Semantic Segmentation) نامیده می‌شود. شبکه‌های عصبی پیچشی مبتنی بر منطقه یا R-CNN، خانواده‌ای از مدل‌های شبکه‌های عصبی پیچشی هستند که برای تشخیص اشیا توسط «روس گیرشیک» و همکاران اون توسعه داده شده‌اند. احتمالا، چهار نوع مشخص از این رویکرد وجود دارد که منجر به دستاوردهای قابل توجه در روش جدید کنونی با عنوان Mask R-CNN شده‌اند. جنبه‌های برجسته هر یک از انواع را می‌توان به صورت زیر خلاصه کرد.

  • R-CNN: جعبه‌های محصور کننده به وسیله الگوریتم «جستجوی انتخابی» (Selective Search) فراهم می‌شوند؛ هر یک از آن‌ها توسعه داده می‌شوند و با استفاده از شبکه‌های عصبی پیچشی عمیق ویژگی‌های آن‌ها استخراج می‌شود. همچون AlexNet، پیش از گام نهایی، طبقه‌بندی اشیا با «ماشین بردار پشتیبان» (Support Vector Machine) خطی انجام می‌شود.
  • Fast R-CNN: طراحی ساده با مدل مجرد دارد و جعبه‌های محصور کننده آن به عنوان ورودی مشخص می‌شوند؛ اما لایه pooling پس از CNN برای تحکیم مناطق مورد استفاده قرار می‌گیرد و مدل، برچسب کلاس‌ها و منطقه مورد نظر را به طور مستتقیم پیش‌بینی می‌کند.
  • Faster R-CNN: افزودن «شبکه پیشنهاد منطقه» (Region Proposal Network) که ویژگی‌های استخراج شده از یک CNN عمیق را تفسیر می‌کند و یاد می‌گیرد که منطقه مورد نظر را به طور مستقیم پیشنهاد بدهد.
  • Mask R-CNN: افزونه R-CNN سریع‌تر که خروجی مدل را برای پیش‌بینی یک ماسک برای هر شی شناسایی شده اضافه می‌کند.

مدل  Mask R-CNN در سال ۲۰۱۸ در مقاله‌ای با عنوان «Mask R-CNN» به عنوان جدیدترین عضو از مدل‌های خانواده معرفی شد و از تشخیص اشیا و بخش‌بندی اشیا پشتیبانی می‌کند. در مقاله اصلی که این مدل در آن معرفی شده است، خلاصه خوبی از عملکرد این مدل ارائه شده است. در ادامه، بخش‌هایی از مقاله عینا آورده شده‌اند.

رویکرد مبتنی بر منطقه CNN (همان R-CNN) برای تشخیص اشیا با جعبه محصور کننده برای ارجاعات با تعداد قابل مدیریتی از مناطق شی کاندید و ارزیابی شبکه‌های پیچشی به طور مستقل روی RoI است. R-CNN برای پذیرش ارجاعات به RoI‌ها روی نقشه ویژگی‌ها با استفاده از RoIPool توسعه یافته است، این امر منجر به سرعت بالا و صحت بیشتر می‌شود. R-CNN سریع‌تر این استریم را با یادگیری مکانیزم توجه با یک «شبکه پیشنهاد منطقه» (Region Proposal Network | RPN) توسعه می‌دهد. R-CNN سریع‌تر یک روش انطاف‌پذیر و مستحکم محسوب می‌شود که بهبودهای بسیاری پیدا کرده است و در چندین بنچ‌مارک انجام شده، چارچوب پیش‌رو است.

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

پروژه Matterport Mask R-CNN

Mask R-CNN یک مدل پیچیده برای پیاده‌سازی است، به ویژه در مقایسه با دیگر روش‌های لبه علم مانند مدل شبکه عصبی پیچشی عمیق. کد منبع هر نسخه از مدل R-CNN در مخازن گیت‌هاب مجزایی با مدل‌های نمونه بر پایه چارچوب یادگیری عمیق Caffe [+] موجود هستند. برای مثال:

  • R-CNN: مناطق با ویژگی‌های شبکه عصبی پیچشی [+]
  • Fast R-CNN [+]
  • کد پایتون Faster R-CNN [+]
  • دِتِکرون (Detectron) [+]

به جای توسعه یک پیاده‌سازی از مدل R-CNN یا Mask R-CNN از پایه، می‌توان از پیاده‌سازی شخص ثالث ساخته شده بر فراز چارچوب یادگیری عمیق «کرس» (Keras) استفاده کرد. بهترین پیاده‌سازی شخص ثالث از Mask R-CNN، مربوط به پروژه Mask R-CNN Project است که توسط Matterport توسعه داده شده است. این پروژه متن‌باز و دارای گواهینامه MIT است. همچنین، کد آن به طور گسترده در طیف وسیعی از پروژه‌ها و رقابت‌های «کَگل» (Kaggle) استفاده شده است.

با توجه به اینکه این پروژه «متن‌باز» (Open Source) است، توسعه‌دهندگان گوناگون می‌توانند آن را به راحتی فورک کرده و روی آن کار کنند. این پروژه چندین فرم از نت‌بوک پایتون را فراهم می‌کند که می‌توان با استفاده از آن با روش استفاده از کتابخانه آشنا شد. دو نت‌بوکی که ممکن است در این راستا مفید واقع شوند، Mask R-CNN Demo, Notebook [+] و Mask R-CNN – Inspect Trained Model, Notebook [+] هستند. سه بررسی موردی برای استفاده از مدل Mask R-CNN با کتابخانه Matterport وجود دارد.

  • کاربرد تشخیص شی: استفاده از یک مدل از پیش آموزش دیده روی تصاویر جدید.
  • مدل جدید با یادگیری انتقالی: یک مدل از پیش آموزش دیده را به عنوان نقطه شروع در توسعه یک مدل برای مجموعه داده تشخیص شی جدید توسعه دهد.
  • یک مدل جدید از پایه: توسعه یک مدل جدید از پایه برای یک مجموعه داده تشخیص شی.

به منظور آشنا شدن با مدل و کتابخانه، در بخش بعدی مثال‌هایی مورد بررسی قرار می‌گیرد.

در این بخش، از کتابخانه Matterport Mask R-CNN برای انجام تشخیص شی روی تصاویر دلخواه استفاده می‌شود. درست مانند استفاده از شبکه عصبی پیچشی عمیق از پیش آموزش دیده برای دسته‌بندی تصاویر، همچون VGG-16 آموزش دیده روی مجموعه داده ImageNet، می‌توان از مدل از پیش آموزش دیده R-CNN برای شناسایی اشیا در تصاویر جدید استفاده کرد. در اینجا، از Mask R-CNN آموزش دیده در مسئله شناسایی اشیای MS COCO استفاده شده است.

نصب Mask R-CNN

اولین گام، نصب کتابخانه است. در زمان نگارش این مطلب، هیچ نسخه توزیع شده‌ای از این کتابخانه وجود نداشت، بنابراین نصب آن به صورت دستی انجام می‌شود. نصب، شامل کلون کردن مخزن گیت‌هاب و اجرای اسکریپت نصب روی «ایستگاه کاری» (Workstation) است. در صورت وجود مشکل می‌توان دستورالعمل نصب موجود در فایل readme کتابخانه را مطالعه کرد.

گام ۱: کلون کردن مخزن گیت Mask R-CNN

این کار بسیار ساده است و با وارد کردن دستور زیر در خط فرمان انجام می‌شود.

این امر موجب می‌شود یک دایرکتوری محلی جدید با نام Mask_RCNN ساخته شود که محتوای آن به صورت زیر به نظر می‌رسد.

گام ۲. نصب کتابخانه R-CNN

این کتابخانه را می‌توان مستقیما با استفاده از pip نصب کرد. ابتدا دایرکتوری به Mask_RCNN تغییر داده می‌شود و سپس، اسکریپت نصب اجرا می‌شود. در خط فرمان، باید دستورات زیر را تایپ کرد.

در «لینوکس» (Linux) یا «مک‌او‌اس» (MacOS) ممکن است نیاز به نصب نرم‌افزار با مجوز sudo باشد؛ برای مثال، در صورت عدم استفاده از مجوز بیان شده، امکان دارد پیغام زیر به کاربر نمایش داده شود.

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

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

گام ۳: تایید نصب شدن کتابخانه

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

در خروجی می‌توان مشاهده کرد که کدام نسخه در کجا نصب شده است. برای مثال خروجی زیر مربوط به اجرای دستور بالا است.

اکنون می‌توان از کتابخانه استفاده کرد.

مثالی از محلی‌سازی تصویر

در ادامه، از یک مدل از پیش آموزش دیده Mask R-CNN برای شناسایی اشیا در یک تصویر جدید، استفاده خواهد شد.

گام ۱: دانلود وزن‌های مدل

ابتدا، وزن‌ها برای مدل از پیش آموزش دیده شده به ویژه مدل Mask R-CNN در مجموعه داده MS Coco

دانلود می‌شوند. وزن‌ها در حدود ۲۵۰ مگابایت خجم دارند و می‌توان آن‌ها را با نام «mask_rcnn_coco.h5» از این مسیر [+] دانلود کرد و در پوشه کاری جاری قرار داد.

گام ۲: دانلود تصویر نمونه

اکنون، نیاز به دانلود یک تصویر نمونه برای شناسایی اشیا است. از تصویر فیلی که در فلیکر موجود است و توسط «مَندی گلدبرگ» (Mandy Goldberg) عکاسی شده، برای این کار استفاده می‌شود. تصویر را باید با اسم elephant.jpg دانلود و در پوشه کاری جاری ذخیره کرد.

تشخیص اشیا در تصاویر با پایتون -- به زبان ساده

گام ۳: بارگذاری مدل و انجام پیش‌بینی

ابتدا مدل را باید با نمونه کلاس MaskRCNN تعریف کرد. این کلاس دارای یک شی پیکربندی به عنوان پارامتر است. شی پیکربندی تعیین می‌کند که مدل چگونه در طول آموزش یا استنتاج مورد استفاده قرار می‌گیرد. در این مورد، پیکربندی تنها تعداد تصاویر در هر دسته را نشان می‌دهد که یک است و همچنین، تعداد کلاس‌هایی که باید پیش‌بینی شوند. می‌توان لیست کامل اشیای پیکربندی شده و مشخصاتی که کاربر تغییر داده را در فایل config.py [+] مشاهده کرد.

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

گام بعدی بارگذاری وزن‌هایی است که دانلود شده‌اند.

اکنون، می‌توان پیش‌بینی را برای تصویر انجام داد. ابتدا، می‌توان تصویر را بارگذاری و آن را به آرایه «نام‌پای» (NumPy) تبدیل کرد.

سپس، می‌توان با استفاده از مدل، پیش‌بینی را انجام داد. به جای فراخوانی ()predict به صورتی که در مدل کرس مرکال انجام می‌شود، تابع ()detect فراخوانی و یک تصویر تنها به آن پاس داده می‌شود.

نتایج حاوی یک دیکشنری برای هر تصویر است که به تابع ()detect پاس داده شده است. در این مورد، لیستی از یک دیکشنری مجرد برای یک تصویر استفاده می‌شود. دیکشنری دارای کلیدهایی برای جعبه‌های محصور کننده، ماسک‌ها و دیگر موارد است و هر کلید به لیستی از چندین شی ممکن در تصویر اشاره دارد. کلیدهای دیکشنری note به صورت زیر است:

  • ‘rois‘: جعبه‌های محصور کننده یا مناطق مورد نظر (Regions-of-Interest | ROI)
  • ‘masks‘: ماسک‌هایی برای اشیای شناسایی شده
  • ‘class_ids‘: اعداد صحیح کلاس برای اشیای شناسایی شده
  • ‘scores‘: احتمال یا اطمینان برای هر کلاس پیش‌بینی شده است.

می‌توان هر جعبه شناسایی شده در تصویر را دریافت، دیکشنری برای اولین تصویر را ترسیم (برای مثال [results[0) و سپس، لیست جعبه‌های محصور کننده (برای مثال [‘rois’]) را بازیابی کرد.

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

می‌توان از این مختصات برای ساخت یک Rectangle() از API کتابخانه «مت‌پلات‌لیب» (Matplotlib) استفاده و هر مستطیل را در اطراف تصویر ترسیم کرد.

برای حفظ شفافیت، می‌توان تابعی برای انجام این کار ساخت که نام فایل تصویر و لیست جعبه‌های محصور کننده برای ترسیم را دریافت و تصویر را همراه با جعبه‌ها نمایش می‌دهد.

اکنون می توان همه این موارد را در کنار هم قرار داد و مدل از پیش آموزش دیده را بارگذاری کرد و از آن برای شناسایی اشیا در تصویر فیل مورد نظر استفاد کرد و سپس، تصویر را با همه اشیای شناسایی شده در آن، رسم کرد. مثال کامل در ادامه آمده است.

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

تشخیص اشیا در تصاویر با پایتون -- به زبان ساده
تصویر یک فیل که جعبه محصور کننده توسط مدل تشخیص شی اطراف آن ترسیم شده است.

مثالی از تشخیص اشیا

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

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

یکی از آرگومان‌ها، لیست شناساگرهای کلاس‌های پیش‌بینی شده موجود در کلید «class_ids» دیکشنری است. همچنین، تابع نیاز به یک نگاشت از ids به برچسب‌های کلاس دارد. مدل از پیش آموزش دیده شده با یک مجمعه داده برازش پیدا می‌کند که دارای ۸۰ (بادر نظر گرفتم س‌زمینه، ۸۱ مورد) برچسب کلاس است و به صورت یک لیست در Mask R-CNN Demo ارائه شده است.

سپس، می‌توان جزئیات پیش‌بینی برای تصویر فیل را برای تابع ()display_instances فراهم کرد. در این راستا داریم:

تابع ()display_instances انعطاف‌پذیر است و به کاربر امکان آنکه فقط ماسک و یا فقط جعبه‌های محصور کننده را ترسیم کند می‌دهد. مثال کامل با این تغییرات با استفاده از تابع ()display_instances در ادامه آمده است.

اجرای مثال بالا، تصویر فیل را با توضیحات پیش‌بینی شده به وسیله مدل Mask R-CNN نشان می‌دهد؛ به طور خاص:

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

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

تشخیص اشیا در تصاویر با پایتون -- به زبان ساده

اگر مطلب بالا برای شما مفید بوده، آموزش‌های زیر نیز به شما پیشنهاد می‌شود:

^^

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

بر اساس رای 10 نفر

آیا این مطلب برای شما مفید بود؟

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *