尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

毕设项目 yolo深度学习动物识别

毕设项目 yolo深度学习动物识别 文章目录0 前言1 深度学习实现动物识别与检测2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层4 数据集准备4.1 数据标注简介4.2 数据保存5 模型训练5.1 修改数据配置文件5.2 修改模型配置文件5.3 开始训练模型6 实现效果0 前言这里是学长的优质毕业设计项目分享今天要分享的是基于深度学习的动物识别算法研究与实现项目运行效果毕业设计 深度学习的动物识别系统项目分享见主页任意置顶文章1 深度学习实现动物识别与检测学长实现的动态检测效果精度还是非常高的2 卷积神经网络受到人类大脑神经突触结构相互连接的模式启发神经网络作为人工智能领域的重要组成部分通过分布式的方法处理信息可以解决复杂的非线性问题从构造方面来看主要包括输入层、隐藏层、输出层三大组成结构。每一个节点被称为一个神经元存在着对应的权重参数部分神经元存在偏置当输入数据进入后对于经过的神经元都会进行类似于yw*xb的线性函数的计算其中为该位置神经元的权值b则为偏置函数。通过每一层神经元的逻辑运算将结果输入至最后一层的激活函数最后得到输出output。2.1卷积层卷积核相当于一个滑动窗口示意图中x大小的卷积核依次划过x大小的输入数据中的对应区域并与卷积核滑过区域做矩阵点乘将所得结果依次填入对应位置即可得到右侧x尺寸的卷积特征图例如划到右上角x所圈区域时将进行xxxxxxxxxx的计算操作并将得到的数值填充到卷积特征的右上角。2.2 池化层池化操作又称为降采样提取网络主要特征可以在达到空间不变性的效果同时有效地减少网络参数因而简化网络计算复杂度防止过拟合现象的出现。在实际操作中经常使用最大池化或平均池化两种方式如下图所示。虽然池化操作可以有效的降低参数数量但过度池化也会导致一些图片细节的丢失因此在搭建网络时要根据实际情况来调整池化操作。2.3 激活函数激活函数大致分为两种在卷积神经网络的发展前期使用较为传统的饱和激活函数主要包括sigmoid函数、tanh函数等随着神经网络的发展研宄者们发现了饱和激活函数的弱点并针对其存在的潜在问题研宄了非饱和激活函数其主要含有ReLU函数及其函数变体2.4 全连接层在整个网络结构中起到“分类器”的作用经过前面卷积层、池化层、激活函数层之后网络己经对输入图片的原始数据进行特征提取并将其映射到隐藏特征空间全连接层将负责将学习到的特征从隐藏特征空间映射到样本标记空间一般包括提取到的特征在图片上的位置信息以及特征所属类别概率等。将隐藏特征空间的信息具象化也是图像处理当中的重要一环。2.5 使用tensorflow中keras模块实现卷积神经网络classCNN(tf.keras.Model):def__init__(self):super().__init__()self.conv1tf.keras.layers.Conv2D(filters32,# 卷积层神经元卷积核数目kernel_size[5,5],# 感受野大小paddingsame,# padding策略vaild 或 sameactivationtf.nn.relu# 激活函数)self.pool1tf.keras.layers.MaxPool2D(pool_size[2,2],strides2)self.conv2tf.keras.layers.Conv2D(filters64,kernel_size[5,5],paddingsame,activationtf.nn.relu)self.pool2tf.keras.layers.MaxPool2D(pool_size[2,2],strides2)self.flattentf.keras.layers.Reshape(target_shape(7*7*64,))self.dense1tf.keras.layers.Dense(units1024,activationtf.nn.relu)self.dense2tf.keras.layers.Dense(units10)defcall(self,inputs):xself.conv1(inputs)# [batch_size, 28, 28, 32]xself.pool1(x)# [batch_size, 14, 14, 32]xself.conv2(x)# [batch_size, 14, 14, 64]xself.pool2(x)# [batch_size, 7, 7, 64]xself.flatten(x)# [batch_size, 7 * 7 * 64]xself.dense1(x)# [batch_size, 1024]xself.dense2(x)# [batch_size, 10]outputtf.nn.softmax(x)returnoutput3 YOLOV5我们选择当下YOLO最新的卷积神经网络YOLOv5来进行火焰识别检测。6月9日Ultralytics公司开源了YOLOv5离上一次YOLOv4发布不到50天。而且这一次的YOLOv5是完全基于PyTorch实现的在我们还对YOLOv4的各种高端操作、丰富的实验对比惊叹不已时YOLOv5又带来了更强实时目标检测技术。按照官方给出的数目现版本的YOLOv5每个图像的推理时间最快0.007秒即每秒140帧FPS但YOLOv5的权重文件大小只有YOLOv4的1/9。目标检测架构分为两种一种是two-stage一种是one-stage区别就在于 two-stage 有region proposal过程类似于一种海选过程,网络会根据候选区域生成位置和类别而one-stage直接从图片生成位置和类别。今天提到的 YOLO就是一种 one-stage方法。YOLO是You Only Look Once的缩写,意思是神经网络只需要看一次图片就能输出结果。YOLO 一共发布了五个版本其中 YOLOv1 奠定了整个系列的基础后面的系列就是在第一版基础上的改进为的是提升性能。YOLOv5有4个版本性能如图所示3.1 网络架构图YOLOv5是一种单阶段目标检测算法该算法在YOLOv4的基础上添加了一些新的改进思路使其速度与精度都得到了极大的性能提升。主要的改进思路如下所示3.2 输入端在模型训练阶段提出了一些改进思路主要包括Mosaic数据增强、自适应锚框计算、自适应图片缩放Mosaic数据增强Mosaic数据增强的作者也是来自YOLOv5团队的成员通过随机缩放、随机裁剪、随机排布的方式进行拼接对小目标的检测效果很不错3.3 基准网络融合其它检测算法中的一些新思路主要包括Focus结构与CSP结构3.4 Neck网络在目标检测领域为了更好的提取融合特征通常在Backbone和输出层会插入一些层这个部分称为Neck。Yolov5中添加了FPNPAN结构相当于目标检测网络的颈部也是非常关键的。FPNPAN的结构这样结合操作FPN层自顶向下传达强语义特征High-Level特征而特征金字塔则自底向上传达强定位特征Low-Level特征两两联手从不同的主干层对不同的检测层进行特征聚合。FPNPAN借鉴的是18年CVPR的PANet当时主要应用于图像分割领域但Alexey将其拆分应用到Yolov4中进一步提高特征提取的能力。3.5 Head输出层输出层的锚框机制与YOLOv4相同主要改进的是训练时的损失函数GIOU_Loss以及预测框筛选的DIOU_nms。对于Head部分可以看到三个紫色箭头处的特征图是40×40、20×20、10×10。以及最后Prediction中用于预测的3个特征图①40×40×255 ②20×20×255 ③10×10×255相关代码classDetect(nn.Module):strideNone# strides computed during buildonnx_dynamicFalse# ONNX export parameterdef__init__(self,nc80,anchors(),ch(),inplaceTrue):# detection layersuper().__init__()self.ncnc# number of classesself.nonc5# number of outputs per anchorself.nllen(anchors)# number of detection layersself.nalen(anchors[0])//2# number of anchorsself.grid[torch.zeros(1)]*self.nl# init gridself.anchor_grid[torch.zeros(1)]*self.nl# init anchor gridself.register_buffer(anchors,torch.tensor(anchors).float().view(self.nl,-1,2))# shape(nl,na,2)self.mnn.ModuleList(nn.Conv2d(x,self.no*self.na,1)forxinch)# output convself.inplaceinplace# use in-place ops (e.g. slice assignment)defforward(self,x):z[]# inference outputforiinrange(self.nl):x[i]self.m[i](x[i])# convbs,_,ny,nxx[i].shape# x(bs,255,20,20) to x(bs,3,20,20,85)x[i]x[i].view(bs,self.na,self.no,ny,nx).permute(0,1,3,4,2).contiguous()ifnotself.training:# inferenceifself.onnx_dynamicorself.grid[i].shape[2:4]!x[i].shape[2:4]:self.grid[i],self.anchor_grid[i]self._make_grid(nx,ny,i)yx[i].sigmoid()ifself.inplace:y[...,0:2](y[...,0:2]*2-0.5self.grid[i])*self.stride[i]# xyy[...,2:4](y[...,2:4]*2)**2*self.anchor_grid[i]# whelse:# for YOLOv5 on AWS Inferentia https://github.com/ultralytics/yolov5/pull/2953xy(y[...,0:2]*2-0.5self.grid[i])*self.stride[i]# xywh(y[...,2:4]*2)**2*self.anchor_grid[i]# whytorch.cat((xy,wh,y[...,4:]),-1)z.append(y.view(bs,-1,self.no))returnxifself.trainingelse(torch.cat(z,1),x)def_make_grid(self,nx20,ny20,i0):dself.anchors[i].deviceifcheck_version(torch.__version__,1.10.0):# torch1.10.0 meshgrid workaround for torch0.7 compatibilityyv,xvtorch.meshgrid([torch.arange(ny).to(d),torch.arange(nx).to(d)],indexingij)else:yv,xvtorch.meshgrid([torch.arange(ny).to(d),torch.arange(nx).to(d)])gridtorch.stack((xv,yv),2).expand((1,self.na,ny,nx,2)).float()anchor_grid(self.anchors[i].clone()*self.stride[i])\.view((1,self.na,1,1,2)).expand((1,self.na,ny,nx,2)).float()returngrid,anchor_grid4 数据集准备由于目前针对多源场景下的火焰数据并没有现成的数据集我们使用使用Python爬虫利用关键字在互联网上获得的图片数据爬取数据包含室内场景下的火焰、写字楼和房屋燃烧、森林火灾和车辆燃烧等场景下的火焰图片。经过筛选后留下3000张质量较好的图片制作成VOC格式的实验数据集。深度学习图像标注软件众多按照不同分类标准有多中类型本文使用LabelImg单机标注软件进行标注。LabelImg是基于角点的标注方式产生边界框对图片进行标注得到xml格式的标注文件由于边界框对检测精度的影响较大因此采用手动标注并没有使用自动标注软件。考虑到有的朋友时间不足博主提供了标注好的数据集和训练好的模型需要请联系。4.1 数据标注简介通过pip指令即可安装pip install labelimg在命令行中输入labelimg即可打开打开你所需要进行标注的文件夹点击红色框区域进行标注格式切换我们需要yolo格式因此切换到yolo点击Create RectBo - 拖拽鼠标框选目标 - 给上标签 - 点击ok4.2 数据保存点击save保存txt。打开具体的标注文件你将会看到下面的内容txt文件中每一行表示一个目标以空格进行区分分别表示目标的类别id归一化处理之后的中心点x坐标、y坐标、目标框的w和h。5 模型训练预训练模型和数据集都准备好了就可以开始训练自己的yolov5目标检测模型了训练目标检测模型需要修改两个yaml文件中的参数。一个是data目录下的相应的yaml文件一个是model目录文件下的相应的yaml文件。5.1 修改数据配置文件修改data目录下的相应的yaml文件。找到目录下的voc.yaml文件将该文件复制一份将复制的文件重命名最好和项目相关这样方便后面操作。我这里修改为animal_data.yaml。打开这个文件夹修改其中的参数需要检测的类别数这里识别有6种动物所以这里填写6最后填写需要识别的类别的名字必须是英文否则会乱码识别不出来。到这里和data目录下的yaml文件就修改好了。5.2 修改模型配置文件由于该项目使用的是yolov5s.pt这个预训练权重所以要使用models目录下的yolov5s.yaml文件中的相应参数因为不同的预训练权重对应着不同的网络层数所以用错预训练权重会报错。同上修改data目录下的yaml文件一样我们最好将yolov5s.yaml文件复制一份然后将其重命名打开yolov5s.yaml文件,主要是进去后修改nc这个参数来进行类别的修改修改如图中的数字就好了这里是识别两个类别。至此相应的配置参数就修改好了。目前支持的模型种类如下所示5.3 开始训练模型如果上面的数据集和两个yaml文件的参数都修改好了的话就可以开始yolov5的训练了。首先我们找到train.py这个py文件。然后找到主函数的入口这里面有模型的主要参数。修改train.py中的weights、cfg、data、epochs、batch_size、imgsz、device、workers等参数至此就可以运行train.py函数训练自己的模型了。训练代码成功执行之后会在命令行中输出下列信息接下来就是安心等待模型训练结束即可。6 实现效果我们实现了图片检测视频检测和摄像头实时检测接口用Pyqt自制了简单UI#部分代码fromPyQt5importQtCore,QtGui,QtWidgetsclassUi_Win_animal(object):defsetupUi(self,Win_animal):Win_animal.setObjectName(Win_animal)Win_animal.resize(1107,868)Win_animal.setStyleSheet(QString qstrStylesheet \background-color:rgb(43, 43, 255)\;\nui.pushButton-setStyleSheet(qstrStylesheet);)self.frameQtWidgets.QFrame(Win_animal)self.frame.setGeometry(QtCore.QRect(10,140,201,701))self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)self.frame.setFrameShadow(QtWidgets.QFrame.Raised)self.frame.setObjectName(frame)self.pushButtonQtWidgets.QPushButton(self.frame)self.pushButton.setGeometry(QtCore.QRect(10,40,161,51))fontQtGui.QFont()font.setBold(True)font.setUnderline(True)font.setWeight(75)self.pushButton.setFont(font)self.pushButton.setStyleSheet(QPushButton{background-color:rgb(151, 191, 255);})self.pushButton.setObjectName(pushButton)self.pushButton_2QtWidgets.QPushButton(self.frame)self.pushButton_2.setGeometry(QtCore.QRect(10,280,161,51))fontQtGui.QFont()font.setBold(True)font.setUnderline(True)font.setWeight(75)self.pushButton_2.setFont(font)self.pushButton_2.setStyleSheet(QPushButton{background-color:rgb(151, 191, 255);})self.pushButton_2.setObjectName(pushButton_2)self.pushButton_3QtWidgets.QPushButton(self.frame)self.pushButton_3.setGeometry(QtCore.QRect(10,500,161,51))QtCore.QMetaObject.connectSlotsByName(Win_animal)项目运行效果毕业设计 深度学习的动物识别系统项目分享见主页任意置顶文章
返回列表