021-71053903 [email protected] پشتیبانی از شنبه تا چهارشنبه ساعت 9 الی 16

الگوریتم Yolo

این مقاله معماری تشخیص شی یا پردازش تصویر YOLO را از دیدگاه شخصی که می‌خواهد آن را از ابتدا پیاده‌سازی کند، توضیح می‌دهد. مزایا/معایب شبکه یا دلایل هر انتخاب طراحی را توضیح نمی دهد. در عوض، بر نحوه کارکرد YOLO تمرکز می کند. قبل از خواندن این مطلب باید درک اولیه ای از شبکه های عصبی، به ویژه CNNS را باید داشته باشید.

تمام توضیحات در این پست مربوط به مقاله اصلی YOLO: You Only Look Once: Unified, Real-Time Object Detection اثر جوزف ردمون، سانتوش دیوالا، راس گیرشیک و علی فرهادی (2015) است. از آن زمان پیشرفت‌های زیادی ارائه شده است که در نسخه جدیدتر YOLOv2 ترکیب شده‌اند که در یک مقاله دیگر به صورت کامل به آن خواهیم پرداخت.

اگر نیاز به منابع این مقاله می توانید در پایان این مقاله منابع مورد نیاز خود را جست و جو کنید.

 

YOLO چیست؟

YOLO (You Only Look Once)، یک شبکه برای تشخیص اشیا است. وظیفه تشخیص شی شامل تعیین مکان روی تصویر است که در آن اشیاء خاصی وجود دارند و همچنین طبقه بندی آن اشیا. روش‌های قبلی برای این کار، مانند R-CNN و تغییرات آن، از یک pipline برای انجام این کار در چند مرحله استفاده می‌کردند. این می‌تواند آهسته اجرا شود و همچنین بهینه‌سازی آن سخت است، زیرا هر جزء جداگانه باید به طور جداگانه آموزش داده شود. YOLO همه این کارها را با یک شبکه عصبی انجام می دهد. توضیح روی کاغذ:

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

 

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

بنابراین، این پیش بینی ها چگونه به نظر می رسند؟

 

بردار پیش بینی ها

اولین قدم برای درک YOLO این است که چگونه خروجی خود را رمزگذاری می کند. تصویر ورودی به یک شبکه S x S از سلول ها تقسیم می شود. برای هر جسمی که روی تصویر وجود دارد، یک سلول شبکه ای گفته می شود که “مسئول” پیش بینی آن است. آن سلولی است که مرکز جسم در آن قرار می گیرد.

هر سلول شبکه ای جعبه هایی را در محدوده B و همچنین احتمالا کلاس C را پیش بینی می کنند. پیش بینی جعبه مرزی دارای 5 جزء است: (x، y، w، h، اطمینان). مختصات (x، y) مرکز کادر را نسبت به محل سلول شبکه نشان می دهد (به یاد داشته باشید که اگر مرکز کادر در داخل سلول شبکه قرار نگیرد، این سلول در قبال آن مسئولیتی ندارد). این مختصات برای قرار گرفتن بین 0 و 1 نرمال می شوند. بیایید به مثال زیر نگاه کنیم:

مثالی از نحوه محاسبه مختصات جعبه در یک تصویر 448×448 با S=3. به نحوه محاسبه مختصات (x,y) نسبت به سلول شبکه مرکزی توجه کنید.

 

به طور رسمی ما اطمینان را به عنوان این فرمول یاد می کنیم:

  • Pr(Object) * IOU(pred, truth)

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

اتحاد (IOU) بین جعبه پیش بینی شده و حقیقت پایه.

توجه داشته باشید که اطمینان منعکس کننده وجود یا عدم وجود یک شی از هر کلاس است. اگر نمی دانید IOU چیست، اگر نمی دانید چیست این مقاله را کامل بخوانید.

اکنون که 5 جزء پیش‌بینی مربع را فهمیدیم، به یاد داشته باشید که هر سلول شبکه B از آن پیش‌بینی‌ها را می‌سازد، بنابراین در مجموع S x S x B * 5 خروجی مربوط به پیش‌بینی‌های مربع حد وجود دارد.

 

همچنین لازم است احتمالات کلاس، Pr(Class(i) | Object) را پیش بینی کنیم. این احتمال مشروط به سلول شبکه حاوی یک شی است (اگر معنی احتمال شرطی را نمی دانید این را ببینید). در عمل، به این معنی است که اگر هیچ شیئی در سلول شبکه وجود نداشته باشد، تابع ضرر آن را برای پیش‌بینی کلاس اشتباه جریمه نمی‌کند، همانطور که بعداً خواهیم دید. شبکه فقط یک مجموعه از احتمالات کلاس را در هر سلول پیش‌بینی می‌کند، بدون توجه به تعداد جعبه‌های B. این باعث می‌شود در کل احتمالات کلاس S x S x C باشد.

با اضافه کردن پیش‌بینی‌های کلاس به بردار خروجی، یک تانسور S x S x (B * 5 +C) به عنوان خروجی دریافت می‌کنیم.

yolo چیست

yolo چیست

هر سلول شبکه پیش‌بینی‌های جعبه مرزی B و پیش‌بینی‌های کلاس C را انجام می‌دهد (S=3، B=2 و C=3 در این مثال)

 

شبکه

هنگامی که درک کردید که چگونه پیش بینی ها بارگذاری می شوند، بقیه کارها آسان است. ساختار شبکه مانند یک CNN معمولی به نظر می رسد، با لایه های کانولوشنال و حداکثر ادغام و به دنبال آن 2 لایه کاملاً متصل در پایان:

┌────────────┬────────────────────────┬───────────────────┐
│    Name    │        Filters         │ Output Dimension  │
├────────────┼────────────────────────┼───────────────────┤
│ Conv 1     │ 7 x 7 x 64, stride=2   │ 224 x 224 x 64    │
│ Max Pool 1 │ 2 x 2, stride=2        │ 112 x 112 x 64    │
│ Conv 2     │ 3 x 3 x 192            │ 112 x 112 x 192   │
│ Max Pool 2 │ 2 x 2, stride=2        │ 56 x 56 x 192     │
│ Conv 3     │ 1 x 1 x 128            │ 56 x 56 x 128     │
│ Conv 4     │ 3 x 3 x 256            │ 56 x 56 x 256     │
│ Conv 5     │ 1 x 1 x 256            │ 56 x 56 x 256     │
│ Conv 6     │ 1 x 1 x 512            │ 56 x 56 x 512     │
│ Max Pool 3 │ 2 x 2, stride=2        │ 28 x 28 x 512     │
│ Conv 7     │ 1 x 1 x 256            │ 28 x 28 x 256     │
│ Conv 8     │ 3 x 3 x 512            │ 28 x 28 x 512     │
│ Conv 9     │ 1 x 1 x 256            │ 28 x 28 x 256     │
│ Conv 10    │ 3 x 3 x 512            │ 28 x 28 x 512     │
│ Conv 11    │ 1 x 1 x 256            │ 28 x 28 x 256     │
│ Conv 12    │ 3 x 3 x 512            │ 28 x 28 x 512     │
│ Conv 13    │ 1 x 1 x 256            │ 28 x 28 x 256     │
│ Conv 14    │ 3 x 3 x 512            │ 28 x 28 x 512     │
│ Conv 15    │ 1 x 1 x 512            │ 28 x 28 x 512     │
│ Conv 16    │ 3 x 3 x 1024           │ 28 x 28 x 1024    │
│ Max Pool 4 │ 2 x 2, stride=2        │ 14 x 14 x 1024    │
│ Conv 17    │ 1 x 1 x 512            │ 14 x 14 x 512     │
│ Conv 18    │ 3 x 3 x 1024           │ 14 x 14 x 1024    │
│ Conv 19    │ 1 x 1 x 512            │ 14 x 14 x 512     │
│ Conv 20    │ 3 x 3 x 1024           │ 14 x 14 x 1024    │
│ Conv 21    │ 3 x 3 x 1024           │ 14 x 14 x 1024    │
│ Conv 22    │ 3 x 3 x 1024, stride=2 │ 7 x 7 x 1024      │
│ Conv 23    │ 3 x 3 x 1024           │ 7 x 7 x 1024      │
│ Conv 24    │ 3 x 3 x 1024           │ 7 x 7 x 1024      │
│ FC 1       │ -                      │ 4096              │
│ FC 2       │ -                      │ 7 x 7 x 30 (1470) │
└────────────┴────────────────────────┴───────────────────┘

 

چند نکته در مورد معماری:

  • توجه داشته باشید که معماری برای استفاده در مجموعه داده پاسکال VOC ساخته شده است، جایی که نویسندگان از S=7، B=2 و C=20 استفاده کردند. این توضیح می دهد که چرا نقشه های ویژگی نهایی 7×7 هستند و همچنین اندازه خروجی را توضیح می دهد (7x7x(2*5+20)). استفاده از این شبکه با اندازه شبکه متفاوت یا تعداد کلاس های مختلف ممکن است نیاز به تنظیم ابعاد لایه داشته باشد.
  • نویسندگان اشاره می کنند که نسخه سریع YOLO با لایه های کانولوشنال کمتری وجود دارد. جدول بالا، با این حال، نسخه کامل را نشان می دهد.
  • توالی لایه های کاهش 1×1 و لایه های کانولوشنال 3×3 از مدل GoogLeNet (Inception) الهام گرفته شده است.
  • لایه نهایی از یک تابع فعال سازی خطی استفاده می کند. همه لایه‌های دیگر از یک RELU نشتی استفاده می‌کنند (Φ(x) = x، اگر x> 0؛ 0.1x در غیر این صورت)
  • اگر با شبکه های کانولوشن آشنایی ندارید، به این معرفی عالی نگاه کنید

 

تابع ضرر

در مورد تابع ضرر حرف های زیادی برای گفتن وجود دارد، بنابراین اجازه دهید آن را بر اساس جزیات بیان کنیم :

تابع ضرر

تابع ضرر

 

این معادله ضرر مربوط به موقعیت مربع مرزی پیش بینی شده (x,y) را محاسبه می کند. در حال حاضر نگران λ نباشید، فقط آن را یک ثابت معین در نظر بگیرید. این تابع یک مجموع را بر روی هر پیش‌بینی‌کننده جعبه مرزی (j = 0.. B) هر سلول شبکه (i = 0 .. S^2) محاسبه می‌کند. 𝟙 obj به صورت زیر تعریف می شود:

1، اگر یک شی در سلول شبکه i وجود داشته باشد و jامین خط مربع پیش بینی کننده “مسئول” آن پیش بینی باشد.
0، در غیر این صورت

اما چگونه بفهمیم کدام پیش بینی مسئول شی است؟ به نقل از مقاله اصلی:

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

 

سایر اصطلاحات موجود در معادله باید به راحتی قابل درک باشند: (x, y) موقعیت مربع مرزی پیش بینی شده و (x̂, ŷ) کلاه موقعیت واقعی از داده های آموزشی است.

بریم سراغ قسمت دوم:

 

این ضرر مربوط به عرض / ارتفاع جعبه پیش بینی شده است. معادله به جز جذر، شبیه معادله اول است. چه خبر است؟ نقل مجدد مقاله:

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

 

میریم سراغ قسمت سوم:

آموزش Yolo

آموزش Yolo

 

در اینجا ما ضرر مربوط به امتیاز اطمینان را برای هر پیش‌بینی‌کننده جعبه مرزی محاسبه می‌کنیم. C امتیاز اطمینان و Ĉ تقاطع بیش از اتحاد جعبه مرزی پیش‌بینی‌شده با حقیقت زمین است. وقتی جسمی در سلول وجود دارد obj برابر یک است و در غیر این صورت 0 است. 𝟙 noobj برعکس است.

پارامترهای λ که در اینجا و همچنین در قسمت اول ظاهر می‌شوند برای وزن دادن متفاوت بخش‌های توابع کاهش استفاده می‌شوند. این برای افزایش پایداری مدل ضروری است. بالاترین جریمه برای پیش‌بینی مختصات (λ coord = 5) و کمترین برای پیش‌بینی‌های اطمینان زمانی است که هیچ جسمی وجود ندارد (λ noobj = 0.5).

آخرین بخش تابع ضرر، زیان طبقه بندی است:

 

t شبیه به یک خطای مجموع مربع معمولی برای طبقه بندی به نظر می رسد، به جز عبارت 𝟙 obj. این اصطلاح به این دلیل استفاده می‌شود که ما خطای طبقه‌بندی را زمانی که هیچ شیئی در سلول وجود ندارد جریمه نمی‌کنیم (از این رو احتمال کلاس شرطی که قبلاً بحث شد).
تمرین

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

ابتدا، 20 لایه کانولوشنال اول را با استفاده از مجموعه داده رقابتی کلاس 1000 ImageNet، با استفاده از اندازه ورودی 224×224 از قبل آموزش دهید.
سپس وضوح ورودی را به 448×448 افزایش دهید
شبکه کامل را برای حدود 135 دوره با استفاده از اندازه دسته ای 64، تکانه 0.9 و فروپاشی 0.0005 آموزش دهید.
برنامه نرخ یادگیری: برای دوره های اول، نرخ یادگیری به آرامی از 0.001 به 0.01 افزایش یافت. حدود 75 دوره تمرین کنید و سپس شروع به کاهش آن کنید.
از تقویت داده ها با مقیاس بندی و ترجمه تصادفی و تنظیم تصادفی نوردهی و اشباع استفاده کنید.

این روش با جزئیات بیشتر در مقاله اصلی توضیح داده شده است. من قصد دارم خودم آن را تکثیر کنم، اما هنوز به آنجا نرسیده ام :).

 

نتیجه

مدتی طول کشید تا تمام جزئیات این مقاله را به دست بیاورم. اگر در حال خواندن این مطلب هستید، امیدوارم با به اشتراک گذاشتن نظراتم در مورد آن، کار شما را آسان کرده باشم.

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

با تشکر از خواندن و لطفا نظرات خود را در زیر، در صورت داشتن نظرات.

 

 

دانلود باکس

محمدرضا حسنی

224 مطلب منتشر شده

دانش آموخته رشته فناوری اطلاعات / موسس پایتونی ها

درباره این مطلب نظر دهید !

محصولات فروش پایتونی ها

%60
تخفیف

آموزش فیگما (Figma)

30,000 تومان
3
%69
تخفیف

آموزش برنامه نویسی پایتون

35,000 تومان
2