IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 目标检测计算mAP -> 正文阅读

[人工智能]目标检测计算mAP

Det为预测框 Gt为真实框
在这里插入图片描述

import numpy as np
from functools import reduce

def iou_cal(boxa, boxb): #计算IOU
    x1, y1, x2, y2 = boxa  #a框的左上角和右下角坐标
    x3, y3, x4, y4 = boxb  #b框的左上角和右下角坐标
    left_max = max(x1, x3) #计算交集框的左边的横坐标最大值
    right_min = min(x2, x4) #计算交集框的右边的横坐标最小值
    top_max = max(y1, y3)  #计算交集框的上边的纵坐标最大值
    bottom_min = min(y2, y4) #计算交集框下边的纵坐标最小值
    #计算交集框的面积  长是左右横坐标的差值,宽是上下纵坐标的差值  当ab框没有交集时,左右横坐标或上下纵坐标差值为负值,此时取0即可
    inter_area = max(0, right_min-left_max) * max(0, bottom_min-top_max)
    #计算a框和b框的面积
    a_area = (x2 - x1) * (y2 - y1)
    b_area = (x4 - x3) * (y4 - y3)
    #计算交并比
    iou = inter_area / (a_area + b_area - inter_area)
    return iou

cls_num = 3  #目标类别数量
pre_boxes = [] #保存预测框的list
gt_boxes = [] #保存真实框的list
cls_pre_boxes = {i: [] for i in range(cls_num)} #保存不同类别预测框的字典
cls_gt_boxes = {j: [] for j in range(cls_num)}  #保存不同类别真实框的字典

#随机生成预测值和标签值  (标签和预测值一致)
for i in range(50):
    x1 = np.random.randint(10, 50)
    x2 = x1 + np.random.randint(20, 50)
    y1 = np.random.randint(20, 60)
    y2 = y1 + np.random.randint(30, 80)
    cls = np.random.randint(0, 3)
    conf = np.random.rand()
    pre_boxes.append([x1, y1, x2, y2, cls, conf])
    gt_boxes.append([x1, y1, x2, y2, cls, 0])

#将预测框和标签框按类别分类
for pre_box in pre_boxes:
    cls_pre_boxes[pre_box[4]].append(pre_box)
for gt_box in gt_boxes:
    cls_gt_boxes[gt_box[4]].append(gt_box)

res = []  #保存每个类别的ap

#按类别遍历全部预测框计算ap
for pre_cls, pre_boxes in cls_pre_boxes.items():
    gt_cls = pre_cls #当前类别序号
    gt_boxes = cls_gt_boxes[gt_cls] #当前类别的真实框
    #对当前类别的预测值按置信度降序排序
    pre_boxes = sorted(pre_boxes, key=lambda x: x[5], reverse=True)
    TP = np.zeros(len(pre_boxes))
    FP = np.zeros(len(pre_boxes))#数组保存每个预测框是TP还是FP
    for ind, pre_box in enumerate(pre_boxes):
        iou_max = 0  # 初始化当前预测框与真实框的最大IOU为0
        for indx, gt_box in enumerate(gt_boxes):
            iou = IOU_calculate.iou_cal(pre_box[:4], gt_box[:4])
            if iou > iou_max:
                iou_max = iou
                jmax = indx #保存最大iou的真实框的序号
        # 若当前预测框与真实框的最大iou大于0.5且匹配的真实框没有被匹配过则记为TP且标记这个真实框被匹配过
        if iou_max > 0.5 and gt_boxes[jmax][5] == 0:
            TP[ind] = 1
            gt_boxes[jmax][5] = 1
        else:  #否则标记为FP
            FP[ind] = 1
    #计算累计的TP和FP  即有n个预测框生成对应的n个precision和recall以绘制PR曲线求ap
    acc_TP = np.cumsum(TP)
    acc_FP = np.cumsum(FP)
    #计算截至到每个预测框的recall和precision
    rec = acc_TP / len(gt_boxes)
    acc = np.divide(acc_TP, acc_TP + acc_FP)
    #计算ap
    ap = np.trapz(acc, rec)  #求PR曲线下面积   y轴acc, x轴rec
    res.append((pre_cls, ap)) #将当前类别的ap保存

print(res)
mAP = reduce(lambda x, y: x + y, [re[1] for re in res]) /cls_num  #计算mAP
print("mAP = ", mAp)

在这里插入图片描述

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-08-29 09:05:19  更:2021-08-29 09:05:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/1 10:22:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码