Как получить правильные ограничивающие рамки, используя обученный CNN

#python #tensorflow #machine-learning #keras #conv-neural-network

#python #тензорный поток #машинное обучение #keras #conv-нейронная сеть

Вопрос:

Я обучил модель CNN с приличной точностью, близкой к 0,93. Он был обучен с использованием набора данных Street View House Numbers (SVHN), состоящего из 10 классов для 10 чисел (0 — 9)

Набор данных, который я использовал, состоял из изображений размером 32×32, размер которых был изменен до 227×227, формы, с которой была разработана модель. Чтобы обнаружить ограничивающую рамку, я:

  • Изменение размера изображения до 1/4 * высоты, 1/4 * ширины
  • Генерация пирамид изображений для 4 уровней
  • Перемещение ползунка и использование модели для обнаружения с вводом в качестве окна ползунка

Вот как я это сделал:

 def pyramid(image):
    pyr = [image]
    pd = image

    for i in range(4):
    pdown = cv2.pyrDown(pd)
    pd = pdown
    pyr.append(pdown)

    return pyr

window = (48,48)
stride = (4,4)

def slider():
    for row in range(0, img.shape[0], stride[1]):
        for col in range(0, img.shape[1], stride[0]):
            # yield the current window
            yield (col, row, img[row:row window[0], col:col window[1]])
  

Метод pyramid генерирует пирамиду до 4 уровней. Ползунок метода перемещает скользящее окно 48×48 с шагом 4×4. Вот как я использую их для прогнозирования:

 l = 1
loaded_model = keras.models.load_model("model.hdf5")
for resized in pyramid(img):
    img = resized
    i = 0
    for (x, y, win) in slider():
        i = i   1
        if win.shape[0] != window[0] and win.shape[1] != window[1]:
            continue

        winc = np.copy(win)
        win = cv2.resize(win, (227,227))
        win = win.astype('float32') / 255.
        proba = loaded_model.predict_proba(np.expand_dims(win, axis = 0))
        _class = loaded_model.predict_classes(np.expand_dims(win, axis = 0))
        #print("Max: ", np.max(proba))
        if np.max(proba) >= 0.93:
        filename = "win/{}-{}-{}.png".format(str(l), _class[0], str(round(np.max(proba), 2)))
        cv2.imwrite(filename, winc)

    l = l   1
    print(resized.shape)
  

Я отфильтровал изображения, в которых обнаруженная вероятность класса выше 0,93, но все же он генерирует множество классов. Я не уверен, как я мог бы сгенерировать ограничивающие рамки, используя этот метод. Есть ли способ, которым вы могли бы предложить, как получить ограничивающие рамки с помощью моего обученного CNN?

Комментарии:

1. Поскольку изображения обрезаны, я думаю, что в этом случае скользящее окно должно работать хорошо. Что вы можете сделать, так это настроить пороговое значение, например if np.max(proba) >= 0.99: . 0,93 — это точность набора данных проверки, но не является хорошим значением для вероятности прогнозирования. Я пытался использовать алгоритм выборочного поиска для создания ограничивающих рамок предложения, но он плохо работает на изображениях небольшого размера.

2. Привет, Аманда, теперь твоя проблема решена. Еще, если это возможно для вас, не могли бы вы, пожалуйста, поделиться выходным изображением, где вы могли бы увидеть множество классов, чтобы мы могли точно понять проблему, а затем мы могли работать над решением проблемы. Спасибо.