目标检测——yolov4损失函数

深入理解 YOLOv4 中的 CIOU 损失函数计算方法 CIOU 损失函数是 YOLOv4 在原有 IOU(Intersection over Union)损失函数基础上的改进版本。它考虑了目标框之间的完整交叉,并引入了修正因子,以更精准地度量目标框之间的相似性。CIOU 损失函数的计算方法相比于传统 IOU 更为复杂,但这也使得模型在训练过程中能够更好地理解目标框的准确位置和形状。CIOU 损失函数在设计上考虑了目标框的形状信息,通过引入修正因子,使得损失对于不同形状的目标框更具鲁棒性。这使得模型更容易捕捉目标的准确形状。 阅读详情

 

人工智能学习离不开实践的验证,推荐大家可以多在FlyAI-AI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力。FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台。每周免费提供项目开源算法样例,支持算法能力变现以及快速的迭代算法模型。

损失函数

yolo损失分为3个部分类别损失、置信度损失、位置损失

1. 类别损失

只有有目标的地方才会有类别判断,从而才会有类别损失,所以需要解决两个问题:1.有目标的地方;2.类别损失

1.1有目标的地方:object_mask

object_mask根据 y_true(真实值)确定,如何通过前处理编码y_true,通过计算实际框(ground_truth)与anchor框的iou来确定

achor的9个框分为3组,分别负责下小目标(8倍下采样)、中目标(16倍下采样)、大目标(32倍下采样) ,计算每个框与anchor框的iou,iou最大的anchor负责回归这个真实框,

以13*13 (32倍下采样)为例,整幅图被分为13*13个gird,真实框的信息应该放在哪个grid里面呢?答案是真实框的中心落在哪个grid里面,这个grid就负责存储这个框的所有信息,

包括(x, y, h, w),(confidence=1),(class)。object_mask,顾名思义,目标掩码,即有目标的地方为true,所以 object_mask = y_true[l][..., 4:5]

2.1类别损失

类型损失,一般采用交叉熵损失,在目标检测中,采用二元交叉熵损失,对每一个类别计算交叉熵损失,进行求和;

class_loss = object_mask * K.binary_crossentropy(true_class_prob, raw_pred[..., 5:], from_logits=True)
class_loss = K.sum(class_loss) / mf

此处为什么不采用softmax交叉熵损失呢?此处笔者也不清楚,欢迎有答案的同学留言交流。我猜测是因为各个类别之间相互独立,不是非A即B的关系

所以没有采用softmax,将所有类别的概率之和调整为1。

2.位置损失

目标检测的一项重要任务就是确定目标的位置,即(x, y, h, w),所以损失值的计算中包含位置损失

通常计算位置损失有

1. L1 Loss 平均绝对误差(Mean Absolute Error, MAE

梯度值为1或-1,在接近准确值时,会以learning_rate在准确值附近波动,比较难获得准确效果

2. L2 Loss  均方误差损失(Mean Square Error, MSE

在距离准确值较远的地方梯度值较大,训练初期收敛难度大,容易受到噪声的干扰

3. Smooth L1 Loss

克服了以上两种损失函数的缺点,但将x,y,h,w作为独立的变量的看待,割裂了他们之间的相对关系

4. IoU Loss

考虑重合面积,可以较好的反应预测框和真实框的接近程度,但是但二者不相交时,损失值恒为1

5. GIoU Loss

考虑了不重合部分的面积对于损失的影响

6. DIoU Loss

考虑了中心点的偏移,即两个框中心的距离与两个框最远距离的比值

7. CIoU Loss

考虑了长和宽的比值

在yoloV4中,采用了CIou Loss

 

def box_ciou(b1, b2):

    b1_xy = b1[..., :2]
    b1_wh = b1[..., 2:4]
    b1_wh_half = b1_wh / 2.

    b1_mins = b1_xy - b1_wh_half
    b1_maxes = b1_xy + b1_wh_half

    b2_xy = b2[..., :2]
    b2_wh = b2[..., 2:4]
    b2_wh_half = b2_wh / 2.

    b2_mins = b2_xy - b2_wh_half
    b2_maxes = b2_xy + b2_wh_half

    intersect_mins = K.maximum(b1_mins, b2_mins)
    intersect_maxes = K.minimum(b1_maxes, b2_maxes)

    intersect_wh = K.maximum(intersect_maxes-intersect_mins, 0.)
    # 两个框相交部分面积
    intersect_area = intersect_wh[..., 0] * intersect_wh[..., 1]

    b1_area = b1_wh[..., 0] * b1_wh[..., 1]

    b2_area = b2_wh[..., 0] * b2_wh[..., 1]

    union_area = b1_area + b2_area - intersect_area
    # 两个框的iou
    iou = intersect_area / K.maximum(union_area, K.epsilon())

    # 两个框中心点的距离
    center_distance = K.sum(K.square((b1_xy - b2_xy)), axis=-1)

    enclose_mins = K.minimum(b1_mins, b2_mins)
    enclose_maxes = K.maximum(b1_maxes, b2_maxes)
    enclose_wh = K.maximum(enclose_maxes - enclose_mins, 0.0)
     
    # 两个框的最远距离
    enclose_diagonal = K.sum(K.square(enclose_wh), axis=-1)
   
    # 计算DIOU(CIOU的前半部分)
    ciou = iou - 1.0 * (center_distance) / K.maximum(enclose_diagonal, K.epsilon())
   
   # 计算两个框的长宽比的差值的平方
    v = 4*K.square(tf.math.atan2(b1_wh[..., 0], K.maximum(b1_wh[..., 1],K.epsilon())) - tf.math.atan2(b2_wh[..., 0], K.maximum(b2_wh[..., 1],K.epsilon()))) / (math.pi * math.pi)

    alpha = v / K.maximum((1.0 - iou + v), K.epsilon())
    ciou = ciou - alpha * v

    ciou = K.expand_dims(ciou, -1)
    return ciou     
ciou_loss = object_mask * box_loss_scale * (1 - ciou)
ciou_loss = K.sum(ciou_loss) / mf

其中 box_loss_scale 为 (2 - 对应真实框的面积),范围为(1-2),当真实框的面积越大,box_loss_scale越小,意味着对大框的偏差容忍度越大。

解决了以上问题以后,我们还有一个重要问题没有解决,预测框的(x, y, h, w)如何得到?

在yolo中,我们的(x,y)是通过对应grid左上角偏移得到;(h,w)是通过对对应anchor的长宽缩放得到,

box_xy = (K.sigmoid(feats[..., :2]) + grid) / K.cast(grid_shape[..., ::-1], K.dtype(feats))
box_wh = K.exp(feats[..., 2:4]) * anchors_tensor / K.cast(input_shape[..., ::-1], K.dtype(feats))

前半部分(斜体加粗),公式转化如图所示

 

后半部分,box_xy 除以grid_shape 将中心点坐标转化为(0-1),与y_true中中心点的坐标的编码对应,同样转化为(0-1),即中心点相对于输入图像的位置;同样也是作归一化处理;box_hw 除以input_shape 将长宽转化为(0-1),与y_true中长宽的编码对应。

3.置信度损失

置信度损失分为两个部分,有目标的置信度损失,无目标的置信度损失

3.1 有目标的置信度损失

有目标的地方,即object_mask,

置信度损失:采用二元交叉熵损失

K.binary_crossentropy(object_mask, raw_pred[..., 4:5]

总的损失为

object_mask * K.binary_crossentropy(object_mask, raw_pred[..., 4:5], from_logits=True)

3.2 无目标的置信度损失

无目标的地方,即(1-object_mask)

(1 - object_mask) * K.binary_crossentropy(object_mask, raw_pred[..., 4:5], from_logits=True)

存在一个问题,因为一张图中大部分是背景,即大部分是负样本,如果所有的负样本都参与计算,会极大的放大负样本的损失,导致训练结果偏向于负样本,

所以在计算无目标的置信度损失时只会选择部分负样本,如何选择负样本?原则是计算预测值框和真实值框的iou,每个预测值的每个grid中都有三个框(以13*13)为例,每个真实值(一幅图)中有那个框

依次计算iou,会得到(13*13*3*n)个iou,选取最大的iou作为预测值和真实值的iou,得到的维度为(13,13,3,1),设置一个iou阈值,小于此阈值的视为负样本,其实质笔者认为是一种随机取样的方法。

def loop_body(b, ignore_mask):
    true_box = tf.boolean_mask(y_true[l][b, ..., 0:4], object_mask_bool[b, ..., 0])

    iou = box_iou(pred_box[b], true_box)

    best_iou = K.max(iou, axis=-1)

    # 13, 13, 3
    ignore_mask = ignore_mask.write(b, K.cast(best_iou<ignore_thresh, K.dtype(true_box)))

    return b+1, ignore_mask

得到ignore_mask ,所以无目标的置信度损失为:

confidence_loss = object_mask * K.binary_crossentropy(object_mask, raw_pred[..., 4:5], from_logits=True) + \
                  (1 - object_mask) * K.binary_crossentropy(object_mask, raw_pred[..., 4:5], from_logits=True) * ignore_mask
confidence_loss = K.sum(confidence_loss) / mf

所以最终的目标检测损失为三者的损失之和:

loss += location_loss + confidence_loss + class_loss

更多精彩内容请访问FlyAI-AI竞赛服务平台;为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台;每周免费提供项目开源算法样例,支持算法能力变现以及快速的迭代算法模型。

挑战者,都在FlyAI!!!

YOLOv1中的损失函数:分类、定位与置信度损失的详解与实现 分类损失:模型在分类任务中由于类别预测错误而产生的损失。在目标检测中,分类损失通常来自于模型对于每个网格单元预测的置信度和实际物体类别的误差。由于目标检测任务通常涉及到多个类别的物体,因此分类损失是一个非常重要的组成部分,它可以帮助模型更好地区分不同类别的物体,提高目标检测的准确性。定位损失:模型在定位任务中的误差值,即预测框与实际框之间的差异。在目标检测中,定位损失通常来自于模型对于每个网格单元中物体位置的预测误差。通过计算预测框和实际框之间的差异,定位损失可以用来衡量模型对于物体位置预测的准确性。 阅读详情

相关推荐

使用PyTorch实现YOLOv4图像识别

在实现YOLOv4模型时,我们利用PyTorch的nn.Module来定义网络结构,并根据YOLOv4的设计思想实现相应的网络层和模块,如卷积层、残差模块等。在数据加载与预处理阶段,我们使用PyTorch提供的Dataset和DataLoader来加载数据集,并编写预处理代码,如图像的缩放、裁剪、归一化等操作,以满足模型训练的需求。在PyTorch中,可以使用nn.Module来定义网络模型,并根据YOLOv4的结构实现相应的网络层和模块,包括卷积层、残差模块、池化层等。准备数据集,并进行标注和预处理。

suishi0331的博客 943

YOLOv4目标检测:原理与源码解析

需要学习Windows系统YOLOv4的同学请前往《Windows版YOLOv4目标检测实战:原理与源码解析》,课程链接 https://edu.youkuaiyun.com/course/detail/29865【为什么要学习这门课】 Linux创始人Linus Torvalds有一句名言:Talk is cheap. Show me the code. 冗谈不够,放码过来!  代码阅读是从基础到提高的必由之路。尤其对深度学习,许多框架隐藏了神经网络底层的实现,只能在上层调包使用,对其内部原理很难认识清晰,不利于进一步优化和创新。YOLOv4是最近推出的基于深度学习的端到端实时目标检测方法。YOLOv4的实现darknet是使用C语言开发的轻型开源深度学习框架,依赖少,可移植性好,可以作为很好的代码阅读案例,让我们深入探究其实现原理。【课程内容与收获】 本课程将解析YOLOv4的实现原理和源码,具体内容包括:- YOLOv4目标检测原理- 神经网络及darknet的C语言实现,尤其是反向传播的梯度求解和误差计算- 代码阅读工具及方法- 深度学习计算的利器:BLAS和GEMM- GPU的CUDA编程方法及在darknet的应用- YOLOv4的程序流程- YOLOv4各层及关键技术的源码解析本课程将提供注释后的darknet的源码程序文件。【相关课程】 除本课程《YOLOv4目标检测:原理与源码解析》外,本人推出了有关YOLOv4目标检测的系列课程,包括:《YOLOv4目标检测实战:训练自己的数据集》《YOLOv4-tiny目标检测实战:训练自己的数据集》《YOLOv4目标检测实战:人脸口罩佩戴检测》《YOLOv4目标检测实战:中国交通标志识别》建议先学习一门YOLOv4实战课程,对YOLOv4的使用方法了解以后再学习本课程。【YOLOv4网络模型架构图】 下图由白勇老师绘制  

YOLOv4 损失函数解析

YOLOv4的损失函数通过CIoU Loss的几何联合优化、动态IoU置信度匹配及多标签分类增强,实现了检测精度与训练效率的平衡。

浩瀚之水的专栏 720

YOLOv4损失函数全面解析

点击上方“小白学视觉”,选择加&#34;星标&#34;或“置顶”重磅干货,第一时间送达 本文转自:计算机视觉联盟AI博士笔记系列推荐周志华《机器学习》手推笔记正式开源!可打印版本附pdf...

小白学视觉 7174

PyTorch高级应用(十三)——从零开始构建YOLOv4目标检测模型

作者:禅与计算机程序设计艺术 1.简介 目标检测(Object Detection)是计算机视觉领域中的一个重要任务,其主要目的是在图像中找出并识别出感兴趣的物体或目标。许多目标检测框架都已经涵盖了不同阶段、不同层次的特征提取及目标检测方法,但是这些框架仍然存在一些性能不足的问题。近年来,随着神经网络的

AI天才研究院 1064

芒果YOLOv7改进29:Loss篇:改进wiou损失函数:结合最新Wise-IoU损失函数,涨点神器|超越CIoU, SIoU性能,助力YOLOv7模型涨点1.4%,最新目标检测的损失函数

YOLOv7+Wise-IoU代码实战 | Wise-IoU 新的损失函数助力 YOLOv7提升涨点,打造新的检测器

包括YOLOv5、YOLOv7、YOLOv8等模型改进 1万+

目标检测——YOLOv3、YOLOv4、YOLOv5、YOLOv7正负样本匹配、YOLO3损失函数理解

学习小计。有什么不对的地方,还请大家指正。

Chaoy6565的博客 6162

QT下利用FFTW实现功率谱密度分析(周期图法)

写在前面 出于项目需求,需要在QT的msvc 2015编译环境下实现功率谱密度估计。 所以这个需求很直接的关键词就是 1. C++ 2. QT 3. 傅里叶变换 4. 功率谱密度估计 但是在网上搜索了很久,没有一个非常直接的答案。所以我觉得很有必要写一篇文章来说明,在QT msvc2015 32bit环境下如何实现功率谱密度估计。 本文并没有经过严格编辑,但代码是已经可以跑通的,如...

李时珍食疗志的博客 5223

【目标检测】(15) YOLOV4 损失函数,附TensorFlow完整代码

大家好,今天和各位分享一下 YOLOV4 的损失函数的构建方法,YOLOV4和损失函数的组成和YOLOV3类似,只是YOLOV4使用了CIOU损失作为目标边界框的定位损失。强烈建议大家在阅读本文之前,先看以下文章: 预测框解码,调整先验框:https://blog.youkuaiyun.com/dgvv4/article/details/124076352 预测框定位损失,各种 iou:https://blog.youkuaiyun.com/dgvv4/article/details/124039111 1. 损失函数介绍

博观而约取,厚积而薄发 2801

告别安装烦恼!Orange3 3.38.0 Windows绿色版下载即用,附保姆级汉化与组件配置指南

本文详细介绍了Orange3 3.38.0 Windows绿色版的下载与使用,包括中文汉化、组件配置及高效管理技巧。这款无需安装的数据科学工具特别适合快速验证想法的研究人员和移动办公用户,支持多种数据源和可视化工具,大幅提升工作效率。

weixin_30897233的博客 602

别再为reg2icg的setup违例头疼了!手把手教你用ICC2/Innovus这3招搞定(附实战数据对比)

本文详细介绍了在ICC2/Innovus中解决reg2icg的setup违例的三种高效方法,包括早期时钟树预估、精准控制时钟延迟与门控检查以及ICG专用优化选项组合。通过实战数据对比,展示了不同策略的效果差异,帮助工程师快速优化时序路径,提升芯片性能。

weixin_42569329的博客 408

【万字长文】看完这篇yolov4详解,那算是真会了

YOLO系列自2016年推出YOLOv1起,就以其卓越的速度和准确度引领着目标检测技术的潮流。YOLOv1将目标检测任务转化为一个回归问题,每个格子(grid cell)负责预测该区域内的物体。随后的YOLOv2通过批量归一化、高斯YOLO等技术进一步提升性能。YOLOv3引入多尺度预测,通过三个不同尺度的网络来检测不同尺寸的物体,极大地提升了对小目标的检测能力。

dont worry about it的博客 6万+

4090显卡实测:PointPillars在KITTI数据集上的3D目标检测复现全流程(附避坑指南)

本文详细记录了在NVIDIA RTX 4090显卡上,从环境搭建、数据处理到模型训练与评估,完整复现PointPillars算法在KITTI数据集上进行3D目标检测的全流程。重点分享了版本配置、数据预处理、性能调优及常见问题的避坑指南,帮助开发者高效利用硬件资源,成功跑通并理解这一经典3D检测项目。

purple的博客 914

YOLOv4论文解读

论文原文: https://arxiv.org/pdf/2004.10934.pdf 代码实现: https://github.com/AlexeyAB/darknet 一、介绍 原文名称:《YOLOv4: Optimal Speed and Accuracy of Object Detection》,可以看出这是一个非常自信的题目,声称YOLOv4在目标检测具有最优的速度和准确率。相比于Joe Redmon的最终作品YOLOv3,Alexey Bochkovskiy为一作的YOLOv4确实取得了非常明显的

Chermack的博客 3846

手把手教你YOLOv8/YOLOv11分割训练自己数据集和推理,并教你使用Labelme工具标注数据(附分割网络结构图)

YOLOv8-seg 和 YOLOv11-seg 都是一种高效实例分割算法,实例分割模型的输出是一组勾勒出图像中每个物体的遮罩或轮廓,以及每个物体的类标签和置信度分数。当你不仅需要知道物体在图像中的位置,还需要知道它们的具体形状时,实例分割就非常有用了,功能非常强大,可以应对各种视觉任务。 YOLOv11-seg 则在 YOLOv8-seg 基础上进一步魔改了模型架构,相对分割速度可能更快,其他指标性能有待测试。实例分割可以用于自动驾驶、医疗图像处理、智能农业监控等领域。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 4475

从源码编译CesiumForUnreal

从源码编译CesiumForUnreal插件

专注GIS开发 5644

YOLOv4深度解析:革命性的实时目标检测技术

在智能视觉时代,目标检测已成为深度学习领域最具实用价值的核心技术之一。而以其端到端的高效结构与卓越的实时性能,成为工程落地与学术研究中的明星算法。本专栏从算法原理、模型设计到实验复现与工程部署,系统梳理 YOLO 系列的技术演进与关键创新,让复杂的模型调优和实战部署变得更系统。YOLOv4作为目标检测领域的里程碑之作,于2020年由Alexey Bochkovskiy在Darknet框架上正式发布。这一版本不仅继承了YOLO系列"只看一次"的核心理念,更在精度与速度的平衡上实现了前所未有的突破。

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 1万+

Win10 系统下VisualStudio2022 配置Open3D-0.18.0(C++)

Win10 系统下VisualStudio2022 配置Open3D-0.18.0

点云侠的博客 2657

基于YOLOV3、YOLOV4的目标检测

YOLO系列目标检测算法:从V3到V4的演进》在目标检测领域,YOLO系列算法以其高效和准确的特点备受关注。本文将介绍YOLOv3和YOLOv4的主要特点和改进之处。

weixin_69683009的博客 1091

基于Simulink使用激光雷达数据跟踪车辆仿真(附源码)

这些模型将长方体的尺寸定义为状态转换期间的常量,并且它们的估计值在滤波器的校正阶段随时间演变。下面的动画显示了在滤波器的预测阶段将具有不同概率的恒定速度和恒定转弯率模型混合在一起的效果。此示例显示了如何使用带有 IMM 过滤器的 JPDA 跟踪器来跟踪使用激光雷达传感器的对象。图像和激光雷达数据读取器从 MAT 文件中读取记录的数据,并分别输出参考图像和点云中点的位置。跟踪器块选中“启用所有轨道输出”和“启用可检测的跟踪 ID 输入”复选框,以从跟踪器输出所有轨道,并将其检测概率作为其状态的函数进行计算。

珞瑜的博客 2566

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

目标检测 pytorch复现Yolov4目标检测项目

目标检测 pytorch复现Yolov4目标检测项目

guoqingru0311的博客 1031

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Yolo 一小时吃透 yolov4 & yolov5 原理

一小时吃透 yolov4 & yolov5 原理.

我是小白呀的博客 5387

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

《从零深入理解Yolo系列v1-v8全家桶 + 目标检测面试提问+目标检测算法总览》

从零深入理解Yolo系列理论v1-v8

ZhengrongYue的博客 1万+

目标检测系列之——YOLO

相关内容借鉴该博主:https://blog.youkuaiyun.com/wmymo/article/details/107815217 目标检测需要解决的问题 1 物体位置 2 物体种类 目标检测中重要的名词 1 bounding box(简称:bbox) 2 ground truth bounding box(简称:gd) 3 predicted bounding box(简称:pd) 评价pd相对于gd的好坏,即IOU。 在two stage算法中,需要先找出候选去,然后识别候选区的对象。 one sta

wuhongwuyan的博客 2231

深度学习之学习(3-4)YOLOV4

四、大神接棒:YOLOv4 4.1 简介 今年(2020年)YOLO系列的作者Redmon在推特上发表声明,出于道德方面的考虑,从此退出CV界。听到此消息的我,为之震惊!本以为YOLOv3已经是YOLO系列的终局之战。没想到就在今年,Alexey Bochkovskiy等人与Redmon取得联系,正式将他们的研究命名为YOLOv4。 YOLOv4对深度学习中一些常用Tricks进行了大量的测试,最终选择了这些有用的Tricks:WRC、CSP、CmBN、SAT、 Mish activation、Mos

light169的专栏 4375
上一篇: 深度学习论文翻译解析Densely Connected Convolutional Networks
下一篇: LSRA: 轻量级Transformer,注意力长短搭配
iFlyAI
博客等级 码龄9年 238粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值