Как я могу использовать tf.image.draw_bounding_boxes для рисования ограничительных рамок на моем исходном изображении, чтобы показать, где был обнаружен мой объект? - PullRequest
0 голосов
/ 25 апреля 2019

Я новичок в Tensorflow, и до сих пор я смог построить классификатор, используя данные, полученные от Kaggle для набора цветочных данных, и мне удалось обучить CNN для идентификации подсолнечника и маргаритки и отобразить результаты с помощьюнадписи с использованием вызова matplotlib.pyplot.figure ().

Теперь я хочу нарисовать ограничительную рамку на самом оригинальном изображении, чтобы показать, где он обнаружил цветок.Я читал о tf.image.draw_bounding_boxes, но я немного запутался, как его использовать, потому что технически CNN уже нарисовал ограничивающий прямоугольник над объектами, чтобы иметь возможность его классифицировать.Есть ли способ подключиться к этой операции и нарисовать изумительную рамку в тот момент, когда она создает объект в исходном файле?

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

sunflower

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

training_images = train_data_with_label()
testing_images = test_data_with_label()
TTest = test_new_data()

# Assign images and labels
tr_img_data = np.array([i[0] for i in training_images]).reshape(-1, 64, 64, 1)
tr_lbl_data = np.array([i[1] for i in training_images])
tst_img_data = np.array([i[0] for i in testing_images]).reshape(-1, 64, 64, 1)
tst_lbl_data = np.array([i[1] for i in testing_images])

model = Sequential()

model.add(InputLayer(input_shape=[64, 64, 1]))

model.add(Conv2D(filters=16, kernel_size=5, strides=1, padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=5, padding='same'))

model.add(Conv2D(filters=32, kernel_size=5, strides=1, padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=5, padding='same'))

model.add(Conv2D(filters=50, kernel_size=5, strides=1, padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=5, padding='same'))

model.add(Conv2D(filters=80, kernel_size=5, strides=1, padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=5, padding='same'))

model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dropout(rate=0.5))
model.add(Dense(classes, activation='softmax'))
optimizer = Adam(lr=1e-4)

model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(x=tr_img_data, y=tr_lbl_data, epochs=1000, batch_size=50)
model.summary()


# Save the model's weights
pth = 'S:/SavedWeights/Daisy_vs_Sunflower_vs_Tulip/weights.hdf5'
model.save_weights(pth, overwrite=True)
print("Weights saved!!!")


fig = plt.figure(figsize=(14, 14))

for cnt, data in enumerate(TTest[0:14]):

    y = fig.add_subplot(6, 5, cnt+1)
    img = data[0]
    data = img.reshape(1, 64, 64, 1)
    model_out = model.predict([data])

    if np.argmax(model_out) == 0:
        str_label = 'Daisy'
    elif np.argmax(model_out) == 1:
        str_label = 'Sunflower'
    else:
        str_label = 'Tulip'

    y.imshow(img, cmap='gray')
    plt.title(str_label)
    y.axes.get_xaxis().set_visible(False)
    y.axes.get_yaxis().set_visible(False)

plt.show()

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

Спасибо!

1 Ответ

0 голосов
/ 29 апреля 2019

В разобрался! Оказывается, я использовал это неправильно, я использовал классификацию изображений все это время, и то, на что я должен был смотреть, было обнаружением объекта. Я прочитал документацию по тензорному потоку и обнаружил объект, который рисует ограничивающие рамки.

...