用于工地裸土检测的卷积网络目标检测模型在Pytorch当中的实现

本文详细介绍了Unet模型的结构,包括编码器、解码器和跨通道连接,并阐述了其在图像分割任务中的作用。接着,深入探讨了DeeplabV3+模型的改进,如空洞卷积和增强特征提取结构,以及模型的实现步骤。此外,还提到了训练过程中的数据集制作、模型训练和损失函数,如交叉熵和DiceLoss。最后,文章提供了相关资源链接供读者参考和实践。
摘要由CSDN通过智能技术生成

概要

什么是Unet模型?
Unet模型是一种用于图像分割的卷积神经网络模型,由Ronneberger等人于2015年提出。它的名称来自于其网络结构类似于字母U的形状。

Unet模型主要用于将输入的图像分割成若干个像素级别的区域,并为每个像素分配一个标签,以便进行进一步的分析和处理。

Unet模型的三个重要模块:
Unet模型的其中一个重要模块是编码器(encoder),它由多层卷积层组成,用于提取输入图像的特征。编码器的输出被送入解码器(decoder)中。

另一个重要的模块是跨通道连接(skip connection),它允许解码器能够从编码器的不同层次的特征图中获取更准确和丰富的信息。这个模块通常通过在解码器中添加上采样层(upsampling layer)和卷积层(convolutional layer)来实现。

此外,Unet模型的最后一层是一个sigmoid激活函数,用于将输出的每个像素值压缩到0到1之间,以便进行二元分类任务。

总之,Unet模型是一种用于图像分割的卷积神经网络模型,具有编码器、解码器和跨通道连接等重要模块。通过对输入图像进行分割,它能够将每个像素分配一个标签,以便进一步地进行分析和处理。

DeeplabV3+模型组成:

DeeplabV3+主要在模型的架构上作文章,引入了可任意控制编码器提取特征的分辨率,通过空洞卷积平衡精度和耗时。
在这里插入图片描述
如图:
一.主干特征提取网络(DCNN):
我们可以利用主干部分获得一个又一个的特征层,Unet的主干特征提取部分与VGG相似,为卷积和最大池化的堆叠。利用主干特征提取部分我们可以获得五个初步有效特征层。
**具体实现如下:**这里以MobileNetV2为例,它具有一个非常重要的特点就是使用了Inverted resblock,整个mobilenetv2都由Inverted resblock组成。
nverted resblock可以分为两个部分:
左边是主干部分,首先利用1x1卷积进行升维,然后利用3x3深度可分离卷积进行特征提取,然后再利用1x1卷积降维。
右边是残差边部分,输入和输出直接相接。
在这里插入图片描述
需要注意的是,在DeeplabV3当中,一般不会5次下采样,可选的有3次下采样和4次下采样,本文使用的4次下采样。这里所提到的下采样指的是不会进行五次长和宽的压缩,通常选用三次或者四次长和宽的压缩。
在这里插入图片描述
在完成MobilenetV2的特征提取后,我们可以获得两个有效特征层,一个有效特征层是输入图片高和宽压缩两次的结果,一个有效特征层是输入图片高和宽压缩四次的结果。
二.加强特征提取结构
在DeeplabV3+中,加强特征提取网络可以分为两部分:
在Encoder中,我们会对压缩四次的初步有效特征层利用并行的Atrous Convolution,分别用不同rate的Atrous Convolution进行特征提取,再进行合并,再进行1x1卷积压缩特征。
在这里插入图片描述
在Decoder中,我们会对压缩两次的初步有效特征层利用1x1卷积调整通道数,再和空洞卷积后的有效特征层上采样的结果进行堆叠,在完成堆叠后,进行两次深度可分离卷积块。

在这里插入图片描述
这个时候,我们就获得了一个最终的有效特征层,它是整张图片的特征浓缩。
三.利用特征获得预测结果
利用1、2步,我们可以获取输入进来的图片的特征,此时,我们需要利用特征获得预测结果。

利用特征获得预测结果的过程可以分为2步:
1、利用一个1x1卷积进行通道调整,调整成Num_Classes。
2、利用resize进行上采样使得最终输出层,宽高和输入图片一样。
在这里插入图片描述

模型实现具体操作流程

一.数据集的制作
其中语义分割需要的包括:
1.ImageSets/Segmentation:存放训练验证集文件名称的txt文件;
在这里插入图片描述
2.JPEGImages:存放原始图像的文件夹
在这里插入图片描述
3.SegmentationClass:存放标注文件的文件夹;
在这里插入图片描述
标注工具:labelme(部署在anaconda上的标注工具)
标注操作如下:
在这里插入图片描述
标注经验总结:
1.首先需要统一标签,并向组员讲解各标签的具体定义,防止出现标注错误。
2.在运行转化的时候把每个组员的数据集分别运行,防止在总数据集中混杂太大污染。
3.告诉组员不要随意更改文件名,防止出现原图片与json文件出现不匹配的问题。
4.在标注错误的情况出现时,切记不要使用全局替换,可使用全局查找“label”,再进行替换。
二.模型训练
1、训练文件详解
我们使用的训练文件采用VOC的格式。
语义分割模型训练的文件分为两部分。
第一部分是原图,像这样:
在这里插入图片描述
第二部分标签,像这样:
在这里插入图片描述
原图就是普通的RGB图像,标签就是灰度图或者8位彩色图。
原图的shape为[height, width, 3],标签的shape就是[height, width],对于标签而言,每个像素点的内容是一个数字,比如0、1、2、3、4、5……,代表这个像素点所属的类别。
语义分割的工作就是对原始的图片的每一个像素点进行分类,所以通过预测结果中每个像素点属于每个类别的概率与标签对比,可以对网络进行训练。

2、LOSS解析
本文所使用的LOSS由两部分组成:
(1)Cross Entropy Loss。
(2)Dice Loss。
Cross Entropy Loss就是普通的交叉熵损失,当语义分割平台利用Softmax对像素点进行分类的时候,进行使用。
Dice loss将语义分割的评价指标作为Loss,Dice系数是一种集合相似度度量函数,通常用于计算两个样本的相似度,取值范围在[0,1]。
计算公式如下:在这里插入图片描述

就是预测结果和真实结果的交乘上2,除上预测结果加上真实结果。其值在0-1之间。越大表示预测结果和真实结果重合度越大。所以Dice系数是越大越好。
如果作为LOSS的话是越小越好,所以使得Dice loss = 1 - Dice,就可以将Loss作为语义分割的损失了。
3.训练自己的DeeplabV3+模型:
首先前往Github下载对应的仓库,下载完后利用解压软件解压,之后用编程软件打开文件夹。
注意打开的根目录必须正确,否则相对目录不正确的情况下,代码将无法运行。
一定要注意打开后的根目录是文件存放的目录。
在这里插入图片描述
训练流程:
一、数据集的准备
本文使用VOC格式进行训练,训练前需要自己制作好数据集,如果没有自己的数据集,可以通过Github连接下载VOC12+07的数据集尝试下。
训练前将图片文件放在VOCdevkit文件夹下的VOC2007文件夹下的JPEGImages中。
训练前将标签文件放在VOCdevkit文件夹下的VOC2007文件夹下的SegmentationClass中。
在这里插入图片描述
二、数据集的处理
在完成数据集的摆放之后,我们需要对数据集进行下一步的处理,目的是获得训练用的train.txt以及val.txt,需要用到根目录下的voc_annotation.py。
在这里插入图片描述

三、开始网络训练
通过voc_annotation.py我们已经生成了train.txt以及val.txt,此时我们可以开始训练了。训练的参数最重要的部分依然是train.py,num_classes。
num_classes用于指向检测类别的个数+1!训练自己的数据集必须要修改!
除此之外在train.py文件夹下面,选择自己要使用的主干模型backbone、预训练权重model_path和下采样因子downsample_factor。预训练模型需要和主干模型相对应。下采样因子可以在8和16中选择。
在这里插入图片描述
之后就可以开始训练了:
在这里插入图片描述
四、训练结果预测
训练结果预测需要用到两个文件,分别是deeplab.py和predict.py。
我们首先需要去deeplab.py里面修改model_path以及num_classes,
这两个参数必须要修改。
model_path指向训练好的权值文件,在logs文件夹里。
num_classes指向检测类别的个数+1。
在这里插入图片描述

技术名词解释

1.上采样:上采样是图像处理中的一种常见操作,用于将低分辨率的图像或特征图转换成高分辨率的图像或特征图。它通常是卷积神经网络中的一个重要模块,用于在图像识别、语义分割和目标检测等任务中增加分辨率,以便更好地提取和分析局部特征。

为了解释上采样的含义,我们可以先将其与下采样(或池化)进行对比。在卷积神经网络中通常会使用多次下采样操作来缩小输入图像的尺寸并减少计算量。这样做可以抽取更高级别的特征,但有时可能会导致分辨率不足,从而影响最终的识别和分割结果。

上采样的主要目的就是将分辨率恢复到更高的水平,以便更好地跟踪和分析小的目标或者局部特征。在卷积神经网络中,通常会使用插值或反卷积操作来实现上采样。其中最常见的方法是反卷积(deconvolution),它可以根据输入特征映射的形状自动恢复原始图像的尺寸。

总之,上采样是一种用于将低分辨率图像或特征图转换成高分辨率的图像或特征图的常见操作,通常用于卷积神经网络中的图像识别、语义分割和目标检测等任务中。它可以增加分辨率,以便更好地提取、跟踪和分析小目标或局部特征。

2.卷积层:卷积层是深度学习中的一种基本神经网络层,它使用卷积运算从输入特征映射中提取出新特征映射,以便进行下游任务(如图像分类和目标检测等)。卷积层由一个或多个卷积核组成,每个卷积核用于对输入的局部区域进行线性组合,生成一个新的特征。

在卷积层中,卷积核通过滑动窗口的方式在输入特征映射上移动,对于每个窗口,卷积核将与该窗口重叠的部分相乘并求和,得到一个新的特征值。根据窗口移动的步幅和卷积核大小,可以生成不同的特征映射,每个特征映射代表了原始数据在不同空间尺度下的抽象表示。

卷积层通常还包括激活函数和池化操作。激活函数用于引入非线性变换,增强模型的表达能力;池化操作则可以减小特征映射的尺寸,降低计算复杂度,并增加对平移、旋转和缩放等变换的不变性。

总之,卷积层是一种基本的神经网络层,使用卷积运算从输入特征映射中提取新特征,用于进行下游任务。卷积核是卷积层的核心组成部分,用于局部区域的线性加权和计算。卷积层通常还包括激活函数和池化操作,用于增强表达能力和增加不变性,从而提高模型的准确性。

3.空洞卷积:空洞卷积(Dilated Convolution)是一种卷积操作的扩展形式,它可以在不增加网络参数和计算量的情况下扩大特征图的感受野增强模型对于全局信息的感知能力。它通过在卷积核中插入空洞(dilation)来实现,因此也被称为扩张卷积或膨胀卷积。

与传统的卷积核不同,空洞卷积核中间间隔插入了若干个0,使得每个卷积核元素可以覆盖更广阔的区域,从而产生更大的感受野。具体而言,每个卷积核元素的 receptive field 可以表示为 (k-1)\times r + 1(k−1)×r+1,其中 rr 为空洞卷积的 rate 参数,kk 为卷积核大小。当 r=1r=1 时,空洞卷积退化为普通的卷积操作。

空洞卷积的一个优点是可以在不增加网络参数和计算量的情况下提高模型的性能,因为它可以增强特征图的感知能力,使得模型能够更好地学习到全局的语义信息。同时,由于空洞卷积可以扩大感受野,因此它在处理视觉任务中的大尺度物体、细节和文本等方面具有更好的效果。

总之,空洞卷积是一种用于扩大特征图感受野的高级卷积操作。它通过在传统卷积核中插入若干个0来实现扩张效果,增强模型对全局信息的感知能力。由于不增加网络参数和计算量,因此空洞卷积被广泛应用于图像处理、自然语言处理和语音识别等领域。

3.交叉熵:交叉熵(Cross Entropy)是一种用于衡量两个概率分布之间差异性的度量方法,它常用于深度学习中分类问题和优化目标函数。在分类问题中,交叉熵通常作为损失函数使用,用于衡量模型输出和真实标签之间的差距。

设 pp 和 qq 分别表示两个概率分布,其中 pp 是真实分布,qq 是预测分布。交叉熵可以表示为:
在这里插入图片描述
其中i表示分类类别,Pi与qi分别表示真实分布和预测分布对应类别i的概率。
交叉熵可以理解为在给定真实分布情况下,预测分布与真实分布之间的距离。交叉熵越小,表示预测分布和真实分布之间的距离越小,说明模型的输出结果越接近真实标签,模型的性能越好。

在深度学习中,交叉熵通常被用作损失函数,用于比较模型的输出结果与真实标签之间的差异,并告诉模型如何通过调整权重来改善结果。训练过程的最终目的就是通过不断迭代,使得交叉熵损失函数的值越来越小,从而让模型的输出结果逐渐接近真实标签。

总之,交叉熵是一种用于衡量两个概率分布之间差异性的度量方法,在分类问题中常作为损失函数使用。它的值越小,表示模型的输出结果与真实标签之间的距离越小,模型的性能越好。

小结

此模型在检测上面具有较高的准确度,有兴趣的道友可是尝试弄一下,有啥问题都可以在评论区问或私聊我,看到后会一一回复大家哦。
源代码链接:https://github.com/bubbliiiing/unet-pytorch.git

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值