الگوریتم YOLO
YOLO چیست؟ در این مقاله میخواهیم به سیستم تشخیص اشیای YOLO نسخه اول بپردازیم. الگوریتم YOLO در سال 2016 در کنفرانس CVPR ارائه شد و تا زمان نگارش این مقاله 4279 ارجاع داشته است. این مقاله، ساختار جدیدی را برای سیستمهای تشخیص اشیا ارائه داد و بههمین دلیل بسیار مورد توجه قرار گرفت. سعی کردهایم برای نگارش این مقاله از مقاله اصلی الگوریتم YOLO نسخه اول حداکثر استفاده را ببریم و تمامی توضیحات را بر اساس متن مقاله اصلی ارائه دهیم. زمان زیادی برای نگارش این مقاله صرف شد. امیدواریم که این مقاله مفید واقع شود. با هوسم همراه باشید…
YOLO چیست؟ (مقدمه)
انسان با نگاهی کوتاه به تصویر بلافاصله میفهمد چه اشیایی در تصویر وجود دارند، موقعیتشان در تصویر کجاست و حتی چه ارتباطی با هم دارند. این عملها برای انسان بسیار ساده هست و سیستم بینایی دقیق و سریع انسان کارهای بهمراتب پیچیدهتری مانند رانندگی را میتواند بهآسانی انجام دهد. البته، بخش مهمی از رانندگی، شناسایی و موقعیتیابی اشیای اطراف خودرو هست که انسان در این زمینه مهارت بالایی دارد. حال، اگر الگوریتمهای سریع و دقیقی برای شناسایی و موقعیتیابی اشیا داشته باشیم، میتوان امیدوار بود که ماشینهای خودرانِ بدون نیاز به سنسورهای مخصوص داشته باشیم. شناسایی و موقعیتیابی اشیا ازجمله زمینههای تحقیقاتی قدیمی و مهم در بینایی کامپیوتر است. در بینایی کامپیوتر، به شناسایی و موقعیتیابی اشیا در تصویر Object Detection گفته میشود. معمولا در فارسی بجای عبارت شناسایی و موقعیتیابی اشیا از عبارت “تشخیص اشیا” استفاده میشود. در این مقاله، میخواهیم بهیکی از سیستمهای سریع و دقیق تشخیص اشیا بهنام YOLO بپردازیم. بنابراین، YOLO چیست؟ یک سیستم تشخیص اشیا است. تصویری از خروجی سیستم تشخیص اشیا را در زیر مشاهده میکنید. تشخیص اشیا = شناسایی اشیا + موقعیتیابی اشیا
YOLO مخفف عبارت You Only Look Once، بهمعنای “شما فقط یکبار به تصویر نگاه میکنید” هست. درواقع، این عبارت به همان قابلیت سیستم بینایی انسان اشاره دارد که با یک نگاه عمل تشخیص اشیا را انجام میدهد. بنابراین، سیستم تشخیص اشیای YOLO با هدف ارائه روشی مشابه کارکرد سیستم بینایی انسان طراحی شده است. اما سوال اینجاست که سیستمهای تشخیص اشیای قبل از YOLO چه ویژگیهایی داشتند و چگونه کار میکردند؟ یعنی آنها شباهتی به سیستم بینایی انسان نداشتند؟ در بخش مروری بر کارهای گذشته به این سوالها پاسخ خواهیم داد.
YOLO کلمه جالبی است! اگر در اینترنت YOLO چیست را جستجو کنید، نتایج اول گوگل درباره الگوریتم و کد YOLO نیست. YOLO مخفف عبارت You Only Live Once هم هست. یعنی شما فقط یکبار زندگی میکنید. احتمالا مولفان باهوش الگوریتم YOLO، با الگوگیری از همین عبارت نام YOLO را انتخاب کردهاند. خب بالاخره YOLO چیست؟!
الگوریتم YOLO و الگوریتمهای پیش از آن
سیستمهای تشخیص اشیای پیش از YOLO، از کلاسیفایرها در کار تشخیص اشیا استفاده میکردند. این سیستمها برای تشخیص یک شی، یک کلاسیفایر را در موقعیتها و مقیاسهای مختلف به تصویر ورودی اعمال میکردند. بهعنوان مثال، سیستمهایی مانند Deformable Part Models یا DPM از پنجرههای لغزان (Sliding Window) بهره میبرند که کلاسیفایر را به موقعیتهای مختلف در سراسر تصویر اعمال میکنند. این اِعمال کلاسیفایر به موقعیتهای مختلف تصویر، کار زمانبری است که البته شباهت چندانی هم به سیستم بینایی انسان در تشخیص اشیا ندارد. در شکل زیر، نمونهای از الگوریتمهای مبتنی بر پنجره لغزان را مشاهده مینمایید. در این لینک اطلاعات بیشتری درباره DPM میتوانید کسب کنید.
دسته دیگری از رهیافتها که نسبت به DPM جدیدتر هستند، رهیافتهای مبتنی بر پروپوزال ناحیه (Region Proposal) مانند R-CNN است. در شکل 3، ساختار یک الگوریتم مبتنیبر پروپوزال ناحیه بهنام R-CNN را مشاهده مینمایید. در این روشها، ابتدا مجموعه زیادی پروپوزال یا همان باکس برای هر تصویر تولید میشوند (مثلا 2000 پروپوزال برای هر تصویر در مرحله 2 شکل 3). سپس، هریک از پروپوزالها به یک سایز مشخص ریسایز میشوند و برای استخراج ویژگی در اختیار شبکههای CNN قرار میگیرند (مرحله 3 در شکل 3). درنهایت، یک کلاسیفایر برای کلاسیفایکردن این باکسهای تولیدشده بهکار برده میشود (مرحله 4 در شکل 3). بنابراین، بههمین دلیل است که گفتیم روشهای تشخیص اشیای پیش از YOLO عمل تشخیص اشیا را با کلاسیفایرها انجام میدهند. این مسیر نسبتا پیچیده سرعت پایینی دارد و بهینهسازی آن مشکل است، چون هریک از این اجزا که در شکل 2 مشاهده میکنید، باید بهصورت جداگانه آموزش داده شوند.
حال که کمی با کارکرد کلی سیستمهای تشخیص اشیای پیش از YOLO آشنا شدیم، بهتر است به YOLO برگردیم. YOLO معماری سیستمهای تشخیص اشیا را دستخوش تغییراتی کرده است و به مساله تشخیص اشیا بهصورت یک مساله رگرسیون مینگرد که مستقیم از پیکسلهای تصویر به مختصات باکس و احتمال کلاسها میرسد (در بخشهای بعدی متوجه خواهید شد که چرا میگوییم رگرسیون). با استفاده از سیستم YOLO، برای تشخیص اشیای موجود در تصویر، به هر تصویر شما فقط یک بار مینگرید (You Only Look Once). این رویکرد را با رویکردهای DPM و R-CNN مقایسه کنید.
YOLO بسیار ساده است (به شکل 4 نگاه کنید). تنها یک شبکه کانولوشنی وجود دارد که تصویر ریسایز ورودی را دریافت (مرحله 1) و سپس به صورت همزمان چندین باکس را به همراه احتمال کلاسها پیشبینی میکند (مرحله 2). YOLO روی تصاویر کامل آموزش میبیند و مستقیما کارآیی تشخیص را بهبود میدهد.
مدل یکپارچه YOLO مزایای زیادی نسبت به روشهای سنتی تشخیص اشیا دارد که در ادامه اشاره خواهد شد:
- اول، YOLO بسیار سریع است. در اینجا، تنها یک شبکه وجود دارد که خیلی ساده به آن ورودی تصویر داده میشود تا شبکه پیشبینیهای تشخیص اشیا را به ما نشان دهد. دو نسخه شبکه YOLO شامل YOLO اصلی و YOLO سریع طراحی شده است. YOLO اصلی با کارت گرافیک Titan X با سرعت 45 فریمبرثانیه اجرا میشود. نسخه سریع YOLO هم سرعتی بیش از 150 فریمبرثانیه دارد. یعنی YOLO میتواند در یک ویدئوی 40 فریمبرثانیه درحالت بلادرنگ به تشخیص اشیا بپردازد. YOLO نسبت به دیگر سیستمهای تشخیص اشیای بلادرنگ، به mAP یا همان mean Average Precision دوبرابر دست یافته است. دقت کنید، عملکرد بهتر نسبت به سایر سیستمهای بلادرنگ و نه سیستمهای تشخیص اشیای قدرتمند مانند Faster R-CNN که بلادرنگ نیستند.
- دوم، YOLO برای پیشبینی تشخیص، به صورت کلی (Global) به تصویر نگاه میکند. برخلاف تکنیکهای پنجرههای لغزان (اسلاید) و پروپوزال، YOLO به کل تصویر نگاه میکند.
- سوم، YOLO تعیمیمپذیری بالایی دارد. زمانیکه تصاویر به شبکه آموزش داده میشوند و سپس شبکه آموزشدیده روی کارهای هنری تست میشود (در واقع منظورمان همان تغییر حوزه دادههای ورودی است) شبکه YOLO با فاصله زیادی بهتر از شبکههایی مانند DPM و R-CNN کار میکند. بنابراین، YOLO به شدت تعمیمپذیر هست و در مقابل حوزههای جدید و یا دادههای ورودی غیرمنتظره با احتمال کمتری نسبت به بقیه سیستمها با شکست مواجه میشود.
YOLO همچنان از سیستمهای تشخیص اشیای مدرن در دقت عقب هست. درحالیکه YOLO سرعت بالایی در تشخیص اشیا دارد، اما در تعیین دقیق بعضی از اشیا در تصویر، خصوصا اشیای کوچک چالش دارد. درادامه، درمورد ساختار کلی الگوریتم YOLO توضیح خواهیم داد.
ساختار کلی الگوریتم YOLO
ساختار کلی الگوریتم YOLO در شکل 5 نشان داده شده است. تصویر ورودی با ابعاد 3×448×448 به یک Grid یا شبکه S×S تقسیمبندی میشود. این تصویر به شبکه YOLO داده میشود. خروجی شبکه کانولوشنی، ماتریسی به ابعاد 30×S×S خواهد بود. هریک از درایههای ماتریس S×S خروجی معادل با یک سلول در شبکه S×S ورودی است (به ورودی و خروجی در شکل 5 دقت کنید). خروجی 30×S×S شامل مختصات باکسها و احتمالهاست. اگر در فرآیند آموزش (Train) باشیم، خروجی 30×S×S بههمراه باکسهای واقعی یا هدف (Ground Truth) به تابع اتلاف داده میشود. مقدار S در یولو نسخه 1، برابر با 7 درنظر گرفته شده است. اگر در فرآیند آزمایش (Test) باشیم، خروجی 30×S×S به الگوریتم حذف غیرحداکثرها (Non-maximum Suppression) داده میشود تا باکسهای ضعیف از بین بروند و تنها باکسهای درست در خروجی نمایش داده شوند. درادامه، درمورد طراحی شبکه YOLO، نحوه آموزش شبکه، تابع اتلاف، آزمایش شبکه و غیره توضیح خواهیم داد.
شبکه YOLO
YOLO شامل یک شبکه عصبی کانولوشنی (Convolutional Neural Network) با 24 لایه کانولوشنی برای استخراج ویژگی و همچنین 2 لایه فولیکانکتد (Fully Connected) برای پیشبینی احتمال و مختصات اشیا است. معماری شبکه YOLO را در شکل 6 مشاهده میکنید.
همچنین، یک نسخه سریع از YOLO برای جابجایی مرزهای تشخیص اشیای سریع طراحی شده است. YOLO سریع، یک شبکه عصبی با تعداد لایههای کانولوشنی کمتر است که در آن از 9 لایه کانولوشنی بجای 24 لایه کانولوشنی (YOLO اصلی) استفاده شده و البته تعداد فیلترهای هر لایه در YOLO سریع نسبت به YOLO اصلی کمتر است. اندازه ورودی هر دو شبکه 3×448×448 و خروجی شبکه نیز یک تنسور 30×7×7 از پیشبینیها است. درتمامی لایهها از Leaky ReLU استفاده شده است. ممکن است سوالاتی درمورد اندازه ورودی و خروجی شبکه YOLO داشته باشید. مثلا، چرا ابعاد ورودی 3×448×448 است، درحالیکه اکثر شبکههای کانولوشنی ورودی حدودا 3×224×224 دارند؟ چرا خروجی 30×7×7 است و این خروجی شامل چه اطلاعاتی است؟ چگونه از این خروجی، پیشبینی احتمالها و مختصات باکس اشیا استخراج میشود؟ درادامه، در بخش آموزش شبکه YOLO به این سوالات پاسخ خواهیم داد.
آموزش شبکه YOLO
آموزش شبکه تشخیص اشیای YOLO در دو مرحله مجزا انجام میشود:
ابتدا، شبکه YOLO با پایگاه داده 1000 کلاسه ImageNet برای عمل کلاسبندی آموزش داده شده است. در این فرآیند آموزش، از 20 لایه کانولوشنی ابتدایی YOLO استفاده شده است. در انتهای این 20 لایه، یک لایه پولینگ میانگین (Average Pooling) و یک لایه فولیکانکتد قرار گرفته است. تصاویر ورودی در اندازه 3×224×224 به شبکه داده شدهاند. این شبکه تقریبا بهمدت یک هفته آموزش داده شده که درنهایت دقت 88% در top-5 در ImageNet حاصل شده است.
در مرحله دوم، برای کار تشخیص اشیا در ساختار مدل تغییراتی ایجاد شده است. تغییرات به اینصورت است که چهار لایه کانولوشنی و دو لایه فولی کانکتد با وزنهای تصادفی به انتهای 20 لایه شبکه اضافه شده است. در کار تشخیص اشیا اغلب به اطلاعات با جزئیات بیشتری نیاز است، بههمین دلیل رزولوشن ورودی شبکه از 3×244×224 به 3×448×448 افزایش داده شده است. بنابراین، به جواب یکی از سوالها رسیدیم و متوجه شدیم که هدف از افزایش اندازه ورودی، بهرهگیری از جزئیات بیشتر در تصویر است.
درمورد ورودی شبکه توضیح داده شد. حال نوبت به بررسی خروجی شبکه است. اندازه خروجی شبکه 30×7×7 است. ابتدا از اندازه 7×7 شروع کنیم؛ تصاویر ورودی به یک شبکه 7×7 تقسیمبندی میشوند (در شکل 5 نشان داده شده است). بنابراین، خروجی 7×7 متناظر با تصویر شبکهشده ورودی است. هر درایه در 7×7 خروجی، متناظر با یک سلول در تصویر شبکهشده ورودی است (شکل 5). هر درایه از این ماتریس 7×7 خروجی، یک بردار بهطول 30 دارد (شکل 7). این بردار بهطول 30 شامل اطلاعات پیشبینی احتمالها و مختصات باکس است. اما چگونه؟ هر سلول از این آرایه 7×7 دو باکس میتواند رسم کند. برای رسم هر باکس به 5 پارامتر (x,y,w,h,confidence) نیاز است. پارامترهای x و y، مختصات سطر و ستون مبدا باکس (مرکز باکس) را نشان میدهند. مختصات w و h بهترتیب متناظر با پهنا و ارتفاع باکس هستند. با این چهار پارامتر میتوانیم باکس را ترسیم کنیم، درحالیکه گفتیم 5 پارامتر برای ترسیم باکس نیاز است. پارامتر پنجم چه کاربردی دارد؟ پارامتر پنجم confidence هست؛ یک پارامتر احتمالاتی با مقدار بین 0 تا 1 که میگوید اصلا این باکس شامل شی هست یا اینکه پسزمینه تصویر است! طبیعتا ما باکسهایی را میخواهیم که مقدار confidence بزرگی داشته باشند که نشان میدهد این باکس شامل یک شی است. مقدار confidence از طریق رابطه IoU بین باکس پیشبینی و باکس واقعی محاسبه میشود.
تابع اتلاف در الگوریتم YOLO
در YOLO از تابع اتلاف MSE یا Mean Squared Error استفاده شده است، چون بهینهسازی این تابع اتلاف آسان است و با مساله رگرسیون که در YOLO مطرح شده سازگار است. پلی به گذشته میزنیم و یادآوری میکنیم که در این مقاله بارها گفته شد که الگوریتم یولو به مساله تشخیص اشیا بهصورت رگرسیون مینگرد. حال اینجا هم خروجی شبکه را مشاهده کردید و هم اینکه تابع اتلاف MSE نشاندهنده دلیل رگرسیون هست. اما لازم است در تابع اتلاف MSE تغییراتی ایجاد شود که بیشتر با خواسته ما برای تشخیص اشیا همراستا باشد. تابع اتلاف نهایی در YOLOv1 بهشکل زیر است:
بیایید از ابتدا، خطبهخط تابع اتلاف الگوریتم یولو را بررسی کنیم؛ در خط اول، با استفاده از رابطه SSE، موقعیت مبداهای دو باکس پیشبینی و واقعی (x,y) باهم مقایسه شدهاند. اندیسهای i و j بهترتیب نشاندهنده سلولها (49 سلول داریم) و باکسها (B) هستند. پشت سیگما یک متغیر 1obj لحاظ شده است؛ درصورتی 1 هست که باکس j در سلول i شامل یک شی باشد، درغیراینصورت صفر خواهد بود. سلولی که شامل باکسی باشد که شی در آن وجود ندارد و شامل پسزمینه باشد، چه ارزشی برای ما دارد؟ دو سیگما داریم که وظیفهشان بررسی تکتک سلولها و باکسها هست. پشت سیگماها هایپرپارامتر λ قرار دارد. این پارامتر را به ذهن بسپارید تا در آخر درباره آن توضیح دهیم.
در خط دوم، رابطه تقریبا مشابهی با خط اول میبینیم. اما بجای x و y از w و h استفاده شده است. یعنی در اینجا میخواهیم پهنا و ارتفاع باکس پیشبینی را با باکس واقعی مقایسه کنیم. اما چرا w و h داخل یک √ قرار دارند؟ به این سوال فکر کنید و جواب آن را بیابید و بعد درادامه پاسخ آن را بخوانید. جواب آن بسیار ساده و جالب است؛ در تصویر، اشیای با اندازههای مختلف از خیلی کوچک تا خیلی بزرگ داریم. حالا وقتیکه بخواهیم باکسهای این اشیا را با باکسهای واقعی مقایسه کنیم، همه باکسها با هر اندازهای را با یک معیار مقایسه میکنیم. درحالیکه میدانیم خطا در باکسهای بزرگ مانند خطا در باکسهای کوچک نیست. بهعبارت دیگر، یک پیکسل خطا در باکس بزرگ باید کمتر مجازات داشته باشد تا یک پیکسل خطا در باکس کوچک. با استفاده از √، ما باکسهای بزرگ را کمتر از باکسهای کوچک مجازات میکنیم. کافیاست نمودار y=x و y=√x را در شکل زیر باهم مقایسه کنید.
خط سوم و چهارم، ضریب اطمینان (Confidence) برای حضور یا عدم حضور یک شی در باکس هست. اول اینکه، خط سوم برای ضرایب اطمینان باکسهایی است که شامل شی هستند و خط چهارم متناظر با باکسهایی است که شامل هیچگونه شی نیستند. پشت سیگماهای خط چهارم، یک هاپیرپارامتر λ قرار داده شده است. مقدار این پارامتر 0.5 درنظر گرفته شده است. چرا؟ چون، در هر تصویر بسیاری از باکسها شامل شی نیستند و تعداد باکسهای بدون شی بیشتر از با شی هست. برای اینکه مقدار اتلاف باکسهای بدون شی بر باکسهای با شی غلبه نداشته باشد، ضریب 0.5 پشت آن قرار داده شده تا مقدار اتلاف باکسهای بدونشی کاهش یابد. درنهایت، مقدار احتمال کلاسها باهم مقایسه شدهاند.
بسیار خب، بخش نسبتا سخت تابع اتلاف را هم بهپایان رساندیم. در بخش بعدی میخواهیم ببینیم تنظیمات لازم برای آموزش شبکه چگونه است. این بخش مهم است، چون به ما میآموزد شبکههای خود را با چه تنظیماتی آموزش دهیم.
تنظیمات آموزش شبکه YOLO
شبکه YOLO به اندازه 135 ایپوک با دادههای Train و Validation از پایگاه داده PASCAL VOC 2007 و 2012 آموزش داده شده است. هنگام تست روی پایگاه داده PASCAL VOC 2012، از دادههای تست PASCAL VOC 2007 هم برای آموزش استفاده شده است. برای آموزش از تنظیمات Batch size=64، Momentum=0.9 و Weight decay=5e-4 استفاده شده است.
برنامه lr به اینصورت است که، برای ایپوکهای اولیه، به صورت آرام نرخ یادگیری از 0.001 تا 0.01 افزایش مییابد (دقت کنید به این فرآیند که نرخ یادگیری از مقدار کوچکی شروع و سپس بهآرامی زیاد شود، warmup گفته میشود که تکنیک بسیار خوبی برای آموزش در ایپوک های اولیه است. چون شبکه در ابتدای فرآیند آموزش درحالت ناپایدار قرار دارد و بنابراین بهتر است نرخ یادگیری کم باشد و سپس بهآرامی زیاد شود). سپس، آموزش شبکه با نرخ یادگیری 0.01 به اندازه 75 ایپوک ادامه یافته است، بعد برای 30 ایپوک نرخ یادگیری 0.001 خواهد بود و درنهایت برای 30 ایپوک 0.0001 خواهد شد.
برای جلوگیری از Overfitting، از Dropout و دادهسازی (Data Augmentation) استفاده شده است. از Dropout با نرخ 0.5 بعد از لایههای فولیکانکتد استفاده شده است. برای دادهسازی هم، مقیاس (Scale) و انتقال (Translation) حداکثر 20% اندازه تصویر اصلی بهکار برده شده است. همچنین، به صورت تصادفی Exposure و Saturation در تصویر با فاکتوری حداکثر 1.5 در فضای رنگی HSV تنظیم شده است.
آزمایش ارزیابی الگوریتم YOLO
پس از فرآیند آموزش YOLO، مشاهده خروجی YOLO برای یک تصویر نمونه بسیار ساده است. یک تصویر نمونه به ابعاد 3×448×448 بهعنوان ورودی به شبکه داده میشود و شبکه احتمالها و مختصات باکسها را پیشبینی میکند. این خروجیها در قالب یک ماتریس 30×7×7 برای پایگاه داده PASCAL VOC ارائه میشوند. برای هر سلول در ماتریس 7×7، دو باکس وجود دارد و درمجموع هم 49 سلول داریم. بنابراین، بهاندازه 49×2 باکس در تصویر میتوانیم رسم کنیم. یعنی برای هر تصویری 98 باکس در خروجی ترسیم میشود؟! خیر، حداکثر 98 باکس میتوانیم داشته باشیم، اما با روشهای آستانهگیری و حذف غیرحداکثرها (Non-maximal Supression) بسیاری از این 98 باکس حذف میشوند.
محدودیتهای الگوریتم YOLO
باوجود دستاوردهای بزرگی که شبکه YOLO بههمراه داشته است، اما با محدودیتها و چالشهایی هم همراه است. درادامه، به تعدادی از این محدودیتها اشاره شده است:
- اگرچه YOLO دو باکس برای هر سلول ترسیم میکند، اما این باکس از دو کلاس مختلف هستند. یعنی در هر سلول، از یک کلاس دو باکس نمیتواند رسم کند. چرا؟ راهنمایی: به بردار 30-تایی هر سلول 7×7 توجه کنید.
- YOLO در تشخیص اشیای کوچک در تصویر، مانند دسته پرندگان چالش دارد.
- YOLO در تشخیص اشیای با ابعاد جدید و غیرمعمولی که در فرآیند آموزش ندیده باشد، مشکل دارد.
- YOLO از ویژگیهای کلی اشیا برای تشخیص بهره میبرد، چون تنها از ویژگیهای لایه خروجی برای تشخیص اشیا استفاده میکند که این ویژگیها کلی هستند و بهخاطر کوچک شدنهای متوالی جزئیات از بین میروند. بهنظر شما چاره کار چیست؟
- بهنظر شما YOLO چه چالشها و محدودیتهای دیگری دارد؟ (برای ما کامنت بگذارید)
نتایج ارزیابی الگوریتم یولو
بهتر است ابتدا به یکی از مهمترین نقطه قوتهای یولو، یعنی سرعت بپردازیم. در جدول زیر، نتایج مقایسه سرعت و دقت YOLO با سایر کارها را مشاهده میکنید. جدول از دو بخش Real-Time Detectors و Less Than Real-Time تشکیل شده است. بخش اول (Real-Time Detectors)، الگوریتمهای تشخیص اشیای سریع را نشان میدهد؛ در این بخش، مشاهده میکنید که Fast YOLO و YOLO هردو هم سرعت بسیار بالا (FPS) و هم دقت بالاتر (mAP) نسبت به 100Hz DPM و 30Hz DPM دارند.
بخش دوم (Less Than Real-Time) مربوط به الگوریتمهایی میشود که بلادرنگ نیستند (سریع نیستند). دراینجا بجای YOLO از YOLO VGG-16 استفاده شده است. در YOLO VGG-16 از شبکه VGG-16 برای تشخیص اشیا بجای مدل 24 لایهای YOLO استفاده شده است. VGG-16 دقت بهتری دارد، اما سرعت پایینتری دارد. دراینحالت، سرعت YOLO به 21 فریمبرثانیه افت کرده، اما بازهم سریعتر از سایر الگوریتمهاست. درعینحال، در بخش mAP نسبت به بعضی الگوریتمها مانند Fast R-CNN کمی ضعیفتر است. البته دقت کنید همین Fast R-CNN، سرعت پردازش 0.5 فریمبرثانیه دارد!
بخش بعدی ارزیابی، مربوط به مقایسه دقیق بین YOLO و Fast R-CNN هست. دراینجا، برای تشخیص اشیا، خطاهای مختلفی تعریف شده و سپس اندازهگیری شده که هریک از این دو الگوریتم چقدر خطا دارند. در شکل زیر، نمودار دایرهای تحلیل خطا بین YOLO و Fast R-CNN را مشاهده میکنید. بهصورت خلاصه، نمودار شکل 9 را بهصورت زیر میتوان مقایسه نمود:
- correct: اگر کلاس شی درست تشخیص داده شده باشد و مقدار IOU بزرگتر از 0.5 باشد. دراین مورد، Fast R-CNN عملکرد بهتری دارد (ناحیه سبز).
- localization: اگر کلاس شی درست تشخیص داده شده باشد ولی مقدار IOU بین [0.5 0.1] باشد. دراین خطا، عملکرد Fast R-CNN بهتر است (ناحیه آبی).
- Background: مقدار IOU کمتر از 0.1 باشد. در این خطا، عملکرد یولو بهتر است.
با بررسی سه مورد بالا، میتوان به این نتیجه رسید که عملکرد Fast R-CNN درکل بهتر از یولو است. YOLO خطای بیشتری در موقعیتیابی اشیا دارد و این یک چالش برای YOLO محسوب میشود. اما درعینحال، YOLO خطای پسزمینه کمتری نسبت به Fast R-CNN دارد.
ترکیب Fast R-CNN و YOLO هم میتواند جالب باشد. YOLO خطاهای پسزمینه کمتری نسبت به Fast R-CNN تولید میکند. با استفاده از YOLO برای حذف تشخیصهای پسزمینه از Fast R-CNN، میتوانیم بهبود قابلتوجهی در کارآیی تشخیص اشیای Fast R-CNN ایجاد کنیم. اما چگونه این دو را ترکیب کنیم؟ برای هر باکسی که توسط Fast R-CNN پیشبینی میشود، چک میکنیم که آیا YOLO باکس مشابهی پیشبینی کرده است یا خیر. درصورت پاسخ بله، پیشبینی از طریق احتمال YOLO تقویت میشود و همچنین همپوشانی (overlap) بین دو باکس محاسبه و بهعنوان باکس نهایی نمایش داده میشود. در جدول زیر، مشاهده میکنید که Fast R-CNN با مدلهای مختلفی ترکیب شده و بهترین mAP متعلق به ترکیب Fast R-CNN با YOLO است (روشی ترکیبی به mAP=75% دست یافته است).
YOLO در مجموعه تست پایگاه داده VOC 2012، به mAP 57.9% رسیده است. باتوجه به جدول زیر، این مقدار پایینتر از بهترین نتایج ارائه شده در حال حاضر است و نزدیک به R-CNN با استفاده از VGG-16 است. در مقایسه با رقیبهای نزدیک مانند R-CNN، سیستم YOLO بیشتر درگیر چالش تشخیص اشیای کوچک است. بهعنوان مثال، YOLO در تشخیص اشیایی مانند bottle، sheep و tv/monitor عملکردی 8-10% پایینتر نسبت به R-CNN دارد. اما، در سایر کلاسها مانند گربه، YOLO عملکرد بهتری در تشخیص دارد. در بخش قبل، YOLO با Fast R-CNN ترکیب شد که مشاهده میکنید این مساله باعث شده که دقت بالایی حاصل شود و رتبه پنجم در جدول را دارد. البته، دراینحالت دیگر باید از مقوله سرعت که از ویژگیهای مهم YOLO است، چشمپوشی کنیم.
در بخشهای ابتدایی، یکی از ویژگیهای مثبتی که برای YOLO برشمردیم، قابلیت تعمیمپذیری آن بود. ادعا شده بود که YOLO در دادههای با توزیع متفاوت عملکرد خوبی دارد و میتواند تعمیمپذیری بالای خود را به رخ دیگر سیستمها بکشد! شکل زیر نشان میدهد که چگونه دقت سایر سیستمهای تشخیص بهشدت افت میکند. البته، در مقاله درباره تعمیمپذیری توضیحات بیشتری داده شده است که درصورت تمایل میتوانید مطالعه کنید.
خب به پایان مقاله سیستم تشخیص اشیای YOLO رسیدیم. امیدواریم شما تا پایان این مقاله طولانی را مطالعه کرده باشید. اگرچه YOLOv1 مقاله بسیار خوبی بود، اما مقالههای YOLOv2 و YOLOv3 از YOLOv1 بسیار بهتر هستند. نظرها، ایرادها و پیشنهادهای خود را درباره این مقاله کامنت کنید. نظرهای شما به ما کمک میکند که مقالات بعدی را با کیفیت بهتری آماده کنیم.
مطالب زیر را حتما مطالعه کنید
شبکه ترنسفورمر
روش اعتبارسنجی متقابل یا cross validation چیست
مقایسه تنسورفلو و پایتورچ
شبکه عصبی GRU
یادگیری عمیق چیست
شبکه عصبی کانولوشن
23 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
سلام.
مقاله خیلی خوبی بود. یه دید کلی بهم داد.
سلام.
لطفا ورژن های بروزتری از یولو را به عنوان مقاله قرار بدید .
خدا قوت. ممنون از اطلاعات مفید و جامع تون
سلام
یکی از نویسندگان این مقاله آقای دکتر علی فرهادی هستن که استاد دانشگاه واشنگتن هستن.
لینک مقاله رو هم براتون میذارم. ای کاش توی متن اشارهای به ایشون میکردید:)
https://www.cv-foundation.org/openaccess/content_cvpr_2016/html/Redmon_You_Only_Look_CVPR_2016_paper.html
واقعا بی نظیر هستین
عالی بود
دمتون گرم.
سلام
خیلی ممنون از مقاله خوبتون
سلام
خیلی مختصر و مفید و عالی
سپاس
سلام
خوشحالیم که مفید واقع شده.
سپاس
سلام ممنون از مطالب مفیدتون
در مورد مطلبی که فرمودید از yolo و faster_rcnn همزمان استفاده بشه
منظورتون در آموزش شبکه هست و در تست تنها از yolo استفاده شود؟
ممنون از راهنماییتون
سلام
سپاس 🌹🙏
در فرآیند ارزیابی این دو شبکه باهم ترکیب شدند. هرکدوم بهصورت جداگانه آموزش دیدند و بعد در ارزیابی باهم ترکیب شدند تا خروجی نهایی بهتر بشه.
سلام اگه میشه نسخه چهارم با همین دقت توضیح بدید ممنون میشم .
سلام
چشم، انشالله در برنامه قرار میدیم.
سپاس از شما برای پیشنهاد 🌹🙏
سلام و خسته نباشید بابت مقاله ی ارزشمندتون
ی مقاله تو سایت بود که درباره ی همه ی سیستم های تشخیص اشیا بحث میکرد. آیا حذف شده ؟ لطفا اگه هست بفرمایید کجا میتونم ببینم؟
سلام
سپاس 🌹
ما یک مقاله دیگر هم در تشخیص اشیا داریم. لینک
جز این دو مورد در وبلاگ مقاله دیگهای نداریم. در فروشگاه هم دو محصول الگوریتم یولو (لینک) و Faster RCNN (لینک) داریم.
خییلی مقاله جامعی بود واقعا ممنون
سلام
سپاس 🌹🙏
با عرض سلام.
امکانش هست نحوه استفاده از شبکه پری ترین yolo در C++ ، opencv ، CPU و ویندوز رو بفرمایید
با تشکر
سلام
وقتتون بخیر
من تو این هفته بالای 15 مقاله در مورد yolo خوندم. به جرات میتونم بگم کامل ترین مقاله فاسی رو در سایت شما خوندم و بابتش ممنون…
دوتا پیشنهاد داشتم،
در بحث توضیح این سبک الگوریتم ها اگر میشد بجای توضیح عملکرد درون یک پاراگراف، از سبک شماره گذاری و مرحله ای استفاده کنین خیلی درکش راحت تر میشه.
در مورد loss funtion خیلی خوب توضیح دادین، فقط بنظرم بازم کمی جا داشت بیشتر تحلیلش کنین.
در کل بین مقالات فارسی بینظیرید.
سلام
زمان زیادی بابت نگارش این مقاله صرف شده و خوشحالیم که مورد رضایت شما واقع شده…
از اینکه نظر و پیشنهادتان را با ما میان درگذاشتید، متشکریم. انشالله پیشنهادهای خوب شما را بررسی و این مقاله را ادیت خواهیم کرد تا توضیحاتش کاملتر و سادهتر شود.
سلام امکانش هست ورژن۴ یولو رو هم بذارید ممنونم
سلام
بله، تلاش میکنیم یولو 4 رو هم آماده کنیم.
سلام و وقت بخیر
ببخشید منتظر پست یولو 4 باشیم؟
سلام
احتمالا طول میکشه تا آماده شه…