人工智能学习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,
Yolo算法损失函数详解

最低0.47元/天 解锁文章
1155

被折叠的 条评论
为什么被折叠?



