机器学习算法五之 目标检测评价指标 IOU 准确率 召回率等
- 在目标检测算法中,训练出一个模型,想要知道这个模型的效果怎么样,主要是从模型的指标得出的,指标不仅在论文还是在自己学习的过程中,都是十分重要的,下边就来详细介绍一下指标的这个概念。
一、准确率(Accuracy)
定义:正确识别的目标数量与总目标数量的比率。
目标数量:图像中实际存在的目标数量,列如物体、人、车辆等,列如给出一张照片,其中有100个人,这100个人是总目标数量,然后预测出来了90个并且是正确的,那准确率就为90%。
二、IOU交并比
1、IoU计算的是“预测的边框”和“真实的边框”的交叠率,即它们的交集和并集的比值。
2、IoU等于“预测的边框”和“真实的边框”之间交集和并集的比值。
简单说,交集面积与并集面积之比,值越接近于1表示两个边界框的的重叠程度越高。
计算方法:
- 计算两个边界框的相交区域的面积。
- 计算两个边界框的并集区域的面积。
- 将相交区域的面积除以并集区域的面积,得到IoU值。
代码:
def calculate_iou(bbox1, bbox2):
# bbox: [x1, y1, x2, y2]
x1 = max(bbox1[0], bbox2[0])
y1 = max(bbox1[1], bbox2[1])
x2 = min(bbox1[2], bbox2[2])
y2 = min(bbox1[3], bbox2[3])
#上述是得出了交集的对角线的坐标
# 计算交集的面积
intersection_area = max(0, x2 - x1 + 1) * max(0, y2 - y1 + 1)
# 计算并集区域的面积
area_bbox1 = (bbox1[2] - bbox1[0] + 1) * (bbox1[3] - bbox1[1] + 1)
area_bbox2 = (bbox2[2] - bbox2[0] + 1) * (bbox2[3] - bbox2[1] + 1)
union_area = area_bbox1 + area_bbox2 - intersection_area
# 加一的目的是为了避免重合的时候的情况
# 计算IoU值
iou = intersection_area / union_area
return iou
bbox1 = [10, 20, 50, 60] # 左上角和右下角坐标
bbox2 = [30, 40, 70, 80]
iou = calculate_iou(bbox1, bbox2)
print("IoU:", iou)
- C++ 实现
#include <iostream>
struct Rect {
int x;
int y;
int width;
int height;
};
float CalculateIOU(const Rect& rect1, const Rect& rect2) {
int overlap_x = std::max(std::min(rect1.x + rect1.width, rect2.x + rect2.width) - std::max(rect1.x, rect2.x), 0);
int overlap_y = std::max(std::min(rect1.y + rect1.height, rect2.y + rect2.height) - std::max(rect1.y, rect2.y), 0);
int overlap_area = overlap_x * overlap_y;
int union_area = rect1.width * rect1.height + rect2.width * rect2.height - overlap_area;
return overlap_area / float(union_area);
}
int main() {
Rect rect1 = {0, 0, 10, 10};
Rect rect2 = {5, 5, 10, 10};
std::cout << "IOU: " << CalculateIOU(rect1, rect2) << std::endl;
return 0;
}
三、TP、TN、FP、FN
T是True,F是False,P是positive,N是negative
关于这四个词的概念,我就通俗易懂的讲一下:
假如, 原始图片中有10张人脸,输入到一个人脸检测模型,检测的结果是9张人脸,然后9张人脸的框,有8个和原图是相似对应的,有1个框里面啥也没有,没有人脸。那计算这个情况下的四个值。
TP:就是预测人脸然后预测正确了的,这个题就知道有8个。
FP:就是将一个不是标签的给预测出来,预测的结果是标签,这次 预测中,有一个是空气但是预测成人脸了,所以的值就为1了。
FN:就是模型判断错了,他是标签,但是没有预测出来,这个题的结果为2,因为有两个人脸没有预测出来。
TN:这个概念的意思就是说,就如有一张照片,这张照片没有人脸,然后模型也没有给出任何的结果,对于这种情况下,TN的值就是1.
对于上述表中,对内容进行详细地解释一下。
首先,感到的第一个疑惑的地方就是,是如何判断自己到底预测的是对的还是错的,也就是表中的正负样本的这些概念,个人理解是会去计算预测框和真实的框( GT)的IOU,然后和阈值进行比较,大于阈值的时候,然后看这个框内物体的类别有没有预测正确,如果预测正确就是正样本,这样理解起来应该通俗易懂了。然后还有四个指标的解释,下边分标题来讲解,并且给出代码。
四、准确率、召回率、F1-Score、
给出上述指标的代码,代码如下:
def calculate_precision_recall_f1(predicted_boxes, ground_truth_boxes, threshold=0.5):
true_positives = 0
false_positives = 0
false_negatives = 0
for pred_box, pred_class, pred_confidence in predicted_boxes:
best_iou = 0
for gt_box, gt_class in ground_truth_boxes:
iou = calculate_iou(pred_box, gt_box)
if iou > best_iou and pred_class == gt_class:
best_iou = iou
if best_iou >= threshold:
true_positives += 1
else:
false_positives += 1
for gt_box, gt_class in ground_truth_boxes:
best_iou = 0
for pred_box, pred_class, pred_confidence in predicted_boxes:
iou = calculate_iou(pred_box, gt_box)
if iou > best_iou and pred_class == gt_class:
best_iou = iou
if best_iou < threshold:
false_negatives += 1
precision = true_positives / max((true_positives + false_positives), 1)
recall = true_positives / max((true_positives + false_negatives), 1)
f1_score = 2 * (precision * recall) / max((precision + recall), 1)
return precision, recall, f1_score
五、ROC曲线、PR曲线
ROC曲线
P-R曲线(查准率-查全率曲线)
六 AP、 MAP
七、参考文献
1. https://blog.csdn.net/m0_74055982/article/details/138613520
2. https://blog.csdn.net/caip12999203000/article/details/129342661?ops_request_misc=&request_id=&biz_id=102&utm_term=%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AE%97%E6%B3%95%E6%8C%87%E6%A0%87%E8%AE%B2%E8%A7%A3&utm_medium=distribute.pc_search_result.none-task-blog-2blogsobaiduweb~default-0-129342661.nonecase&spm=1018.2226.3001.4450