تشخیص خودرو در تصویر

تغییرات پروژه از تاریخ 1396/11/11 تا حالا
در این پژوهش از شما خواسته شده است که با دریافت تصویر ورودی، خودروهای موجود در آن را شناسایی کنید. با این کار گام اول را در طراحی یک سیستم نظارت ترافیکی شهری برداشته‌اید، مثلا برای ثبت تخلفات رانندگی.![ماشین‌های پیدا شده، با مستطیل سبز رنگ مشخص شده‌اند](https://camo.githubusercontent.com/f4c7a21bad5eded51ccfc760595d001263feb44b/687474703a2f2f626179616e626f782e69722f69642f3732303636383238383632393032303533343f76696577)

# ۱. مقدمه

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

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

1)سیستم‌های کنترل ترافیک (برای مثال بررسی حجم ترافیک یا شناسایی متخلفین ) [3][16]
2)برنامه‌ریزی شهری[3] [6][16]
3)برای شناسایی یک خودرو که عکس آن در خیابان گرفته شده‌است[2]
4)خودرو‌های بدون راننده
5)هر سیستمی که قصد هدایت خود را در خیابان و محیط‌های شامل خودرو دارد
6)مدیریت پارکینگ‌ها با اعلام ورود خودرو به مکان مورد نظر توسط ماشین(یا برای مثال برای باز کردن اتوماتیک در پارکینگ هنگامی‌که خودرو در مقابل آن قرار می‌گیرد)
7)در صورتی‌که ویژگی‌های خودرو مانند رنگ،مدل،شمارپلاک و غیره را بتوان توسط ماشین شناسایی کرد می‌توان برای تشخیص خودروی سرقت شده، متخلف
و یا هر موردی که در تعقیب است از آن استفاده کرد.[3]

پیدا کردن خودرو در تصویر کمی پیچیده است،زیرا برای مثال صورت انسان ساختار ساده‌تر و انعطاف‌پذیری کمتری دارد[1]، اما خودرو‌ها شکل‌ها و  رنگ ها مدل‌های بسیار متفاوتی دارند چون طراحی‌شان با یکدیگر متفاوت است[4].همچنین بررسی خودرو‌ها در شرایط متفاوت آب و هوایی و در روز و شب باهم متفاوت است .انتظار  می‌رود که خودرو‌ها مستقل از زاویه دید [^view] شناسایی شوند.برای این کار باید ماشین را برای تشخیص خودرو از زوایای مختلف تعلیم داد[1].

![شکل(1) تصویر شامل خودرهای مختلف و خروجی مورد نظر ما که خودروها با کادر قرمز مشخص شدند](https://boute.s3.amazonaws.com/246-photo_2017-11-17_23-13-13.jpg)
# ۲. کارهای مرتبط
در این زمینه در بخش‌های مختلفی مانند پیدا کردن خودرو در عکس ، فیلم ، تصاویر متحرک و غیره پژوهش‌های گوناگون انجام شده است.در این بخش به‌طور خلاصه روش‌های اصلی و مهم که استفاده بیشتری از آن‌ها شده‌،ذکر شده اند:
 * در روش  اول اشیاء  دودویی[^binary] در یک چارچوب آماری طبقه‌بندی می‌شوند.سپس مجموعه‌ای از ویژگی‌ها بررسی و ارزیابی می‌شود.در نهایت به چارچوب لازم برای طبقه‌بندی عکس می‌رسیم. در این روش در واقع یک **طبقه بندی سلسله مراتبی جامع **برای خودرو انجام می‌شود که بتوان به وسیله آن  تشخیص داد که قسمت مورد نظر جزئی از خودرو است یا خیر.[1]
 ![شکل(2) این تصویر پرمعنی ترین نقاط کلیدی خودرو را  با رنگ قرمز و نقاط کلیدی زمینه را با رنگ سبز نمایش می دهد.](https://boute.s3.amazonaws.com/246-photo_2017-11-17_18-10-13.jpg)
* روش دوم استفاده از  تکنیک‌های [بینایی کامپیوتر](https://en.wikipedia.org/wiki/Computer_vision) [^computer vision] است  . باید با آنالیز داده با استفاده از تصاویر زیاد به الگوریتم آموخته‌شود در کدام تصاویر خودرو وجود دارد یا وجود ندارد.سپس *ویژگی‌های پرمعنا* را از تصویر استخراج شود.سپس ماشین  تشخیص می‌دهد که خودرو کجا قرار دارد یا اینکه اصلا وجود ندارد.[5]  [8] [13]  ![شکل(3) آنالیز تصویر](https://boute.s3.amazonaws.com/246-photo_2017-11-17_21-22-10.jpg)
* در روش  سوم دنباله ای از تصاویر شامل خودرو موجود است،یعنی فرض  می‌شود صحنه پویاست. ماشین برای یافتن خودرو سه  راه دارد: 1)با متدهای مشخص زمینه را حذف کند2)ویژگی‌ها را با متدهایی استخراج کند3)با استفاده از متدهایی ،قالب‌های متفاوت را در تصویر از یکدیگر جدا کند و اجسام متحرک را در تصویر تشخیص دهد.[6][12]![شکل(4) شناسایی اجسام متحرک](https://boute.s3.amazonaws.com/246-photo_2017-11-17_21-42-02.jpg)![شکل(5)شناسایی اجسام متحرک](https://boute.s3.amazonaws.com/246-photo_2017-11-17_22-55-24.jpg)
* روش چهارم استفاده از ویژگی‌های Haar-like است که ایده اصلی آن به این شرح است:با توجه به ویژگی‌های ساده‌‌ای که طبقه‌بندی کننده در چند مرحله ساماندهی کرده‌است یک شیء به صورت آبشاری تعریف می‌شود(یا به صورت پله پله).سیستم  پیشنهادی  بر اساس [شبکه عصبی مصنوعی](https://en.wikipedia.org/wiki/Artificial_neural_network)  [^ANN]کار  می‌کند.   [7] [9][14][15]![شکل(6) شناسایی چهره  با استفاده از  ویژگی مذکور در مراحل مختلف](https://boute.s3.amazonaws.com/246-photo_2017-11-17_23-26-26.jpg)

* روش پنجم طراحی طبقه‌بندی‌کننده[^classifier]ای است که بتواند تشخیص دهد در تصویر ماشینی وجود دارد یا خیر.تفاوت این روش با روش دوم در این است که در این روش علاوه‌بر ویژگی‌های شکلی جسم، هم از ویژگی‌های **رنگ و شکل** و هم از ویژگی‌های**رنگ به تنهایی** استفاده می‌شود. مجموع این اطلاعات برای طبقه‌بندی تصویر کافی است.[10]
 در مقاله‌‌ی  [16] با استفاده از[یادگیری عمیق](https://en.wikipedia.org/wiki/Deep_learning) [^Deep Learning]سعی بر پیدا‌کردن و شمردن خودرو‌ها از روی عکس‌های هوایی اتوماتیک[^UAV Imagery]شده‌است.اما از الگوریتم‌های خاصی برای افزایش کارایی استفاده‌ شده‌است.روش‌های یادگیری عمیق برای استخراج ویژگی‌ها [^features]نیاز به حجم داده [^data] بالا دارد اما در مقاله ذکر شده با متدهای خاص آموزشی  ویژگی ها استخراج شده اند و در SVM وظیفه یادگیری را بر عهده دارد که به علت پیچیدگی از آن می‌گذریم.
![شکل(7) نمودار متد مورد نظر به کمک یادگیری عمیق](https://boute.s3.amazonaws.com/246-photo_2017-11-19_23-48-40.jpg)
در شکل 7، CNN در واقع   شبکه عصبی پیچیده[^ convolutional neural network ] و SVM  ماشین بردار پشتیبانی[^support vector machine]  هستند.

* در روش ششم ابتدا اندازه‌ و زاویه‌ی بردار گرادیان همه‌ی پیکسل‌های تصویر محاسبه می‌شود،سپس پیکسل‌های غیرماکزیمم و  پیکسل‌های با اندازه‌ی گرادیان ضعیف حذف می‌شوند. در مرحله بعد پیکسل‌های باقی‌مانده بر اساس زاویه گرادیان در دو سطح افقی و عمودی چند‌سازی می‌گردند. بعد ضرایب خود‌همبسته نگار لبه در هر سطح محاسبه ‌می‌شوند.حال یا ویژگی‌های به‌دست‌آمده با توجه به آموزشی که به ماشین داده‌شده تشخیص می‌دهد که در صحنه خودرو حضور دارد یا نه.[11]
در نهایت می‌بینیم روش‌های مطرح شده **مشابهت **زیادی دارند.مثلا ممکن است برداشت شود روش اول و چهارم  یا روش دوم و پنجم مثل هم عمل می‌کنند که برداشت غلطی نیست،اما درمقاله‌های مختلف از زوایای متفاوتی به این روش‌ها نگاه شده‌است.
اما در کل می‌توان این روش‌ها را در روش سوم ، چهارم ، پنجم و ششم به صورت خلاصه طبقه بندی کرد.

# ۳. آزمایش‌ها

برای این قسمت از روشی ساده برای آزمایش استفاده شده‌است که مبتنی بر ویژگی‌های  Cascade HAARمی‌باشد.ابزار لازم برای انجام این آزمایش‌ها یک کامپایلر برای پایتون 2.7 است که می‌توانید ازPycharm استفاده کنید. همچنین برای پیاده‌سازی این روش لازم است از کتابخانه openCV استفاده‌شود .
برای آشنایی با نحوه نصب و کار با ابزار مورد نیاز می‌توانید از این [لینک](https://github.com/MicrocontrollersAndMore/OpenCV_3_Windows_10_Installation_Tutorial) استفاده کنید.
**داده‌ها**
برای انجام آزمایش در برخی از مقاله‌ها فقط از تصاویر شامل یک خودرو و فاقد خودرو استفاده‌شده است.علاوه بر این‌ها در این پژوهش  تصاویر شامل چند خودرو هم مورد بررسی قرار گرفته‌اند اما تصاویری که شامل خودروهای بسیار زیاد هستند خروجی مناسبی ندارند و ارزیابی نشده اند..
 این تصاویر از زوایای مختلف کد را مورد آزمایش قرار داده‌اند.
 برای دریافت کد و چند نمونه داده  ورودی از این [لینک گیت هاب](https://github.com/atisa/hh.gitatieh_sarvi74/tree/master/car_detection_ai) استفاده کنید.[26]

**روش پیاده‌سازی شده و گزارش نتایج**
توضیحات:
در کتابخانه openCV تابعی به نام CascadeClassifier از روی تصاویری که به آن به صورت ورودی می‌دهیم تعلیم می‌بیند و قابلیت تشخیص اشیا را پیدا می‌کند، به این صورت که باید با تصاویر مثبت (در اینجا به معنی وجود خودرو در تصویر) و تصاویر منفی ( یعنی تصاویری که شامل هیچ خودرویی نیستند ) تعلیم داده‌شود ، تا ویژگی‌های خودرو را استخراج و طبقه بندی  کند. در اینجا با فایل [cars.xml](https://gist.github.com/199995/37e1e0af2bf8965e8058a9dfa3285bc6) ماشین تعلیم داده می‌شود.

	import cv2
	car_cascade = cv2.CascadeClassifier('cars.xm');

هرویژگی با تفریق مجموع پیکسل‌های مستطیل سفید از مجموع پیکسل‌های مستطیل سیاه به شکل زیر به‌دست‌می‌آید.

![شکل(8) ویژگی های HAAR](https://boute.s3.amazonaws.com/246-Untitled.jpg)
![شکل(9) ویژگی های استخراج شده و ویژگی هایی که روی خودرو پیدا شده است](https://boute.s3.amazonaws.com/246-qqq.jpg)
بعضی از این ویژگی‌ها برای تشخیص مفید هستند که از آن‌ها استفاده می‌شود.تابع [CascadeClassifier](https://docs.opencv.org/2.4/modules/objdetect/doc/cascade_classification.html)   در هر مرحله روی قسمتی از عکس چند ویژگی‌ مختلف را آزمایش می‌کند تا آن قسمت به عنوان شیء مورد نظر تایید یا رد شود ،سپس به سراغ قسمت‌های دیگر رفته و این کار را تکرار می‌کند تا یک شیء را شناسایی کند.

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

	img = cv2.imread('NameOfInputFile' ,1)
	gray =cv2.cvtColor( img , cv2.COLOR_BGR2GRAY)
	cars = car_cascade.detectMutiScale(gray , 1.2 , 1)
بعضی مواقع لازم است برای به‌دست آوردن خروجی بهتر پارامتر مقیاس تابع  detectMultiScale  غییر کند (بین 1.1 ، 1.2 و 1.3).
پس از شناسایی با یک حلقه ساده دور خودرو‌های شناسایی شده یک مستطیل کشیده می‌شود و تصویر خروجی نهایی نشان داده می‌شود.


**نمونه خروجی‌های صحیح**

![شکل 10: نمونه خروجی مناسب](https://boute.s3.amazonaws.com/246-photo_2018-01-30_23-18-06.jpg)
![شکل 11: خروجی مناسب](https://boute.s3.amazonaws.com/246-photo_2018-01-30_23-28-29.jpg)
**اما بسیاری از خروجی ها با توجه به پارامترهای مختلف قابل قبول نیستند**
![شکل 12: نمونه خروجی نامناسب و غیردقیق](https://boute.s3.amazonaws.com/246-photo_2018-01-30_23-39-43.jpg)
![شکل 13: نمونه خروجی غلط](https://boute.s3.amazonaws.com/246-KLJKJI.jpg)

**نحوه ارزیابی**
درصد های مربوط به درستی عملکرد از رابطه زیر به دست می آید.
![فرمول به دست آوردن درصد پاسخ های صحیح ، صورت کسر نتایج صحیح و مخرج مجموع نتایج صحیح و غلط](https://boute.s3.amazonaws.com/246-dddd.jpg)

برای داده‌های ورودی  از 34 تصویراستفاده شده‌است که 13 عدد از این تصاویر شامل 1 خودرو ، 11 عدد شامل بیش از 1خودرو و 10 عدد بدون خودرو هستند. نتایج آزمایش در جدول (1) قابل ملاحظه است.
![جدول(1) نتایج درست ](https://boute.s3.amazonaws.com/246-1111.jpg)
**بهبود نتایج**
برای بهبود نتایج می توان از فیلتر های خاص استفاده کرد و دقت را بالا برد ، اما راه دیگر استفاده از یک طبقه بندی کننده با روشی متفاوت است که در ادامه به  این موضوع پرداخته شده است:
بررسی ویژگی‌های [الگوهای دودویی محلی](http://ieeexplore.ieee.org/abstract/document/5427137/) [^LBP]  روش دیگری برای به‌دست‌آوردن خروجی است.این ویژگی‌ها بسیار شبیه به ویژگی‌های HAARاست و همانند آن از خانواده‌ی ویژگی‌های آبشاری می‌باشد.
تصویر به تعداد مشخصی پیکسل تقسیم می‌شود و برای هر پیکسل  8 پیکسل که اطراف آن را فراگرفته  مانند شکل در نظر گرفته‌می‌شوند به این صورت که اگر پیکسل همسایه از پیکسل مرکزی بزرگتر یا مساوی آن بود عدد آن یک می‌شود در غیر این صورت صفر می‌شود که در این صورت یک عدد دودویی به
دست‌می‌آید.[25]
![شکل 14: ویژگی LBP](https://boute.s3.amazonaws.com/246-aaaa.jpg)
![شکل 15 : تصویر با ویژگی الگوی دودویی محلی](https://boute.s3.amazonaws.com/246-vgghnjk.jpg)
تعلیم دادن این سیستم مانند سیستم قبلی با تصاویر مثبت و منفی است با تفاوت اینکه وضوح این تصاویر اعداد مشخصی هستند یعنی 64 در  64 یا 128 در128 یا 256 در 256. این طبقه‌بندی کننده در برخی موارد خروجی را بهبود می‌بخشد و موثر است.
![شکل 16: نمونه نحوه تعلیم _ با تصاویر مثبت و منفی](https://boute.s3.amazonaws.com/246-gggg.jpg)

 نمونه خروجی با استفاده از روش بهبود یافته :
![شکل 17 : خروجی بهبود یافته](https://boute.s3.amazonaws.com/246-JJJJJ.jpg)
![شکل 18 : نمونه خروجی بهبود یافته](https://boute.s3.amazonaws.com/246-ESDRFGHJKL.jpg)

![جدول(2) نتایج درست ](https://boute.s3.amazonaws.com/246-22222.jpg)
همانطور که ملاحظه می‌شود مقایسه جدول 1 و 2  نشان می‌دهد که در تصویر‌هایی که شامل  یک یا چند خودرو بودند نتایج بهبود نیافته اما تشخیص درست
در تصاویری که شامل خودرو نیستند به 100% رسیده‌است که بهبود چشمگیری  می‌باشد.پس بهبود ایجاد شده شامل تصاویر بدون خودرو می باشد.
در کل در می بینیم که در برخی موارد Haar  دقت بیشتری دارد اما برای تشخیص عدم وجود خودرو استفاده از LBP  بهتر است. اما از طرفی چون LBP  با اعداد صحیح کار می کند سرعت بیشتری دارد پس بهتر است وقتی هدف افزایش سرعت است از آن استفاده شود. از طرفی هم فایل آموزشی LBP  سبکتر است که می تواند مزیتی برای آن به حساب بیاید.
![نمودار1 : صحت روش های مختلف](https://boute.s3.amazonaws.com/246-bbbb.jpg)
  در پژوهش [25] نمودار 1  به چشم می خورد که ادعای فوق را تایید می کند. همانطور که مشاهده می شود  در قسمتی از نمودار نسبت پاسخ های صحیح LBP  بالاتر است اما در کل روش Haar  دقیق تر و بهتر است .اما مشاهده می شود که Cascade LBP GPU  خیلی دقیق تر از  انواع   HAAR است که این موضوع هم می تواند به عنوان کارهای آینده مورد بررسی قرار گیرد. اما یک توضیح کلی برای آن این است که سرعت پیدا کردن شیء در آن بسیار بالا می باشد.برای اطلاعات بیشتر به [27] مراجعه نمایید.
# ۴. کارهای آینده

پیاده‌سازی واستفاده از ماشین‌های بردار پشتیبان می‌تواند نتایج بسیار دقیقتری نسبت به روش‌های پیشین ارائه دهد. ماشینهای بردار پشتیبان، الگوریتم های
بسیار قدرتمندی در دسته بندی و تفکیک داده ها هستند بخصوص زمانی که با سایر روشهای یادگیری ماشین مانند روش جنگل تصادفی تلفیق شوند. این روش برای جاهایی که با دقت بسیار بالا نیاز به ماشینی داده ها داریم، به شرط اینکه توابع نگاشت را به درستی انتخاب کنیم، بسیار خوب عمل می کند .
![شکل 19](https://boute.s3.amazonaws.com/246-Untitled2.jpg)
همچنین می‌توان از روش‌های دقیق تر دیگر هم مانند الگوریتم‌های ژنتیک استفاده کرد.[24]
دقت این روش در حدی است که مقالات زیادی در مورد خودروهای بدون راننده‌ای که توسط این الگوریتم خود را هدایت ‌می‌کنند تالیف شده‌است.
با توجه به مقالات بررسی شده دیده‌می‌شود که  دقیق‌ترین نتایج با استفاده از الگوریتم‌هایی به‌دست آمده است که پژوهشگران به نحو مناسبی آن را تعلیم داده‌اند و به شکل بهینه استفاده نموده‌اند.[16]
# ۵. مراجع
[1] B.Leung, Component-based Car Detection in Street Scenes Images ,Department of Electrical Engineering and Computer Science , 2004
[2] S.Yamaguchi, A Car Detection System Using the neocognitron  , IEEE International joint conference  on, Singapore , 2002
[3] T.Tang ,S.Zhou, Z.Deng, H.Zou, L.Lei ,Vehicle Detection in Aerial Images  Based on Region Convolutional  Neural Networks and Hard Negative Example Mining , Sensor ,2017
[4] S.Cheung,A.Chu , Make And Model Recognition of Cars,Department of Computer Engineering University of California ,San Diego , 2008
[5]https://chatbotslife.com/vehicle-detection-and-tracking-using-computer-vision-baea4df65906
[6]R.Hadi ,G.Sulong ,E.George , Vehicle Detection  And Tracking Techniques:A Concise Review , Malaysia,Iraq,2014
[7]M.Oliveria,V.Santos,Automatic Detection of Cars in Real Roads using Haar-like Features, Department of Mechanical Engineering, University of Aveiro ,Portugal ,2008
[8] https://github.com/JunshengFu/vehicle-detection
[9]https://github.com/andrewssobral/vehicle_detection_haarcascades
[10]https://github.com/NikolasEnt/Vehicle-Detection-and-Tracking
[11] م.سعادتمند، یک روش جدید برای تشخیص خودرو در تصویر، کنفرانس توسعه کاربردهای صنعتی اطلاعات ارتباطات و محاسبات ، مشهد ، 1390
[12]https://github.com/andrewssobral/simple_vehicle_counting
[13]https://github.com/ckirksey3/vehicle-detection-with-svm
[14]A.Naba, B.Pratma,A.Nadhir ,Haar-like feature based-time neuro car detection system, Indonesia ,2016
[15] Y.Wang,Monocular Vehicle Detection and Tracking, Department of Electrical and Computer Engineering University of California, San Diego
[16]N.Ammour,H.Alhichri,Y.Bazi,B.Benjdira,N.Alajan,M.Zuair,Deep Learning Approach for Car Detection in UAV Imagery,Computer Engineering Department, College of Computer and Information Sciences, King Saud University,2017
[17]https://en.wikipedia.org/wiki/Computer_vision
[18]https://en.wikipedia.org/wiki/Artificial_neural_network
[19](https://en.wikipedia.org/wiki/Deep_learning
[20]https://pixabay.com/en/videos/cars-motorway-speed-motion-traffic-1900/
[21]https://pixabay.com/en/videos/roads-motorways-highway-1952/
[22]https://pixabay.com/en/videos/freeway-transportation-highway-road-6329/
[23]https://pixabay.com/en/videos/traffic-cars-via-road-2532/
[24]http://www.mdpi.com/2078-2489/6/3/339/pdf 
[25]http://www.mi.fu-berlin.de/inf/groups/ag-ki/publications/Online-vehicle-detection1/03411.pdf
[26]https://github.com/duyetdev/opencv-car-detection/blob/master/Vehicle%20detection.ipynb
[27]http://on-demand.gputechconf.com/gtc/2013/presentations/S3297-Efficient-Object-Detection-GPU-MB-LBP-Forest.pdf
**پیوندهای مفید**

+ [کتابخانه اپن‌سی‌وی](http://opencv.org/)

+ [اپن‌سی‌وی در پایتون](http://docs.opencv.org/trunk/doc/py_tutorials/py_tutorials.html)

+ [نصب اپن‌سی‌وی در ابونتو](https://help.ubuntu.com/community/OpenCV)

+ [شناسایی اجسام در تصاویر با اپن‌سی‌وی](http://achuwilson.wordpress.com/2011/07/01/create-your-own-haar-classifier-for-detecting-objects-in-opencv/)
+ [راهنمای نصب ابزار لازم برای اجرای کد](https://www.youtube.com/watch?v=RbKpPmpvJa0)