在进行实验的过程中,博主一直使用的是COCO数据集,其评价指标如下所示,包含大中小目标的AP值与AR值。博主选用了yolov5与yolov7进行实验,其中yolov5成功,yolov7却出现了问题。
随后博主在进行对比实验时使用了YOLO模型,其默认是不输出大中小目标的AP值的,为了能够获取这个评价指标值,我们需要对val.py文件进行修改。
下载依赖
首先是我们所需的依赖包:pycocotools
pip install pycocotools
数据集测试
yolov5
要执行val.py
。yolov7中是test.py
,需要加载我们的训练完成的模型文件,其参数与训练时大致相同。
修改文件
首先是将--save-json
加上default="True"
parser.add_argument('--save-json', action='store_true', help='save a cocoapi-compatible JSON results file')
其次将下面这句代码注释掉:
opt.save_json |= opt.data.endswith('coco.yaml')
报错处理
报错1:
File "/home/ubuntu/anaconda3/envs/python/lib/python3.8/site-packages/torch/serialization.py", line 1033, in _legacy_load
magic_number = pickle_module.load(f, **pickle_load_args)
_pickle.UnpicklingError: STACK_GLOBAL requires str
将数据集中的cache文件删除即可,然后重新运行。
运行结果如下,说明该程序已经没有问题了。
报错2:
可以看到下面报错,这是由于我们的COCO数据集验证时需要json格式的标注文件,而这个文件要放在./coco/annotations/
文件夹下,那么我们将instances_val2017.json
文件复制一份到yolov7根目录的./coco/annotations
即可
Speed: 9.4/1.1/10.4 ms inference/NMS/total per 640x640 image at batch-size 4
Evaluating pycocotools mAP... saving runs/test/exp7/best_predictions.json...
loading annotations into memory...
pycocotools unable to run: [Errno 2] No such file or directory: './coco/annotations/instances_val2017.json'
需要注意的是yolov5在这里的报错与yolov7是有些许不同的:
这里他要存放json的地址为../datasets/coco/annotations/instances_val2017.json
loading annotations into memory...
pycocotools unable to run: [Errno 2] No such file or directory: '../datasets/coco/annotations/instances_val2017.json'
Results saved to runs/val/exp3
报错3
然而yolov7却出现下面问题:
起初我是先做的yolov7的,开始以为是数据集出现了问题,然而在yolov5中却是正常的,那么就只能是yolov7的修改方式与yolov5不同所导致的。
看到有人说test.py文件要将is_coco手动设置为True,不知道为什么这里结果是False,手动设置为True的话会执行下面coco80->91的函数,因为coco标签文件是到91的,如果不转评估结果都是0。但博主实验后发现不行。
随后在查阅资料时误打误撞,将下面这句代码修改,说实话真不知道为啥这样改,但结果就是成功了。
原本代码
'category_id': coco91class[int(p[5])] if is_coco else int(p[5]),
修改后代码:
'category_id': int(p[5])
再次运行就OK了。
yolov7运行结果
yolov5运行结果
yolov5的运行效果如下图所示,但却发现yolo的评价结果值要比coco的值高了一点,不过倒也无伤大雅。