自己最近也在使用mmdetection,过程中自己也遇到了一些问题,想分享一下解决的方法可以供大家参考,希望能对需要的人有所帮助。本人在这方面也是一个新手,所以欢迎大家跟我交流心得。
关于mmdetection中的评价指标,mAP是训练和测试都会直接打印的,这里就不过多赘述。主要讲的是打印precision和recall这两个指标。这里的precision和recall跟yolo中的一样,都是根据绘制的混淆矩阵进行计算求得的。
首先使用我们训练好的模型进行测试并生成.pkl文件,这个文件是关键,通过运行以下命令(修改引号中对应的三个参数,运行时不带引号),运行后找到生成的pkl文件。
python tools/test.py '模型配置文件的路径,在config文件夹中的对应的模型的py文件' '训练好的权重路径,.pth文件的路径' '--out' '.pkl文件保存路径,例:
python tools/test.py configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py work_dirs/faster-rcnn_r50_fpn_1x_coco/epoch_12.pth results/faster-rcnn /faster-rcnn.pkl
修改tools/analysis_tools/confusion_matrix.py文件,在底部添加代码
# 计算每个类别的精确率和召回率 precision_per_class = [] recall_per_class = [] for i in range(len(confusion_matrix)-1): tp = diagonal_elements[i] precision = tp / np.sum(confusion_matrix[:, i]) if np.sum(confusion_matrix[:, i]) > 0 else 0 recall = tp / np.sum(confusion_matrix[i, :]) if np.sum(confusion_matrix[i, :]) > 0 else 0 precision_per_class.append(precision) recall_per_class.append(recall) precision_per_class = np.array(precision_per_class) recall_per_class = np.array(recall_per_class) # 计算总体的平均精确率和召回率 mean_precision = np.mean(precision_per_class) mean_recall = np.mean(recall_per_class) print("每类的精确率:", precision_per_class) print("每类的召回率:", recall_per_class) print("总体平均精确率:", mean_precision) print("总体平均召回率:", mean_recall)
运行以下命令(原理同上)
python tools/analysis/confusion_matrix.py '模型配置文件的路径,在config文件夹中的对应的模型的py文件' '.pkl文件的路径' '生成文件保存路径',例:
python tools/analysis_tools/confusion_matrix.py configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py results/faster-rcnn/faster-rcnn.pkl results/faster-rcnn
注意!!!混淆矩阵除了我们自己数据集已有的标签外,会额外加一个background标签,比如说我的数据集有11类,那么混淆矩阵就是12×12的,在使用混淆矩阵进行单类的precision和recall计算时,往往会算上background,这是正常的,但是在计算precision和recall的平均值时,也就是我们最后需要的precision和recall的指标时,我看到的文章的代码都没有把background给去掉,而是直接对混淆矩阵所有类别的precision和recall直接求平均,这样会导致真实值偏低,因为background的precision和recall的值都是0。我的这个代码是在计算最后的平均值的时候把background给去掉了,所以可以放心使用。