前言
当我们使用yolov8进行测试指定文件夹里的图片时,为了计算相应的map,需要先将yolov8的预测结果保存为txt文件;然后将txt文件中的格式(类别、框的中心点和高宽,置信度)转换成符合要求的格式(类别、置信度、框左上角坐标点、框右下角坐标点)。最后运行map计算代码
yolov8测试图片并保存预测结果
按照下面的方法来测试图片并保存预测结果,其中参数model为yolov8的pt模型,参数source为测试的图片或者图片的文件夹路径,参数save_txt设置为True:将预测结果保存为txt文件,参数save_conf设置为True:置信度也保存在txt文件中。
#使用命令
yolo detect predict model=/***/***.pt source=/**/ save_txt=True imgsz=416 save_conf=True
# 或者使用代码
Model = YOLO("/***/***.pt") # load a pretrained model (recommended for training)
Model.predict(source="/**/",save_txt=True, imgsz=416, save_conf=True)
格式转换
由于yolov8预测结果保存的格式为类别、框的中心点和高宽,置信度。我们需要将其转换成类别、置信度、框左上角坐标点、框右下角坐标点。下面的代码实现此需求。
import numpy as np
import cv2
import torch
import os
# 需要该下面这两处地方
label_path = './input/labels0' # label_path:未转换的txt文件夹路径
image_path = './input/images-optional' # label_path:原图的文件夹路径
#坐标转换,原始存储的是YOLOv5格式
# Convert nx4 boxes from [x, y, w, h] normalized to [x1, y1, x2, y2] where xy1=top-left, xy2=bottom-right
def xywhn2xyxy(x, w=416, h=416, padw=0, padh=0):
y = x.clone() if isinstance(x, torch.Tensor) else np.copy(x)
y[:, 0] = w * (x[:, 0] - x[:, 2] / 2) + padw # top left x
y[:, 1] = h * (x[:, 1] - x[:, 3] / 2) + padh # top left y
y[:, 2] = w * (x[:, 0] + x[:, 2] / 2) + padw # bottom right x
y[:, 3] = h * (x[:, 1] + x[:, 3] / 2) + padh # bottom right y
return y
folder = os.path.exists('DR')
if not folder:
os.makedirs('DR')
folderlist = os.listdir(label_path)
for i in folderlist:
label_path_new = os.path.join(label_path,i)
with open(label_path_new, 'r') as f:
lb = np.array([x.split() for x in f.read().strip().splitlines()], dtype=np.float32) # labels
print(lb)
read_label = label_path_new.replace(".txt", ".jpg")
read_label_path = read_label.replace(label_path, image_path)
print(read_label_path,"ddd")
img = cv2.imread(str(read_label_path))
h, w = img.shape[:2]
lb[:, 1:] = xywhn2xyxy(lb[:, 1:], w, h, 0, 0) # 反归一化
# 绘图
for _, x in enumerate(lb):
class_label = int(x[0]) # class
with open('DR/' + i, 'a') as fw:#这里需要把confidence放到第二位
fw.write(str(int(x[0])) + ' ' + str(x[5])+' '+str(x[1]) + ' ' + str(x[2]) + ' ' + str(x[3]) + ' ' + str(
x[4]) + '\n')
'''cv2.imshow('show', img)
cv2.waitKey(0) # 按键结束
cv2.destroyAllWindows()'''
运行结果后,会生成一个文件夹名字为“DR”的文件夹,将里面的txt文件放置在./input/detection-results里面。