Abbas Nosrat
Abbas Nosrat
خواندن ۱۱ دقیقه·۲ سال پیش

تشخیص اشیا با YOLO

مقدمه

در این مطالعه، سه توصعه الگریتم YOLO، به نام های YOLOV3، YOLOV4 و YOLOX بررسی شده و نکات و ویژگی های آنها ذکر می شود. الگریتم YOLO یک الگریتم object detection است که با هدف افزایش سرعت و دقت در مقایسه با مدل های R-CNN ارائه شده. یکی از مهمترین ویژگی های این معماری، یکپارچه کردن الگریتم دو مرحله ای R-CNN و استفاده از رگرسیون، به جای کلاس بندی، در تعیین محل باکس هاست. در R-CNNها، ابتدا با یک الگریتم سرچ هوشمند، Region Proposalهایی ارائه می شد که هر کدام از این Proposalها، به یک شبکه کلاس بندی جهت تعیین کلاس، داده می شد. در YOLO، کل این دو مرحله توسط یک شبکه انجام می شود. در YOLO تصویر گرید بندی شده و برای هر گرید، C+5B اطلاعات موجود است. در اینجا، C تعداد کلاس هاست و B تعداد باکس هایی است که YOLO برای هر گرید تولید می کند. عدد 5، برای اطلاعات مربوط به هر باکس است. این اطلاعات متشکل از طول مرکز باکس، عرض مرکز، طول خود باکس و عرض آن است. معماری YOLO متشکل از دو بخش Backboneو Head است. Backbone لایه های کانولوشنالیست که وظیفه استخراج ویژگی را از تصویر دارند. در YOLOV1، این قسمت معماری DarkNet است که از قبل، روی دیتاست ImageNet آموزش داده شده است. Head قسمتیست که وظیفه استخراج گرید نهایی و اطلاعات آن را دارد. در YOLO اصلی، این قسمت را چند لایه خطی تشکیل داده اند که خروجی آنها، در نهایت، تغییر شکل می گیرد و به یک گرید SدرS در C+5B در می آید. در بخش های آتی، ابتدا به YOLOV3، سپس V4 و YOLOX پرداخته خواهد شد.

YOLOV3

معماری YOLO به دلیل سرعتش با موفقیت بسیار زیادی رو به رو شد اما با بزرگ کردن Backbone به منظور افزایش دقت، از سرعت آن کاسته شد. همچنین معماری RCNN نیز با توسعه ای تحت عنوان MaskRCNN، به رقابت بازگشت. علاوه بر مسائل ذکر شده، الگریتم YOLO در شناسایی اشیای کوچک، ضعیف عمل می کند. این مسائل سبب شد تا YOLOV2 و V3 ارائه شود. از آنجایی که ویژگی های جدید V2، در V3 نیز مجددا ظاهر شده است، تمام ویژگی ها در قالب YOLOV3 بیان می شود.

از مهمترین ویژگی های V3، می توان به Backbone جدید و بهینه DarkNet-53 اشاره نمود. این معماری، توسط سازنده YOLO و با هدف بهینه سازی محاسبات، ارائه شد. در V3، دیگر خبری از لایه های pooling نیست. چرا که این لایه ها منجر به از دست رفتن اطلاعات می شوند و به جای آنها، از کانولوشن برای کاهش ابعاد استفاده شده است. ویژگی دیگر V3، استفاده از skip connection و Residual blockهاست. هر دو روش ذکر شده به شبکه قابلیت استفاده از اطلاعات لایه های پیشین را به شبکه می دهند. همچنین، به دلیل استخراج تدریجی و دیفرانسیلی اطلاعات، توسط residual blockها، شبکه نوعی regularization بدست می آورد که از overfit شدنش جلوگیری می کند. در V3، علی رقمV1، لایه خطی وجود ندارد و هر دو بخش backbone و head، تماما با لایه های کانولوشنال طراحی شده و همچنین در V3، از Batch Normalization استفاده شده است. دلیل عدم استفاده از batch norm در V1، ابداع نشدن این لایه در آن زمان بود.

به منظور حل مشکل تشخیص اشیای کوچک در V1، V3 دارای سه head است که این سه head، در اندازه گرید با یکدیگر تفاوت داردن. Head اول با اندازه گرید برابر با 13 در 13، برای تشخیص اجسام بزرگ، هد دوم با اندازه گرید 26 در 26 برای تشخیص اجسام متوسط و هد سوم با اندازه گرید 52 در 52 برای اجسام کوچک، به ترتیب در لایه های 79 تا 82، 91 تا 94 و 103 تا 106 قرار دارند. پس از هر هد، یک لایه upsample برای بزرگ کردن feature mapها قرار گرفته است تا مورد استفاده هد های بعدی قرار گیرند.

یکی از مشکلات V1، ناپایداری گرادیان ها در ابتدای آموزش بود. در ابتدای آموزش، دو باکس تولید شده توسط شبکه با هم، بر سر این که کدام باکس، در کدام شکل متخصص شود می جنگیدند و این امر، موجب بروز گرادیان های تندی می شد. برای حل این مشکل، در V2 و V3، مفهوم جدیدی به نام Anchor Box معرفی شد. ابتدا با استفاده از K-means clustering، سه حالت پر تکرار باکس ها در دیتاست یافته می شود. سپس این سه شکل، anchor boxهای الگریتم می شوند. حال، به جای بدست آوردن مکان باکس از هیچ، شبکه باید میزان آفست و اسکیل anchor boxها را محاسبه کند.

الگریتم V3 پیشرفت چشمگیری ازنظر سرعت و دقت، نسبت به الگریتم های رقیب داشته که در شکل های 4 و 5، مشهود است.

YOLOV4

مدل YOLOV4، با هدف افزایش سرعت و دقت به میان آمد و چند مفهوم جدید را ارائه کرد. در V4، مدل به سه بخش تقسیم شده که دو بخش از این سه بخش، در V3 توضیح داده شده. بخش اول Backbone است که وظیفه استخراج ویژگی را بر عهده دارد. بخش دوم Neck است که وظیفه انتقال خروجی بخش اول به سوم را دارد و بخش آخر، Head است که وظیفه کلاس بندی و تخمین باکس ها را بر عهده دارد. در قسمت backbone، از مدل CSPDarkNet-53 استفاده شده است که پس از آزمایش بین چند مدل از جمله CSPResNext50 و EfficientNet-B3، به عنوان بهینه ترین مدل انتخاب شد. جالب است که EfficientNet-B3 تعداد محاسبات کمتری دارد ولی در عمل، کندترین مدل است.

در قسمت neck، از معماری SPP و PANet استفاده شده و در قسمت head، همان head YOLOV3 استفاده شده است.

دو مفهوم جدیدی که در V4 معرفی شد، Bag of Freebies و Bag of Specials است. BoF مجموعه ای از روش هاست که بدون افزایش زمان استنباط، دقت را افزایش می دهند. به عنوان مثال، روش data augmentation، با افزایش زمان آموزش، دقت مدل را افزایش می دهد ولی در زمان استنباط مدل تاثیری ندارد. یکی از augmentationهایی که در V4 ابداع شد، mosaic augmentation است. در این روش چند تصویر را به هم چسبانده و به عنوان ورودی جدید، به مدل می دهند. از دیگر روش های BoF می توان به DropOut، DropConnect، DropBlock، MixUp، Random Erase and Cut Out، Hide-and-Seek and Grid Mask ، CutMix و Objective Function of BBox Regression اشاره کرد. در DropConnect، وزن ها به صورت تصادفی انداخته می شوند به جای آن که در DropOut، Activation ها انداخته شوند. تفاوت DropBlock با DropOut نیز در این است که به جای انداخته شدن پیکسل ها، feature map ها به صورت تصادفی انداخته می شوند. در Objective Function of BBox Regression، با باز فرمولیزه کردن تابع هزینه، به نتایج بهتر رسیده می شوند. از جمله اقداماتی که در این سو انجام شده، می توان به GIoU، CIoU، DIoU و anchor box ها اشاره کرد.

مجموعه Bag of Specials، مجموعه ای از روش هاست که با افزایش زمان استنباط، افزایش چشمگیری در دقت مدل دارند. این روش ها، علی رقم BoF که بیشتر در آموزش تغییر ایجاد می کنند، BoS در ساختار مدل تغییر ایجاد می کنند. از جمله این روش ها، می توان به تغییر activation به mish، Cross Stage Partial Connections، FCN-Spatial Pyramid Pooling، Spatial Attention Module، Path Aggregation Networks و DIoU NMS اشاره کرد. شرح تمام این روش ها نیازمند یک مطالعه کامل بر YOLOV4 است پس لاجرم، چند روش توضیح داده می شود.

تابع فعال ساز mish تابعی مشابه swish است که به شکل زیر فرمول بندی می شود.

این تابع یک تابع نایک نواست و برخلاف relu, قسمت منفی را از بین نمی برد. این امر، موجب جریان بهتر گرادیان ها و یادگیری ویژگی های بیشتر توسط شبکه می شود.

روش CSP، ابتدا در معماری DenseNet استفاده شد. در این روش بین تمام ورودی لایه ها، یک skip connection برقرار است. این روش کل شبکه را به هم متصل می کند و هر لایه می تواند از تمام اطلاعات لایه های پیشین استفاده کند. همچنین جریان گرادیان بهتر می شود و یادگیری را نرمتر و پایدارتر می کند. همانطور که از نام CSPDarkNet مشخص است، این روش در backbone شبکه استفاده می شود.

در قسمت head، از روش آموزش Self Adversarial Training(SAT) استفاده شده است. این روش دو مرحله دارد. در مرحله اول، شبکه در قسمت های مختلف خود، اغتشاش ایجاد می کند و اصطلاحا یک حمله self adversarial به خودش می کند. در مرحله دوم شبکه یاد می گیرد در حضور این حملات کار خود را انجام دهد. این روش به قوام و امنیت شبکه کمک می کند و می توان آن را در دسته BoF قرار داد.

به عنوان جمع بندی می توان روش های استفاده شده در YOLOV4 را به صورت زیر، درسته بندی کرد.

  • Bag of Freebies (BoF) for backbone: CutMix and Mosaic data augmentation, DropBlock regularization, Class label smoothing
  • Bag of Specials (BoS) for backbone: Mish activation, Cross-stage partial connections (CSP), Multi-input weighted residual connections (MiWRC)
  • Bag of Freebies (BoF) for detector: CIoU-loss, CmBN, DropBlock regularization, Mosaic data augmentation, Self-Adversarial Training, Eliminate grid sensitivity, Using multiple anchors for a single ground truth, Cosine annealing scheduler, Optimal hyper-parameters, Random training shapes
  • Bag of Specials (BoS) for detector: Mish activation, SPP-block, SAM-block, PAN path-aggregation block, DIoU-NMS

در شکل زیر، عملکرد YOLOV4 در برابر مدل های دیگر، سنجیده شده:

YOLOX

پس از معرفی YOLOV4 ، معماری YOLOV5 معرفی شد و بحث زیادی بر سر نوآوری این مدل، بجز پیاده سازی با کتابخانه pytorch به جای فریمورک darknet و استفاده از موارد دیگر BoF و BoS، وجود دارد. در سال 2021، مدل YOLOX با چند نوآوری اساسی معرفی شد. این مدل به جای استفاده از YOLOV4 به عنوان مبنا، مدل V3 با بک بون DarkNet53 را مبنا قرار داده است. در قسمت head، دو تغییر ایجاد شده است که عبارت اند از دکوپله کردن head و حذف anchor box های معرفی شده در YOLOV3. در مدل های پیشین YOLO، هد مدل یک لایه بود. در مدل اصلی، یک لایه خطی بود که تغییر شکل می داد و در مدل های بعدی، یک لایه کانوولوشنال بود. این لایه نهایی، هم وظیفه پیشبینی کلاس را داشت هم پیشبینی اطمینان و موقعیت باکس. (در مقالات و آموزش های مرتبط باYOLO، عبارت اطمینان و objectness score یک معنی را می دهند) در YOLOX، لایه اخر ابتدا به دو لایه تقسیم می شود. لایه اول وظیفه پیشبینی کلاس را دارد. لایه دوم مجددا به دو لایه تقسیم می شود. این دو لایه به ترتیب وظیفه تخمین اطمینان و موقعیت باکس را دارند. مزیت این دکوپله سازی، امکان یادگیری بهتر مدل و همگرایی سریعتر است. یک مشکل اساسی که تا YOLOX مطرح بود، رقابت بین کلاس بندی و تعیین محل باکس در هنگام آموزش بود. این مشکل با هد دکوپله حل شده است. در مدل های V3 و V4، استفاده از anchor boxها، مزیت بزرگی محسوب می شد. همانطور که پیشتر مطرح شد، هر هد، چند باکس پیشبینی می کرد و این باکس ها بر سراین که در کدام شکل متخصص شوند، با یکدیگر رقابت می کردند. با ارائه anchor boxها این مشکل به قیمت مقداری دقت حل شد. در YOLOX به جای پیشبینی چند باکس، یک باکس برای هر هد پیشبینی می شود. این رویکرد نیاز به استفاده از Non-max suppression و anchor box ها را از بین برد و دیگر نیاز به استفاده از K-means برای بدست اوردن anchor boxها نیست. همچنین، با کاهش پارامتر های طراحی، همگرایی مدل نیز سریعتر شده است.

در تمام YOLO های پیشین، بک بون مدل روی دیتاست ImageNet از پیش آموزش داده شده است ولی در YOLOX، با استفاده از augmentation های سنگین، نیازی به آموزش قبلی نیست و این امر دقت مدل را افزایش می دهد. دلیل افزایش دقت این است که با آموزش مستقیم مدل بر دیتاست مورد نظر، لایه ها ویژگی هایی را استخراج می کنند که برای بهینه سازی تابع هزینه مفیدتر باشند یا به بیانی دیگر، ویژگی های استخراج شده، برای دیتاست مورد نظر منحصر به فرد می شوند. مدل YOLOX، با بک بون های مختلف آزموده شده است و چند مدل زیر شاخه به نام های YOLOX-S، YOLOX-M، YOLOX-L، YOLOX-Tiny و YOLOX-Nano برای کاربرد های مختلف معرفی شده است.

در مدل های پیشین، از تابع هزینه رگرسیون استفاده می شد. در YOLOX، تابع هزینه دستخوش تغییراتی اساسی شده است. در قسمت هزینه کلاس بندی، به جای هزینه رگرسیون یا Categorical CrossEntropy، از تابع هزینه Binary CrossEntropy بر تک تک خروجی های کلاس بند استفاده شده است. در قسمت تخمین اطمینان نیز BCE جایگزین تابع هزینه رگرسیون شده است. در قسمت تخمین محل باکس، تابع هزینه IOU نیز جایگزین تابع هزینه رگرسیون شده است. IOU در مدل های پیشین نقش یک متریک و یک ابزار در Non-Max Suppression را ایفا می کرد. در اینجا مستقیما به عنوان تابع هزینه استفاده شده. البته با توجه به این که در یادگیری، تابع هزینه کمینه می شود و بیشینگی IOU مطلوب است، هزینه IOU برابر 1-IOU است.

پیشتر بیان شد که در YOLOX از augmentation های سنگین استفاده شده است. دو آگمنتیشنی که در مقاله به آن ها اشاره شد mosaic و mixup است. روش mosaic در قسمت V4 توضیح داده شده است. در روش mixup، دو نمونه به طور تصادفی انتخاب شده، و با یک دیگر superimpose می شوند. همچنین، برچسب نمونه بدست آمده دارای کلاس هر دو نمونه تشکیل دهنده نمونه جدید است. این augmentation ها، تا 15 ایپاک آخر آموزش فعال هستند و بعد از آن غیرفعال می شوند.

یکی دیگر از روش هایی که منجر به بهبود دقت در YOLOX شده است، Multi positives است. در مدل های پیشین، بهترین باکس انتخاب شده و بقیه پیشبینی ها ندیده گرفته می شوند. با آموزش برای پیشبینی هایی که IOU نسبتا بالایی با پیشبینی اصلی دارند، می توان دقت مدل را بهبود داد.

روش دیگری که در ادامه Multi Positives بیان شد، روش SimOTA است. در این روش، ابتدا یک میزان کیفیت برای هر جفت برچسب و پیشبینی محاسبه می شود. سپس K پیشبینی با بالاترین میزان کیفیت به عنوان multi positive ها انتخاب می شوند. در اینجا کیفیت بر اساس مجموع هزینه کلاس بندی و هزینه رگرسیون محاسبه می شود. لازم به ذکر است که K به صورت دینامیک تغییر می کند.

یکی از تلاش هایی که در YOLOX صورت گرفت، تلاش بر end to end کردن مدل بود. این تلاش به واسطه افزودن دو لایه کانولوشنال، برچسب زنی یک به یک و stop gradient صورت گرفت. نتیجه این تلاش افت دقت مدل بود و به همین دلیل به عنوان یک ماژول انتخابی قرار گرفته است.

مدل YOLOX جزو سریعترین و دقیقترین مدل های object detection است اما با سرعت پیشرفت سریع در حوضه object detector ها، به زودی، توسعه های سریعتر و دقیقتر ارائه خواهند شد.


تابع هزینهanchor boxامنیت شبکهکاهش ابعاد
شاید از این پست‌ها خوشتان بیاید