Небольшой проект по применению компьютерного зрения

Задачи, которые можно автоматизировать, должны быть автоматизированы. Но обычные задачи, разработанные людьми, оказываются сложными для выполнения машинами. Чтение цифр в изображениях - одно из них.

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

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

Код, использованный в этом проекте, был разработан на Python, и его можно найти здесь. И не стесняйтесь обращаться ко мне, если у вас есть какие-либо вопросы или предложения.

Определение проблемы

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

Этот небольшой проект направлен на анализ методов, которые позволят автоматизировать этот процесс.

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

Вкратце, цель проекта - прочитать цифры на изображениях счетчиков:

Но как это сделать? Давайте посмотрим на некоторые возможности.

Разделяйся, чтобы побеждать!

Как читать цифры на картинках? Я разделю задачу на три части.

Часть 1: на первом этапе цель состоит в том, чтобы найти способ идентифицировать и вырезать интересующую область, содержащую цифры.

Часть 2: теперь цель состоит в том, чтобы сегментировать цифры, содержащиеся в изображении, обрезанном на первом этапе.

Часть 3: считывание цифр, полученных на шаге 2

Давай сделаем это. Часть 1

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

Для достижения этой цели была принята система YOLOv3 (посмотрите только один раз). В алгоритме используется сверточная нейронная сеть со специальными характеристиками. В сети есть только полносвязные сверточные сети (FCN). Он называется Darknet-53 и содержит 53 сверточных слоя, за каждым из которых следует слой пакетной нормализации и активация Leaky ReLU.

Я нашел очень интересное руководство по YOLO (его можно увидеть здесь) и набор данных с более чем 1000 изображениями счетчиков воды (которые можно найти здесь).
Чтобы обучить сеть, нам нужно спроектировать метки изображения. Тяжелая работа. Я пометил 500 изображений с помощью программы LabelImg.

Поскольку мой компьютер уже немного подустал, я решил обучить модель в Google Colab. С помощью графического процессора, предлагаемого платформой, обучение длилось 5 часов, и результат был очень удовлетворительным.

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

Часть 2: цифровая сегментация обрезанной области

Для сегментации цифр региона, полученных в части 1, использовались традиционные методы. Шаги были следующими:
• Сначала изображение было изменено на оттенки серого:

• В последовательности был выбран лучший порог для проблемы (лучший результат был получен с TOZERO - если значение пикселя меньше принятого предела, оно устанавливается на ноль, а другие значения сохраняются.):

• С помощью функции findContours (OpenCV) были обнаружены контуры. Найденные контуры были упорядочены и отфильтрованы в соответствии с их площадью. Были выбраны значения с областями, которые, скорее всего, содержат цифры.

Полученный результат можно увидеть ниже:

Как видите, цифра 6 так и не была идентифицирована.

Часть 3: чтение цифр

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

Набор данных MNIST - это аббревиатура, обозначающая модифицированный набор данных Национального института стандартов и технологий. Это набор данных из 60000 небольших квадратных изображений в оттенках серого размером 28 × 28 пикселей с цифрами от 0 до 9.

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

Могло быть лучше?

Одна из самых сложных частей компьютерного зрения - сегментация. Многие факторы могут повлиять на производительность системы, и необходимо настроить множество параметров. И как можно улучшить систему? Первый и третий этапы показали хорошие результаты. Ошибка появилась на втором этапе. Улучшение, которое я собираюсь реализовать в ближайшее время, заключается в замене второй и третьей фаз другой сетью YOLO, чтобы напрямую идентифицировать цифру на изображении, полученном на первой фазе. Система станет более надежной.

На первом этапе была реализована сеть YOLO для идентификации только одного объекта на изображении. В этом новом формате мне придется обучить сеть распознавать цифры от 0 до 9, то есть 10 возможных объектов на изображении. На первом этапе я пометил 500 изображений, теперь мне нужно было пометить 5000. Это большая работа. Но думаю результат будет интересным.

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