تشخیص خطوط جاده با استفاده از تکنیک های پیشرفته بینایی کامپیوتر

تشخیص خطوط جاده با استفاده از تکنیک های پیشرفته بینایی کامپیوتر

اخیراً ، من بصورت تمام وقت روی پروژه هایم به عنوان تکمیل بخشی از برنامه Nanodegree مهندس خودران Udacity (گروه فوریه 2017) کار می کنم. چهارمین پروژه ، و مورد علاقه من ، این است که ما وظیفه داریم مرزهای خط جاده و شعاع انحنای آن را از طریق جریان ویدئوها مشخص کنیم. این ویدئوها از دوربینی که روی خودرو قرار داده شده گرفته شده است. در این مقاله ، من در مورد چیزهایی که در انجام این پروژه آموخته ام صحبت می کنم. "> اگر این مقاله به نوعی به شما کمک کرد ، در نظر داشته باشید که برای من قهوه بخرید :)

GITHUB LINK | گزارش کامل فنی

به طور خلاصه ، I ' مراحل زیر را برای انجام این کار انجام داده اید:

برای اعوجاج دوربین پیکسل های خط فیلتر دریافت "نمای آسمان" منحنی “Best-Fit” را تنظیم کنید خط را به تصویر "نمای خودرو"

1 بازگردانید. CALIBRATION CAMERA

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

< img src = "https://cdn-images-1.medium.com/max/426/1*sq1BRcJGSvm3fdxnbS08yw.png">

2. TRANSFORMATION چشم انداز

پس از تصحیح تصویر ، ما تصویری بدون تحریف از یک جاده از دیدگاه وسیله نقلیه خواهیم داشت. ما می توانیم این تصویر را از دید پرنده ای در آسمان به تصویری از جاده تبدیل کنیم. برای استخراج همه اطلاعاتی که برای چرخاندن این تصویر از نمای خودرو به نمای آسمان نیاز داریم ، فقط به مختصات مکان نیاز داریم. به طور خاص ، تنها چیزی که ما نیاز داریم یک تصویر است که از دیدگاه ورودی (نمای خودرو) و مکانهای مربوط به چشم انداز مورد نظر (نمای آسمان) را در اختیار داریم. من به این مختصات مکان می گویم نقاط مبدا و نقاط مقصد. تصویری آسان که می توانیم به آن دقت کنیم خطوط موازی مستقیم هستند. نکته جالب این است که ما همچنین اطلاعات لازم برای چرخاندن از نمای آسمان به نمای خودرو را داریم.

3. پیش بینی درجه و رنگ

برای برآورد خمیدگی جاده ، ما به تمام اطلاعات از تمام پیکسل های یک تصویر جاده نیاز نداریم. خطوط راه جاده از جریان ویدئو زرد و سفید است ، بنابراین ما می توانیم همه چیز را به جز رنگ زرد و سفید تصویر پنهان کنیم. به عنوان یک احتیاط اضافی ، زیرا ممکن است برخی از خطوط زرد و خطوط غیر خطی را مشاهده کنیم ، یا ممکن است خطوطی وجود داشته باشد که به طور مشخص زرد و سفید نیستند ، ما از آنچه اپراتور Sobel نامیده می شود استفاده می کنیم. یک اپراتور Sobel اساساً میزان تغییر ارزش (و جهت آن) را بین دو مکان تصویر اندازه گیری می کند. این همچنین از نظر فنی مشتق یا گرادیان نامیده می شود. در مورد این بعداً بیشتر

من رنگها را نشان دادمبا فرمت HSL مقدار Hue نشان دهنده تعداد رنگ درک شده بر اساس ترکیب قرمز ، سبز و آبی است. مقدار اشباع میزان میزان رنگ آمیزی یا کسل کننده بودن آن است. سبکی این است که رنگ چقدر به سفید نزدیکتر است. خطوط زرد به خوبی با ترکیبی از سبکی و اشباع بالای مقدار مشخص می شوند. خطوط سفید بدون در نظر گرفتن میزان اشباع و رنگ بسیار روشن می شوند.

من عملگر Sobel را به مقدار روشنایی تصویر اعمال کردم. ما از ترکیبی از آستانه شیب مولفه افقی ، بزرگی شیب و جهت شیب استفاده کردیم. من می خواهم مکان های گرادیان را که تغییر اندازه کافی چندانی ندارند ، کنار بگذارم. آستانه اندازه گرادیان و همچنین x جزء شیب کار خوبی را در این زمینه انجام می دهد. من فقط شیب های یک جهت خاص را در نظر می گیرم. کمی بالاتر از 0 درجه (یا حدود 0.7 در رادیان) ، و زیر 90 درجه (یا حدود 1.4 در رادیان). صفر دلالت بر خطوط افقی و نود خطوط عمودی دارد و خطوط ما (در نمای خودرو) بین آنها قرار دارد.

افزودن هر دو نتیجه رنگ و آستانه گرادیان ، خطوط خط را به خوبی فیلتر می کند. مقادیر اضافی را از لبه های تصویر به دلیل سایه ها دریافت می کنیم ، بنابراین آنها را بعداً مخفی کنید.

4. CURVE FITTING

ما می توانیم یک منحنی برای هر خط خط با یک تابع چند جمله ای درجه دوم x = y² + By + C قرار دهیم. ما باید ضرایب مربوط به هر خط [A ، B ، C] را پیدا کنیم. ما می توانیم از تابع داخلی polyfit () استفاده کنیم تنها کاری که باید انجام دهیم تغذیه نقاط آن است و ضرایب چند جمله ای از یک درجه مشخص از منحنی را که متناسب با نقاط تغذیه شده است ، بیرون می آورد.

برای تصمیم گیری که کدام پیکسل ها بخشی از یک خط هستند ، بیایید این الگوریتم اساسی را پیاده سازی کنیم. من می توانم هیستوگرام همه ستون های تصویر پایینی را بگیرم و گراف با دو قله شبیه به نمودار بالا دریافت می کنم. قله های برجسته هیستوگرام شاخص های خوبی برای موقعیت x پایه خط هستند. بنابراین من از آنها به عنوان نقطه شروع استفاده می کنم.

< p> من می توانم یک "تکنیک پنجره کشویی" را انجام دهم - یکی از پنجره ها روی پنجره دیگر که از خطوط بالای قاب پیروی می کند. پیکسل های داخل یک "پنجره" به عنوان "پیکسل های مورد علاقه" علامت گذاری می شوند و به لیست نقاط در خط اضافه می شوند. ما مقادیر x این پیکسل ها را متوسط ​​می کنیم تا به خوبی نقطه پایه پنجره بعدی بالا را نشان دهیم. ما می توانیم این کار را بارها و بارها تکرار کنیم تا به بالای خط برسیم. به این ترتیب ما تمام پیکسل هایی را که به آن علاقه داریم جمع کرده ایم و به تابع polyfit () که ضرایب چند جمله ای درجه 2 را مشخص می کند ، تغذیه می کنیم. ما می توانیم شعاع انحنای هر خط را محاسبه کنیموقتی معادلات منحنی را می دانیم.

برای تخمین موقعیت وسیله نقلیه ، می توانم عرض خط را بر حسب پیکسل در پایین تصویر (نزدیک ترین به دوربین) محاسبه کنم. بگویید عرض آن 1000 پیکسل بود. این بدان معناست که هر پیکسل در مقیاس واقعی با 3.7 متر مطابقت دارد. سپس می توانم تعداد پیکسل هایی که مرکز تصویر از مرکز خط خارج شده است را محاسبه کرده و افست را در متر در نظر بگیرم.

5. پروژه LANE برای مشاهده وسیله نقلیه

خوب است! ما در واقع اطلاعات زیادی در مورد جاده با توجه به یک تصویر واحد از جاده جمع آوری کرده ایم. همانطور که قبلاً در بخش Perspective Transformation گفتم ، ما می توانیم از همان اطلاعات برای پیچاندن تصویر از نمای آسمان به نمای خودرو استفاده کنیم.

چون ما در حال حاضر پارامترهای منحنی خط خط را داریم نقاط منحنی ها و تابع fillPoly () برای کشیدن ناحیه خط روی تصویر. اکنون می توانیم اندازه گیری خود را در مسیر تصویر نشان دهیم. ما این را به زیبایی در یک عملکرد کوچک و شیک به نامbirdsEye.project ()

< /img>

خلاصه و بعد از اندیشه ها

بنابراین به طور خلاصه ، این تقریباً تمام مراحلی است که باید برای تشخیص خطوط خط انجام دهیم. ما همچنین می توانیم شعاع خمیدگی را تخمین زده و موقعیت خودرو را با توجه به هر یک از این خطوط خط تخمین بزنیم. ابتدا ، اعوجاج دوربین را تصحیح کردیم ، همه چیز را به جز پیکسل های خط خط پنهان کردیم. ما تصویر را به "نمای آسمان" تغییر دادیم و از این پیکسل های خط استفاده کردیم تا با استفاده از تکنیک "sliding-window" و تابع polyfit () بهترین منحنی را پیدا کنیم. ما همچنین می توانیم خطوط خمیده را برای نمای فوق العاده به تصویر "نمای خودرو" بازگردانیم :). منحنی که منطقی است من فکر می کنم هنوز باید تغییراتی ایجاد کنم تا شعاع تخمین خمیدگی بهتری حاصل شود. من همچنین فکر می کنم اگر بیشتر فکر کنم می توانم الگوریتم پنجره کشویی را با خواندن تمیزتری انجام دهم تا پیکسل های مورد علاقه هر خط را بدست آورم. به نظر می رسد کلاس Curves مسئول بسیاری از موارد است ، شاید بتوانم این را به چند کلاس کوچکتر تقسیم کنم. نکته دیگر این است که من فکر می کنم عملکرد پروژه () در کلاس BirdsEye من نامناسب است ، شاید من باید به جای درخواست ضرایب اتصالات منحنی ، خطوط خط خارج را محاسبه کنم ، تابع باید برای نمایش تصویر درخواست کند در عوض.

پیوند GITHUB | گزارش فنی کامل

اگر این مقاله به نوعی به شما کمک کرد ، برای من قهوه بخرید :)