Уменьшенное изображение для MNIST - PullRequest
0 голосов
/ 30 апреля 2018

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

После фотографирования я делаю некоторую предварительную обработку, прежде чем передать изображение модели. Вот пример оригинального изображения: enter image description here

После этого я делаю его только черно-белым, поэтому он начинает выглядеть так: enter image description here

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

После приведения его к цветам BW я извлекаю каплю числа, уменьшая ее до 20 * 20 (с учетом соотношения сторон), а затем добавляю отступы, чтобы он соответствовал размеру MNIST 28 * 28. Окончательный результат следующий:

enter image description here

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

P.S. Я использую фреймворк Catalano для обработки изображений.

РЕДАКТИРОВАТЬ После применения предложенного фильтра из ответа вот что я получаю: enter image description here

1 Ответ

0 голосов
/ 30 апреля 2018

Я не уверен насчет упомянутой вами фреймворка, но одна вещь, которая может здесь помочь, это использовать некоторые морфологические операции с исходным изображением, прежде чем перейти к нормализации стиля MNIST. А именно, можно сделать размывание следующим образом (я записываю подход в python, в используемой платформе должны быть аналоги, так как операции довольно стандартные).

import numpy as np
import cv2

xx = cv2.imread('6.jpg') # your original image of 6
kernel = np.ones((20,20), np.uint8)
erosion = cv2.erode(xx, kernel, iterations = 2)

cv2.imwrite('6A.jpg',erosion) # this will be used as a replacement for the original image

это даст что-то похожее на это . Затем, если вы выполните бинаризацию нового изображения (скажем, пороговое значение по интенсивности серого 150) и выполните изменение размера с последующим заполнением, вы должны получить что-то вроде this , которое является более надежным.

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

Конечный результат в стандартах MNIST следующий: (физические размеры 28x28).

...