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

Распространенным подходом к решению подобных проблем является обучение глубокой нейронной сети, обычно сверточной сети, поскольку мы имеем дело с изображениями. DNN оказались чрезвычайно успешными для множества приложений компьютерного зрения, включая классификацию изображений, обнаружение объектов и обнаружение лиц. Однако DNN довольно дороги как с точки зрения времени вычислений, так и с точки зрения использования памяти. Следовательно, они могут не подходить для каждого случая. Мы также можем подумать об адаптации трансферного обучения, но тогда оно работает только тогда, когда данные, на которых вы хотите обучаться, очень похожи на данные, на которых была обучена сеть. Однако, если вы видите приведенное выше изображение, и документы, которые я хочу обнаружить, не богаты функциями по сравнению с изображениями в ImageNet, и поэтому мы действительно можем использовать простые алгоритмы CV для выполнения задачи.

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

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

2. Ограничивающая рамка: чтобы сформировать несколько групп текста (по одной для каждого документа) и нарисовать ограничивающие рамки вокруг них, я выполняю растяжение после обнаружения краев, которое увеличивает площадь объекта и является отличным способ подчеркнуть особенности, а затем я пытаюсь создать белые пятна вокруг документов, а остальные части изображения превращаются в черные, это помогает на последнем этапе, когда я выполняю определение контура для обнаружения прямоугольников вокруг документов. Это дает что-то вроде этого:

3. Распознавание текста с поворотом: на этом этапе я выполняю распознавание текста с поворотом для обнаружения текста в каждом из обнаруженных документов. Для OCR я использую Tesseract, который представляет собой замечательно долгоживущий проект с открытым исходным кодом, разработанный за последние 20 с лишним лет в HP и Google. Более того, поскольку вы можете видеть, что эти документы не обязательно хорошо выровнены, я делаю их горизонтальными, выполняя вращение, чтобы OCR могло выдавать разумный текст.

4. Пакет слов: как только я получаю текст от OCR, я преобразую его в функции с помощью Sklearn’s Count Vectorizer, поскольку модели машинного обучения понимают только нули и единицы.

5. ML-классификатор: наконец, я использую модель Случайный лес Склеарна для обучения функциям, которые я получаю от модели мешок слов, и после обучения модели я использую ее для классификации новых изображений. .

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