آموزش رزبری پای, پردازش تصویر و هوش مصنوعی

آموزش پردازش تصویر با رزبری پای در پروژه خودروی خودران

تصویر شاخص پردازش تصویر با رزبری پای

آیا تا به حال به این فکر کرده‌اید که چطور می‌توانید قدرتِ ماشین‌های خودرانِ غول‌پیکر را در مقیاس کوچک تجربه کنید؟ شاید تصور کنید ساخت سیستمی که بتواند مسیر را تشخیص دهد و هوشمندانه تصمیم بگیرد، نیازمند بودجه‌های کلان و سخت‌افزارهای فوق‌سریع است، اما خبر خوب این است که دنیای «یادگیری عمیق» (Deep Learning) و «TinyML» این مسیر را برای ما هموارتر از همیشه کرده است.

راز اصلی این پروژه، قدرت پردازش تصویر با رزبری پای است. این رایانه کوچک و قدرتمند، همان حلقه گمشده‌ای است که به ما اجازه می‌دهد بدون نیاز به کامپیوترهای بزرگ، مدل‌های پیچیده هوش مصنوعی را به صورت بلادرنگ (Real-time) اجرا کنیم.

پردازش تصویر با رزبری پای

چرا “پردازش تصویر با رزبری پای” بهترین انتخاب برای شروع است؟

یکی از بزرگترین موانع در راه یادگیری هوش مصنوعی، پیچیدگی محاسباتی و هزینه‌های بالای سخت‌افزار است. اما در این پروژه، ما نشان می‌دهیم که چگونه با استفاده از یک برد رزبری پای، می‌توان به دقت خیره‌کننده ۹۸.۸۲ درصد در تشخیص مسیر رسید! نکته جذاب اینجاست که برای شروعِ این سفر هیجان‌انگیز، نیازی نیست بلافاصله هزینه‌های سنگین کنید. استفاده از بردهای رزبری پای استوک که به‌صرفه و تست‌شده هستند، یک انتخاب هوشمندانه برای دانشجویان و علاقه‌مندان است تا بودجه خود را روی بخش‌های مهم‌تر مثل سنسورها یا شاسی ماشین متمرکز کنند.

در این مقاله چه چیزی یاد می‌گیریم؟

ما در این مطلب، قدم به قدم همراه شما هستیم تا یک خودروی مدلِ مقرون‌به‌صرفه را طراحی و پیاده‌سازی کنیم. ما از ترکیب قدرتمندِ Tensorflow Lite برای اجرای بهینه مدل‌ها، شبکه MobileNet برای پردازش تصویر، و الگوریتم Haar Cascade برای تشخیص علائم راهنمایی و رانندگی استفاده می‌کنیم. همه این‌ها بر بسترِ سیستم‌های نهفته (Embedded Systems) و با تمرکز بر دنیای جذاب TinyML انجام می‌شود.

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

مقدمه ای بر خودرو های خودران

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

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

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

چرا هوش مصنوعی برای خودروهای خودران ضروری است؟

برای اینکه یک خودرو بتواند به‌صورت مستقل عمل کند، باید مثل انسان «ببیند»، «تحلیل کند» و «تصمیم بگیرد». این سه وظیفه بدون استفاده از هوش مصنوعی و یادگیری عمیق عملاً امکان‌پذیر نیست. روش‌های سنتی پردازش تصویر، اگرچه در محیط‌های ساده عملکرد قابل قبولی دارند، اما در دنیای واقعی با محدودیت‌های زیادی روبه‌رو می‌شوند. تغییرات نور، باران، برف، سایه‌ها، پیچ‌های جاده و وجود موانع متحرک، همگی عواملی هستند که دقت روش‌های کلاسیک را کاهش می‌دهند. یادگیری عمیق این مشکل را تا حد زیادی برطرف کرده است. در این رویکرد، مدل‌های عصبی به‌جای اینکه با قوانین ثابت برنامه‌ریزی شوند، از داده‌های واقعی یاد می‌گیرند و ویژگی‌های مهم را به‌صورت خودکار استخراج می‌کنند. به همین دلیل، شبکه‌های عصبی کانولوشنی و مدل‌های سبک‌تر یادگیری عمیق، امروزه در تشخیص مسیر، شناسایی علائم راهنمایی و رانندگی، تشخیص موانع و حتی تصمیم‌گیری لحظه‌ای خودروهای خودران استفاده می‌شوند.

TinyML چیست و چرا مهم است؟

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

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

ارتباط TinyML با “پردازش تصویر با رزبری پای”

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

طراحی سیستم خودرو خودران با رزبری پای چگونه انجام می‌شود؟

در این پروژه، هدف فقط ساخت یک ماشین کوچک متحرک نیست؛ هدف این است که یک سیستم خودران کم‌هزینه طراحی کنیم که بتواند چند وظیفه مهم را به‌صورت هم‌زمان انجام دهد. چالش اصلی هم از همان ابتدا مشخص است: بیشتر سامانه‌های حرفه‌ای خودروهای خودران روی سخت‌افزارهای بسیار قدرتمند و گران‌قیمت مثل GPUها یا پردازنده‌های اختصاصی اجرا می‌شوند، اما اینجا قرار است همه‌چیز روی یک بستر سبک، اقتصادی و در دسترس پیاده‌سازی شود.

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

آموزش مدل تشخیص مسیر

یکی از مهم‌ترین بخش‌های این پروژه، آموزش مدل تشخیص مسیر است. برای این کار، یک مجموعه‌داده با بیش از 10 هزار تصویر جمع‌آوری و برچسب‌گذاری می‌شود تا مدل بتواند شرایط مختلف مسیر را یاد بگیرد. بعد از آماده‌سازی داده‌ها، چند معماری مختلف شبکه عصبی را بررسی می‌کنیم؛ از جمله MLP، CNN و MobileNet. پس از مقایسه این مدل‌ها، نسخه بهینه‌شده MobileNet Lite را به‌عنوان مدل نهایی انتخاب می‌کنیم. دلیل این انتخاب هم مشخص است: این مدل در عین سبک بودن، دقت مناسبی ارائه می‌دهد و برای اجرا روی سخت‌افزارهای کم‌منبع مثل رزبری پای گزینه بسیار خوبی به حساب می‌آید. این دقیقاً همان جایی است که مفهوم TinyML و اجرای مدل‌های سبک روی بردهای کوچک اهمیت پیدا می‌کند.

تشخیص علائم و موانع در کنار پردازش تصویر

در کنار تشخیص مسیر، لازم است خودرو بتواند علائم راهنمایی و رانندگی را هم در لحظه شناسایی کند. برای این بخش از الگوریتم Haar Cascade استفاده می‌کنیم؛ روشی سبک و سریع که برای تشخیص بلادرنگ روی سیستم‌های محدود، انتخاب مناسبی محسوب می‌شود. همچنین برای تشخیص فاصله موانع، یک سنسور اولتراسونیک در نظر می‌گیریم تا خودرو بتواند موانع روبه‌رو را شناسایی کند و در صورت نیاز واکنش لازم را انجام دهد. نکته مهم اینجاست که تمام این بخش‌ها باید به‌صورت هم‌زمان کار کنند. یعنی سیستم باید هم‌زمان تصویر را تحلیل کند، مسیر را تشخیص دهد، علائم را بشناسد و فاصله موانع را هم بسنجد؛ آن هم بدون اینکه به سخت‌افزار گران‌قیمت نیاز داشته باشد.

اجرای مدل‌ها روی رزبری پای

برای اینکه این الگوریتم‌ها روی برد رزبری پای قابل اجرا باشند، مدل‌ها را با استفاده از TensorFlow Lite بهینه‌سازی و فشرده‌سازی می‌کنیم. این مرحله اهمیت زیادی دارد، چون مدل‌های یادگیری عمیق در حالت معمول ممکن است برای یک برد کوچک بیش از حد سنگین باشند. اما با سبک‌سازی مدل، امکان اجرای هم‌زمان MobileNet Lite، الگوریتم Haar Cascade و سنسور اولتراسونیک فقط روی CPU فراهم می‌شود. این یعنی یک برد کوچک مثل رزبری پای می‌تواند نقش مغز اصلی خودرو را برعهده بگیرد و بدون نیاز به پردازنده‌های پیچیده و پرهزینه، بخش مهمی از وظایف یک سیستم خودران را انجام دهد. به همین دلیل، اگر کسی بخواهد یک پروژه آموزشی یا نیمه‌حرفه‌ای در حوزه پردازش تصویر با رزبری پای اجرا کند، این معماری می‌تواند یک الگوی بسیار کاربردی و مقرون‌به‌صرفه باشد.

لیست قطعات سخت‌افزاری پروژه خودرو خودران

برای ساخت این سیستم، ما از قطعات زیر استفاده کردیم. انتخاب این موارد به دلیل تعادل میان قدرت پردازشی و قیمت تمام‌شده بوده است:

 

Specification Part number
8Gb RAM, Quad core Cortex-A72 (ARM v8) 64-bit Raspberry pi4
ATmega328P, 14 digital input/output Arduino uno
8MP More than HD: Supports 3280 × 2464 Camera
Ranging Distance: 2cm – 4m Ultrasonic-SR04/5
433MHz, 4 Channels RF Remote Control
In: 4 to 35v, out: 1.25 to 35v 5A DC-DC Converter
5V,20mA BUZZER & LED

چرا ۸ گیگ رم؟ چون برای اجرای هم‌زمان چندین پردازش سنگین (OpenCV و TensorFlow Lite) نیاز به فضای رم کافی داشتیم تا سیستم دچار لگ (Lag) نشود.

دیاگرام کلی خودرو مدل خودران:

پردازش تصویر با رزبری پای

ورودی‌های سیستم خودرو خودران: حسگرها چه نقشی دارند؟

در هر سیستم خودران، تصمیم‌گیری درست بدون دریافت داده دقیق از محیط ممکن نیست. به همین دلیل، حسگرهای ورودی یکی از مهم‌ترین بخش‌های معماری خودرو خودران به حساب می‌آیند. در این پروژه هم دو حسگر اصلی وظیفه جمع‌آوری اطلاعات محیطی را برعهده دارند: سنسور اولتراسونیک HC-SR04 و دوربین PiCam مبتنی بر حسگر Sony IMX219. این دو حسگر در کنار هم، دید کامل‌تری از شرایط مسیر در اختیار سیستم قرار می‌دهند و به رزبری پای کمک می‌کنند تا تصمیم دقیق‌تری بگیرد.

سنسور اولتراسونیک HC-SR04 چگونه کار می‌کند؟

سنسور HC-SR04 یکی از رایج‌ترین حسگرهای فاصله‌سنج در پروژه‌های رباتیکی و خودروهای کوچک هوشمند است. در این پروژه، از این سنسور برای اندازه‌گیری فاصله خودرو تا موانع استفاده می‌کنیم. عملکرد آن هم ساده و کاربردی است: حسگر از طریق پایه Trigger یک موج صوتی با فرکانس 40 کیلوهرتز ارسال می‌کند و از طریق پایه Echo بازتاب همان موج را دریافت می‌کند. با اندازه‌گیری زمان رفت‌وبرگشت این موج، فاصله مانع تا خودرو محاسبه می‌شود.

محدوده اندازه‌گیری این سنسور معمولاً بین 2 تا 400 سانتی‌متر است و دقتی در حدود 3± میلی‌متر دارد. همین ویژگی‌ها باعث می‌شود HC-SR04 برای یک خودرو خودران کوچک، گزینه‌ای مناسب و اقتصادی باشد. دلیل انتخاب این حسگر در این پروژه هم دقیقاً همین است: قیمت مناسب، دقت قابل قبول و راه‌اندازی ساده. برای اینکه سنسور بتواند موانع روبه‌رو را سریع‌تر تشخیص دهد، آن را در بخش جلویی خودرو نصب می‌کنیم. داده‌های خروجی این حسگر مستقیماً به Raspberry Pi ارسال می‌شوند و در کنار داده‌های دوربین، نقش مهمی در تصمیم‌گیری نهایی خودرو ایفا می‌کنند. به‌عبارت ساده‌تر، دوربین به خودرو کمک می‌کند محیط را ببیند و سنسور اولتراسونیک کمک می‌کند فاصله موانع را بهتر تشخیص دهد.

دوربین PiCam مهم‌ترین حسگر این سیستم

در کنار سنسور فاصله، دوربین PiCam اصلی‌ترین ابزار ادراکی خودرو در بخش بینایی ماشین است. این دوربین که بر پایه حسگر Sony IMX219 کار می‌کند، به‌صورت مداوم از محیط پیش‌رو تصویر می‌گیرد و داده‌هایی مثل مسیر حرکت، خطوط جاده و علائم راهنمایی و رانندگی را در اختیار سیستم قرار می‌دهد. این اطلاعات بعد از ثبت، به رزبری پای منتقل می‌شوند تا در الگوریتم‌های پردازش تصویر و یادگیری ماشین استفاده شوند. در واقع اگر بخواهیم ساده بگوییم، دوربین همان بخشی است که «چشم» خودرو را می‌سازد. بدون آن، تشخیص مسیر، شناسایی تابلوها و تحلیل شرایط جاده عملاً ممکن نیست.

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

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

کالیبراسیون دوربین چه کمکی به دقت سیستم می‌کند؟

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

کالیبراسیون دوربین چگونه انجام می‌شود؟

برای کالیبراسیون، از یک الگوی شطرنجی تخت یا Checkerboard استفاده می‌کنیم.

الگوی شطرنجی تخت

در این روش، دوربین از زوایا و فاصله‌های مختلف، چندین تصویر از این الگو ثبت می‌کند. هرچه تنوع زاویه‌ها و فاصله‌ها بیشتر باشد، دقت کالیبراسیون هم بالاتر می‌رود. در این پروژه، برای رسیدن به دقت بهتر، بیش از 40 تصویر از الگوی شطرنجی جمع‌آوری می‌شود. بعد از ثبت تصاویر، گوشه‌های خانه‌های شطرنجی در هر تصویر شناسایی می‌شوند. این گوشه‌ها به‌عنوان نقاط مرجع دوبعدی یا Image Points در نظر گرفته می‌شوند. از آنجا که الگوی شطرنجی روی یک صفحه صاف قرار دارد، مختصات واقعی این نقاط هم به‌صورت سه‌بعدی یا World Points تعریف می‌شوند. با استفاده از این دو دسته داده، می‌توان پارامترهای هندسی دوربین را محاسبه کرد. برای شناسایی دقیق گوشه‌ها از توابع findChessboardCorners و cornerSubPix در کتابخانه OpenCV استفاده می‌کنیم. این توابع به سیستم کمک می‌کنند موقعیت گوشه‌ها را با دقت بالا تشخیص دهد و کیفیت نهایی کالیبراسیون بهتر شود.

در پایان این مرحله، خروجی کالیبراسیون شامل ماتریس دوربین (Camera Matrix)، ضرایب اعوجاج و پارامترهای خارجی برای هر تصویر است. این مقادیر در نرم‌افزارهای بینایی ماشین مثل OpenCV ذخیره می‌شوند و در مراحل بعدی برای اصلاح اعوجاج تصویر و نگاشت دقیق مختصات به کار می‌روند. ماتریس کالیبراسیون دوربین که معمولاً با نماد K نمایش داده می‌شود، ساختار هندسی تصویربرداری را مشخص می‌کند و نقش مهمی در تحلیل دقیق تصاویر دارد. همین پارامترها بعداً در بخش‌هایی مثل تخمین فاصله علائم راهنمایی و رانندگی از دوربین هم استفاده می‌شوند. این موضوع در خودروهای خودران اهمیت زیادی دارد، چون تصمیم‌هایی مثل کاهش سرعت، توقف یا تغییر مسیر، به درک درست موقعیت علائم نسبت به خودرو وابسته هستند.

۱. آماده‌سازی برای کالیبراسیون

قبل از اجرای کد، باید چند مرحله ساده را انجام دهیم:

  • چاپ الگو: ابتدا یک الگوی شطرنجی استاندارد را روی یک کاغذ A4 چاپ کن و آن را روی یک سطح کاملاً صاف (مثل یک تخته شاسی) بچسبان.
  • محیط کار: جایی را انتخاب کن که نور یکنواختی داشته باشد تا سایه‌های اضافی روی کاغذ نیفتد.
  • تصویربرداری: حالا باید حدود ۱۵ تا ۲۰ عکس از زوایای مختلف (چپ، راست، بالا، پایین و کج) از این تخته شطرنجی بگیری. دقت کن که در برخی عکس‌ها، تخته شطرنجی باید کل کادر دوربین را پر کند و در برخی دیگر فاصله بیشتری داشته باشد.

نکته: کد مربوط به ذخیره سازی تصاویر شطرنجی رو باید با خود رزبری پای ( دوربین متصل باشد) اجرا کنید تا با دوربین خودش از تصاویر عکس بگیرد. 

۲. ذخیره سازی تصاویر شطرنجی با Python

import time
from picamera2 import Picamera2, Preview

picam2 = Picamera2()
preview_config = picam2.create_preview_configuration(main={"size": (420, 240)})
picam2.configure(preview_config)
picam2.start_preview(Preview.QTGL)
picam2.start()
time.sleep(10)
metadata = picam2.capture_file("f25.jpg")
print(metadata)
picam2.close()

3-اجرای کد کالیبراسیون

 

import cv2
import numpy as np
import glob
# Stop criteria for corner refinement
criteria = (
    cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER,
    30,
    0.001
)
# Prepare 3D points of the chessboard pattern
object_point = np.zeros((6 * 9, 3), np.float32)
object_point[:, :2] = np.mgrid[0:9, 0:6].T.reshape(-1, 2)
object_points = []
image_points = []
h, w = 0, 0
# Load all calibration images
images = glob.glob("chess_board/*.jpg")
for file_name in images:
    image = cv2.imread(file_name)
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    h, w = gray.shape[:2]
    # Find chessboard corners
    ret, corners = cv2.findChessboardCorners(gray, (9, 6), None)
    if ret:
        object_points.append(object_point.copy())
        corners = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
        image_points.append(corners)
        # Draw and display the detected corners
        cv2.drawChessboardCorners(image, (9, 6), corners, ret)
        cv2.imshow("image", image)
        cv2.waitKey(500)
# Run camera calibration
retval, cameraMatrix, distCoeffs, rvecs, tvecs = cv2.calibrateCamera(
    object_points,
    image_points,
    (w, h),
    None,
    None
)
print("Camera matrix:\n", cameraMatrix)
print("Distortion coefficients:\n", distCoeffs)
# Extract intrinsic camera parameters
fx = cameraMatrix[0, 0]
fy = cameraMatrix[1, 1]
cx = cameraMatrix[0, 2]
cy = cameraMatrix[1, 2]
print("fx:", fx)
print("fy:", fy)
print("cx:", cx)
print("cy:", cy)
cv2.destroyAllWindows()

واحد پردازشگر مرکزی

در این بخش، به قلب تپنده سیستم یعنی رزبری پای ۴ می‌رسیم. استفاده از این برد قدرتمند به ما اجازه می‌دهد پردازش‌های سنگین بلادرنگ (Real-time) را با سرعت بالا انجام دهیم. در این سیستم، رزبری پای 4 وظیفه تحلیل جریان تصاویر ارسالی از دوربین را بر عهده دارد. دوربین مورد استفاده، تصاویر را با رزولوشن ۲۴۰ × ۴۲۰ پیکسل و نرخ ۳۰ فریم بر ثانیه به واحد پردازش می‌فرستد.

به‌منظور افزایش سرعت و دقت، مراحل زیر روی تصاویر اعمال می‌شود:

  1. برش تصویر (Crop): تصویر اولیه به ابعاد ۶۰ × ۴۲۰ پیکسل برش داده می‌شود. این بخش که آن را ناحیه جستجو یا ROI (به شکل زیر توجه کنید) می‌نامیم، به سیستم کمک می‌کند تا فقط بر روی مسیر حرکت تمرکز کند و محاسبات اضافه را حذف کند.
  2. پیش‌پردازش (Preprocessing): برای حذف نویزهای محیطی و بهبود کنتراست، ابتدا فیلتر گوسی (Gaussian Blur) و سپس عملیات مورفولوژیکی Opening اعمال می‌گردد تا داده‌های تصویری برای الگوریتم‌های هوش مصنوعی کاملاً شفاف و بهینه شوند.
  3. نمایش وضعیت: مطابق با شکل ۱، تصویر اصلی به‌همراه ناحیه ROI به‌صورت هم‌زمان بر روی مانیتور متصل به رزبری پای نمایش داده می‌شود تا بتوانیم عملکرد سیستم را به‌صورت زنده پایش کنیم.

نکته فنی برای شما: استفاده از رزبری پای ۴ در این پروژه باعث شده تا تعادل بسیار خوبی بین «مصرف توان» و «قدرت پردازشی» برقرار شود. اگر از نسخه‌های رزبری پای استوک استفاده می‌کنید، مطمئن شوید که سیستم خنک‌کننده (هیت‌سینک یا فن) را حتماً برای پردازش‌های سنگین دوربین متصل کرده‌اید تا افت فریم نداشته باشید.

ناحیه roi پردازش تصویر با رزبری پای

در این پروژه، واحد پردازشگر مرکزی نقش اصلی را در دریافت داده‌ها، پردازش اطلاعات و صدور فرمان‌های کنترلی بر عهده دارد. این واحد داده‌های ورودی را از منابع مختلف مانند دوربین، شبکه عصبی، الگوریتم تشخیص تابلو و حسگر فاصله دریافت می‌کند و پس از تحلیل آن‌ها، تصمیم مناسب را برای هدایت خودرو صادر می‌نماید. در بخش پردازش تصویر، ابتدا ناحیه پایین تصویر اصلی که شامل بخش مهمی از مسیر و خطوط جاده است، جدا یا کراپ می‌شود. دلیل انتخاب این ناحیه آن است که تغییرات خطوط جاده در قسمت پایینی تصویر واضح‌تر دیده می‌شود و این بخش بیشترین اطلاعات لازم برای تعیین مسیر حرکت خودرو را در اختیار سیستم قرار می‌دهد. پس از جداسازی این ناحیه، تصویر کراپ‌شده به ابعاد 80×60 پیکسل تغییر اندازه داده می‌شود. سپس این تصویر به شبکه عصبی MobileNet Lite که از قبل آموزش دیده است، ارسال می‌گردد. این شبکه عصبی وظیفه دارد بر اساس ویژگی‌های استخراج‌شده از تصویر، فرمان حرکتی مناسب خودرو را پیش‌بینی کند.

خروجی شبکه عصبی می‌تواند شامل فرمان‌های مختلفی مانند موارد زیر باشد:

  • حرکت به سمت راست
  • حرکت به سمت چپ
  • حرکت مستقیم
  • توقف خودرو در شرایط خاص

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

تشخیص تابلوهای راهنمایی و رانندگی با Haar Cascade

همزمان با پردازش مسیر توسط شبکه عصبی، الگوریتم Haar Cascade نیز روی تصویر اصلی اعمال می‌شود. هدف از استفاده از این الگوریتم، تشخیص و طبقه‌بندی تابلوهای راهنمایی و رانندگی در محیط حرکت خودرو است. الگوریتم Haar Cascade یکی از روش‌های کلاسیک و سریع در پردازش تصویر است که برای تشخیص اشیا در تصویر استفاده می‌شود. در این پروژه، این الگوریتم به‌طور خاص برای شناسایی چند نوع تابلو و علامت مهم آموزش داده شده است، از جمله:

  • تابلوی ایست
  • چراغ راهنمایی
  • سرعت‌گیر یا Speed Bump
  • تابلوهای محدودیت سرعت

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

اولویت‌بندی سیگنال‌ها در بلوک تصمیم‌گیری

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

واحد خروجی سیستم

واحد خروجی سیستم یکی از بخش‌های کلیدی در سامانه خودروی خودران پیشنهادی است که وظیفه اجرای تصمیمات اتخاذشده توسط واحد پردازشی را بر عهده دارد. در این پروژه، خروجی‌ها شامل موتورهای الکتریکی 12 ولت برای تأمین نیروی محرکه، درایور L298N به‌عنوان واسط کنترلی موتور، LEDها برای نمایش وضعیت ترمز، و بازر هشدار برای اطلاع‌رسانی وجود مانع هستند. ترکیب این اجزا باعث می‌شود خودرو بتواند در محیط واقعی به‌صورت خودکار حرکت کند، متوقف شود و در شرایط لازم هشدار مناسب را ارائه دهد. موتورهای الکتریکی نقش اصلی را در ایجاد حرکت خودرو ایفا می‌کنند. در این پروژه از دو موتور DC 12 ولت استفاده شده است که هر یک به یکی از چرخ‌های محرک خودرو متصل می‌شوند. این موتورها با سیگنال‌های PWM دریافتی از برد پردازش مرکزی کنترل می‌شوند و سرعت آن‌ها متناسب با عملکرد موردنیاز سیستم، مانند حرکت مستقیم، پیچیدن به راست، پیچیدن به چپ یا توقف، تغییر می‌کند. برای راه‌اندازی و کنترل موتورهای DC، وجود یک درایور واسط میان برد Raspberry Pi و موتورها ضروری است. دلیل این موضوع آن است که پردازنده مرکزی به‌تنهایی توان تأمین جریان و ولتاژ موردنیاز موتور را ندارد. در این پژوهش از درایور L298N استفاده شده است که یکی از پرکاربردترین ماژول‌های راه‌انداز موتور در پروژه‌های رباتیک و سامانه‌های کنترلی به شمار می‌آید.

L298 یک درایور دوبل H-Bridge است که قابلیت کنترل هم‌زمان دو موتور DC یا یک موتور پله‌ای را دارد. در ساختار داخلی این درایور، دو پل کامل H-Bridge تعبیه شده است که به کمک آن‌ها می‌توان جریان لازم برای موتور را تأمین و جهت چرخش آن را کنترل کرد. هر پل H-Bridge از چهار کلید الکترونیکی تشکیل شده است که با تغییر وضعیت آن‌ها، امکان تغییر جهت حرکت موتور فراهم می‌شود. به این ترتیب، سیستم می‌تواند متناسب با فرمان صادرشده از واحد تصمیم‌گیری، خودرو را به سمت راست یا چپ هدایت کرده یا آن را متوقف نماید.

برای نمایش وضعیت حرکتی خودرو و افزایش قابلیت پایش توسط کاربر یا ناظر انسانی، یک LED خروجی نیز در سامانه در نظر گرفته شده است. این LED به‌عنوان نشانگر ترمز عمل می‌کند و در شرایطی که خودرو دستور توقف دریافت نماید، روشن می‌شود. برای مثال، در هنگام تشخیص چراغ قرمز، تابلوی ایست یا مانع نزدیک، این LED فعال خواهد شد. استفاده از LED علاوه بر نمایش وضعیت، یک ابزار ساده، کم‌هزینه و مؤثر برای تست و عیب‌یابی عملکرد نرم‌افزار و بخش کنترلی نیز محسوب می‌شود.

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

در مجموع، واحد خروجی سیستم نقش نهایی را در تبدیل تصمیمات نرم‌افزاری به عملکرد فیزیکی خودرو بر عهده دارد. به بیان دیگر، پس از آن‌که داده‌های ورودی توسط دوربین، شبکه عصبی، الگوریتم تشخیص علائم و حسگر فاصله پردازش شدند، نتایج حاصل از این تحلیل‌ها از طریق واحد خروجی به اعمال واقعی مانند حرکت، توقف، هشدار نوری و هشدار صوتی تبدیل می‌شوند. این موضوع نشان می‌دهد که عملکرد صحیح واحد خروجی، برای اجرای دقیق و ایمن فرامین در سامانه خودروی خودران اهمیت بسیار زیادی دارد. در پایان، برای درک بهتر نحوه ارتباط اجزای مختلف، شکل زیر شماتیک کلی سامانه را نمایش می‌دهد. در این شکل، نحوه اتصال حسگر اولتراسونیک، دوربین، درایور موتور L298N، موتورهای حرکتی، LED و بازر هشدار به برد Raspberry Pi و منبع تغذیه سیستم نشان داده شده است.

شماتیک برد پردازش تصویر با برد رزبری پای

جمع‌بندی و گام بعدی

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

در جلسه و مقاله بعدی به سراغ موضوعات جذاب زیر خواهیم رفت:

  • نحوه جمع‌آوری دیتاست (Dataset Extraction): چگونگی تصویربرداری از مسیر، برچسب‌گذاری تصاویر و آماده‌سازی داده‌های آموزشی.
  • آموزش شبکه عصبی MobileNet Lite: فرآیند طراحی، بهینه‌سازی و آموزش مدل یادگیری عمیق برای پیش‌بینی دقیق جهت حرکت خودرو.
  • پیاده‌سازی و استقرار روی رزبری پای: انتقال مدل آموزش‌دیده به لبه شبکه (Edge)، استفاده از ابزار TensorFlow Lite برای اجرای روان و بلادرنگ (Real-time) مدل روی سخت‌افزار محدود رزبری پای.

با ما همراه باشید تا در بخش بعدی، این خودروی خودران را به‌طور کامل هوشمند کنیم و اولین تست‌های جاده‌ای آن را رقم بزنیم!

💬 نوبت شماست!

ما در این مقاله تلاش کردیم بخش سخت‌افزاری، کالیبراسیون دوربین و معماری اولیه سیستم را به زبان ساده و کاربردی توضیح دهیم. اما برای ما بسیار مهم است که بدانیم شما در چه مرحله‌ای از پروژه هستید و چه نیازهایی دارید:

  • آیا بخش خاصی از این مقاله (مثلاً کالیبراسیون دوربین یا راه‌اندازی درایور L298N) نیاز به توضیح یا جزئیات بیشتری دارد؟
  • دوست دارید در بخش‌های بعدی، روی کدام موضوعات تمرکز بیشتری داشته باشیم؟
    • آموزش قدم‌به‌قدم جمع‌آوری و برچسب‌گذاری تصاویر؟
    • نحوه آموزش مدل MobileNet Lite در گوگل کولب؟
    • یا چالش‌های پیاده‌سازی و کدنویسی پایتون روی رزبری پای؟

نظرات، سوالات و چالش‌های خود را در بخش دیدگاه‌های همین صفحه بنویسید. ما تمام کامنت‌ها را می‌خوانیم و در آموزش‌های بعدی از آن‌ها استفاده می‌کنیم! 😉

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

Time limit exceeded. Please complete the captcha once again.