Моя подорож у світ автономного водіння: створення системи виявлення смуг — Частина 1

Вступ

У цьому швидко змінюваному світі, де інновації та технології розвиваються стрімко, мене завжди захоплювали електричні автомобілі та автономне водіння. Як самокеровані автомобілі знають, куди їхати? Здатність машини визначати смуги руху, інші транспортні засоби на дорозі, дотримуватися правил дорожнього руху та багато іншого викликала в мене цікавість, і я вирішив дослідити науку, яка стоїть за цим, розв’язуючи кожне завдання по черзі.

Виявлення смуг є одним із основних елементів автономних транспортних засобів; саме це допомагає автомобілю розпізнати своє місцезнаходження на дорозі і залишатися в межах своєї смуги. Це також те, що робить можливими такі складні системи допомоги водієві (ADAS), як допомога у збереженні смуги руху.

Натхнений цією ідеєю, я вирішив створити Систему Виявлення Смуг з нуля, і я хотів, щоб вона робила дві (2) речі:

  1. Визначати місцезнаходження автомобіля на дорозі (ліво, центр чи право від смуги).
  2. Працювати в реальному часі на Arduino, доводячи, що штучний інтелект може працювати навіть в умовах обмежених ресурсів.

У цій статті я поділюсь тим, як я підходив до першого завдання, які технології використовував і які уроки отримав на своєму шляху.

💡 Розбір Проблеми

Виявлення смуг може здатися простим — зрештою, це ж просто визначення ліній на дорозі, правда? Але реальні умови роблять це завдання набагато складнішим:

  1. Деякі смуги криві, з витертими маркуваннями або нечіткими краями.
  2. Тіні, відблиски та погодні умови можуть ускладнювати визначення смуг.
  3. Обмеження в реальному часі, особливо коли працюєш з малопотужними пристроями, такими як плати Arduino.

Я зрозумів, що для вирішення цієї проблеми знадобиться комбінація різних технік:

  1. Класичний комп'ютерний зір для виявлення країв та ліній.
  2. Глибоке навчання для більш надійного розпізнавання патернів, особливо в складних ситуаціях.
  3. Легковагова реалізація для того, щоб кінцева модель працювала на вбудованому обладнанні.

🛠️ Технології та Методи, Які Я Використовував

Попередня Обробка Даних за допомогою OpenCV:

Перед тим як подавати зображення до нейронних мереж, їх потрібно очистити та підготувати, оскільки нейронні мережі працюють краще з послідовними та безшумними вхідними даними. Попередня обробка покращує ключові особливості, одночасно пригнічуючи непотрібні деталі, такі як тіні або фоновий шум. Саме тут і прийшла на допомогу OpenCV. Ось кроки, які я виконав:

  1. Перетворення в відтінки сірого: Для виявлення смуг колір не потрібен, тому я зменшив складність зображень, перетворивши RGB-ізображення в одноканальний відтінок сірого, зменшуючи тим самим шум.
  2. Зміна розміру: Нейронні мережі люблять послідовність, тому я змінив розмір всіх зображень до однакового 64x64 пікселів.
  3. Виявлення країв за допомогою Canny: Я використовував цей класичний алгоритм для виявлення країв та підкреслення меж смуг. Чому саме цей підхід? Виявлення країв за допомогою Canny є надійним та швидким, підкреслюючи різкі градієнти (як межі смуг), і ігноруючи більш плавні області (як дорожнє покриття). Це був чудовий інструмент для комп'ютерного зору, який було введено Джоном Кенні в 1986 році.

Перетворення Хафа: Класична Геометрія в Дії

Після виявлення країв я використав Перетворення Хафа для визначення ліній смуг. Це надійний математичний метод, запропонований Полом Хафом у 1962 році, який дозволяє виявляти прямі лінії, навіть якщо вони частково приховані. Метод відображає точки в зображенні на криві в параметричному просторі.
Пряма лінія в декартовій системі координат, y = mx + b, може бути виражена в полярній формі:

r = x cos(θ) + y sin(θ)

де r — це відстань від початку координат, а θ — кут нахилу. Точки, що збігаються уздовж лінії в просторі зображення, перетворюються в криві, що перетинаються в просторі Хафа.

lines = cv2.HoughLinesP(masked_edges, rho=1, theta=np.pi/180, threshold=50, minLineLength=50, maxLineGap=20)  

for line in lines:  
 x1, y1, x2, y2 = line[0]  
 cv2.line(image, (x1, y1), (x2, y2), (255, 0, 0), 5)

Згорткові Нейронні Мережі (CNN): Навчання на Даних

Хоча класичні методи, як Перетворення Хафа, добре працюють у контрольованих умовах, вони можуть мати проблеми в складних ситуаціях (наприклад, на кривих, при поганому освітленні).
CNN чудово працюють в різноманітних реальних умовах.

Згорткові нейронні мережі (CNN) обробляють зображення шар за шаром, автоматично вивчаючи такі патерни, як краї, текстури та форми, причому кожен шар виділяє ознаки, які допомагають мережі класифікувати зображення. У моєму випадку метою було класифікувати положення автомобіля на дорозі як ліво, центр або право.

Щоб натренувати CNN:

  1. Я отримав набір даних з https://paperswithcode.com/, який містив достатньо зображень для тренування моєї моделі.
  2. Я нормалізував значення пікселів (масштабируючи їх до [0, 1]), щоб тренування проходило швидше і було стабільнішим.
  3. Я додав аугментацію (наприклад, перевертання та корекцію яскравості), щоб зробити модель більш стійкою до різних умов.

📈 Результати та Наступні Кроки

  • Моя CNN досягла точності понад 95% у класифікації положень смуг.

pic

Сире зображення

pic

Оброблене зображення

  • Наступний крок — розгортання моделі TensorFlow Lite на Arduino та її запуск для оцінки продуктивності, а також візуалізація прогнозів, накладених на зображення доріг, для підтвердження надійності системи. Цей етап буде розглянуто в наступному пості цієї серії.

🔍 Ключові Концепції, Які Виділяються

Під час створення цієї системи я досліджував кілька захоплюючих концепцій:

  • Перетворення Хафа: Спочатку введене у 1962 році, ця техніка поєднує геометрію з комп'ютерним зором таким чином, що це виглядає майже магічно. Ідея того, що пряму лінію можна представити як точку в параметричному просторі, є такою ж елегантною, як і потужною.
  • Функція Softmax: Останній шар моєї нейронної мережі використовував її для перетворення сирих виходів у ймовірності. Це гарантує, що вихід можна інтерпретувати як ймовірності класів (наприклад, модель на 90% впевнена, що автомобіль знаходиться в центрі смуги).

🤔 Обговорімо!

  1. Як ви бачите вплив штучного інтелекту на майбутнє автономного водіння та вбудованих систем?
  2. Чи працювали ви над подібними проектами? Мені було б цікаво почути ваші думки та досвід.

Повний код можна знайти на GitHub тут, якщо ви хочете дослідити чи повторити цей проект. Сподіваюся, що ця стаття була корисною! Якщо так, підписуйтесь або слідкуйте за новими публікаціями.

Перекладено з: My Journey into the World of Autonomous Driving: Building a Lane Detection System — Part 1

Leave a Reply

Your email address will not be published. Required fields are marked *