一、前言
"""
在进行基于yolov8的摔倒检测的时候发现,要是基于深度学习去检测摔倒的话有时候会将物体识别成摔倒,所以我加了一个yolov8自带的人体检测模型(yolov8n)。使用后发现人体检测加物体识别要是不加一个限定,还是无法准确检测摔倒,所以引用了IoU计算来验证跌倒检测
''''
二、定义与核心原理
IoU(Intersection over Union)是目标检测中用于衡量预测边界框与真实边界框重叠程度的指标,其定义为:
取值范围为[0,1],值越大表示两者重叠度越高。
三、计算步骤
1、确定边界框坐标
预测框(,
,
,
)与真实框(
,
,
,
)
(假设为矩形框,(x,y)为中心点坐标,w,h为宽高)
2、计算交集区域
交集左上角坐标:(max(,
),max(
,
))
交集右下角坐标:(min(,
),min(
,
))
3、计算并集区域
并集面积 = 预测框面积 + 真实框面积 − 交集面积
4、求比值
四、代码实现示例
def calculate_iou(boxA, boxB):
# 输入格式: (x_center, y_center, width, height)
# 转换为角点坐标
boxA = [boxA[0]-boxA[2]/2, boxA[1]-boxA[3]/2, boxA[0]+boxA[2]/2, boxA[1]+boxA[3]/2]
boxB = [boxB[0]-boxB[2]/2, boxB[1]-boxB[3]/2, boxB[0]+boxB[2]/2, boxB[1]+boxB[3]/2]
# 计算交集区域
xA = max(boxA[0], boxB[0])
yA = max(boxA[1], boxB[1])
xB = min(boxA[2], boxB[2])
yB = min(boxA[3], boxB[3])
inter_area = max(0, xB - xA) * max(0, yB - yA)
# 计算并集
boxA_area = (boxA[2]-boxA[0])*(boxA[3]-boxA[1])
boxB_area = (boxB[2]-boxB[0])*(boxB[3]-boxB[1])
union_area = boxA_area + boxB_area - inter_area
return inter_area / union_area if union_area !=0 else 0
五、应用场景
场景 | 说明 | 特点 |
---|---|---|
模型评估 | 检测结果与标注数据的匹配度评价 | 阈值通常设为0.5 |
损失函数 | IoU Loss及其变种(如GIoU、DIoU) | 直接优化定位精度 |
非极大值抑制(NMS) | 筛选最优检测框 | 避免重复检测 |
旋转目标检测 | 使用旋转框IoU计算(Rotated IoU) | 支持任意角度检测 |
六、特性分析
- 边界敏感性:当边界框尺寸变化时,IoU值呈现非线性变化
- 类别平衡:Focal IoU通过引入 αα 和 γγ 参数解决样本不平衡问题
- 可微性:旋转框IoU实现了可微分计算,支持端到端训练
七、思维导图
这是第一次发博客,后面会不定期更新作者有关深度学习的计算机视觉笔记