首先我有一个文件夹,里面包含两百多张已经用labelImg标注好的图片,每个图片对应一个xml文件。这些图片中可能会包含五种标签。
现需要利用mmdetection计算每种标签的精确率(precision),召回率(recall),AP,和这个模型的mAP。并且将检测结果写成xml,且该xml可被labelimg识别。
网上大多讨论的是二分类的做法,当下的问题相当于五类,说一下我的思路。
对某一个标签来说:
Precision :识别正确的个数 / 识别出的总个数 (准)
Recall:识别正确的个数 / 实际的个数 (全)
AP(Average Precision): 每一张图片的P值之和 / 图片数量
对所有标签(这个模型)来说:
mAP(mean Average Precision): 每个标签的AP值之和 / 标签数量
利用混淆矩阵计算 Precision,Recall
矩阵为 (5* 6)如下:
列:实际的标签
行:检测到的标签类别、没检出来的
这里是将所有图片中的所有标签的结果都放在这个矩阵中
例如计算label1的Precision = 3/(3+1+0+0+2) = 0.5 Recall = 3/(3+1+1+0+0+1) = 0.5
计算AP
根据ap的定义来算。
首先定义两个列表,这两个列表长度等于图片数量
#保存原始所有图片的每个标签的实际个数
original_matrix_pics = []
#保存检测到的所有图片的每个标签的个数
detected_matrix_pics = []
然后在定义一个列表,保存每张图片的信息
#每张图片各标签的检测个数 num_classes_fzp = 5
origin_pic = np.zeros(num_classes_fzp) #[0, 0, 0, 0, 0]
#每张图片各标签的检测成功个数
detected_pic = np.zeros(num_classes_fzp) #[0, 0, 0, 0, 0]
然后循环处理每一张图片,将结果append到original_matrix_pics和detected_matrix_pics ,然后计算每张图片每个标签的P、AP值
如果该图片中实际没有该标签,那么计算AP是应该排除这张图片,即总数不计该图片。
计算mAP
mAP = 5个标签AP之和/5
如果所有图片中实际只有四个标签,那么应该除以4
结果
刚接触目标检测,可能理解有不到位或者偏差的地方,欢迎指正。
其他
重要参考:
https://blog.csdn.net/leviopku/article/details/80835929
https://blog.csdn.net/weixin_40369473/article/details/102653018 (该博客中 P=(一张图片上某一类别识别的正确数量)/一张图片上某一类别的总数量 分母应该是识别的总数量,不是实际)
https://blog.csdn.net/mr_muli/article/details/91897566
http://www.sohu.com/a/135668355_556897
读写XML可使用ElementTree
参考:https://blog.csdn.net/hu694028833/article/details/81089959
xml美化,缩进
参考:https://blog.csdn.net/weixin_42997255/article/details/100090114
创建矩阵可用numpy
参考:https://blog.csdn.net/qq_39161737/article/details/78814743
IOU计算
参考:
https://www.cnblogs.com/mengxiangtiankongfenwailan/p/11392409.html