تشخیص ماشین‌ها در تصویر

GitHub

مقدمه

تشخیص اشیا در تصویر یک عمل پر چالش است که بسیاری از محققین در حال حاضر به آن می پردازند. تشخیص و نام گذاری1 اشیا در عکس بسیار پر چالش است، زیرا تصاویری که داریم می تواند در شرایط بسیار متونعی باشد. به عنوان مثال برای تشخیص خودرو در تصویر چالش هایی که در پیش رو هستند عبارتند از :

  • تصاویر بسیار متونع از زوایای متفاوت از خودرو

  • گوناگونی در خودروها به عنوان مثال خودرو سواری ، اتوبوس و …

  • رنگ ها و طرح های متفاوت خودرو ها

  • تصاویر در شب یا روز

  • تصاویر در شرایط جوی متفاوت مانند برفی، بارانی یا آفتابی یا ابری

فایق آمدن بر چنین مشکلاتی در حالت کلی بسیار مفید خواهد بود و در زمینه هایی مانند ایمنی خودروها2، فهرست گذاری ویدو3، دنبال کردن اشیا در تصویر4 ، روباتیک و … بسیار سودمند خواهد بود.

اما تشخیص خودرو در تصویر چه سودمندی خواهد داشت؟

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

کارهای مرتبط

تشخیص خودرو در بسیار از موارد کاربرد دارد که در اینجا به بخشی از آن اشاره میکنیم و روش های گوناگون تشخیص خودرو در تصویر و یا به طور کلی اشیا در تصویر را بررسی می کنیم.
برای تشخیص این که خودرو ای در محدوده ای ممنوعه پارک کرده است یا نه، تشخیص مدل خودرو، تشخیص خودرو در تصاویر هوایی وحذف آن از تصویر( همانند کاری که گوگل در گوگل مپ برای حذف انسان از تصاویر هوایی به علت حفظ حریم خصوصیشان انجام می دهد) می توان از این پروژه استفاده کرد. زیرا در تمامی موارد ذکر شده ابتدا باید محل خودرو در تصویر تشخیص داده شود سپس مراحل بعدی طی شود.
البته لازم به ذکر است که بعضی از تکنیک های مورد استفاده برای یافتن تصویر خودرو می توانند برای تشخیص اشیا دیگری در تصویر بکار روند مانند: تشخیص چهره و یا دوچرخه و ... زیرا در این زمینه ها چالش های تقریبا یکسانی وجود دارد.

رویکردهایی برای تشخیص اشیا در تصویر وجود دارد مانند: شناسایی با اجزا5 ، شناسایی بر اساس ظاهر6 و شناسایی بر اساس ویژگی ها7.

شناسایی بر اساس ویژگی ها

  • درخت ترجمه8

  • نظریه و اثبات9

  • ثبات وضعیت 10

  • خوشه بندی وضعیت 11

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

  • روش شاخه و حد توسط Narendra و Fukunaga برای دوری از جست و جو های کامل همه زیر مجموعه های ویژگی ها استفاده شد. Liu et al. هم روشی برای دوری از جست و جوی کامل توسعه داده است.

  • در سال ۲۰۱۱ Pedrycz و Ahmad از روش انتخاب ویژگی ها با رویکرد تصادفی ، الگوریتم ژنتیک و بهینه سازی اجتماع ذرات استفاده کردند.

  • در سال ۱۹۹۶ Bala et al. از الگوریتم ژنتیک و درخت های تصمیم گیری برای انتخاب ویژگی های مفاهیم بصری استفاده کرد. Dollar et al. ابعاد مجموعه تصادفی آغازین را با استفاده از روش Ada Boost کاهش داد.

شناسایی بر اساس ظاهر

  • روش تقسیم و حل

  • تطابق لبه

  • هیستوگرام

روش استفاده شده

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

در این فاز از روش Haar-like features استفاده کردیم. این روش از ویژگی های عکس های دیجیتال استفاده میکند. در توضیح این روش به اختصار می توان گفت که ویژگی های تصویر بر اساس تفاضل مجموع پیکسل های یک ناحیه ی مستطیل تعریف می گردند.

sum = I(C) + I(A) - I(B) - I(D)

در این فاز از کتابخانه ی OpenCV نسخه ی ۲.۴ استفاده شده است. با استفاده از Cascade Classifier Training که امکان تمرین13 بر اساس Haar-like features را به ما می دهد و تعداد زیادی داده ی آموزشی مشتمل بر دو دسته، دسته ای حاوی عکس های بدون خودرو و دسته ای شامل عکس های خودرو، و دو فایل توصیف گر، یکی برای عکس های بدون خودرو یا به اصطلاح پس زمینه و دیگری توصیف گر عکس های حاوی خودرو و محل خودرو یا خودرو های موجود در تصویر، فایل هایی به دست می آیند که نتیجه یادگیری بر روی داده های تست بوده. سپس این فایل ها به برنامه ای که به زبان سی پلاس پلاس نوشته شده داده می شوند تا آن برنامه با استفاده از آن ها بتواند در صورت وجود خودرو در تصویر محل آن را مشخص کند.

در ادامه به توضیح چگونگی استفاده از فایل های موجود در Github خواهیم پرداخت البته لازم به ذکر است که این توضیحات در ReadMe پروژه نیز موجود است و این توضیحات برای سیستم عامل لینوکس ارایه گردیده است.

ابتدا کد را کامپایل میکنیم، البته باید دقت شود که کتابخانه های مربوطه را نیز به کامپایلر معرفی کنیم.

سپس فایل اجرایی را با پارامتر های زیر اجرا میکنیم:

  • آدرس عکس

  • فایل یا فایل های مربوط به ما حصل Cascade Classifier

به عنوان مثال:

./output image.bmp cascade1.xml cascade2.xml cascade3.xml cascade4.xml cascade.xml

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

ارزیابی

برای اطمینان از کارایی روش استفاده شده، از یک مجموعه داده ای مشتمل بر ۱۰۷ عکس برای ارزیابی برنامه ارایه شده، استفاده گردید. مشخصات این مجموعه به قرار زیر است:

  • ۲۷ عکس ،شامل چند خودرو

  • ۵۷ عکس، شامل یک خودرو

  • ۲۳ عکس، بدون خودرو

پس از اجرا برنامه برای تمام این عکس ها نتایج اولیه زیر حاصل گردید:

نوع شامل چند خودرو شامل یک خودرو بدون خودرو
عکس های مورد بررسی ۲۷ ۵۷ ۲۳
تشخیص درست ۱۳ ۳۳ ۲۱
تشخیص نادرست ۱۷ ۱۹ ۴

همان طور که از نتایج بالا مشخص است، از بین ۱۰۷ عکس مورد بررسی ۲۵ عکس (مجموع ستون عکس های بدون خودرو، در دو ردیف تشخیص درست و نادرست) به عنوان عکس بدون خودرو تشخیص داده شده که ۲۱ عکس به درستی و ۴ عکس به غلط تشخیص داده شده است. برای عکس های شامل یک خودرو، ۵۲ عکس تشخیص داده شده که از این میان ۱۹ عکس به نادرستی و ۳۳ عکس به درستی تشخیص داده می شوند. برای عکس هایی که شامل چند خودرو بودند در مجموع ۳۰ عکس تشخیص داده شده که از میان آن ها ۱۳ عکس به درستی و ۱۷ عکس به نادرستی تشخیص داده شده اند.

با استفاده از نتایج بالا درصد درستی برای مجموعه مورد بررسی به قرار زیر است:

بدون خودرو شامل یک خودرو شامل چند خودرو در کل
۸۴٪ ۶۳.۴۶٪ ۴۳.۳۳٪ ۶۲.۶۱٪

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

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

بهبود روش مورد استفاده

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

بهبود اول - اعمال فیلتر های مختلف

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

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

البته به دلیل این که فیلتر حساس باعث می شد تعداد عکس های که شامل خودرو نبودند اما به اشتباه ، شامل خودرو مورد تشخیص قرار می گرفتند زیاد شود، بر آن شدیم تا از مجموع جواب های حاصل در چهار فیلتر برای پاسخ گویی استفاده کنیم. به طور مثال اگر برای یک عکس فیلتر ۱ و ۴ نتیجه وجود خودرو ، و فیلتر ۲و ۳ نتیجه ی عدم وجود گرفتند ما فرض میکنیم در عکس خودرو وجود دارد زیرا در برنامه فرض کردیم اگر از چهار بررسی تعداد دو یا بیشتر به نتیجه وجود خودرو منجر شد خودرو در تصویر وجود دارد.

بهبود دوم - بهبود یادگیری اولیه

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

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

نتایج حاصل

در زیر جدولی از نتایج قبلی و نتایج حاصل شده بعد از بهبود اول، بهبود دوم ( به صورت جداگانه ) و هر دو بهبود آورده شده است. ( توجه شود: داده های مورد بررسی همان داده های بررسی شده در قسمت قبل هستند.)

در جدول زیر درصد درستی آمده است.

روش بدون خودرو شامل یک خودرو شامل چند خودرو
روش اولیه ۸۴٪ ۶۳.۴۶٪ ۴۳.۳۳٪
بهبود اول ۸۱٪ ۶۶.۳۴٪ ۴۴.۲۶٪
بهبود دوم ۸۶.۶۴٪ ۶۴.۳٪ ۴۱.۴۹٪
بهبود اول و دوم ۸۵.۹٪ ۷۰.۱۴٪ ۴۵٪

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

روش های نوین

روش پیشنهادی برای تشخیص خودرو در تصویر، روش الگوریتم ژنتیک است. زیرا این روش بدون نیاز به دانش اولیه و مداخله انسان قابل پیاده سازی است. همچنین در زمینه هایی مانند شناسایی خودرو، شناسایی صورت و شناسایی هواپیما در تصویر این روش به دقت ۱۰۰٪ رسیده است.

نوین ترین الگوریتم مطرح شده برای تشخیص اشیا به طور عمومی14، الگوریتم ECO feature می باشد. اساس کار این روش الگوریتم ژنتیک است. از آن جا که توضیح این روش بسیار بسیط و مفصل است برای مشاهده مقاله مربوط به این روش می توانید به مقاله ی A feature construction method for general object recognition مراجعه فرمایید.

مراجع

  • Computational method of feature selection, Edited by Huan Liu & Hiroshi Motoda


  1. Labeling

  2. Automotive Safety

  3. Video Indexing

  4. Tracking

  5. Recognition by part

  6. Appearance-based method

  7. Feature-based method

  8. Interpretation trees

  9. Hypothesize and test

  10. Pose consistency

  11. Pose clustering

  12. Feature Selection

  13. Training

  14. General object recognition

محمد غضنفری

روند کلی کارتان خوب است ولی انتظار می رفت مراجع بیشتری را بررسی می کردید.

تایید شده

بسم الله الرحمن الرحیم

توضیحات کامل و خوب است .

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

به نظر می رسید قرار است در قسمت کارهای مرتبط توضیحی در مورد سایر روش ها نیز وجود داشته باشد . تا جایی که بنده متوجه شدم ، توضیحات این بخش(سایر روش ها) بسیار مختصر است.

ضمنا بهتر است توضیحات به گونه ای باشد که برای شخصی بدون هیچ گونه اطلاعات اولیه در این زمینه نیز مفید واقع شود. برای مثال می توان برای مفاهیمی مانند الگوریتم ژنتیک یا ECO feature که در شرح روش پیشنهادی استفاده شده اند ، توضیحی مختصر ارائه داد .

نمره ای که بنده به این پروژه می دهم پنج است چون به نظرم ضعف هایی که در بالا ذکر شد ، با وجود تلاشی که برای کد زنی انجام شده و امتیاز مثبت برنامه نویسی در این بخش جبران می شود.

محمد غضنفری

به طور کلی کارت خوب بود برای این فاز ولی به این چندتا نکته توجه داشته باش:

  • تو متنت از کلمات و ترکیبات انگلیسی زیاد استفاد ه کردی که میتونی خیلی از اونها رو بیاری تو پاورقی

  • به نظر میاد باید متنت رو قبل از اینکه نهایی کنی یه بار بخونیدش تا مرتب تر باشه. مثلا تو دو خط پشت سر هم یکبار از "ژنتیک الگوریتم" و یک بار از "الگوریتم ژنتیک" استفاده شده که من دومی را ترجیح می دهم.

  • فرق روش استفاده شده و روش پیشنهادی چیه؟ در واقع من فرق دو تا روش را می دونم منظورم اینه که چرا به به اولی گفتی روش استفاده شده و به بعدی گفتی روش پیشنهادی؟ یعنی تو روش اول رو پیشنهاد نمی کنی؟ پس چرا پیاده سازی کردیش؟ تو انتخاب اسم برای بخش های متنت دقت کن

  • توضیح به درد بخوری در مورد کدت ندادی. به نظرم باید ساختار کدت رو شرح می دادی و بعضی از توابع اصلی رو هم بهتر بود توضیح بدی. ضمنا ننوشتی چقدر از این کد کار خودته

موفق باشی و امیدوارم برای فاز بعد این مشکلات اندک هم حل بشه

تایید شده

مشکلات پیش روی پروژه به خوبی اشاره شده است (زاویه خودرو،تنوع خودرو و ...).روش انجام پروژه توضیح داده شده اما اگر با جزییات بیشتری ارائه میشد به خواننده کمک بیشتری میکرد.لینک کد در گیت هاب نیز در پروژه قرار داده شده است. ارزیابی با دقت و جزئیات کافی و خوب به ثبت رسیده.استفاده از نمودار هم برای ارزیابی کمک خوبی برای درک بهتر کرده است.بهتر بود تست پروژه روی بیشتر از یک عکس اجرا و نتیجه آن نمایش داده میشد.

تایید شده

بسيار خوب هم از نظر مرتب نويسي هم از نظر مطالب علمي.
اگر توضيحات مختصر نميشدشاهد يك پروژه بسيار كاملتر مي بوديم!
در كل خوب بود. موفق باشيد

محمد غضنفری

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

رد شده

توضیحات کامل و جامع بود

رد شده
تایید شده

سلام علیکم!

  • در بخش مقدمه ->
    چالش ها : کم بودن کیفیت تصاویر هم یک چالش است. اضافه کنید!
    درمورد کاربرها، بیشتر توضیح می دادید.( بهتر بود اول متن کارهای مرتبط تان در بخش مقدمه بیاید)

  • ترجمه ها خیلی دقیق و خوب و با پانویس ذکر شده. خیلی خوب است این!

  • کد بسیار خوب و تمیز است. همچنین از ابزار قدرتمندی برای کار استفاده شده است. فقط اگر کد فاز دوم و سوم و ... با هم تفاوت اساسی دارد بهتر بود در branch های جداگانه نگهداری می کردید.

  • روش استفاده شده را بسیار کم توضیح دادید. بهتر بود در مورد Haar-like features و Cascade Classifier Training هم در متن خود توضیح می دادید.

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

  • فلسفه قرار دادن جدول، جلوگیری از نوشتن متن زیاد است!:دی

  • خیلی جالب است که با اعمال دو فیلتر با هم، نتایج خیلی بیشتر از انتظار بهبود یافته است. من دلیل منطقی این موضوع را نفهمیدم. شاید این موضوع، تصادفی و به خاطر این باشد که تعداد دیتاست شما کم است و تغییر در یک نتیجه، حدود یک درصد در نتیجه کار تغییر ایجاد می کند.

  • روش نوینی که توضیح دادید بسیار جالب و عجیب است که به دقت 100 درصد رسیده! مقاله ای که درباره آن گذاشتید خیلی جالب است. ممنون

با تشکر و آرزوی موفقیت:)

تایید شده

بهتر بود مراجع را در متن ارجاع میدادید
در قسمت ارزیابی استفاده از نمودار ایده خوبی بوده ولی بهتر بود نمونه هایی از عکس های تست شده را به عنوان پیوندهای مفید می اوردید
کارهای مرتبط توضیحات کمی دارد ولی نکته مثبت این است که روش های مختلف را ذکر کردید
پروژه از لحاظ نگارشی کامل و بدون خطا میباشد ولی بهتر بود، روش های استفاده شده را بیشتر توضیح میدادید
readme خوبی نوشته اید که کار را برای خواننده اسان میکند
بهبود پروژه با استفاده از روش های ذکر شده باعث بهبودی نتایج در این فاز شده است که نشان از عملکرد خوب شماست .

رد شده

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

رد شده

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