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

تغییرات پروژه از تاریخ 1396/10/07 تا تاریخ 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]
در نهایت می‌بینیم روش‌های مطرح شده **مشابهت **زیادی دارند.مثلا ممکن است برداشت شود روش اول و چهارم  یا روش دوم و پنجم مثل هم عمل می‌کنند که برداشت غلطی نیست،اما درمقاله‌های مختلف از زوایای متفاوتی به این روش‌ها نگاه شده‌است.
اما در کل می‌توان این روش‌ها را در روش سوم ، چهارم ، پنجم و ششم به صورت خلاصه طبقه بندی کرد.

# ۳. آزمایش‌ها
**داده‌ها**
در این بخش داده‌های استفاده شده تعدادی فیلم mp4  هستند که از فیلم‌های گرفته‌شده توسط دوربین های موجود در اتوبان‌ها یا در خیابان‌ها تهیه‌شده‌اند.
با توجه به محدود بودن  فیلم‌های اتوبان ، این فیلم‌ها طوری انتخاب شده‌اند که بتوان کد پیاده‌سازی‌شده را در موقعیت‌های  متنوع آزمایش نمود.
از تنها [سایتی](https://pixabay.com/) که فیلم‌های رایگان و مناسب‌تری برای آزمایش داشت چهارده فیلم با ویژگی‌های مختلف برای آزمایش انتخاب شدند. 
از این ویژگی‌ها می‌توان موارد زیر را نام برد:
+ زاویه متفاوت دوربین
+ محو بودن بخشی از تصویر
+ تنوع حجم ترافیک 
+ دور یا نزدیک بودن دوربین از اتوبان و خیابان
+ سریع بودن یا سرعت عادی داشتن فیلم 
+ روز یا شب بودن 
+ یک طرفه یا دو طرفه بودن مسیر
+ ثابت بودن یا متغیر بودن زاویه دوربین
+ وجود یا عدم وجود خودروهای ثابت (پارک شده) در فیلم 
+ میزان نور 
+ کیفیت دوربین 

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

	void drawBlobInfoOnImage(std::vector<Blob> &blobs, cv::Mat &imgFrame2Copy)

	void drawAndShowContours(cv::Size imageSize, std::vector<Blob> blobs, std::string strImageName);


	void addNewBlob(Blob &currentFrameBlob, std::vector<Blob> &existingBlobs);



![شکل(8) نمونه قالب های استخراج شده از  فیلم در یک لحظه](https://boute.s3.amazonaws.com/246-carrr.jpg)

![شکل(9) خروجی با توجه به قالب های استخراج شده در شکل 8](https://boute.s3.amazonaws.com/246-carr.jpg)
برای پیاده‌سازی این روش ابتدا لازم است کتابخانه‌ی OpenCV-3.4.0 روی سیستم نصب شده باشد.در ضمن این پیاده‌سازی به زبان ++Cاست و باید در محیط      Visual Studio 2015 اجرا شود. البته [نصب](https://www.youtube.com/watch?v=RbKpPmpvJa0) openCV  باید با دقت انجام شود تا کد به درستی عمل کند. بعد از ایجاد فایل‌های پروژه در VisualStudio 2015  هم باید projectproperties  تنظیم شود تا کتابخانهopenCV ضمیمه پروژه بشود. حال در ادامه با آزمایش‌های متعدد روی داده هایمان دقت این روش را بررسی می‌‌نماییم.
لازم به ذکر است برای ارزیابی این پیاده‌سازی چون داده‌ی ورودی فیلم است ارزیابی کمّی تا حدی پیچیده‌ است، چون معیار مشخصی برای بررسی عملکرد صحیح برنامه وجود ندارد. می‌توان معیار‌های مختلفی تعریف کرد ازجمله:

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

پس از آزمایش این فیلم‌ها که هریک ویژگی‌خاصی داشت نتایج زیر حاصل می‌شود:

1) زمانی‌که در فیلم ‌ها دو یا چند خودرو فاصله‌شان از حدی کمتر شود یک کادر دور آن‌ها کشیده ‌می‌شود یعنی تشخیص خودرو‌های نزدیک به
هم ممکن نیست.
![شکل (10) نمونه خروجی ناکارا به علت فاصله کم خودروها](https://boute.s3.amazonaws.com/246-car2.jpg)
2) زمانی‌که دوربین حرکت کند دو حالت پیش می‌آید:
 + اگر حرکت آن لرزشی و لحظه ای باشد خطای لحظه‌ای در آن پیش می‌آید یعنی ممکن است دور سایر اجسام که متحرک نیستند یا دور یکی از اجزاء
خودرو برای چند لحظه کادر بکشد.
 + اگر دوربین کلا ثابت نباشد و متحرک باشد خطا خیلی زیاد است و سیستم ناکارآمد می‌باشد.
 ![شکل(11) نمونه خروجی ناکارا به علت متحرک بودن دوربین](https://boute.s3.amazonaws.com/246-car3.jpg)
3) اگر تصویر از حدی بیشتر محو باشد تشخیص برای ماشین سخت است و خودر‌و‌های کمتری تشخیص داده‌می‌شوند.
4)زمانی‌که سرعت تصویر متعادل باشد و خودرو‌ها فاصله مناسب داشته‌باشند خروجی مناسب و قابل قبولی به‌دست‌می‌آید.
![شکل (12) نمونه خروجی مناسب ](https://boute.s3.amazonaws.com/246-car4.jpg)
5)زاویه دوربین و میزان نور تصویر در عملکرد برنامه بی‌تاثیر است.
![شکل(13) نمونه خروجی مناسب](https://boute.s3.amazonaws.com/246-car1.jpg)
6)اگر فیلم در شب بررسی شود از طریق چراغ‌های خودرو که روشن هستند حرکت خودرو تشخیص داده‌می‌شود اما اگر خودرو اصلا دیده‌نشود و
محو باشد کادر خروجی کوچکتر از اندازه‌ی خودرو است.
7) تا زمانی‌که فیلم وضوح داشته باشد فاصله دوربین از خیابان تاثیری در نتیجه ندارد.
8)زمانی‌که  سرعت فیلم از حدی بیشتر شود خطا زیاد شده و کارایی پایین می‌آید.
9)مشخص است که خودروهایی که پارک شده یا بی حرکت هستند در خروجی ظاهر نمی‌شوند.
10)یک یا دوطرفه بودن خیابان تاثیری در نتیجه ندارد.

کد پیاده سازی شده و توضیحات مربوط به اجرای آن در [گیت هاب](https://github.com/atisa/atieh_sarvi74) بارگذاری شده‌است.
به علت حجیم بودن فایل‌های تست شده فقط چند فایل mp4 سبک برای تست پروژه روی سایت  در فایل زیپ قرار گرفته است که قابل استفاده است. اما چندفایل دیگر را هم میتوانید از لینک های [20] ,[21]  ,[22]  , [23]بارگذاری کرده و تست کنید.

# ۴. کارهای آینده

برای این قسمت از روشی ساده برای آزمایش استفاده شده‌است که مبتنی بر ویژگی‌های  Cascade HAARمی‌باشد.ابزار لازم برای انجام این آزمایش‌ها یک کامپایلر برای پایتون 2.7 است که می‌توانید ازPycharm استفاده کنید. همچنین برای پیاده‌سازی این روش لازم است از کتابخانه openCV استفاده‌شود .
برای آشنایی با نحوه نصب و کار با ابزار مورد نیاز می‌توانید از این [لینک](https://github.com/MicrocontrollersAndMore/OpenCV_3_Windows_10_Installation_Tutorial) استفاده کنید.
**داده‌ها**
برای انجام آزمایش در برخی از مقاله‌ها فقط از تصاویر شامل یک خودرو و فاقد خودرو استفاده‌شده است.علاوه بر این‌ها در این پژوهش  تصاویر شامل چند خودرو هم مورد بررسی قرار گرفته‌اند اما تصاویری که شامل خودروهای بسیار زیاد هستند خروجی مناسبی ندارند و ارزیابی نشده اند..
 این تصاویر از زوایای مختلف کد را مورد آزمایش قرار داده‌اند.
 برای دریافت کد و چند نمونه داده  ورودی از این [لینک گیت هاب](https://github.com/atisa/hh.git) استفاده کنید.[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)