Распознавание цифр с правилами - PullRequest
0 голосов
/ 14 января 2019

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

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

Не дождусь полного решения здесь, а скорее осей исследований или ссылок на подобную проблему. Sample

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

Вот образец картинки. Изображение одной и той же схемы, но несколько раз на картинке.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Я думаю, у вас есть три способа работы. И, возможно, вам не нужно заходить так далеко! Пока мы будем искать только то, что было выбрано.

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

% Solution 1 (practically a perfect cicle, use hough circle transform to find circles)
im = imread('https://i.stack.imgur.com/L7cE1.png');
[centers, radii, metric] = imfindcircles(im, [10, 60]);
imshow(im); viscircles(centers, radii,'EdgeColor','r');

Случай 2: Вы можете работать в пространстве синего цвета и исключать ахроматические цвета, чтобы сегментировать области, которые вас интересуют (если вы добавляете поля, вы можете работать правильно).

% Solution 2 (ALWAYS is blue, read only rgB channel and delete achromatic)
b = im(:, :, 3) & (std(double(im(:, :, :)), [], 3) > 5);
bw = imfill(b,'holes');
stats = regionprops('table', bw, 'Centroid', 'MajorAxisLength','MinorAxisLength')
imshow(im); viscircles(stats.Centroid, stats.MajorAxisLength / 2,'EdgeColor','r');

Случай 3: Вы можете создать набор данных вместе с положительными случаями и другие с отрицательными. И обучить нейронную сеть с 10 выходами, которые указывают на каждом, есть или нет зачеркнутый (сигмовидный выход). Хорошая вещь в этом типе модели состоит в том, что вы не должны делать OCR позже.

import keras
from keras.layers import *
from keras.models import Model
from keras.losses import mean_squared_error
from keras.applications.mobilenet import MobileNet
def model():
    WIDTH, HEIGHT = 128, 128
    mobile_input = Input(shape=(WIDTH, HEIGHT, 3))
    alpha = 0.25 # 0.25, 0.5, 1
    shape = (1, 1, int(1024 * alpha))
    dropout = 0.1
    input_ = Input(shape=(WIDTH, HEIGHT, 3))
    mobile_model = MobileNet(input_shape=(WIDTH, HEIGHT, 3), 
                             alpha= alpha, 
                             include_top=False, 
                             dropout = dropout,
                             pooling='avg')
    base_model = mobile_model(mobile_input)
    x = Reshape(shape, name='reshape_1')(base_model)
    x_gen = Dropout(dropout, name='dropout')(x)
    x = Conv2D(10, (1, 1), padding='same')(x_gen)
    x = Activation('sigmoid')(x)
    output_detection = Reshape((10,), name='output_mark_detection')(x)

    """x = Conv2D(2 * 10, (1, 1), padding='same')(x_gen)
    x = Activation('sigmoid')(x)
    output_position = Reshape((2 * 10, ), name='output_mark_position')(x)
    output = Concatenate(axis=-1)([output_detection, output_position])
    """

    model = Model(name="mark_net", inputs=mobile_input, outputs=output_detection)

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

  1. Вы можете создать искусственный набор данных, добавив искаженный круги (возьмите нормальный круг применить случайный аффинные преобразования, добавить шум, немного изменить синий цвет, линия и т. д.).
  2. Затем вы вставляете случайный круг в каждое число и создать набор данных, указывающий, какие номера помечены.
  3. После того, как «застрял на бумаге», вы можете снова применить увеличение данных чтобы он выглядел более реалистично.
0 голосов
/ 14 января 2019

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

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