Приложения компьютерного зрения и, в частности, обнаружение объектов широко используются в здравоохранении, финансах и транспорте. В то время как приложения могут иметь далеко идущие последствия, процесс настройки соответствующей модели может занять много времени и быть сложным — 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 г.