Нейронная сеть считает лес кругляк и распознает автомобильные номера. Как это сделано? |
||
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2022-04-20 13:59 В статье покажем, как алгоритмы компьютерного зрения помогают решить задачу автоматического определения объема круглого леса в лесовозе по фотографии. Пройдем путь от идеи до прототипа. Расскажем, какие были выбраны решения и почему. Необходимая подготовка читателя — должно быть общее представление о компьютерном зрении (computer vision) и нейронных сетях. Здесь не будет описаний, что такое сверточная нейронная сеть и т.п., статей по таким основам найдете много на хабре (вот хорошая Глубокое обучение для новичков: распознаем изображения с помощью сверточных сетей). В то же время, совсем новички могут получить представление, какие знания и компетенции нужны для решения подобных задач. Применялись:
В статье ниже упоминаются еще всякие штуки. По условию задачи требовалось определить объем бревен в лесовозе по фотографии с телефона. «Линейкой» будет автомобильный номер. Размер автомобильного номерного знака определен в ГОСТ Р 50577-2018: Для расчета объема нужна еще длина бревен — задается вручную. Теперь по шагам, какие были выбраны решения и почему. Алгоритм:
С чего начать? Конечно посмотреть, какие уже есть решения и подходы. При этом не забыть заглянуть в ГОСТ 32594-2013 «Лесоматериалы круглые. Методы измерений». В интернете нашлось несколько готовых решений для автоматического расчета количества и размеров бревен. Это дало понимание, что задача точно решаемая. Но готовых opensource по распознаванию кругляка не попалось. Для обнаружения бревен предпочтение сразу отдали нейронным сетям. Алгоритмы классического машинного обучения не рассматривали, в computer vision задачах они проигрывают нейронным сетям с большим отрывом. Ниже есть пример, где это наглядно видно. Обнаруживаем на изображении бревна Если задуматься, то чем обнаружение отдельного бревна на изображении отличается от задачи обнаружения лица человека? Гипотеза, что решение, которое хорошо обнаруживает лица при соответствующем обучении справится и с бревнами, оказалась верной. Остановились в итоге на решении YOLOv5. Оно не специализируется прям на лицах/бревнах, но выбрано т.к.:
И не прогадали. Для тестирования было выбрано несколько фото, где бревен поменьше. Лучше разметить несколько разных фото с малым количеством бревен, чем много бревен на одном фото. Уже на трех(!) размеченных фото с лесовозами, на изображениях 320х320, yolo показала свой потенциал. То что yolo прекрасно справится с задачей, сомнений не осталось. Для тренировки YOLOv5 необходимо для каждого изображения создать текстовый файл с тем же именем, но расширением .txt. В файл записывается номер класса объекта и координаты рамки (bounding box): Класс один — кругляк. Обнаружение номера не стали мешать с бревнами, чтобы избежать сильной разбалансировки классов. Пример содержимого файла разметки: Обратите внимание, что координаты относительные, в интервале от 0 до 1. Для расширения тренировочной базы применена аугментация (получение новых изображений с помощью случайного сдвига, масштабирования, растягивания исходных изображений). С этой задачей отлично справилась библиотека Albumentations — простая в использовании и функциональная. Важно учитывать, что не все варианты аугментации одинаково полезны. Например в нашей задаче поворот изображения на случайный угол собьет координаты рамки относительно контура бревна и ухудшит точность определения размеров. Такие нюансы надо учитывать. От качества разметки зависит многое. А в задаче с определением точных размеров тем более. Поэтому к разметке подошли серьезно, подготовили ТЗ. Тестовые изображения были размечены в бесплатном labelme. Но у этого инструмента два существенных недостатка:
Есть бесплатный онлайн инструмент https://www.makesense.ai/, который умеет сохранять сразу в формате YOLO. Сейчас, все чаще используем для разметки решение Superannotate. Обнаруживаем и распознаем автомобильный номер К этой задаче подступались с мыслями: «Здесь точно проблем не будет. Решений, статей, описаний найдется миллион. Самое трудное будет выбрать лучшее из хороших«. И ошиблись. Самым трудным оказалось найти нормально работающее. Казалось бы, распознавание автомобильных номеров в computer vision, это как создание калькулятора в традиционном программировании. После изучения темы сложилось впечатление, что решений по распознаванию номеров очень много, но бОльшая часть построена на алгоритмах классического машинного обучения и годится для решения задач со строгими условиями, например: номер чистый, положение номера +/- фиксированное (перед шлагбаумом или на расстоянии 20-30 метров от камеры), яркое освещение. Хорошее решение на нейронных сетях сделали и развивают ребята nomeroff.net. Его использовали в первом прототипе. Плюс этого решения — сразу умеет возвращать координаты углов номера, которые как раз нужны для определения размеров. Nomeroff.net показал себя лучше классического ML. Но именно для российских номеров работа nomeroff.net оказалась недостаточно качественной. Может быть дело в базе российских номеров, на которой обучали, нужна больше. Возможно причина еще в том, что у прицепов другая комбинация символов на номере, а в базе был другой, более распространенный тип номеров. Здесь важно отметить, что нам нужно не просто решение обнаруживающее номера. Оно должно возвращать координаты углов номера и быть обучено на базе, которую размечали с целью использовать автомобильный номер как эталон размера. Нельзя просто обвести номер рамкой, как при разметке бревен. Таких готовых решений не нашлось. Задачу поиска углов ставили перед собой далеко не все авторы. Вот пример, который справляется с распознаванием бельгийских номеров без поиска углов, с использованием YOLOv4 и сверточной сети https://medium.com/@theophilebuyssens/license-plate-recognition-using-opencv-yolo-and-keras-f5bfe03afc65 (eng) Попадались также решения, которые потенциально можно адаптировать. Вот пример made in chine (ch): Отмечу, что годных статей по ИИ на китайском языке, или английском, но с китайскими авторами, попадалось очень много. Вывод здесь делайте сами. PS: славянские фамилии тоже встречаются часто, в т.ч. в признанных сообществом решениях (тот же yolo, albumentation и др.), что лично нас радует. Готового и полностью устраивающего решения не нашлось, поэтому стали делать свое. Тут пришлось окунуться в удивительный мир разных подходов. Только основная задача у них — распознать номер. А нам надо еще точные координаты рамки. Как распознавать номерные знаки Сначала про распознавание номерного знака. У этой задачи больше практической ценности, чем у определения точных координат углов. Оговорюсь, что не считаю себя экспертом в ANPR. Если среди читателей найдутся специалисты, которые съели на этом собаку, и поправят/дополнят меня, буду только благодарен. Современные подходы распознавания номеров сводятся к следующему алгоритму:
Если нужен OCR, посмотрите в сторону решений Распознавание изогнутого текста (рус). В нашем случае текст не изогнутый, но статью рекомендую, если планируете заниматься темой распознавания текста. Читать было очень интересно. Мы поставили перед собой цель не просто распознавать номер, а делать это не хуже человека. Даже если номер грязный или размытый. Для такого обучения нужна внушительная база. Мысль о необходимости размечать отдельные символы на нескольких тысячах фотографий номеров приводила в уныние. Поэтому решено проверить сначала две гипотезы:
Обе гипотезы подтвердились. Тестовый результат даже превзошел ожидания: Проверили также распознавание на изображении из примера выше. Правда нейронная сеть здесь после дополнительной доработки: Как сгенерировать базу номеров
Чтобы быть уверенным, что все по ГОСТу, выбрали третий путь (свой генератор). Раньше Вы возможно не обращали внимание, что автомобильные номера бывают разных типов. Конечно, возможно, знали, что у полиции номера синие, на маршрутках бывают желтые, а у мотоцикла квадратные. Но то что у них еще и разная комбинация букв-цифр обращают внимание не все. Изображение номеров в формате SVG создавалось с помощью библиотеки drawSvg. Пример кода, генерирующего номер: Как найти углы номера Попытка научить yolo искать углы номера ни к чему не привела. Поиск углов в итоге сделан на обученной с нуля Resnet-50 (предобученная давала хуже результат). После обучения на 103 изображениях (на некоторых изображениях было больше одного номера) результат уже приемлемый: Сеть ищет отдельно углы «левый верхний», «левый нижний», «правый верхний», «правый нижний». Результат и выводы Следующим шагом подбираются гиперпараметры, делается «тюнинг» архитектур и проводится обучение нейронных сетей на расширенной базе. Потом все модули объединяются в единое решение. Финальное решение работает следующим образом:
Описан пилотный проект, с большим потенциалом для оптимизаций. В следующей части есть планы рассказать про интеграцию в телеграмм бот. И у нас осталась задача определения сортности и сравнения лесовозов. Группа авторов: Дмитрий Мокачев и Георгий Брегман Источник: habr.com Комментарии: |
|