问题描述
原始数据集标签格式为 (左上角点 x 轴坐标, 左上角点 y 轴坐标, 图片宽, 图片高) ,为了将其输入到 yolo 网络中进行训练,需要进行数据格式转换,即将标签格式转化为 (中心点 x 轴坐标, 中心点 y 轴坐标, 图片宽, 图片高) 。 编写一段转化代码实现后,想要通过可视化验证一下转换代码编写是否正确,即读取转换后的 txt 文件,然后在原图中画框,看框的位置是否正确。
问题解决
import numpy as np
import cv2
import torch
label_path = r'C:\Users\Administrator\Downloads\data\labels\cars5.txt'
image_path = r'C:\Users\Administrator\Downloads\data\cars5.jpg'
def xywh2xyxy(x, w1, h1, img):
labels = ['person', 'car']
label, x, y, w, h = x
print("原图宽高:\nw1={}\nh1={}".format(w1, h1))
x_t = x*w1
y_t = y*h1
w_t = w*w1
h_t = h*h1
print("反归一化后输出:\n第一个:{}\t第二个:{}\t第三个:{}\t第四个:{}\t\n\n".format(x_t,y_t,w_t,h_t))
top_left_x = x_t - w_t / 2
top_left_y = y_t - h_t / 2
bottom_right_x = x_t + w_t / 2
bottom_right_y = y_t + h_t / 2
print('标签:{}'.format(labels[int(label)]))
print("左上x坐标:{}".format(top_left_x))
print("左上y坐标:{}".format(top_left_y))
print("右下x坐标:{}".format(bottom_right_x))
print("右下y坐标:{}".format(bottom_right_y))
cv2.rectangle(img, (int(top_left_x), int(top_left_y)), (int(bottom_right_x), int(bottom_right_y)), (0, 255, 0), 2)
cv2.imshow('show', img)
cv2.imwrite('11.png',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
with open(label_path, 'r') as f:
lb = np.array([x.split() for x in f.read().strip().splitlines()], dtype=np.float32)
print(lb)
img = cv2.imread(str(image_path))
h, w = img.shape[:2]
for x in lb:
xywh2xyxy(x, w, h, img)
实现效果
参考链接:https://blog.csdn.net/qq_41428418/article/details/120530479
|