پیادهسازی سیستم تشخیص و ردیابی خودرو در پایتون – راهنمای جامع
در مبحث سیستمهای «رانندگی خودران» (Autonomous Driving)، مدل «تشخیص و ردیابی خودرو» (Vehicle Detection and Tracking) یکی از مهمترین بخشهای مورد نیاز برای پیادهسازی چنین سیستمهایی است. یک سیستم تشخیص و ردیابی خودرو باید به اندازهای سریع و دقیق باشد که بتوان از آن برای کاربردهای جهان واقعی نظیر «کنترل و مدیریت ترافیک» (Traffic Control and Management)، کنترل «اتومبیلهای خودران» (Autonomous Automobiles) و سایر موارد استفاده کرد. در مرحله بعد، لازم است سیستم مکملی برای «ردگیری» (Tracking) خودروها به صورت «بلادرنگ» (Real-Time) طراحی شود تا اتومبیل بتواند بدون برخورد با دیگر خودروهای موجود در جاده، به مسیر خود ادامه دهد.
در این مطلب، هدف پیادهسازی یک سیستم تشخیص و ردیابی خودرو با استفاده از روشهای «بینایی کامپیوتر» (Computer Vision) است. در سیستم پیادهسازی شده، از تکنیکهای «پردازش تصویر» (Image Processing) نظیر «هیستوگرام گرادیانهای جهتدار» (Histogram of Oriented Gradients)، برای استخراج ویژگی از تصاویر لحظه به لحظه ویدئویی و از مدلهای «یادگیری ماشین» (Machine Learning)، جهت «دستهبندی باینری» (Binary Classification) اشیاء تشخیص داده شده به دو کلاس (Cars) و (Non-Cars) استفاده میشود. برای درک بهتر نحوه عملکرد سیستم تشخیص و ردیابی خودرو، به شکل زیر دقت کنید. این شکل نمایی از چگونگی تشخیص اشیاء و دستهبندی آنها به دو کلاس (Cars) و (Non-Cars)، در یک سیستم تشخیص و ردیابی خودرو را نشان میدهد.
بخشهای مختلف یک سیستم تشخیص و ردیابی خودرو
در این مطلب کاربردی، از روشهای بینایی ماشین و پردازش تصویر برای پیادهسازی بخشهای مختلف سیستم تشخیص و ردیابی خودرو استفاده میشود. البته، تکنیکهای پیچیدهتر و پیشرفتهتری نسبت به روش ارائه شده در این مطلب، جهت تشخیص و ردیابی خودرو وجود دارد (نظیر روشهای «یادگیری عمیق» (Deep Learning)). مزیت مهم استفاده از روشهای بینایی ماشین برای تشخیص و ردیابی خودرو، پیادهسازی سر راست و مرحله به مرحله بخشهای مختلف و تحلیل آنها، جهت درک بهتر نحوه عملکرد سیستم است.
به دلیل اینکه روشهای پیشرفتهتر نظیر یادگیری عمیق، بر پایه «شبکههای عصبی مصنوعی» (Artificial Neural Network) بنا نهاده شدهاند، مانند «جعبه سیاه» عمل میکنند. در این دسته از روشها، درک فرایند تبدیل ورودیها (تصاویر) به خروجیهای نهایی (خودروهای تشخیص داده شده در تصویر) و مراحل مختلف طی شده برای رسیدن به این جوابها، برای کاربران بسیار سخت است.
برای پیادهسازی بخشهای مختلف سیستم تشخیص و ردیابی خودرو، مراحل زیر طی خواهند شد. لازم به ذکر است که کلیه مراحل زیر، در زبان برنامهنویسی پایتون پیادهسازی شدهاند و کدهای لازم در انتهای هر بخش قرار داده شده است.
- تحلیل دادههای استفاده شده برای تشخیص و ردیابی خودرو
- استفاده از روش «استخراج ویژگی» (Feature Extraction) هیستوگرام گرادیانهای جهتدار برای پیدا کردن بهترین ویژگیها جهت تشخیص و ردیابی خودرو
- آموزش یک مدل یادگیری و دستهبندی «ماشین بردار پشتیبان» (Support Vector Machine)
- پیادهسازی یک «پنجره لغزان» (Sliding-Window) در سیستم تشخیص و ردیابی خودرو و استفاده از ماشین بردار پشتیبان آموزش دیده، برای جستجو خودرو در تصاویر و دستهبندی اشیاء موجود در پنجره به دو کلاس (Cars) و (Non-Cars)
- تولید مدل «نقشه حرارت» (Heatmap) در سیستم تشخیص و ردیابی خودرو جهت شناسایی و نشانهگذاری خودروهای شناسایی شده در تصاویر
- استفاده از روشهای «هموارسازی» (Smoothing) تصاویر برای بهتر کردن نتایج خروجی و از بین بردن «مثبتهای غلط» (False Positives) در ویدئوها (منظور از مثبتهای غلط، تصاویری هستند که اشیاء موجود در آنها به اشتباه در کلاس (Cars) دستهبندی شدهاند، درحالی که باید در کلاس (Non-Cars) دستهبندی شوند)
تحلیل دادهها
به تصویر زیر دقت کنید. به نظر شما کدام یک از تصاویر نمایش داده شده، خودرو را نمایش میدهد؟ بدون شک، پاسخ به چنین سؤالی برای کاربران انسانی راحت خواهد بود و آنها قادر خواهند بود با دقت بسیار بالا، خودروهای موجود در تصاویر را تشخیص دهند. ولی، یک سیستم تشخیص و ردیابی خودرو، باید برای انجام چنین کاری «آموزش» (Training) ببیند.
به عبارت دیگر، یک سیستم تشخیص و ردیابی خودرو باید یاد بگیرد دادههای تصویری حاوی خودرو را از دیگر دادههای تصویر تشخیص دهد و از همه مهمتر، خودروهای شناسایی شده را نشانهگذاری و در مسیر حرکتی ردیابی کند. بهترین راه آموزش یک سیستم تشخیص و ردیابی خودرو، استفاده از حجم زیادی از دادههای تصویری برچسبگذاری شده با برچسب کلاسی (Cars) و (Non-Cars) و مدلسازی یک «دستهبند» (Classifier) تصویر، بر اساس تصاویر برچسبگذاری شده است.
تصاویری که قرار است برای آموزش یک مدل تشخیص و ردیابی خودرو استفاده شود، باید از تصاویر و فایلهای ویدئویی جهان واقعی استخراج شده باشند. در مرحله بعد لازم است تا تصاویری که حاوی خودرو هستند توسط برچسبهای کلاسی مناسب، برچسبگذاری شوند. برای آموزش مدل تشخیص و ردیابی خودرو، از یک مجموعه داده حاوی 8792 تصویر برچسبگذاری شده با برچسب کلاسی (Cars) و 8968 تصویر برچسبگذاری شده با برچسب کلاسی (Non-Cars) استفاده شده است. تصاویر برچسبگذاری شده با برچسب کلاسی (Cars) از طریق لینک [+] و تصاویر برچسبگذاری شده با برچسب کلاسی (Non-Cars) از طریق لینک [+] قابل بارگیری هستند.
Vehicle train images count: 8792 Non-vehicle train image count: 8968
در مرحله بعد، تصاویر کلاسهای (Cars) و (Non-Cars) به ساختار دادههای آرایهای قابل تعریف توسط بسته نرمافزاری numpy تبدیل و در قالب «لیستهای» (Lists) جداگانهای ذخیره میشوند. برای چنین کاری در سیستم تشخیص و ردیابی خودرو، از تابع زیر استفاده میشود:
نمونهای از تصاویر موجود در کلاسهای (Cars) و (Non-Cars) در شکل زیر نمایش داده شده است. «کمیت» (Quantity) و «کیفیت» (Quality) بهینه تصاویر استفاده شده برای آموزش مدل دستهبند، جهت تضمین عملکرد مناسب سیستم تشخیص و ردیابی خودرو بسیار حیاتی است. تصاویر کم و بیکیفیت، سبب تولید پیشبینیهای نادرست میشوند.
استخراج ویژگی از تصاویر
در سیستم پیادهسازی شده برای تشخیص و ردیابی خودرو، از روشهای استخراج ویژگی مختلفی برای انتخاب بهترین ویژگیها (جهت آموزش مدل دستهبند تصاویر) استفاده شده است. روشهای استخراج ویژگی استفاده شده در سیستم تشخیص و ردیابی خودرو، عملکرد بهینه سیستم را در تشخیص خودروها تضمین میکنند.
روش هیستوگرامهای رنگ
سادهترین روش برای استخراج ویژگی از تصاویر، استخراج ویژگی از «کانالهای رنگ» (Color Channels) تصاویر است. بنابراین، برای استخراج ویژگی کافی است تا هیستوگرام کانالهای رنگ یک تصویر ترسیم و دادههای مرتبط با ویژگیهای تصویر، از «دستههای» (Bins) هیستوگرام استخراج شوند. دستههای هیستوگرام، اطلاعات مفیدی در رابطه با تصویر نمایش میدهند و به استخراج ویژگیهای خوب از تصاویر کمک میکنند.
روش Spatial Binning برای استخراج ویژگی از تصاویر
استفاده از سه «کانال رنگی» (Color Channels) موجود در «تصاویر با وضوح کامل» (Full Resolution Images)، بار محاسباتی زیادی را به سیستم تشخیص و ردیابی خودرو تحمیل میکند. با استفاده از روش Spatial Binning، میتوان از یک سو، اطلاعات کافی جهت تشخیص و ردیابی خودرو را در تصاویر حفظ کرد و از سوی دیگر، بار محاسباتی سیستم را به طور قابل ملاحظهای کاهش داد.
همان طور که در تصویر بالا مشاهده میشود، حتی زمانی که دقت پیکسلی تصاویر به (32x32) کاهش مییابد، خودرو به خوبی در تصاویر قابل شناسایی است. این بدین معنی است که ویژگیهای مرتبط با خودرو، هنوز در تصویر حفظ شدهاند. برای کاهش دقت تصاویر در زبان برنامهنویسی پایتون، میتوان از بسته نرمافزاری OpenCV و تابع ()cv2.resize استفاده کرد. همچنین، در صورتی که کاربر تمایل داشته باشد تا تصاویر جدید تولید شده (تصاویری که دقت آنها کاهش پیدا کرده است) را به «بردار ویژگی یکبعدی» (One Dimensional Feature Vector) تبدیل کند، کافی است از تابع ()ravel در بسته numpy استفاده شود.
روش هیستوگرام گرادیانهای جهتدار برای استخراج ویژگی از تصاویر
یک «توصیفگر ویژگی» (Feature Descriptor)، نمایشی از یک تصویر یا مجموعهای از تصاویر است که از طریق استخراج اطلاعات مفید و دور انداختن اطلاعات غیر اصلی، آن تصویر یا مجموعه تصاویر را سادهسازی میکند. روش هیستوگرام گرادیانهای جهتدار، یک توصیفگر ویژگی است که در بینایی ماشین و پردازش تصویر جهت «تشخیص اشیاء» (Object Detection) استفاده میشود.
روش هیستوگرام گرادیانهای جهتدار، قلب تپنده سیستم پیادهسازی شده برای تشخیص و ردیابی خودرو است. با استفاده از این روش، اطلاعات بامعنا و مفید از تصویر استخراج میشود. روش هیستوگرام گرادیانهای جهتدار، سعی میکند تا «جنبه عمومی» (General Aspects) خودروها را در تصویر شناسایی کند و نه «جزئیات خاص» آنها را. روش کار هیستوگرام گرادیانهای جهتدار به این صورت است که ابتدا، تصویر بخشبندی میشود. سپس، در هر بخش، گرادیان (شیب) تغییرات در هر کدام از «جهتهای» (Orientations) داده شده محاسبه میشود. در منابع مختلف علمی، از HOG به عنوان عبارت مخفف برای معرفی هیستوگرام گرادیانهای جهتدار استفاده میشود.
در توصیفگر HOG، توزیع (هیستوگرام) جهت گرادیانها (یا همان گرادیانهای جهتدار) به عنوان ویژگی استفاده میشود. از آنجایی که اندازه گرادیانهای (مشتق بر مبنای X و Y) اطراف «لبهها» (Edges) و «گوشههای» (Corners) تصویر بزرگ هستند و گوشهها و لبهها، اطلاعات به مراتب بیشتری در مورد شکل اشیاء در تصویر در اختیار قرار میدهند، در نتیجه، گرادیانها، اطلاعات بسیار مفیدی در رابطه با یک تصویر به سیستم تشخیص و ردیابی خودرو ارائه میکنند.
از طریق توابع و قطعه کدهای زیر، ویژگیهای مفید موجود در تصویر با استفاده از روشهای معرفی شده استخراج میشوند.
در مرحله بعد لازم است تا پارامترهای مناسب برای آموزش مدلدستهبند انتخاب شوند. انتخاب پارامترهای مناسب، نقش مهمی در پیشبینی درست برچسب کلاسی تصاویر خواهد داشت. در این جا و با استفاده از قطعه کد زیر، کلاسی به نام parameters تعریف و تمامی پارامترهای مدل دستهبندی تصویر مقداردهی میشوند:
کیفیت فرایند استخراج ویژگی، ارتباط مستقیمی با پارامترهای انتخاب شده برای مدل دارد. پارامترهای نمایش داده شده در جدول زیر، از طریق «آزمون و خطا» (Trial) به دست آمدهاند. برای انتخاب این مقادیر، عملکرد سیستم با ترکیبهای مختلفی از مقادیر پارامترها، تست و در نهایت، بهترین ترکیب از مقادیر پارامترها، برای استخراج ویژگی از تصاویر انتخاب شدهاند.
آموزش مدل دستهبند تصویر در سیستم تشخیص و ردیابی خودرو
مدلهای ماشین بردار پشتیبان، مجموعهای از روشهای «یادگیری نظارت شده» (Supervised Learning) در حوزههای «هوش مصنوعی» (Artificial Intelligence) و یادگیری ماشین هستند. از ماشینهای بردار پشتیبان، برای «دستهبندی» (Classification)، «رگرسیون» (Regression) و «تشخیص دادههای پرت» (Outliers Detection) استفاده میشود.
در این مطلب، از مدل دستهبندی ماشین بردار پشتیبان با «کرنل خطی» (Linear Kernel) به عنوان دستبند تصاویر استفاده شده است. در این مدل، هدف پیدا کردن یک «ابر صفحه» (Hyperplane) بهینه است که میتواند به بهترین شکل ممکن، دادههای مسئله را به دو کلاس (در این حالت، دو کلاس Cars و Non-Cars) دستهبندی کند.
مدل ماشین بردار پشتیبان با کرنل خطی، توسط تابع LinearSVC در بسته SciKit-Learn پیادهسازی میشود. از قطعه کد زیر، برای آموزش مدل دستهبند استفاده میشود.
برای آموزش مدل دستهبند، تصاویر کلاسهای Cars و Non-Cars وارد سیستم تشخیص و ردیابی خودرو میشوند. سپس، با استفاده از روشهای استخراج ویژگی شرح داده شده، ویژگیهای موجود در تصاویر استخراج میشوند. برای تقسیمبندی دادهها به دو دسته «دادههای آموزشی» (Training Data) و «دادههای تست» (Test Data)، از تابع train_test_split در بسته SciKit-Learn استفاده میشود. پس از آموزش مدل دستهبندی با استفاده از دادههای آموزشی و تست مدل آموزش دیده با استفاده از دادههای تست، نتایج زیر به عنوان عملکرد سیستم روی دادههای تست به ثبت رسیده است:
Using: 8 orientations 8 pixels per cell and 2 cells per block Feature vector length: 5568 3.04 Seconds to train SVC... Test Accuracy of SVC = 0.9911
دستهبندی فریمهای تصویری با استفاده از پنجره لغزان
تا اینجای کار، سیستم تشخیص و ردیابی خودرو قادر است تصاویر با دقت پیکسلی (64x64) را دریافت و برچسب کلاسی (Cars یا Non-Cars) آنها را پیشبینی کند. برای اینکه بتوان کلیه اشیاء موجود در تصاویر واقعی با دقت پیکسلی (720x1280) را دستهبندی کرد، از مفهومی به نام پنجره لغزان استفاده میشود.
در حوزه بینایی ماشین، پنجره لغزان یک ناحیه مستطیلی شکل، با عرض و طول ثابت است که در راستای یک تصویر حرکت میکند. روش کار در پنجرههای لغزان بدین صورت است که معمولا قسمتی از تصویر که در داخل این پنجره قرار دارد، استخراج میشود. سپس، تصویر استخراج شده به مدل دستهبند تصویر وارد میشود تا مشخص شود که آیا در تصویر مربوطه، خودرو وجود دارد یا نه.
همان طور که در تصاویر بالا مشهود است، پس از اینکه تعدادی تصویر تست وارد سیستم تشخیص و ردیابی خودرو میشوند، پنجره لغزان روی هر تصویر حرکت میکند. قسمتی از تصویر که داخل پنجره قرار دارد، وارد مدل دستهبندی میشود. در صورتی که مدل دستهبندی تصاویر، برچسب کلاسی Cars را به یک تصویر اختصاص دهد، برای نشانگذاری تصاویر حاوی خودرو، دور تصویر مربوطه یک ناحیه مستطیلی قرار میگیرد. این ناحیه، یک خودروی تشخیص داده شده را در تصویر نشان میدهد. همانطور که در تصاویر بالا مشخص است، برای هر کدام از خودروهای تشخیص داده شده، تعدادی ناحیه همپوشان تعریف شده است. همچنین، در یکی از تصاویر، به اشتباه در وسط جاده یک خودرو تشخیص داده شده است («مثبت غلط» (False Positive)).
در این مطلب، برای ترکیب نواحی همپوشان و حذف نواحی مثبت غلط، از مدلی به نام «نقشه حرارت» (Heat Map) و یک مقدار «حد آستانه» (Threshold) استفاده میشود. با استفاده از قطعه کد زیر، مدل نقشه حرارت و حد آستانه تعریف میشوند.
اگر به تصاویر بالا دقت کنید، نواحی همپوشان به خوبی با یکدیگر ترکیب نشدهاند و ناحیه مستطیلی، خودرو را به طور کامل پوشش نمیدهد. برای تشخیص بهتر خودرو در تصاویر، از روش «زیرنمونهگیری هیستوگرام گرادیانهای جهتدار» (HOG Sub-Sampling) استفاده میشود. این روش، عملکرد بهتری در تولید پنجره لغزان و حرکت دادن آن در تصویر ارائه میدهد.
در این روش، ویژگیهای HOG تنها یکبار استخراج میشوند ولی میتوانند به دفعات مختلف زیرنمونهگیری شوند تا پنجره کاملی شکل بگیرد. به عبارت دیگر، در این روش پنجرههای جستجوی مختلفی در تصویر اصلی تشکیل و در نهایت با یکدیگر ترکیب میشوند تا نواحی تشخیص خودرو به خوبی مشخص شوند. از قطعه کد زیر، برای پیدا کردن خودروها با استفاده از روش زیرنمونهگیری هیستوگرام گرادیانهای جهتدار استفاده میشود.
پیادهسازی سیستم تشخیص و ردیابی خودرو و تولید ویدئوی نهایی
در نهایت، هر کدام از تصاویر یا «فریمهای» (Frames) موجود در ویدئو، از طریق سیستم تشخیص و ردیابی خودرو پردازش میشوند تا محل قرارگیری خودروها در تصاویر مشخص شود. سپس، فریمهای پردازش شده با هم ترکیب میشوند تا ویدئوی نهایی شکل بگیرد.
از قطعه کد زیر، برای پردازش نهایی ویدئوها در سیستم تشخیص و ردیابی خودرو استفاده میشود.
در پایان کار، برای تشخیص مسیر حرکت خودرو، از قطعه کد زیر استفاده میشود:
برای بارگیری کامل کدها، فایلها و کلاسهای تعریف شده برای پیادهسازی سیستم تشخیص و ردیابی خودرو، به لینک [+] مراجعه کنید. فایل ویدئو نهایی حاصل از اجرای سیستم تشخیص و ردیابی خودرو در ادامه آمده است.
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای داده کاوی و یادگیری ماشین
- آموزش اصول و روشهای داده کاوی (Data Mining)
- مجموعه آموزشهای هوش مصنوعی
- نقشه دانش فناوری های هوش مصنوعی و دسته بندی آنها — راهنمای جامع
- پیشبینی قیمت بیتکوین با شبکه عصبی — راهنمای کاربردی
- پیاده سازی سیستم های توصیهگر در پایتون — از صفر تا صد
- روش های تحلیل احساسات در پایتون — راهنمای کاربردی
^^