Оптическое распознавание символов с плохими результатами (TensorFlow и OpenCV) - PullRequest
0 голосов
/ 29 апреля 2019

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

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

Набор данных, с которым я обучил алгоритм классификации, представляет собой изображения в оттенках серого размером 20x20 пикселей.

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

## Sliding window detection:

import cv2
import matplotlib.pyplot as plt
import numpy as np

# read the image and define the stepSize and window size 
# (width,height)
image = cv2.imread("./detection-images/detection-1.jpg") # your image path
tmp = image # for drawing a rectangle
stepSize = 30
(w_width, w_height) = (30,30) # window size
class_letter = []
for x in range(0, image.shape[1] - w_width , stepSize):
    for y in range(0, image.shape[0] - w_height, stepSize):
        window = image[x:x + w_width, y:y + w_height, :]
        resize = cv2.resize(window,(20,20),interpolation =cv2.INTER_AREA)
        np.asarray(resize)
        window = resize[:, :, 0]
        window=np.reshape(window,20*20)
        window = pd.DataFrame(data=window).T
        list1 = (window.values[0])

        if all(x == list1[0] for x in list1):
            print(" ",end="\r")
            # print("All elements in list are same. No need for 
         prediction")
        else:
            prediction  = model_tensor.predict(window.values)
            class_letter.append(prediction)


        # knn
        # class_letter.append(test_classifier_sliding(neigh,window))

    # classify content of the window with your classifier and  
    # determine if the window includes an object (cell) or not
    # draw window on image
        cv2.rectangle(tmp, (x, y), (x + w_width, y + w_height), (255, 0, 0), 2) # draw rectangle on image
        plt.imshow(np.array(tmp).astype('uint8'))
# show all windows
plt.show()
# pred = test_classifier_sliding(neigh,find_letter)
# print(class_letter)

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

Я предполагаю, что проблема заключается где-то в этом коде выше, а не в классификаторе.

Есть ли что-то, о чем я не подумал? Прямо сейчас я не получаю никаких правильных классификаций.

Это изображение коробок с настройкой в ​​коде выше.

The image of the boxes with the setup in the code above.

Мне не удалось как-то показать изображение в этом окне. Конечно, "S" и "E" должны быть легко классифицированы?

...