Приложения компьютерного зрения и, в частности, обнаружение объектов широко используются в здравоохранении, финансах и транспорте. В то время как приложения могут иметь далеко идущие последствия, процесс настройки соответствующей модели может занять много времени и быть сложным — Roboflow помогает на протяжении всего этого процесса от предварительной обработки изображения до аугментации изображения, обучения модели и развертывания.

В этом посте мы покажем вам, как создать модель обнаружения номерных знаков и OCR с помощью Roboflow, которую вы можете программно использовать для своих собственных проектов. В этом уроке вы научитесь:

  • Загрузить данные в Roboflow
  • Предварительная обработка данных для обеспечения согласованности
  • Применяйте дополнения к изображениям, чтобы улучшить свою модель
  • Обучите модель с помощью Roboflow Train
  • Выполнение видеовывода программно
  • Понимание кода для проведения видеовывода

Загрузить данные в Roboflow

Данные могут быть сложными! С таким количеством различных форматов может возникнуть путаница в том, как использовать определенные типы наборов данных и как лучше всего их обрабатывать. Roboflow устраняет эту головную боль, автоматически определяя формат набора данных и добавляя соответствующие аннотации. Будь то COCO, TFRecord, CreateML или другой формат, скорее всего, Roboflow его поддерживает. Подробнее о поддерживаемых нами форматах можно прочитать здесь.

Для этого проекта мы будем использовать этот набор данных для обнаружения номерных знаков — этот набор данных является подмножеством набора данных открытых изображений. Поскольку это общедоступный набор данных, вы можете загрузить проект в Roboflow двумя способами:

  • Создайте форк набора данных прямо из Roboflow
  • Экспортируйте набор данных из Roboflow и загрузите вручную

Создайте форк набора данных прямо из Roboflow

Чтобы разветвить набор данных, есть кнопка Разветвить набор данных, которую вы можете нажать, и она автоматически загрузит ваш набор данных в Roboflow.

Экспорт набора данных из Roboflow и загрузка вручную

Чтобы загрузить данные в Roboflow вручную, вам нужно создать учетную запись Roboflow. После входа в вашу панель управления вы захотите создать новый проект:

Вы должны получить всплывающее окно, позволяющее указать имя проекта, тип проекта и группу аннотаций. Этот проект будет проектом обнаружения объектов и будет иметь группу аннотаций номерных знаков. После создания этого проекта вас встретит страница загрузки:

Здесь вы можете загружать отдельные фрагменты данных или полные наборы данных. Мы вернемся к этому!

Следующим шагом будет экспорт набора данных! Чтобы экспортировать набор данных, щелкните нужную версию набора данных в разделе Загрузки.

После этого вы получите всплывающее окно с вопросом, в каком формате вы хотите загрузить набор данных. Мы выберем формат «COCO» и загрузим zip прямо на наш компьютер.

После этого просто извлеките загруженный zip-файл и перетащите папку в интерфейс загрузки созданного вами проекта, и все ваши изображения вместе с вашими аннотациями будут загружены.

Предварительно обработайте данные для обеспечения согласованности

Реальные данные часто могут быть непоследовательными, беспорядочными и в целом сложными для работы при разработке моделей машинного обучения. Предварительная обработка служит важным ключом к решению этих проблем; однако написание кода для предварительной обработки данных часто может быть утомительным.

Roboflow помогает устранить этот код с помощью своих автоматических инструментов предварительной обработки! После загрузки всех данных вы должны заметить страницу, которая позволяет создать новую версию ваших данных! Первым шагом в создании новой версии является предварительная обработка. Roboflow предлагает широкий спектр настроек, от изменения размера до применения оттенков серого.

Для этого проекта мы применим этапы предварительной обработки автоматического ориентирования и изменения размера. Для изменения размера мы растянем все изображения до размера 416 x 416 пикселей.

Примените дополнения к изображению, чтобы улучшить вашу модель

Расширение — это шаг, обычно используемый в машинном обучении для применения преобразований к вашим данным для увеличения размера и разнообразия набора данных. Некоторые дополнения включают в себя вращение, изменение яркости и размытие среди многих других. Однако, как и в случае с предварительной обработкой, написание кода для увеличения изображения может быть утомительным.

К счастью, Roboflow поставляется с автоматическими инструментами увеличения изображений. Вторым шагом в создании новой версии данных является добавление дополнений к данным. Вот некоторые из шагов аугментации Roboflow:

Для этого проекта мы добавим увеличение размытия с диапазоном в 2 пикселя, а также увеличение экспозиции с вариативностью 25%.

После продолжения вы сможете выбрать желаемое количество изображений для вашей версии набора данных. Этот проект увеличит количество обучающих данных в четыре раза, в результате чего будет получено 1085 изображений. После этого просто нажмите «Создать», и у вас должен быть новый набор данных с предварительно обработанными и дополненными данными.

Обучите модель с помощью Roboflow Train

Обучение модели может быть сложной задачей с таким количеством различных фреймворков и настроек, которые нужно настроить. Roboflow Train позволяет легко решить эту проблему, обеспечивая процесс обучения одним щелчком мыши, в результате чего получается оптимальная модель.*

*Примечание.Roboflow Train — это функция Pro. Чтобы узнать больше о Roboflow Pro, нажмите здесь. Если вы хотите обучить модель без Roboflow pro, рассмотрите возможность использования нашей библиотеки моделейвот отличный учебник для начала!

Чтобы использовать Roboflow Train, просто нажмите кнопку поезда, которую можно найти на панели инструментов версии набора данных:

Нажав на это, вы увидите 2 варианта. Нажмите на опцию «Обучить с нуля», а затем начните процесс обучения! Если вы уже обучали модель с номерными знаками в прошлом или хотели бы использовать одну из общедоступных моделей Roboflow для повышения производительности за счет передачи обучения, вы можете нажать «Начать с контрольной точки», где вам будет предложено выбрать модель. контрольно-пропускной пункт.

Поскольку процесс обучения требует значительных вычислительных ресурсов и времени, для полного обучения модели потребуется время. А пока вы можете купить попкорн и посмотреть эпизод Кремниевой долины! По завершении вы получите электронное письмо от Roboflow, в котором сообщается, что модель завершила процесс обучения, а также некоторые статистические данные, такие как время обучения, точность, отзыв и mAP.

Проведение видеовывода программно

Чтобы использовать вашу недавно обученную модель, вы увидите несколько разных вариантов:

Для этого проекта мы будем использовать Roboflow Hosted Inference API. Чтобы использовать это, вам нужно будет получить идентификатор модели и токен доступа к вашей учетной записи — это можно найти, если вы нажмете Использовать команду curl. У вас должна получиться ссылка, похожая на https://infer.roboflow.com/xx-name--#?access_token=[ACCESS_TOKEN].

Далее вам нужно клонировать следующий репозиторий:

git clone https://github.com/roboflow-ai/roboflow-jetson-license-plate.git

Затем установите все необходимые зависимости:

pip3 install -r requirements.txt

Откройте файл roboflow_config.json и измените следующие значения для ключей ROBOFLOW_API_KEY и ROBOFLOW_MODEL. Например, если xx-name--# — это идентификатор вашей модели, а 9QoZKPC2l7A5 — ваш токен доступа, тогда ваш файл JSON будет выглядеть следующим образом:

{ 
"__comment1": "Obtain these values via Roboflow", "ROBOFLOW_API_KEY": "9QoZKPC2l7A5", 
"ROBOFLOW_MODEL": "xx-name--#", 
"ROBOFLOW_SIZE": 416, 
"LOCAL_SERVER": false, 
"__comment2": "The following are only needed for infer-async.py", "FRAMERATE": 24, 
"BUFFER": 0.5 
}

Наконец, чтобы проверить, насколько хорошо работает ваша модель, запустите:

python3 main.py

Кажется, это работает очень хорошо! Теперь давайте углубимся в то, как все это работает на самом деле. Примечание. Все это было написано на Python!

Как работает код?

Построение URL-адреса вывода.Конечная точка вывода Roboflow для каждой модели строится очень специфическим образом. Он собирает данные из файла roboflow_config.json, а затем соответствующим образом строит URL-адрес. Здесь мы можем увидеть, как строится URL:

ROBOFLOW_API_KEY = config["ROBOFLOW_API_KEY"] 
ROBOFLOW_MODEL = config["ROBOFLOW_MODEL"] 
upload_url = 
"".join([ 
"https://infer.roboflow.com/" + ROBOFLOW_MODEL, 
"?access_token=" + ROBOFLOW_API_KEY, 
"&name=YOUR_IMAGE.jpg" 
])

Отправка каждого кадра для анализа конечной точкой модели.Чтобы выполнить вывод на видео, каждый кадр представляет собой изображение, которое проходит через конечную точку модели. Однако, прежде чем кадр можно будет отправить в конечную точку, необходимо выполнить пару шагов:

  • Получение самого кадра. Чтобы получить кадр, OpenCV предоставляет метод чтения, позволяющий считывать текущий кадр в видеопотоке. Это можно сделать просто через это:
# Get webcam interface via opencv-python 
video = cv2.VideoCapture(0) 
# Get the current image from the webcam 
ret, img = video.read()
  • Изменение размера кадра. Это помогает повысить скорость и сэкономить трафик при сохранении соотношения сторон.
height, width, channels = img.shape 
scale = ROBOFLOW_SIZE / max(height, width) 
img = cv2.resize(img, (round(scale * width), round(scale * height)))
  • Кодирование изображения в строку base64. Размещенный в Roboflow API требует, чтобы вы разместили изображение в виде строки base64. К счастью, это очень легко сделать:
retval, buffer = cv2.imencode('.jpg', img) 
img_str = base64.b64encode(buffer)
  • Отправка http-запроса на публикацию. Наконец-то вы можете отправить данные в конечную точку модели и получить различные прогнозы, которые смогла найти ваша модель!
resp = requests.post(upload_url, data=img_str, headers={
    "Content-Type": "application/x-www-form-urlencoded"
}, stream=True).json()['predictions']

Обработка ответов

  • Ответ JSON: Отлично! Теперь, когда у вас есть прогнозы, все, что требуется сделать, — это нарисовать прогнозы на самом видеокадре. Для этого нам нужно понять, как может выглядеть json-ответ на прогноз:
{ 
"x": 504.5, 
"y": 363.0, 
"width": 215, 
"height": 172, 
"class": "license-plate", 
"confidence": 0.917 
}
  • Запись в видеопоток. Ответ дает нам координаты x, y центра, ширину и высоту, класс и уровень достоверности прогноза. Чтобы обработать это во фрейме, мы можем написать метод для рисования соответствующих ограничивающих рамок, написав соответствующее имя класса:
def writeOnStream(x, y, width, height, className, frame): 
    # Draw a Rectangle around detected image 
    cv2.rectangle(frame, (int(x - width / 2), int(y + height / 2)), (int(x + width / 2), int(y - height / 2)), (255, 0, 0), 2) 
    # Draw filled box for class name 
    cv2.rectangle(frame, (int(x - width / 2), int(y + height / 2)), (int(x + width / 2), int(y + height / 2) + 35), (255, 0, 0), cv2.FILLED) 
   # Set label font + draw Text 
    font = cv2.FONT_HERSHEY_DUPLEX 
    cv2.putText(frame, className, (int(x - width / 2 + 6), int(y + height / 2 + 26)), font, 0.5, (255, 255, 255), 1)
  • Итерация прогнозов. Используя это, мы можем перебрать все прогнозы и написать, нарисовать соответствующие ограничивающие рамки и написать соответствующее имя класса для каждого прогноза:
for prediction in resp: 
    writeOnStream(prediction['x'], prediction['y'], prediction['width'], prediction['height'],prediction['class'],img)

Применение OCR к номерному знаку:Чтобы применить OCR, мы будем использовать модуль под названием keras-ocr. Чтобы провести это OCR, необходимо выполнить несколько шагов.

  • Обрезка номерного знака. Учитывая, что мы знаем ответ JSON номерного знака от Roboflow API, мы можем вырезать номерной знак из кадра, выполнив объединение массива изображений:
crop_frame = frame[int(y - height / 2):int(y + height / 2), int(x - width / 2):int(x + width / 2)]
  • Сохранение и предварительная обработка изображения. Мы можем использовать OpenCV для сохранения и предварительной обработки этого изображения. Для краткости наш метод предварительной обработки можно найти здесь.
cv2.imwrite("plate.jpg", crop_frame) # Pre Process Image preprocessImage("plate.jpg")
  • Создание конвейера OCR и прогнозирование. Наконец, нам нужно создать конвейер для модели OCR, чтобы считывать изображение и давать соответствующие прогнозы; эти прогнозы затем будут напечатаны в консоли.
images = [keras_ocr.tools.read("plate.jpg")] # Get Predictions prediction_groups = pipeline.recognize(images) # Print the predictions for predictions in prediction_groups: for prediction in predictions: print(prediction[0])

Вывод

И у вас есть это; полнофункциональная модель обнаружения лицензии, которая также может проводить распознавание номерного знака! Большая часть этого проекта была основана на нашем блоге Использование вашей веб-камеры с моделями Roboflow, в котором мы исследуем различные этапы использования Roboflow Hosted API с веб-камерой. Полный код этого проекта можно найти на Github. Пожалуйста, не стесняйтесь обращаться к нам, если у вас есть какие-либо вопросы!

Первоначально опубликовано на https://blog.roboflow.com 14 мая 2021 г.