如何解决裁剪后如何变换相对边界框?
根据tf.image.draw_bounding_boxes
,我需要使用这种格式的边界框:
[y_min,x_min,y_max,x_max]
我的这张图片的形状为(720,1280,3)
(原图为here):
我有边界框:
array([[0.134722,0.425,0.327778,0.5 ],[0.294444,0.3140625,0.444444,0.4124995],[0.473611,0.294531,0.636111,0.417969 ],[0.5972225,0.392968,0.7986115,0.497656 ],[0.5416665,0.486719,0.6999995,0.645313 ],[0.3986115,0.5319445,0.546094 ],[0.3499995,0.5726565,0.5041665,0.6710935],[0.215278,0.507031,0.383334,0.590625 ]])
它适用于矩形图像:
image = plt.imread(myimage)
x = tf.image.draw_bounding_Boxes(image[None,...],np.array(bBoxes)[None,[[255.,0.,0.] for i in range(len(bBoxes))])
plt.imshow(x[0,...].numpy().astype(np.uint8))
plt.show()
但是当我将图片裁剪成正方形时,一切都会失败:
image = plt.imread(myimage)[:,280:-280]
x = tf.image.draw_bounding_Boxes(image[None,...].numpy().astype(np.uint8))
plt.show()
裁剪为正方形后,如何拥有正确的边框?我希望有一个640x640的正方形,然后将尺寸调整为320x320。
**编辑:**这有效:
h,w,c = image.shape
h_pad = 640 - h
w_pad = 640 - w
image = np.pad(image,[[h_pad//2,h_pad//2],[w_pad//2,w_pad//2],[0,0]],mode='edge')
train_images_np.append(image)
annotations = []
labels_temp = []
with open(annot_path) as txtfile:
reader = csv.reader(txtfile,delimiter=',')
for row in reader:
annotations.append(list([(h*(2*float(row[0])-1)/640+1)/2,(w*(2*float(row[1])-1)/640+1)/2,(h*(2*float(row[2])-1)/640+1)/2,(w*(2*float(row[3])-1)/640+1)/2
]))
解决方法
这是因为您没有考虑调整边界框的大小。
首先,您将从原始图像中获取边界框,然后根据正方形图像调整框的大小。
因此,通过这样做,您的所有边界框都将缩小,与我从输出图像中看到的数量相同。
解决方案:请勿调整边界框的大小,请使用delta替换其x坐标
delta = (width_orginal_image - width_new_image)//2
for each_boundary_box in all_boundary_box:
new_box_x = each_boundary_box[0] - delta
从边界框的x条线中减去此增量
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。