人工智能学习70-Yolo损失函数

Yolo算法损失函数详解

人工智能学习70-Yolo损失函数 —快手视频
人工智能学习71-Yolo损失函数 —快手视频
人工智能学习72-Yolo损失函数 —快手视频
人工智能学习73-Yolo损失函数 —快手视频

Yolo算法损失函数

损失函数是指定Yolo网络训练的标尺,故此损失函数定义非常关键,Yolo网络主要完成目标检测,目标检测涉及量化指标包括包含物体的预测框Box(Box的中心坐标x,y,Box的宽高数据);每个规格特征图提供三个先验框,先验框中是否包含物体的置信度;预测框Box中包含物体的类别。因此损失函数需要度量这三方面量化指标预测框Box位置及大小,是否包含物体置信度confidence,预测框Box中物体类别指标。
在这里插入图片描述

损失函数定义

yolo_training.py

import math
from functools import partial

import tensorflow as tf
from keras import backend as K
from utils_bbox import get_anchors_and_decode

# ---------------------------------------------------#
#   box_ciou包含两个矩形交并比例,还有一个修正值,修正值具体含义有待深究
#   box_iou与box_ciou优缺点可参考
#   https://zhuanlan.zhihu.com/p/648882134
# ---------------------------------------------------#
def box_ciou(b1, b2):
    """
    输入为:
    ----------
    b1: tensor, shape=(batch, feat_w, feat_h, anchor_num, 4), xywh
    b2: tensor, shape=(batch, feat_w, feat_h, anchor_num, 4), xywh

    返回为:
    -------
    ciou: tensor, shape=(batch, feat_w, feat_h, anchor_num, 1)
    """
    # -----------------------------------------------------------#
    #   求出预测框左上角右下角
    #   b1_mins     (batch, feat_w, feat_h, anchor_num, 2)
    #   b1_maxes    (batch, feat_w, feat_h, anchor_num, 2)
    # -----------------------------------------------------------#
    b1_xy = b1[..., :2]  # 矩形b1中心的坐标 0=x,1=y
    b1_wh = b1[..., 2:4]  # 取2-4两个元素,对应宽高 2=w,3=h
    b1_wh_half = b1_wh/2.  # 宽与高都取半数
    b1_mins = b1_xy - b1_wh_half  # 矩形框左上角坐标
    b1_maxes = b1_xy + b1_wh_half  # 矩形框右下角坐标
    # -----------------------------------------------------------#
    #   求出真实框左上角右下角
    #   b2_mins     (batch, feat_w, feat_h, anchor_num, 2)
    #   b2_maxes    (batch, feat_w, feat_h, anchor_num, 2)
    # -----------------------------------------------------------#
    b2_xy = b2[..., :2]  # 矩形b2中心的坐标 0=x,1=y
    b2_wh = b2[..., 2:4]  # 矩形b2宽高 2=2,3=h
    b2_wh_half = b2_wh/2.
    b2_mins = b2_xy - b2_wh_half  # 左上角坐标
    b2_maxes = b2_xy + b2_wh_half  # 右下角坐标

    # -----------------------------------------------------------#
    #   求真实框和预测框所有的iou
    #   iou         (batch, feat_w, feat_h, anchor_num)
    # -----------------------------------------------------------#
    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]  # 矩形框1的面积
    b2_area = b2_wh[..., 0] * b2_wh[..., 1]  # 矩形框2的面积
    union_area = b1_area + b2_area - intersect_area  # 取两个矩形框面积的并集,去掉一份重回部分面积
    iou = intersect_area / K.maximum(union_area, K.epsilon())  # 计算两个矩形框组合后面积与重叠面积比例iou

    # -----------------------------------------------------------#
    #   计算中心的差距
    #   center_distance (batch, feat_w, feat_h, anchor_num)
    # -----------------------------------------------------------#
    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 (batch, feat_w, feat_h, anchor_num)
    #   K.epsilon() 返回数值表达式中使用的模糊因子的值
    # -----------------------------------------------------------#
    enclose_diagonal = K.sum(K.square(enclose_wh), axis=-1)  # 获取两矩形框组合宽与高平方和(w^2+h^2)
    # 其中 center_distance / K.maximum(enclose_diagonal, K.epsilon()) 代表
    # "两矩形中心之间距离平方" 与 "两矩形组合后对角线平方和" 之比
    # 可理解为两矩形中心偏离程度比例
    # iou代表两矩形交集与并集面积之比
    # ciou代表交并比例减去两矩形中心偏离程度比例,
    ciou = iou - 1.0 * center_distance / K.maximum(enclose_diagonal, K.epsilon())

    # (atan2计算 矩形1的w/h反正切值, 与矩形2的w/h反正切值之差)的平方
    # 变量v是此平方值与math.pi平方之比的4倍
    # 变量v代表两个矩形宽与高比例平均值的4倍
    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/(1.0-iou+v)
    alpha = v / K.maximum((1.0 - iou + v), K.epsilon())
    #ciou重新赋值,其值减去alpha*v
    ciou = ciou - alpha * v
    #变量ciou在最后轴添加一维度,具体含义包含两矩形交并比例,还有一定修正值,更深层含义待分析
    ciou = K.expand_dims(ciou, -1)
    return ciou

# ---------------------------------------------------#
#   用于计算两个矩形交并比例
#   当预测框与真实框不存在重叠时,方法box_iou存在缺陷
# ---------------------------------------------------#
def box_iou(b1,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值