基于YOLO系列模型检测性能评估工具
介绍
所使用到的开源库dbolya作者的tide
这个开源库能很好的评估YOLO系列模型的性能,其评估指标很多,有空可以阅读评价目标检测的方法map 新方法 TIDE
如何使用
流程分为两步,顺序可以颠倒
1.准备coco版的数据集标注json文件
2.YOLO系列中val后保存结构格式为json
准备coco版的数据集标注json文件
前提是数据集得是YOLO系列可训练数据集格式
import os
import json
from PIL import Image
# 配置路径
images_dir = r'images/val' #这是图片文件夹路径
labels_dir = r'labels/val' #这是数据集标注文件文件夹路径
output_json_path = 'annotations.json' #这是转换后保存json文件路径已经名字
# 类别信息,根据实际情况进行修改
categories = [{'id': 1, 'name': 'category1'}, {'id': 2, 'name': 'category2'}] # 示例
# 初始化COCO数据集字典结构
coco_data = {
"images": [],
"annotations": [],
"categories": categories
}
def yolo_to_coco(images_dir, labels_dir, output_path):
anno_id = 1 # 初始化注释ID
for label_file in os.listdir(labels_dir):
# 分割文件名和扩展名,获取图像ID
image_id, _ = os.path.splitext(label_file)
# 构建图像路径,获取图像尺寸
image_path = os.path.join(images_dir, f"{image_id}.jpg")
with Image.open(image_path) as img:
width, height = img.size
# 添加图像信息到COCO数据集
coco_data["images"].append({
"file_name": f"{image_id}.jpg",
"height": height,
"width": width,
"id": str(image_id)
})
# 打开相应的标注文件
with open(os.path.join(labels_dir, label_file), 'r') as file:
for line in file:
category_id, x_center, y_center, bbox_width, bbox_height = map(float, line.strip().split())
# 将YOLO坐标转换成COCO坐标
x_min = (x_center - bbox_width / 2) * width
y_min = (y_center - bbox_height / 2) * height
width_bbox = bbox_width * width
height_bbox = bbox_height * height
# 添加注释信息到COCO数据集
coco_data["annotations"].append({
"id": anno_id,
"image_id": str(image_id),
"category_id": int(category_id) , # 假设YOLO类别索引从0开始
"bbox": [x_min, y_min, width_bbox, height_bbox],
"area": width_bbox * height_bbox,
"iscrowd": 0,
"segmentation":[]
})
anno_id += 1
# 写入COCO格式的JSON文件
with open(output_path, 'w') as json_file:
json.dump(coco_data, json_file, indent=4)
yolo_to_coco(images_dir, labels_dir, output_json_path)
根据自己设备环境情况修改
images_dir = r'...' #这是图片文件夹路径
labels_dir = r'...' #这是数据集标注文件文件夹路径
output_json_path = '...' #这是转换后保存json文件路径已经名字
然后将代码修改为py文件使用python命令运行,无报错后就能进行下一步了。
YOLO系列中val后保存结构格式为json
这里拿YOLOv5举例,V7,V8等自行举一反三。
在GitHub上下拉YOLOV5项目,进入项目文件夹后,找到val.py,打开。
分别将红框中的参数根据自己环境已经模型和数据集所在位置进行调整。
注意:
- –conf-thres最好为0.01,因为该文章就是为了评估模型性能而创作的。
- –save-json一定要打开。
然后运行val.py,根据提升在文件夹中
得到类似"best_predictions.json"文件,这个就是val结果json文件。
使用TIDE来对模型性能进行评估
安装TIDE
pip install tidecv
安装完毕后,创建一个新的py文件
from tidecv import TIDE
import tidecv.datasets
# json文件
annFile = 'annotations.json' # 数据集标注json文件路径
resFile = 'val\\exp\\best_predictions.json' # yolo系列val保存的json结果文件路径
gt = datasets.COCO(annFile)
bbox_results = datasets.COCOResult(resFile)
tide = TIDE()
# 注意mode参数,TIDE.BOX是边界框评估,TIDE.MASK是segmentation所使用.
# name参数为字符串,是画图图片标题,以及在控制台评估内容第一行呈现的
tide.evaluate_range(gt, bbox_results, mode=TIDE.BOX, name='123')
# 打印在控制台中运行的评估
tide.summarize()
# 图像的形式呈现出来
tide.plot()
根据自己设备环境修改
annFile = '....' # 数据集标注json文件路径
resFile = '....' # yolo系列val保存的json结果文件路径
注意:
如果你的YOLO模型只是边界框检测,不是语义分割模型或者关键点模型。
以下修改对你很重要
在你的python环境中找到tidecv.datasets,datasets.py文件部分内容需要修改,或者在PyCharm中使用快捷键快速打开该文件,否者下列代码无法运行成功!!!
找到上图中mask变量位置,将102行注释掉修改为104行这样,125行也是同理!
然后运行该新的py文件会得到以下评估信息
由于版本原因运行到tide.plot()行会出现警告,目前不影响使用就不解决了,如何会解决该警告的可以在评论区进行解答!
结束!!!!!!!!