yolo v3网络计算流程简析

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/hfq0219/article/details/84790483

yolo v3网络计算流程简析

  1. 从 examples/darknet.c 里的 main 函数进入,选择参数 detector train,跳转到 examples/detector.c 的 train_detector 函数。
  2. 解析 datacfg 文件,提取出 train_image 训练图片的路径
  3. load_network 加载网络结构,通过 cfgfile 文件,如果传入了 weightfile,则读入 weightfile 里的权重值,否则随机初始化权重值。
  4. load_data 读取训练图片,在所有的图片列表中随机读取 batch x subdivisions 张图片存入 buffer,加载图片时,对这些图片随机进行增强处理,如裁剪、翻转、缩放、调整曝光和饱和度等;同时读入对应图片的 labels 保存到 buffer,注意 labels 文件名字和对应图片相同,只是后缀改为 .txt,labels 里每行保存一个 truth box 的 x, y, w, h, class 值。
  5. 每次训练 batch x subdivisions 张图片,分辨率在 320x320 到 608x608 随机选取,load_data 会对不满足分辨率的图片进行转换成符合的分辨率。
  6. train_network 进行训练。进入 src/network.c,每次从 buffer 里加载 batch 张图片进行训练,共训练 subdivisions 次。
  7. train_network_datum 开始训练,进行一次前向推理 forward_network 和反向推理 backward_network 并记录损失值,当训练 subdivisions 次后,进行一次网络更新 update_network,即更新网络权重值。
  8. yolov3.cfg 网络结构配置只有 convolutional,yolo,route,upsample,shortcut 层,只有卷积层有权重值,yolo 层进行损失函数计算,以及 delta 反向传播。
  9. 经过darknet53的基础网络提取特征后,网络连接3个不同尺度的yolo层,每层与对应的anchor相匹配。第一层匹配3个大的anchor,第二层3个中等的anchor,第三层匹配3个小的anchor。
  10. 最重要的是yolo层的损失函数计算。先对每一个预测值,计算与真实label的iou,如果最大的iou大于thresh,则不对该预测值计算损失,否则类别损失导数记为(0-predict)。然后对每一个真实label,计算与anchor的最大iou,如果最大iou对应的anchor与yolo层相匹配,则计算x,y,w,h和class的损失,类别损失记为(1-predict)。从这里可以看出,yolo对负样本没有计算x,y,w,h,class的损失,只计算了类别损失,所以作者在yolov3里说使用FocalLoss没有优化,因为本来负样本就没有计算损失,对梯度反向传播影响不大。
  11. 反向传播就是用的随机梯度下降,没有什么需要说明的。
  12. 网络训练完成之后,就可以进行预测了。预测时,对输入图片只是进行了一个插值调整图片分辨率,没有进行图片增强操作,然后进行一次网络前向传播,得到三个yolo层的预测结果,但结果里还包含很多重叠的预测框,所以需要进行NMS非极大值抑制,这一步是比较耗时的操作,因为是在CPU里进行的。NMS之后就把最后留下的超过thresh的预测框在原图上画出来,并保存。
  13. 这就是yolo的基本计算流程。关键代码解析在后面的博文里写出来。

猜你喜欢

转载自blog.csdn.net/hfq0219/article/details/84790483