تشخیص اشیا در تصاویر با پایتون

در این مطلب، تشخیص اشیا در تصاویر با پایتون همراه با ارائه چند مثال به طور کامل مورد بررسی قرار گرفته است. تشخیص اشیا در تصاویر، یکی از وظایفی است که در «بینایی کامپیوتری» (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

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

 

git clone https://github.com/matterport/Mask_RCNN.git

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

Mask_RCNN
├── assets
├── build
│ ├── bdist.macosx-10.13-x86_64
│ └── lib
│ └── mrcnn
├── dist
├── images
├── mask_rcnn.egg-info
├── mrcnn
└── samples
├── balloon
├── coco
├── nucleus
└── shapes

 

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

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

 

cd Mask_RCNN
python setup.py install

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

error: can't create or remove files in install directory

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

...
Finished processing dependencies for mask-rcnn==2.1

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

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

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

pip show mask-rcnn

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

Name: mask-rcnn
Version: 2.1
Summary: Mask R-CNN for object detection and instance segmentation
Home-page: https://github.com/matterport/Mask_RCNN
Author: Matterport
Author-email: waleed.abdulla@gmail.com
License: MIT
Location: ...
Requires:
Required-by:

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

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

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

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

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

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

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

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

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

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

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

 

# define the model
rcnn = MaskRCNN(mode='inference', model_dir='./', config=TestConfig())

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

 

# load coco model weights
rcnn.load_weights('mask_rcnn_coco.h5', by_name=True)

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

 

# load photograph
img = load_img('elephant.jpg')
img = img_to_array(img)

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

 

# make prediction
results = rcnn.detect([img], verbose=0)

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

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

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

boxes = results[0]['rois']

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

y1, x1, y2, x2 = boxes[0]

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

 

# get coordinates
y1, x1, y2, x2 = box
# calculate width and height of the box
width, height = x2 - x1, y2 - y1
# create the shape
rect = Rectangle((x1, y1), width, height, fill=False, color='red')
# draw the box
ax.add_patch(rect)

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

 

# draw an image with detected objects
def draw_image_with_boxes(filename, boxes_list):
     # load the image
     data = pyplot.imread(filename)
     # plot the image
     pyplot.imshow(data)
     # get the context for drawing boxes
     ax = pyplot.gca()
     # plot each box
     for box in boxes_list:
          # get coordinates
          y1, x1, y2, x2 = box
          # calculate width and height of the box
          width, height = x2 - x1, y2 - y1
          # create the shape
          rect = Rectangle((x1, y1), width, height, fill=False, color='red')
          # draw the box
          ax.add_patch(rect)
     # show the plot
     pyplot.show()

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

 

# example of inference with a pre-trained coco model
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from mrcnn.config import Config
from mrcnn.model import MaskRCNN
from matplotlib import pyplot
from matplotlib.patches import Rectangle
 
# draw an image with detected objects
def draw_image_with_boxes(filename, boxes_list):
     # load the image
     data = pyplot.imread(filename)
     # plot the image
     pyplot.imshow(data)
     # get the context for drawing boxes
     ax = pyplot.gca()
     # plot each box
     for box in boxes_list:
          # get coordinates
          y1, x1, y2, x2 = box
          # calculate width and height of the box
          width, height = x2 - x1, y2 - y1
          # create the shape
          rect = Rectangle((x1, y1), width, height, fill=False, color='red')
          # draw the box
          ax.add_patch(rect)
     # show the plot
     pyplot.show()
 
# define the test configuration
class TestConfig(Config):
     NAME = "test"
     GPU_COUNT = 1
     IMAGES_PER_GPU = 1
     NUM_CLASSES = 1 + 80
 
# define the model
rcnn = MaskRCNN(mode='inference', model_dir='./', config=TestConfig())
# load coco model weights
rcnn.load_weights('mask_rcnn_coco.h5', by_name=True)
# load photograph
img = load_img('elephant.jpg')
img = img_to_array(img)
# make prediction
results = rcnn.detect([img], verbose=0)
# visualize the results
draw_image_with_boxes('elephant.jpg', results[0]['rois'])

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

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

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

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

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

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

 

# define 81 classes that the coco model knowns about
class_names = ['BG', 'person', 'bicycle', 'car', 'motorcycle', 'airplane',
               'bus', 'train', 'truck', 'boat', 'traffic light',
               'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird',
               'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear',
               'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie',
               'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball',
               'kite', 'baseball bat', 'baseball glove', 'skateboard',
               'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup',
               'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
               'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza',
               'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed',
               'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote',
               'keyboard', 'cell phone', 'microwave', 'oven', 'toaster',
               'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors',
               'teddy bear', 'hair drier', 'toothbrush']

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

 

# get dictionary for first prediction
r = results[0]
# show photo with bounding boxes, masks, class labels and scores
display_instances(img, r['rois'], r['masks'], r['class_ids'], class_names, r['scores'])

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

 

# example of inference with a pre-trained coco model
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from mrcnn.visualize import display_instances
from mrcnn.config import Config
from mrcnn.model import MaskRCNN

# define 81 classes that the coco model knowns about
class_names = ['BG', 'person', 'bicycle', 'car', 'motorcycle', 'airplane',
               'bus', 'train', 'truck', 'boat', 'traffic light',
               'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird',
               'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear',
               'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie',
               'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball',
               'kite', 'baseball bat', 'baseball glove', 'skateboard',
               'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup',
               'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
               'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza',
               'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed',
               'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote',
               'keyboard', 'cell phone', 'microwave', 'oven', 'toaster',
               'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors',
               'teddy bear', 'hair drier', 'toothbrush']

# define the test configuration
class TestConfig(Config):
     NAME = "test"
     GPU_COUNT = 1
     IMAGES_PER_GPU = 1
     NUM_CLASSES = 1 + 80

# define the model
rcnn = MaskRCNN(mode='inference', model_dir='./', config=TestConfig())
# load coco model weights
rcnn.load_weights('mask_rcnn_coco.h5', by_name=True)
# load photograph
img = load_img('elephant.jpg')
img = img_to_array(img)
# make prediction
results = rcnn.detect([img], verbose=0)
# get dictionary for first prediction
r = results[0]
# show photo with bounding boxes, masks, class labels and scores
display_instances(img, r['rois'], r['masks'], r['class_ids'], class_names, r['scores'])

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

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