机器学习算法五之 目标检测评价指标 IOU 准确率 召回率等

机器学习算法五之 目标检测评价指标 IOU 准确率 召回率等

  • 在目标检测算法中,训练出一个模型,想要知道这个模型的效果怎么样,主要是从模型的指标得出的,指标不仅在论文还是在自己学习的过程中,都是十分重要的,下边就来详细介绍一下指标的这个概念。

一、准确率(Accuracy)

定义:正确识别的目标数量与总目标数量的比率。

目标数量:图像中实际存在的目标数量,列如物体、人、车辆等,列如给出一张照片,其中有100个人,这100个人是总目标数量,然后预测出来了90个并且是正确的,那准确率就为90%。

二、IOU交并比

1、IoU计算的是"预测的边框"和"真实的边框"的交叠率,即它们的交集和并集的比值。

2、IoU等于"预测的边框"和"真实的边框"之间交集和并集的比值。

简单说,交集面积与并集面积之比,值越接近于1表示两个边界框的的重叠程度越高。

计算方法:

  1. 计算两个边界框的相交区域的面积。
  2. 计算两个边界框的并集区域的面积。
  3. 将相交区域的面积除以并集区域的面积,得到IoU值。

代码:

python 复制代码
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++ 实现
cpp 复制代码
#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、

给出上述指标的代码,代码如下:

python 复制代码
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-2~blog~sobaiduweb~default-0-129342661.nonecase&spm=1018.2226.3001.4450

相关推荐
青花瓷25 分钟前
C++__XCode工程中Debug版本库向Release版本库的切换
c++·xcode
观音山保我别报错27 分钟前
C语言扫雷小游戏
c语言·开发语言·算法
Eric.Lee20211 小时前
yolo v5 开源项目
人工智能·yolo·目标检测·计算机视觉
幺零九零零2 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
TangKenny2 小时前
计算网络信号
java·算法·华为
景鹤2 小时前
【算法】递归+深搜:814.二叉树剪枝
算法
iiFrankie2 小时前
SCNU习题 总结与复习
算法
捕鲸叉2 小时前
MVC(Model-View-Controller)模式概述
开发语言·c++·设计模式
Dola_Pan3 小时前
C++算法和竞赛:哈希算法、动态规划DP算法、贪心算法、博弈算法
c++·算法·哈希算法
yanlou2333 小时前
KMP算法,next数组详解(c++)
开发语言·c++·kmp算法