YOLOv1代码复现(论文复现)

YOLOv1代码复现(论文复现)

本文所涉及所有资源均在传知代码平台可获取

文章目录

论文介绍

该论文就是YOLOv1,YOLOv1是YOLO系列目标检测算法的第一个版本,由Joseph Redmon等人于2015年提出。它是一种端到端的卷积神经网络,以极高的速度实现目标检测,尤其在实时应用中表现出色

主要内容

YOLO系列都包括:输入端、Backbone、Neck,Head

其中输入端:含有输入数据(图片or视频)、数据增强算法以及预处理操作部分Backbone结构:核心特征提取器Neck结构:V3版本才有,参考了FPN的特征融合思想,明显提升小物体的检测效果Head结构:包含Head检测头、损失函数以及Head结构的优化策略

实验部分
卷积网络结构

在数据集上进行训练卷积层。预训练使用下图的前20个卷积层,再跟上后边的平均池化层以及一个全连接层

计算损失

背景概率损失 坐标损失 类别预测损失,只有前景概率(三四行)达到一定值,判断为真的存在检测目标的时候,才会接着计算坐标损失(第一二行)和类别预测损失(第五行)。因此预测损失不是对每一个gird cell都做的。在该文章中是用一周时间达到在ImageNet 2012数据集上88%的精度,整了一个预训练权重方便计算

核心代码

原代码是c语言,这里代码是参考了C语言的pytorch代码,用的ResNet网络,省事

bash 复制代码
class ResNet(nn.Module):
    def __init__(self, block, layers):
        
        super(ResNet, self).__init__()
        # 通道数64
        self.inplanes = 64
        # 卷积层和池化层
        self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3,bias=False)
        self.bn1 = nn.BatchNorm2d(64)
        self.relu = nn.ReLU(inplace=True)
        self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
        # block块
        self.layer1 = self._make_layer(block, 64, layers[0])
        self.layer2 = self._make_layer(block, 128, layers[1], stride=2)
        self.layer3 = self._make_layer(block, 256, layers[2], stride=2)
        self.layer4 = self._make_layer(block, 512, layers[3], stride=2)
        # output_block
        self.layer5 = self._make_out_layer(in_channels=2048)
        # 将输出变为30个通道数 7*7*30
        self.avgpool = nn.AvgPool2d(2)  # kernel_size = 2  , stride = 2
        self.conv_end = nn.Conv2d(256, 30, kernel_size=3, stride=1, padding=1, bias=False)
        self.bn_end = nn.BatchNorm2d(30)
        # 参数初始化
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
                m.weight.data.normal_(0, math.sqrt(2. / n))
            elif isinstance(m, nn.BatchNorm2d):
                m.weight.data.fill_(1)
                m.bias.data.zero_()

   
    def _make_layer(self, block, planes, blocks, stride=1):

    def _make_out_layer(self, in_channels):

    def forward(self, x):
        # 网络就长这样
        x = self.conv1(x)
        x = self.bn1(x)
        x = self.relu(x)
        x = self.maxpool(x)
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        x = self.layer4(x)
        x = self.layer5(x)
        x = self.avgpool(x)
        x = self.conv_end(x)
        x = self.bn_end(x)
        x = F.sigmoid(x)  # sigmoid归一化到0-1
        # 改代码只要保证最后是7,7,30就行
        x = x.permute(0, 2, 3, 1)  # (-1,7,7,30)
        return x

关于7x7x30的张量:

7x7是把整张图像分成7x7个

30=(2x4+2x1+20)

其中4代表4个边框坐标信息 x y w h

1代表是否包含需要检测的目标

2代表每个格子上有两个候选框(会拿概率是否包含检测目标概率高的候选框出来用)

20是因为测试的voc2012数据集由20个类别

当1这个概率有大于一个阈值的时候,就会调用20个类别概率中概率最高的那个作为目标检测概率

得到一张图片的7x7x30的张量之后,需要生成目标数据的7x7x30的张量

生成目标数据由于类别概率是确定的,所以1的部分概率均是P概率=1,20部分只有在对应类别概率是P=1,其余都是P=0

缺点

一个图片只能有98个检测框(7x7x2),在经过非极大值抑制后剩下的框更少,就容易有漏检。没有更好平衡小目标和大目标损失
文章代码资源点击附件获取

相关推荐
红色的山茶花18 小时前
YOLOv8-ultralytics-8.2.103部分代码阅读笔记-block.py
笔记·深度学习·yolo
unix2linux1 天前
YOLO v5 Series - Image & Video Storage ( Openresty + Lua)
yolo·lua·openresty
菠菠萝宝1 天前
【YOLOv8】安卓端部署-1-项目介绍
android·java·c++·yolo·目标检测·目标跟踪·kotlin
ZZZZ_Y_1 天前
YOLOv5指定标签框背景颜色和标签字
yolo
红色的山茶花2 天前
YOLOv8-ultralytics-8.2.103部分代码阅读笔记-conv.py
笔记·yolo
Eric.Lee20212 天前
数据集-目标检测系列- 花卉 鸡蛋花 检测数据集 frangipani >> DataBall
人工智能·python·yolo·目标检测·计算机视觉·鸡蛋花检查
阿_旭2 天前
【模型级联】YOLO-World与SAM2通过文本实现指定目标的零样本分割
yolo·yolo-world·sam2
CSBLOG2 天前
OpenCV、YOLO、VOC、COCO之间的关系和区别
人工智能·opencv·yolo
2zcode2 天前
基于YOLOv8深度学习的医学影像骨折检测诊断系统研究与实现(PyQt5界面+数据集+训练代码)
人工智能·深度学习·yolo
深度学习lover2 天前
<项目代码>YOLOv8 草莓成熟识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·草莓成熟识别