Блок схема обнаружения в текстовом документе - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть изображение текстового документа.Включает в себя текстовые и блок-схемы.Основная проблема заключается в обнаружении блок-схем.Я думаю, что есть два подхода для решения этой задачи: 1) обнаружить геометрический примитив, составляющий схему;2) определить всю схему.

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

ОБНОВЛЕНИЕ 1 Я пытаюсьопределить, где в документе размещена блок-схема.Пример показан на картинке ниже.Я не пытался обнаружить текст в блок-схеме.

ОБНОВЛЕНИЕ 2 Основная проблема заключается в том, что я должен найти блок-схемы в разных вариантах.Четная часть блок-схемы.

Example image

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Вы можете сделать 1) Обнаружение объекта 2) Семантическая сегментация.Я бы предложил сегментацию, потому что выделение границ имеет решающее значение для вашего приложения.

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

Ниже приведены шаги, связанные с проектами, включающими сегментацию.

Набор данных

  1. Соберите изображения страниц, необходимые для решения вашей проблемы, и выполните шаги предварительной обработки, такие как изменение размера изображения, чтобы привести все изображения в вашем наборе данных к общей форме и уменьшитьколичество выполненных вычислений.Обязательно сохраняйте изменчивость в своих образцах.
  2. Теперь вам нужно аннотировать области интересующих вас изображений и пометить их именем.Здесь присваивается класс (например, классификация) для определенных областей изображения.Для этого вы можете использовать следующие инструменты.

Labelme - (моя рекомендация)

Инструмент аннотации Vgg - (оченьпереносимый инструмент, написанный на html, но имеющий меньше возможностей, чем labelme)

Модель

Вы можете использовать модель U-Net для своей задачи. Unet Paper .Его очень легко реализовать, но он очень надежно справляется с большинством реальных задач, таких как ваша.

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

Литература по анализу макета документа.

  1. https://arxiv.org/pdf/1804.10371.pdf -Они использовали U-Net с ResNet-50 в качестве кодера.Они достигли очень хороших результатов по сравнению с предыдущими подходами
  2. https://github.com/leonlulu/DeepLayout-- Это реализация Python инструмента анализа макета страницы с использованием модели Deep Lab v2, которая выполняет семантическую сегментацию.

Заключение

Представленный здесь подход может показаться утомительным и трудоемким, но он устойчив к изменчивости документов во время тестирования.Прокомментируйте ниже, если у вас есть какие-либо вопросы.

0 голосов
/ 07 декабря 2018

Я бы предпочел, чтобы было больше примеров для типов диаграмм, которые вы ищете, но на основе приведенного вами примера, вот моя попытка наивно решить ее.

1) Изменить размер изображения доуправляемый размер для повышения скорости и сокращения операций.

2) Используйте морфологическое открытие, чтобы объединить все темные объекты вместе.

3) Бинаризировать темные объекты.

4) Пометьте объекты, используя компоненты, связанные с openCV.Это даст нам ограничительную рамку каждого региона.

5) Кластер, перекрывающий ограничивающую рамку вместе.

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

enter image description here

Вот код для реализации

import cv2
import numpy as np


# Function to fill all the bounding box
def fill_rects(image, stats):

    for i,stat in enumerate(stats):
        if i > 0:
            p1 = (stat[0],stat[1])
            p2 = (stat[0] + stat[2],stat[1] + stat[3])
            cv2.rectangle(image,p1,p2,255,-1)


# image name 
img_name = 'test_image.png'
# Load image file
diagram = cv2.imread(img_name,0)
diagram = cv2.blur(diagram,(5,5))

fScale = 0.25
# Make it smaller to speed up everything and easier to cluster
small_img = cv2.resize(diagram,(0,0),fx = fScale, fy = fScale)


img_h, img_w = np.shape(small_img)

# Morphological close process to cluster nearby objects
fat_img = cv2.morphologyEx(small_img,cv2.MORPH_OPEN,None,iterations = 1)

# Threshold strong signals
_, bin_img = cv2.threshold(fat_img,210,255,cv2.THRESH_BINARY_INV)

# Analyse connected components
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(bin_img)

# Cluster all the intersected bounding box together
rsmall, csmall = np.shape(small_img)
new_img1 = np.zeros((rsmall, csmall), dtype=np.uint8)

fill_rects(new_img1,stats)


# Analyse New connected components to get filled regions
num_labels_new, labels_new, stats_new, centroids_new = cv2.connectedComponentsWithStats(new_img1)


# Check for regions that satifies conditions coresponds to diagram

min_dia_width = img_w * 0.1

dia_regions = []
for i ,stat in enumerate(stats):

    if i > 0:
        # get basic dimensions
        x,y,w,h = stat[0:4]

        # calculate ratio
        ratio = w / float(h)

        # if condition met, save in list
        if ratio < 1 and w > min_dia_width:
            dia_regions.append((x/fScale,y/fScale,w/fScale,h/fScale))


# For display purpose
diagram_disp = cv2.imread(img_name)
for region in dia_regions:
    x,y,w,h = region
    x = int(x)
    y = int(y)
    w = int(w)
    h = int(h)
    cv2.rectangle(diagram_disp,(x,y),(x+w,y+h),(0,255,0),2)

labels_disp = np.uint8(200*labels/np.max(labels)) + 50
labels_disp2 = np.uint8(200*labels_new/np.max(labels_new)) + 50




cv2.imshow('small_img',small_img)
cv2.imshow('fat_img',fat_img)
cv2.imshow('bin_img',bin_img)
cv2.imshow("labels",labels_disp)
cv2.imshow("labels_disp2",labels_disp2)
cv2.imshow("diagram_disp",diagram_disp)
cv2.waitKey(0)

Вот результат для другого типа ввода.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...