Несколько лет назад, в 2019 году, я сделал хобби-проект, в котором использовались API-интерфейсы обнаружения объектов TensorFlow для автоматического считывания значений из серии изображений весов, которые можно использовать для построения графика веса с течением времени.

С тех пор эта область продвинулась семимильными шагами. Теперь, в 2022 году, этот проект можно сделать намного проще, используя Google Cloud Vertex AI и Cloud Vision API. Вот как.

Краткое изложение шагов

Суть работы заключается в обучении и развертывании модели ML с использованием Vertex AI для обнаружения экрана цифровых весов, содержащих вес.

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

Затем мы передаем обрезанное изображение в OCR API, чтобы считать вес в виде числа. Наконец, мы можем построить график результатов с течением времени и увидеть траекторию нашего веса.

Давайте теперь углубимся в то, как создать эту модель.

Обучите и разверните модель для обнаружения экрана

Мы будем использовать Vertex AI AutoML для автоматического обучения модели машинного обучения обнаружению экрана цифровых весов.

Для этого мы сначала создадим набор данных, содержащий все наши исходные изображения. Vertex AI имеет управляемый процесс создания набора данных для обнаружения объектов, что очень полезно.

Вы, вероятно, захотите иметь как минимум пару сотен изображений, чтобы получить хорошие результаты. Сначала я тренировался со 112 помеченными изображениями, а затем снова со 165 помеченными изображениями. Средняя точность увеличилась с 0,675 до 0,816, когда были включены эти дополнительные изображения.

После того, как вы загрузили все свои изображения, вы можете использовать встроенный инструмент Vertex AI, чтобы вручную указать ограничивающую рамку для части изображения, которую мы хотим, чтобы модель ML обнаружила. Эту работу по маркировке необходимо выполнить один раз для каждого изображения, что требует немного времени. Если ваши изображения уже были помечены с помощью другого инструмента, вы можете импортировать их напрямую.

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

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

Использование модели и считывание веса

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

  1. Загрузите изображения, показывающие весы с весом, из Google Cloud Storage.
  2. Вызовите конечную точку, которую мы только что развернули, чтобы обнаружить ограничивающую рамку, содержащую экран весов с отображаемым весом.
  3. Извлеките часть изображения внутри ограничительной рамки, содержащей вес, и обрежьте остальное.
  4. Используйте возможности OCR Cloud Vision API, чтобы считать вес в виде числа из обрезанного изображения.
  5. Запишите результаты в электронную таблицу Google Sheets.
  6. Используйте электронную таблицу для построения графика результатов с течением времени.

Вы можете проверить мой код здесь.

Результаты и интересный недостаток

В целом процесс был довольно простым и работал достаточно хорошо для построения графика. Я обработал 170 изображений (на несколько больше, чем в исходном наборе обучающих данных). Из них было 5 изображений, на которых модель Vertex AI не обнаружила ограничивающую рамку. Из оставшихся 165 обработка OCR с помощью API Cloud Vision работала для 133 из них, или примерно в 4/5 случаев.

Если немного углубиться в проблемы OCR, кажется, что многие сбои были связаны с OCR, сканирующим изображения вверх ногами. Например, на следующем изображении указано «151,6», но API OCR вернул «91 51».

Чтобы помочь алгоритму OCR определить ориентацию изображения, вместо этого вы можете просто отправить исходное необрезанное изображение. Однако, когда это было сделано для приведенного выше изображения, API по-прежнему возвращал «15» и «16» по отдельности вместо «151,6». Отправка полного изображения также вызовет больше шума, так как API подберет текст в другом месте увеличенного изображения.

Еще одна проблема, с которой столкнулся алгоритм OCR, заключается в том, что он часто обнаруживал буквы вместо цифр. В других случаях он не видел точки в десятичном числе или не видел всего числа.

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

Подведение итогов и другие мысли

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

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

Тем не менее, есть несколько областей, которые все еще кажутся немного грубыми. Например, есть несколько операций, которые вроде бы выполняются долго и непонятно, почему они не выполняются быстрее. В частности, некоторые страницы долго загружаются; импорт сотни изображений в набор данных занимает довольно много времени; и создание конечной точки с моделью занимает около 15 минут, что кажется излишне долгим.

Еще одна проблема, с которой могут столкнуться многие, — стоимость. Насколько я могу судить, этот продукт может стоить очень дорого. На странице с ценами Vertex AI говорится, что развертывание и онлайн-прогнозирование для обнаружения объектов стоит 2,002 доллара за узел-час! Поскольку узлы работают непрерывно, если их не отключить вручную, это кажется слишком дорогим для большинства любительских проектов.

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