در این پژوهش از شما خواسته شده است که با دریافت تصویر ورودی، خودروهای موجود در آن را شناسایی کنید. با این کار گام اول را در طراحی یک سیستم نظارت ترافیکی شهری برداشتهاید، مثلا برای ثبت تخلفات رانندگی.
۱. ۱. مقدمه
ما به عنوان انسان در طول روز افراد و اجسام مختلف را به سادگی مشاهده و شناسایی میکنیم ، اما این کار برای ماشین سخت و پیپچیده محسوب میشود.در این پژوهش هدف شناسایی اجسامی مانند خودرو ،توسط ماشین میباشد.
امروزه میبینیم خودروها در مقیاس بالا،در قسمتهای مختلف شهر پراکنده هستند و از این جهت احتیاج به کنترل توسط سیستمهای برنامهریزیشده دارند.از کاربردهای این سیستم میتوان موارد زیر را نام برد:
1)سیستمهای کنترل ترافیک (برای مثال بررسی حجم ترافیک یا شناسایی متخلفین ) [3][16]
2)برنامهریزی شهری[3] [6][16]
3)برای شناسایی یک خودرو که عکس آن در خیابان گرفته شدهاست[2]
4)خودروهای بدون راننده
5)هر سیستمی که قصد هدایت خود را در خیابان و محیطهای شامل خودرو دارد
6)مدیریت پارکینگها با اعلام ورود خودرو به مکان مورد نظر توسط ماشین(یا برای مثال برای باز کردن اتوماتیک در پارکینگ هنگامیکه خودرو در مقابل آن قرار میگیرد)
7)در صورتیکه ویژگیهای خودرو مانند رنگ،مدل،شمارپلاک و غیره را بتوان توسط ماشین شناسایی کرد میتوان برای تشخیص خودروی سرقت شده، متخلف
و یا هر موردی که در تعقیب است از آن استفاده کرد.[3]
پیدا کردن خودرو در تصویر کمی پیچیده است،زیرا برای مثال صورت انسان ساختار سادهتر و انعطافپذیری کمتری دارد[1]، اما خودروها شکلها و رنگ ها مدلهای بسیار متفاوتی دارند چون طراحیشان با یکدیگر متفاوت است[4].همچنین بررسی خودروها در شرایط متفاوت آب و هوایی و در روز و شب باهم متفاوت است .انتظار میرود که خودروها مستقل از زاویه دید 1 شناسایی شوند.برای این کار باید ماشین را برای تشخیص خودرو از زوایای مختلف تعلیم داد[1].
۲. ۲. کارهای مرتبط
در این زمینه در بخشهای مختلفی مانند پیدا کردن خودرو در عکس ، فیلم ، تصاویر متحرک و غیره پژوهشهای گوناگون انجام شده است.در این بخش بهطور خلاصه روشهای اصلی و مهم که استفاده بیشتری از آنها شده،ذکر شده اند:
در روش اول اشیاء دودویی2 در یک چارچوب آماری طبقهبندی میشوند.سپس مجموعهای از ویژگیها بررسی و ارزیابی میشود.در نهایت به چارچوب لازم برای طبقهبندی عکس میرسیم. در این روش در واقع یک طبقه بندی سلسله مراتبی جامع برای خودرو انجام میشود که بتوان به وسیله آن تشخیص داد که قسمت مورد نظر جزئی از خودرو است یا خیر.[1]
روش دوم استفاده از تکنیکهای بینایی کامپیوتر 3 است . باید با آنالیز داده با استفاده از تصاویر زیاد به الگوریتم آموختهشود در کدام تصاویر خودرو وجود دارد یا وجود ندارد.سپس ویژگیهای پرمعنا را از تصویر استخراج شود.سپس ماشین تشخیص میدهد که خودرو کجا قرار دارد یا اینکه اصلا وجود ندارد.[5] [8] [13]
در روش سوم دنباله ای از تصاویر شامل خودرو موجود است،یعنی فرض میشود صحنه پویاست. ماشین برای یافتن خودرو سه راه دارد: 1)با متدهای مشخص زمینه را حذف کند2)ویژگیها را با متدهایی استخراج کند3)با استفاده از متدهایی ،قالبهای متفاوت را در تصویر از یکدیگر جدا کند و اجسام متحرک را در تصویر تشخیص دهد.[6][12]
روش چهارم استفاده از ویژگیهای Haar-like است که ایده اصلی آن به این شرح است:با توجه به ویژگیهای سادهای که طبقهبندی کننده در چند مرحله ساماندهی کردهاست یک شیء به صورت آبشاری تعریف میشود(یا به صورت پله پله).سیستم پیشنهادی بر اساس شبکه عصبی مصنوعی 4کار میکند. [7] [9][14][15]
روش پنجم طراحی طبقهبندیکننده5ای است که بتواند تشخیص دهد در تصویر ماشینی وجود دارد یا خیر.تفاوت این روش با روش دوم در این است که در این روش علاوهبر ویژگیهای شکلی جسم، هم از ویژگیهای رنگ و شکل و هم از ویژگیهایرنگ به تنهایی استفاده میشود. مجموع این اطلاعات برای طبقهبندی تصویر کافی است.[10]
در مقالهی [16] با استفاده ازیادگیری عمیق 6سعی بر پیداکردن و شمردن خودروها از روی عکسهای هوایی اتوماتیک7شدهاست.اما از الگوریتمهای خاصی برای افزایش کارایی استفاده شدهاست.روشهای یادگیری عمیق برای استخراج ویژگیها 8نیاز به حجم داده 9 بالا دارد اما در مقاله ذکر شده با متدهای خاص آموزشی ویژگی ها استخراج شده اند و در SVM وظیفه یادگیری را بر عهده دارد که به علت پیچیدگی از آن میگذریم.
در شکل 7، CNN در واقع شبکه عصبی پیچیده10 و SVM ماشین بردار پشتیبانی11 هستند.در روش ششم ابتدا اندازه و زاویهی بردار گرادیان همهی پیکسلهای تصویر محاسبه میشود،سپس پیکسلهای غیرماکزیمم و پیکسلهای با اندازهی گرادیان ضعیف حذف میشوند. در مرحله بعد پیکسلهای باقیمانده بر اساس زاویه گرادیان در دو سطح افقی و عمودی چندسازی میگردند. بعد ضرایب خودهمبسته نگار لبه در هر سطح محاسبه میشوند.حال یا ویژگیهای بهدستآمده با توجه به آموزشی که به ماشین دادهشده تشخیص میدهد که در صحنه خودرو حضور دارد یا نه.[11]
در نهایت میبینیم روشهای مطرح شده مشابهت زیادی دارند.مثلا ممکن است برداشت شود روش اول و چهارم یا روش دوم و پنجم مثل هم عمل میکنند که برداشت غلطی نیست،اما درمقالههای مختلف از زوایای متفاوتی به این روشها نگاه شدهاست.
اما در کل میتوان این روشها را در روش سوم ، چهارم ، پنجم و ششم به صورت خلاصه طبقه بندی کرد.
۳. ۳. آزمایشها
دادهها
در این بخش دادههای استفاده شده تعدادی فیلم mp4 هستند که از فیلمهای گرفتهشده توسط دوربین های موجود در اتوبانها یا در خیابانها تهیهشدهاند.
با توجه به محدود بودن فیلمهای اتوبان ، این فیلمها طوری انتخاب شدهاند که بتوان کد پیادهسازیشده را در موقعیتهای متنوع آزمایش نمود.
از تنها سایتی که فیلمهای رایگان و مناسبتری برای آزمایش داشت چهارده فیلم با ویژگیهای مختلف برای آزمایش انتخاب شدند.
از این ویژگیها میتوان موارد زیر را نام برد:
زاویه متفاوت دوربین
محو بودن بخشی از تصویر
تنوع حجم ترافیک
دور یا نزدیک بودن دوربین از اتوبان و خیابان
سریع بودن یا سرعت عادی داشتن فیلم
روز یا شب بودن
یک طرفه یا دو طرفه بودن مسیر
ثابت بودن یا متغیر بودن زاویه دوربین
وجود یا عدم وجود خودروهای ثابت (پارک شده) در فیلم
میزان نور
کیفیت دوربین
روش پیادهسازی شده و گزارش نتایج
روش پیادهسازی شده در واقع همان روش سوم است که در کارهای مرتبط ذکر شد. در این روش چون ورودی یک فایل 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 ¤tFrameBlob, std::vector<Blob> &existingBlobs);
برای پیادهسازی این روش ابتدا لازم است کتابخانهی OpenCV-3.4.0 روی سیستم نصب شده باشد.در ضمن این پیادهسازی به زبان ++Cاست و باید در محیط Visual Studio 2015 اجرا شود. البته نصب openCV باید با دقت انجام شود تا کد به درستی عمل کند. بعد از ایجاد فایلهای پروژه در VisualStudio 2015 هم باید projectproperties تنظیم شود تا کتابخانهopenCV ضمیمه پروژه بشود. حال در ادامه با آزمایشهای متعدد روی داده هایمان دقت این روش را بررسی مینماییم.
لازم به ذکر است برای ارزیابی این پیادهسازی چون دادهی ورودی فیلم است ارزیابی کمّی تا حدی پیچیده است، چون معیار مشخصی برای بررسی عملکرد صحیح برنامه وجود ندارد. میتوان معیارهای مختلفی تعریف کرد ازجمله:
مشخص شدن همهی خودروها در فیلم بدون خطا یعنی هیچ جسمی به جز خودروها را مشخص نکند، که تقریبا غیر ممکن است چون این پیادهسازی ممکن
است هر جسم متحرکی را بهعنوان خروجی ارائه دهد .مشخص شدن حداقل یک خودرو در فیلم که غیر منطقی است چون در هر فیلم تعداد زیادی خودرو وجود دارد که نیاز هست بیشتر آنها تشخیص دادهشوند ،در غیر این صورت سیستم ناکارآمد است.
در این قسمت معیار تعیین کننده کارآمد بودن،مشخص کردن سهم بیشتر خودروها در فیلم است و اگر مواردی که خودرو نیستند از حدی بیشتر به عنوان خروجی مشخص شوند برنامه کارآمد نیست. پس در این 14 مورد هرکدام که این دو شرط را داشته باشد قبول میشود .
همچنین این ارزیابی فقط برای فیلمهایی معتبر است که یک دوربین نصب شده از وسایل نقلیه در حال حرکت در خیابان یا بزرگراه گرفته باشد و نمیتوان هر فیلمی را با آن ارزیابی کرد.
پس از آزمایش این فیلمها که هریک ویژگیخاصی داشت نتایج زیر حاصل میشود:
1) زمانیکه در فیلم ها دو یا چند خودرو فاصلهشان از حدی کمتر شود یک کادر دور آنها کشیده میشود یعنی تشخیص خودروهای نزدیک به
هم ممکن نیست.
2) زمانیکه دوربین حرکت کند دو حالت پیش میآید:
اگر حرکت آن لرزشی و لحظه ای باشد خطای لحظهای در آن پیش میآید یعنی ممکن است دور سایر اجسام که متحرک نیستند یا دور یکی از اجزاء
خودرو برای چند لحظه کادر بکشد.اگر دوربین کلا ثابت نباشد و متحرک باشد خطا خیلی زیاد است و سیستم ناکارآمد میباشد.
3) اگر تصویر از حدی بیشتر محو باشد تشخیص برای ماشین سخت است و خودروهای کمتری تشخیص دادهمیشوند.
4)زمانیکه سرعت تصویر متعادل باشد و خودروها فاصله مناسب داشتهباشند خروجی مناسب و قابل قبولی بهدستمیآید.
5)زاویه دوربین و میزان نور تصویر در عملکرد برنامه بیتاثیر است.
6)اگر فیلم در شب بررسی شود از طریق چراغهای خودرو که روشن هستند حرکت خودرو تشخیص دادهمیشود اما اگر خودرو اصلا دیدهنشود و
محو باشد کادر خروجی کوچکتر از اندازهی خودرو است.
7) تا زمانیکه فیلم وضوح داشته باشد فاصله دوربین از خیابان تاثیری در نتیجه ندارد.
8)زمانیکه سرعت فیلم از حدی بیشتر شود خطا زیاد شده و کارایی پایین میآید.
9)مشخص است که خودروهایی که پارک شده یا بی حرکت هستند در خروجی ظاهر نمیشوند.
10)یک یا دوطرفه بودن خیابان تاثیری در نتیجه ندارد.
کد پیاده سازی شده و توضیحات مربوط به اجرای آن در گیت هاب بارگذاری شدهاست.
به علت حجیم بودن فایلهای تست شده فقط چند فایل mp4 سبک برای تست پروژه روی سایت در فایل زیپ قرار گرفته است که قابل استفاده است. اما چندفایل دیگر را هم میتوانید از لینک های [20] ,[21] ,[22] , [23]بارگذاری کرده و تست کنید.
۴. ۴. کارهای آینده
۵. ۵. مراجع
[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/
پیوندهای مفید
view
binary
computer vision
ANN
classifier
Deep Learning
UAV Imagery
features
data
convolutional neural network
support vector machine