mmdetection中加入了混淆矩阵生成并可视化的功能,具体的代码在tools/analysis_tools/confusion_matrix.py。
mmrotate由于主流遥感数据集中的DOTA数据集标注格式问题,做了一些修改,所以我们如果是做遥感图像检测的Dota数据集的混淆矩阵,最好还是用mmrotate仓库里的confusion_matrix.py。
但是直接使用会有一些坑,我自己也是调试了一天,终于跑通,在这里记录一下。
首先mmrotate的仓库必须选择1.x的分支,默认拉取的分支是有调用bug的。
github clone -b 1.x https://github.com/open-mmlab/mmrotate.git
并且直接使用pip或者mim(mmrotate推荐的安装工具)来安装的话,mmcv/mmdet的版本是有问题的。经过测试,下图中版本不会存在冲突,可以正常运行。
解决完版本问题,我们在运行confusion_matrix.py依然会报错。
我报的错误是RuntimeError: shape '[5]' is invalid for input of size 0
这个问题我找了好久,最后发现是由于DOTA数据集中的标注文件为空导致的,即annfiles中的txt标注文件里面没有东西,这会导致上述错误。
但是标注为空说明这张图片上什么都没有,代码里的逻辑我推测是寻找跑出来的框在什么位置、是什么类别,当它找不到的时候,代码便发生错误。因为没有框就不能归类为识别为背景background,代码里可能没有考虑这个问题。
比较暴力的解法是在代码做循环的时候把空标签跳过即可。
在代码的85行,calculate_confusion_matrix这个函数中加上if的判断,如果标签为空就跳过。
for idx, per_img_res in enumerate(results):
res_bboxes = per_img_res['pred_instances']
gts = dataset.get_data_info(idx)['instances']
if len(gts) != 0:
analyze_per_img_dets(confusion_matrix, gts, res_bboxes, score_thr,
tp_iou_thr, nms_iou_thr)
prog_bar.update()
然后便可以顺利的跑出混淆矩阵的图了。