yolov3 python代码_YOLOv3代码分析(Keras+Tensorflow)

前面(YOLO v3深入理解)讨论过论文和方案之后,现在看一下代码实现。YOLO原作者是C程序,这里选择的是Kears+Tensorflow版本,代码来自experiencor的git项目keras-yolo3,我补充了一些注释,项目在keras-yolo3 + 注释,如有错漏请指正。

67163d52946f?utm_source=oschina-app

图1 检测Raccoon

下面讲一下训练样本的设置和loss的计算。

67163d52946f?utm_source=oschina-app

图2 输入->输出

训练样本设置

参考上面图2,对于一个输入图像,比如416*416*3,相应的会输出 13*13*3 + 26*26*3 + 52*52*3 = 10647 个预测框。我们希望这些预测框的信息能够尽量准确的反应出哪些位置存在对象,是哪种对象,其边框位置在哪里。

在设置标签y(10647个预测框 * (4+1+类别数) 张量)的时候,YOLO的设计思路是,对于输入图像中的每个对象,该对象实际边框(groud truth)的中心落在哪个网格,就由该网格负责预测该对象。不过,由于设计了3种不同大小的尺度,每个网格又有3个先验框,所以对于一个对象中心点,可以对应9个先验框。但最终只选择与实际边框IOU最大的那个先验框负责预测该对象(该先验框的置信度=1),所有其它先验框都不负责预测该对象(置信度=0)。同时,该先验框所在的输出向量中,边框位置设置为对象实际边框,以及该对象类型设置为1。

loss计算

loss主要有3个部分,置信度、边框位置、对象类型。

首先需要注意的还是置信度的问题。上面说到对于一个实际对象,除了与它IOU最大的那个先验框其置信度设为1,其它先验框的置信度都是0。但是,还有一些先验框与该对象实际边框位置是比较接近的,它们依然有可能检测到该对象,只不过并非最接近实际边框。所以,这部分边框的目标置信度不应该期望输出0。但YOLO也不希望它们输出1。所以,在计算loss的时候,就设置一个IOU阈值,超过阈值的(接近目标边框但又不是IOU最大的)那些边框不计入loss。低于阈值的那些边框就要求置信度为0,也就是检测到背景。

同时,对于检测到对象的边框,要计算其边框位置的loss,以及对象类型的loss。对于那些检测到背景的边框,就只计算其置信度loss了,它的边框位置和对象类型都没有意义。

另外注意一下的是边框位置计算要根据论文的设计做一些变换,参考下面图2。

67163d52946f?utm_source=oschina-app

图2 边框预测

网络结构

详细的YOLOv3网络比较深,有兴趣的同学可以看一下Keras打印的网络结构图。(图有点大)。

代码

总体来说YOLO的设计并不复杂,不过用python实现的话有不少张量计算,一些实现细节请参考项目代码和注释。

训练样本设置参考 generator.py 中 class BatchGenerator。

loss计算参考 yolo.py 的 call(self, x)。

网络结构是 yolo.py 的 create_yolov3_model()。

另外该项目的YOLO网络的训练和测试,请根据项目说明进行。

下面仅摘录loss计算部分代码。

"""

一个神经网络层的计算,实际上在计算loss。

YOLOv3输出3个尺度的特征图,这里是对1个尺度的特征图计算loss。

input

x = input_image, y_pred, y_true, true_boxes

分别是:输入图像,YOLO输出的tensor,标签y(期望其输出的tensor),输入图像中所有ground truth box。

return

loss = 边框位置xy loss + 边框位置wh loss + 边框置信度loss + 对象分类loss

"""

def call(self, x):

# true_boxes 对应 BatchGenerator 里面的 t_batch,shape=(batch,1,1,1,一个图像中最多几个对象,4个坐标)

# y_true 对应 BatchGenerator 里面的 yolo_1/yo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值