一、前言
- 系统:win10
- 环境:python3.7
- 框架:pytorch1.1
完整代码会在最后给出
二、Darknet网络模版
2.1 模板说明
网络模板如下图所示,YoloV3只借鉴到了前面的卷积部分(有修改),后面的Avgpool、Connected、Softmax层去掉。注意事项
- 每一个Convolutional内都包含Con2d、Bn、LeakyRelu三个部分(这是固定搭配),为了方便使用,建议单独实现
- 每一个Residual都包含两个Convolutional

2.2 部分代码实现
- Convolutional单独实现
1 | class Conv2d(nn.Module): |
- Residual单独实现
1 | class BasicBlock(nn.Module): |
三、YoloV3网络结构
(找了好久才找齐这两幅图片——darknet和YoloV3改进,单独看一个都不好看懂)
3.1 网络说明
网络如下所示1,前面的一部分借鉴了darknet53结构,后面从Convolutional Set开始由YoloV3作者自己改进,有三个输出,添加了上采样。具体原理可以参考论文或者其他优秀博客
yolo系列之yolo v3【深度解析】 里面有张神图,转载需要版权,故需要点进去看

3.2 部分代码实现
3.2.1 Convolutional Set
1 | class ConvSet(nn.Module): # inplanes->inplanes |
看到上述的代码实现,心中涌现几个问题:
- 图中信息只给出了卷积核的大小,并不知道填充位(padding)
- 图中也没有给出中间层输入通道和输出通道的数量,这些该怎么确定
在没有完整的看完论文之前有以下猜测
- 第一个卷积一般按照给定的输入输出(inplanes, outplanes),卷积核为1
- 如果卷积为3,则输入和输出一样,填充(padding)此时为1。(这应该是检测功能实现部位)
- 后面再遇到卷积核为1,则需要进行通道变换(放大,或者缩小)。(这应该是选择功能实现部位)
看完论文后,我想打人!!!没有说网络是怎么建立的!
3.2.2 UpSampling
1 | class Upsampling(nn.Module): |
四、总结
根据图片和论文其实无法得到每一个卷积层具体的参数,估计需要有一套自己对卷积网络的理解才能独自建立网络。对于复现来说,最难的不是网络搭建,而是loss损失函数设计和数据集设计,见后文。
五、完整代码
- 代码
1 | # -*- coding: utf-8 -*- |
- 运行测试
1 | torch.Size([1, 30, 52, 52]) |
参考文献
1. yolov3 darknet53网络及mobilenet改进 ↩