[GitHub](https://github.com/aryanbaghi/Car_Detection)
# مقدمه
تشخیص اشیا در تصویر یک عمل پر چالش است که بسیاری از محققین در حال حاضر به آن می پردازند. تشخیص و نام گذاری[^1] اشیا در عکس بسیار پر چالش است، زیرا تصاویری که داریم می تواند در شرایط بسیار متونعی باشد. به عنوان مثال برای تشخیص خودرو در تصویر چالش هایی که در پیش رو هستند عبارتند از :
+ تصاویر بسیار متونع از زوایای متفاوت از خودرو
+ گوناگونی در خودروها به عنوان مثال خودرو سواری ، اتوبوس و …
+ رنگ ها و طرح های متفاوت خودرو ها
+ تصاویر در شب یا روز
+ تصاویر در شرایط جوی متفاوت مانند برفی، بارانی یا آفتابی یا ابری
فایق آمدن بر چنین مشکلاتی در حالت کلی بسیار مفید خواهد بود و در زمینه هایی مانند ایمنی خودروها[^2]، فهرست گذاری ویدو[^3]، دنبال کردن اشیا در تصویر[^4] ، روباتیک و … بسیار سودمند خواهد بود.
اما تشخیص خودرو در تصویر چه سودمندی خواهد داشت؟
برای پاسخ به این سوال بد نیست به چند نمونه از کاربرد هایی که هم اکنون شاهد آن هستیم اشاره کنیم. به عنوان مثال دوربین های کنترل سرعت راهنمایی و رانندگی که در سطح شهر هستند با تشخیص جسم با سرعت بالاتر از حد مجاز عکسی میگیرند که ابتدا در آن عکس خودرو را تشخیص می دهند و سپس پلاک آن.
#کارهای مرتبط
تشخیص خودرو در بسیار از موارد کاربرد دارد که در اینجا به بخشی از آن اشاره میکنیم و روش های گوناگون تشخیص خودرو در تصویر و یا به طور کلی اشیا در تصویر را بررسی می کنیم.
برای تشخیص این که خودرو ای در محدوده ای ممنوعه پارک کرده است یا نه، تشخیص مدل خودرو، تشخیص خودرو در تصاویر هوایی وحذف آن از تصویر( همانند کاری که گوگل در گوگل مپ برای حذف انسان از تصاویر هوایی به علت حفظ حریم خصوصیشان انجام می دهد) می توان از این پروژه استفاده کرد. زیرا در تمامی موارد ذکر شده ابتدا باید محل خودرو در تصویر تشخیص داده شود سپس مراحل بعدی طی شود.
البته لازم به ذکر است که بعضی از تکنیک های مورد استفاده برای یافتن تصویر خودرو می توانند برای تشخیص اشیا دیگری در تصویر بکار روند مانند: تشخیص چهره و یا دوچرخه و ... زیرا در این زمینه ها چالش های تقریبا یکسانی وجود دارد.
رویکردهایی برای تشخیص اشیا در تصویر وجود دارد مانند: شناسایی با اجزا[^5] ، شناسایی بر اساس ظاهر[^6] و شناسایی بر اساس ویژگی ها[^7].
### شناسایی بر اساس ویژگی ها
+ درخت ترجمه[^8]
+ نظریه و اثبات[^9]
+ ثبات وضعیت [^10]
+ خوشه بندی وضعیت [^11]
+ …
با توجه به افزایش داده ها و میل روز افزون به دستیابی به اطلاعات موجود ، کاهش بعد ها به وسیله ی انتخاب ویژگی ها (Feature Selection)[^12] مهم شدند. روش های زیر بخشی از روش هایی هستند که به این منظور به کار گرفته شدند.
+ روش شاخه و حد توسط Narendra و Fukunaga برای دوری از جست و جو های کامل همه زیر مجموعه های ویژگی ها استفاده شد. Liu et al. هم روشی برای دوری از جست و جوی کامل توسعه داده است.
+ در سال ۲۰۱۱ Pedrycz و Ahmad از روش انتخاب ویژگی (Feature Selection)ها با رویکرد تصادفی ، الگوریتم ژنتیک و بهینه سازی اجتماع ذرات استفاده کردند.
+ در سال ۱۹۹۶ Bala et al. از الگوریتم ژنتیک و درخت های تصمیم گیری برای انتخاب ویژگی های مفاهیم بصری استفاده کرد. Dollar et al. ابعاد مجموعه تصادفی آغازین را با استفاده از روش Ada Boost کاهش داد.
### شناسایی بر اساس ظاهر
+ روش تقسیم و حل
+ تطابق لبه
+ هیستوگرام
+ …
#روش استفاده شده
در این بخش به توضیح روش استفاده شده در فاز دوم می پردازیم. برای دریافت فایل ها می توانید به [GitHub](https://github.com/aryanbaghi/Car_Detection) مراجعه کنید.
در این فاز از روش Haar-like features استفاده کردیم. این روش از digital image featuresویژگی های عکس های دیجیتال استفاده میکند. در توضیح این روش به اختصار می توان گفت که ویژگی های تصویر بر اساس تفاضل مجموع پیکسل های یک ناحیه ی مستطیل تعریف می گردند.
<img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Prm_VJ_fig3_computeRectangleWithAlpha.png/220px-Prm_VJ_fig3_computeRectangleWithAlpha.png" width="220" height="165" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Prm_VJ_fig3_computeRectangleWithAlpha.png/330px-Prm_VJ_fig3_computeRectangleWithAlpha.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Prm_VJ_fig3_computeRectangleWithAlpha.png/440px-Prm_VJ_fig3_computeRectangleWithAlpha.png 2x" data-file-width="800" data-file-height="600">
$$sum = I(C) + I(A) - I(B) - I(D)$$
در این فاز از کتابخانه ی OpenCV نسخه ی ۲.۴ استفاده شده است. با استفاده از [Cascade Classifier Training](http://docs.opencv.org/doc/user_guide/ug_traincascade.html) که امکان Training بر اساس Haar-like features را به ما می دهد و تعداد زیادی داده ی آموزشی مشتمل بر دو دسته، دسته ای حاوی عکس های بدون خودرو و دسته ای شامل عکس های خودرو، و دو فایل توصیف گر، یکی برای عکس های بدون خودرو یا به اصطلاح پس زمینه و دیگری توصیف گر عکس های حاوی خودرو و محل خودرو یا خودرو های موجود در تصویر، فایل هایی به دست می آیند که نتیجه یادگیری بر روی داده های تست بوده. سپس این فایل ها به برنامه ای که به زبان سی پلاس پلاس نوشته شده داده می شوند تا آن برنامه با استفاده از آن ها بتواند در صورت وجود خودرو در تصویر محل آن را مشخص کند.
در ادامه به توضیح چگونگی استفاده از فایل های موجود در Github خواهیم پرداخت البته لازم به ذکر است که این توضیحات در ReadMe پروژه نیز موجود است و این توضیحات برای سیستم عامل لینوکس ارایه گردیده است.
ابتدا کد را کامپایل میکنیم، البته باید دقت شود که کتابخانه های مربوطه را نیز به کامپایلر معرفی کنیم.
سپس فایل اجرایی را با پارامتر های زیر اجرا میکنیم:
+ آدرس عکس
+ فایل یا فایل های مربوط به ما حصل Cascade Classifier
به عنوان مثال:
<div dir="ltr">
./output image.bmp cascade1.xml cascade2.xml cascade3.xml cascade4.xml cascade.xml
</div>
البته به دلیل حجم زیاد فقط فایل های حاصل شده از Train های مختلف را در GitHub قرار داده ام و پس از کامپایل با استفاده از دستور بالا آن را اجرا کنید.
#روش پیشنهادی
روش پیشنهادی برای تشخیص خودرو در تصویر، روش ژنتیک الگوریتم است. زیرا این روش بدون نیاز به دانش اولیه و مداخله انسان قابل پیاده سازی است. همچنین در زمینه هایی مانند شناسایی خودرو، شناسایی صورت و شناسایی هواپیما در تصویر این روش به دقت ۱۰۰٪ رسیده است.
البته سعی خواهد شد از الگوریتم ECO feature که بر اساس الگوریتم ژنتیک است استفاده گردد. این الگوریتم بسیار قوی و جدید است به طوری که برای شناسایی اشیا به صورت عمومی در تصاور استفاده می گردتمرین[^13] بر اساس Haar-like features را به ما می دهد و تعداد زیادی داده ی آموزشی مشتمل بر دو دسته، دسته ای حاوی عکس های بدون خودرو و دسته ای شامل عکس های خودرو، و دو فایل توصیف گر، یکی برای عکس های بدون خودرو یا به اصطلاح پس زمینه و دیگری توصیف گر عکس های حاوی خودرو و محل خودرو یا خودرو های موجود در تصویر، فایل هایی به دست می آیند که نتیجه یادگیری بر روی داده های تست بوده. سپس این فایل ها به برنامه ای که به زبان سی پلاس پلاس نوشته شده داده می شوند تا آن برنامه با استفاده از آن ها بتواند در صورت وجود خودرو در تصویر محل آن را مشخص کند.
در ادامه به توضیح چگونگی استفاده از فایل های موجود در Github خواهیم پرداخت البته لازم به ذکر است که این توضیحات در ReadMe پروژه نیز موجود است و این توضیحات برای سیستم عامل لینوکس ارایه گردیده است.
ابتدا کد را کامپایل میکنیم، البته باید دقت شود که کتابخانه های مربوطه را نیز به کامپایلر معرفی کنیم.
سپس فایل اجرایی را با پارامتر های زیر اجرا میکنیم:
+ آدرس عکس
+ فایل یا فایل های مربوط به ما حصل Cascade Classifier
به عنوان مثال:
<div dir="ltr">
./output image.bmp cascade1.xml cascade2.xml cascade3.xml cascade4.xml cascade.xml
</div>
البته به دلیل حجم زیاد فقط فایل های حاصل شده از تمرین های مختلف را در GitHub قرار داده ام و پس از کامپایل با استفاده از دستور بالا آن را اجرا کنید.
## ارزیابی
برای اطمینان از کارایی روش استفاده شده، از یک مجموعه داده ای مشتمل بر ۱۰۷ عکس برای ارزیابی برنامه ارایه شده، استفاده گردید. مشخصات این مجموعه به قرار زیر است:
+ ۲۷ عکس ،شامل چند خودرو
+ ۵۷ عکس، شامل یک خودرو
+ ۲۳ عکس، بدون خودرو
پس از اجرا برنامه برای تمام این عکس ها نتایج اولیه زیر حاصل گردید:
<img style="-webkit-user-select: none; cursor: -webkit-zoom-in;" src="http://192.241.241.138:8000/static/result.png
" width=“600" height=“600">
|نوع |شامل چند خودرو|شامل یک خودرو|بدون خودرو|
|:--------------:|:------------:|:----------:|:----------:|
|عکس های مورد بررسی|۲۷|۵۷|۲۳|
|تشخیص درست|۱۳|۳۳|۲۱|
|تشخیص نادرست|۱۷|۱۹|۴|
همان طور که از نتایج بالا مشخص است، از بین ۱۰۷ عکس مورد بررسی ۲۵ عکس (مجموع ستون عکس های بدون خودرو، در دو ردیف تشخیص درست و نادرست) به عنوان عکس بدون خودرو تشخیص داده شده که ۲۱ عکس به درستی و ۴ عکس به غلط تشخیص داده شده است. برای عکس های شامل یک خودرو، ۵۲ عکس تشخیص داده شده که از این میان ۱۹ عکس به نادرستی و ۳۳ عکس به درستی تشخیص داده می شوند. برای عکس هایی که شامل چند خودرو بودند در مجموع ۳۰ عکس تشخیص داده شده که از میان آن ها ۱۳ عکس به درستی و ۱۷ عکس به نادرستی تشخیص داده شده اند.
با استفاده از نتایج بالا درصد درستی برای مجموعه مورد بررسی به قرار زیر است:
|بدون خودرو|شامل یک خودرو|شامل چند خودرو|در کل|
|:------:|:---------:|:---------:|:---:|
|۸۴٪|۶۳.۴۶٪|۴۳.۳۳٪|۶۲.۶۱٪|
لازم به ذکر است درصد های بالا به این شکل محاسبه گشتند که، تعداد تشخیص ها ، به عنوان مثال تعداد تشخیص های عکس بدون خودرو درست را بر تعداد کل تشخیص های عکس بدون خودرو تقسیم کردیم، اما برای محاسبه کل تعداد عکس های تشخیص داده شده درست را بر تعداد کل عکس ها تقسیم کردیم.
این نتایج نشان می دهد که برنامه در تشخیص عکس هایی که شامل چند خودرو هستند بسیار ضعیف تر عمل می کند، یکی از دلایل این است که در مرحله آموزش و تمرین عکس های شامل چند خودرو کمتر از عکس های شامل یک خودرو استفاده شده بودند.
#روش های نوین
روش پیشنهادی برای تشخیص خودرو در تصویر، روش الگوریتم ژنتیک است. زیرا این روش بدون نیاز به دانش اولیه و مداخله انسان قابل پیاده سازی است. همچنین در زمینه هایی مانند شناسایی خودرو، شناسایی صورت و شناسایی هواپیما در تصویر این روش به دقت ۱۰۰٪ رسیده است.
نوین ترین الگوریتم مطرح شده برای تشخیص اشیا به طور عمومی[^14]، الگوریتم ECO feature می باشد. اساس کار این روش الگوریتم ژنتیک است. از آن جا که توضیح این روش بسیار بسیط و مفصل است برای مشاهده مقاله مربوط به این روش می توانید به مقاله ی [A feature construction method for general object recognition](http://www.sciencedirect.com/science/article/pii/S0031320313002549) مراجعه فرمایید.
<img src="http://news.byu.edu/releases/archive14/Jan/objectrecognition/ID_2.jpg" style="width:600px;-webkit-border-radius:20px;-moz-border-radius: 20px;border-radius: 20px; box-shadow: 0px 0px 7px 1px #202020;-webkit-box-shadow: 0px 0px 7px 1px #202020;-moz-box-shadow: 0px 0px 7px 1px #202020;" />
توضیحات تفضیلی در مورد این روش در مقاله مربوطه که در بخش مراجع آمده قابل مشاهده است.
#مراجع
+ [A feature construction method for general object recognition](http://www.sciencedirect.com/science/article/pii/S0031320313002549)
+ [Wikipedia, Outline of object recognition](http://en.wikipedia.org/wiki/Outline_of_object_recognition)
+ Computational method of feature selection, Edited by Huan Liu & Hiroshi Motoda
+ OpenCV
+ [Feature selection based on rough sets and particle swarm optimization ](http://www.scopus.com/record/display.url?eid=2-s2.0-33845523839&origin=inward&txGid=24D567DAA799B13300ED99B87C6F6C5A.kqQeWtawXauCyC8ghhRGJg%3a12)
+ [Haar-like Features](http://en.wikipedia.org/wiki/Haar-like_features)
[^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