Я новичок в Tensorflow, и до сих пор я смог построить классификатор, используя данные, полученные от Kaggle для набора цветочных данных, и мне удалось обучить CNN для идентификации подсолнечника и маргаритки и отобразить результаты с помощьюнадписи с использованием вызова matplotlib.pyplot.figure ().
Теперь я хочу нарисовать ограничительную рамку на самом оригинальном изображении, чтобы показать, где он обнаружил цветок.Я читал о tf.image.draw_bounding_boxes, но я немного запутался, как его использовать, потому что технически CNN уже нарисовал ограничивающий прямоугольник над объектами, чтобы иметь возможность его классифицировать.Есть ли способ подключиться к этой операции и нарисовать изумительную рамку в тот момент, когда она создает объект в исходном файле?
Вот пример того, что я хочу сделать.Я хочу обучить свою модель определению подсолнухов, а затем, когда я представляю изображение с подсолнухами, я хочу, чтобы он нашел, где находятся подсолнухи, и нарисовал ограничивающую рамку вокруг каждого подсолнуха.
и вот мой код, который я использую для этого урока (предположим, что первые три строки - просто основные функции, которые создают метки и не имеют отношения к этому вопросу)
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()
То, что я хотел бы найти, этопример того, как я могу использовать эту библиотеку в учебном коде такого рода, а затем взять произвольное изображение и определить, есть ли на этом изображении подсолнухи, и нарисовать вокруг них рамку.
Спасибо!