YOLOv2---优图代码+实现细节

本文详细介绍了YOLOv2的代码实现,重点解析了优图实验室的代码结构和实现细节,包括Darknet19网络、LeakyReLU激活函数、特征图的concat操作以及Anchor Box的使用。通过分析优图代码,揭示了YOLOv2在细粒度检测上的处理方法,并探讨了损失函数和网络封装的优点。
摘要由CSDN通过智能技术生成

---- 参考链接:

https://blog.csdn.net/lanran2/article/details/82826045
https://zhuanlan.zhihu.com/p/35325884 参考代码

Yolov2 和Yolov3 先学习然后看代码(优图实验室有)

网络的学习:
1.
Yolov2 使用了darknet19,网络本身值得我们学习和参考,首先卷积层不改变输出特征图的大小,统统交给maxpooling来进行。其次使用了33和11的卷积网络结构,这样做的好处是可以大大的减少需要的参数。先通过3*3进行,然后输出的维度会降低,但是训练的参数也减少,之前学习的笔记本有记录过相关的计算。可以参考这一部分。https://blog.csdn.net/Li_haiyu/article/details/80376395

2.虽然图片里面都没有给出BN层,但是加了BN层的网络mAP是提高了。

3.损失函数一直是我们需要注意的点。Yolo系列之所以是回归,就是因为在损失函数不同于其他的,通过损失函数让网络进行强行回归。

4.感觉YOLOv2的论文大家都是照搬论文的,然后就是源码部分阅读的比较少,所以论文没有提到的细节,只能靠猜测什么的,所以觉得读了很多讲解也没有什么思路,比如复现的话该如何做?所以主要还是研究下大厂对yolov2的理解。看看别人如何复现:别和我BB拿Code来说话

---- 优图下的代码初步学习

---- 总体部分

_YOLO2.py 最外面一层:类别这里用了20,Anchor的数量是5,符合论文所说的,如果用自己的数据集估计这里有些地方都要改一改。nloss后面需要注意下,backbone是基础的网络用了darknet19,符合论文。首先是图片进入backbone网络。我们会先看看backbone-darknet19的网络。

class Yolov2(YoloABC):
    def __init__(self, num_classes=20, weights_file=None, input_channels=3,
                 anchors = [(42.31,55.41), (102.17,128.30), (161.79,259.17), (303.08,154.90), (359.56,320.23)],
                 anchors_mask=[(0,1,2,3,4)], train_flag=1, clear=False, test_args=None):
        """ Network initialisation """
        super().__init__()

        # Parameters
        self.num_classes = num_classes
        self.anchors = anchors
        self.anchors_mask = anchors_mask
        self.nloss = len(self.anchors_mask)
        self.train_flag = train_flag
        self.test_args = test_args

        self.loss = None
        self.postprocess = None

        self.backbone = backbone.Darknet19()
        self.head = head.Yolov2(num_anchors=len(anchors_mask[0]), num_classes=num_classes)

        if weights_file is not None:
            self.load_weights(weights_file, clear)
        else:
            self.init_weights(slope=0.1)

    def _forward(self, x):
        middle_feats = self.backbone(x) 
        features = self.head(middle_feats) #模型最后的输出向量,是concat好的输出13*13*1024
        loss_fn = loss.RegionLoss #进入损失函数
        
        self.compose(x, features, loss_fn)

        return features

    def modules_recurse(self, mod=None):
        """ This function will recursively loop over all module children.

        Args:
            mod (torch.nn.Module, optional): Module to loop over; Default **self**
        """
        if mod is None:
            mod = self

        for module in mod.children():
            if isinstance(module, (nn.ModuleList, nn.Sequential, backbone.Darknet19, head.Yolov2)):
                yield from self.modules_recurse(module)
            else:
                yield module

---- 细节部分
— 1. Darknet19

1.激活函数用了learkyrelu: 是relu的变种之一,可以有效的避免当输入小于0的神经元变成死神经元。具体参考这篇链接:

leakyrelu的好处:
没有饱和区,不存在梯度消失问题。
没有复杂的指数运算,计算简单、效率提高。
实际收敛速度较快,大约是 Sigmoid/tanh 的 6 倍。
不会造成神经元失效,形成了“死神经元”。

这里会记录我读代码的全部记录,可能会很细节,不作为学习的参考,仅作为个人的记录。爸爸的代码真的很会封装。几十个文件的迭代。可以的

darknet19这里也有了几层的封装,这里附带上darknet19的网络结构,基本上是符合网络的结构的。而且最后的输出部分输出了三个部分。layer1,2,3都有输出,估计是为了后面的细粒度检测,所以把每一层的都输出来,这样做也有利于concat我觉得。等下我们会看看优图是怎么处理concat的。by the way可以注意到的事优图自己还给网络最后加了点东西。好像看不到BN层了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值