如何使用 tf.image.draw_bounding_boxes 在原始图像上绘制边界框以显示检测到对象的位置?

Posted

技术标签:

【中文标题】如何使用 tf.image.draw_bounding_boxes 在原始图像上绘制边界框以显示检测到对象的位置?【英文标题】:How can i use tf.image.draw_bounding_boxes to draw bounding boxes on my original image to show where my object was detected? 【发布时间】:2019-09-15 02:26:57 【问题描述】:

我是 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()

我想找到一个示例,说明如何在此类教程代码中使用此库,然后获取任意图像并确定该图像中是否有向日葵并在它们周围画一个框。

谢谢!

【问题讨论】:

【参考方案1】:

使用物体检测算法训练网络,然后在预测部分绘制边界框时使用 tf.image.draw_bounding_boxes

【讨论】:

【参考方案2】:

想通了!原来我用错了,我一直在使用图像分类,我应该研究的是对象检测。我阅读了 tensorflow 文档并进行了对象检测,绘制了边界框。

【讨论】:

以上是关于如何使用 tf.image.draw_bounding_boxes 在原始图像上绘制边界框以显示检测到对象的位置?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?