Я пытаюсь использовать детектор скользящего окна на изображении, чтобы найти буквы и предсказать их. Я обучил модель с 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)
Код о копируется откуда-то еще, но я изменил его, чтобы изменить размер каждого окна, как вы можете видеть.
Я предполагаю, что проблема заключается где-то в этом коде выше, а не в классификаторе.
Есть ли что-то, о чем я не подумал? Прямо сейчас я не получаю никаких правильных классификаций.
Это изображение коробок с настройкой в коде выше.
Мне не удалось как-то показать изображение в этом окне. Конечно, "S" и "E" должны быть легко классифицированы?