由于近期对某算法进行复现,需要用到预测的边界框坐标信息,在网上查找之后发现一个可以用的,具体如下(本人版本是v5.0):
在detect.py中找到plot_one_box,大概在113行,可按ctrl+F进行查找
# Write results
for *xyxy, conf, cls in reversed(det):
if save_txt: # Write to file
xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist() # normalized xywh
with open(txt_path + '.txt', 'a') as f:
f.write(('%g ' * 5 + '\n') % (cls, *xywh)) # label format
if save_img or view_img: # Add bbox to image
label = '%s %.2f' % (names[int(cls)], conf)
plot_one_box(xyxy, im0, label=label, color=colors[int(cls)], line_thickness=3)
ctrl+鼠标左键点击,会跳转到plot.py,并进入该函数。将该函数修改为:
def plot_one_box(x, img, color=None, label=None, line_thickness=None):
# Plots one bounding box on image img
tl = line_thickness or round(0.002 * (img.shape[0] + img.shape[1]) / 2) + 1 # line/font thickness
color = color or [random.randint(0, 255) for _ in range(3)]
c1, c2 = (int(x[0]), int(x[1])), (int(x[2]), int(x[3]))
cv2.rectangle(img, c1, c2, color, thickness=tl, lineType=cv2.LINE_AA)
print("左上点的坐标为:(" + str(c1[0]) + "," + str(c1[1]) + "),右下点的坐标为(" + str(c2[0]) + "," + str(c2[1]) + ")")
此时不出意外,应该能够输出预测边界框的坐标:
原图:
输出坐标:
如果需要将输出的坐标写进.txt文件方便后续操作,可定义一个写入文件的函数:
def write_coordinates_to_file(c1, c2):
# 打开文件,并使用 'a' 模式表示追加写入
with open('coordinates.txt', 'a') as file:
# 将坐标转换为字符串,并使用制表符分隔
line = '\t'.join(str(c) for coord in (c1, c2) for c in coord)
# 将形成的一行写入文件
file.write(line + '\n') # 添加换行符
然后在plot_one_box函数中添加一行write_coordinates_to_file(c1, c2)即可,坐标会被写进一个coordinates文件。
若想输出坐标和置信度,则在plot.py中的plot_one_box函数中,if lable:语句末尾加上print(lable)即可
这样预测边界框的坐标、类别、置信度都有了直观的输出
注意:由于在rectangle绘图时,y轴是向下的,如下图所示:
所以YOLO中输出的左上角实际上指的是(98,345)这个点,右下角是(420,462)这个点。