目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导:
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯基于深度学习的鱼群计数识别系统
设计思路
一、课题背景与意义
鱼群计数在水产养殖密度控制、成活率估算、运输和营销管理等方面具有重要的指导作用。然而,由于鱼类在养殖、运输和营销过程中存在复杂的环境条件,而且鱼类的体型和形态各异,对鱼群进行准确计数带来了一定的挑战。因此,需要一种能够处理复杂背景和鱼类重叠的计数方法,以满足水产养殖行业不同环节的需求,并实现自动、准确和高效的鱼群计数。
二、算法理论原理
2.1 YOLOv5算法
YOLOv5模型按照网络深度和维度的不同,可分为4种模型。其中,YOLOv5s是最轻量的网络模型,具有更好的训练速度和检测速度,因此被广泛应用于工业场景中。本研究选用YOLOv5s模型对鱼群目标进行计数。其网络模型分为4个部分:输入端、主干网络(Backbone)、Neck模块、预测端(Prediction)。
CSPDarknet53在主干网络的开始部分增加了一个特殊的下采样操作,即Focus操作。通过使用Focus操作,可以将高分辨率的特征图分割成多个低分辨率的特征图。如图所示,一个4×4×3的Tensor被间断采样分割成4部分,并在通道维度上进行拼接,形成一个2×2×12的Tensor。Focus层将宽度和高度平面的信息转化为通道维度,并通过卷积操作提取不同的特征,从而减少由下采样引起的信息损失。
CSPDarknet53还采用了Neck模块,其中使用了特征金字塔网络(Feature Pyramid Networks,FPN)和路径聚合网络(Path Aggregation Network,PAN)的结构,以增强网络融合不同尺度对象特征的能力。FPN层负责将顶层丰富的语义特征传输到底层,PAN层负责将底层的精确定位信息传输到顶层,这两者都可以提高预测框位置的精度和预测框类别的准确性。FPN+PAN结构实现了自上而下和自底向上的双向融合。
2.2 改进的YOLOv5算法
YOLOv5使用k-means聚类算法为通用数据集COCO上的大中小全尺寸对象生成先验框。直接使用初始化先验框检测小目标的鱼群容易出现精度低、漏检率高的问题。因此,有必要先根据鱼群数据集的特征生成合适的先验框,再进行模型训练。利用k-means++算法替换YOLOv5网络的k-means算法可以生成更好的先验框,从而避免重叠鱼群被识别成一个目标的问题,且k-means++算法不会带来额外的参数和计算量。在鱼群数据集上使用k-means++算法生成9个适合鱼群检测数据集的先验框,见表。
为更好地学习鱼群图像的特征信息,提升泛化性能,在训练过程中,本研究使用迁移学习方式,将在COCO数据集上已经训练好的权重迁移到鱼群计数的实验任务中。鱼群计数模型训练可分为两个阶段:第一阶段,利用YOLOv5网络在COCO数据集上的预训练权重,冻结该预训练权重中CSPDarknet53网络层的权重,该网络层的权重不发生改变;第二阶段,将冻结的权重进行解冻,使用鱼群图像数据集对整个YOLOv5网络进行训练,直到模型收敛。
三、鱼群计数检测的实现
3.1 实现环境
本研究采用的鱼群数据集来源于b站的鱼群视频,通过魔影工厂软件进行视频截取,得到510张鱼群图像,其中训练集与测试集的比例为9:1,数据集中的鱼群图像见下图。由于模型的输入是图像,需要人为对输入图像进行标记,定义图像特征,为其制作标签文件。本实验利用图像标注工具LabelImg制作VOC数据集。
3.2 CBMA注机制
本实验采用的深度学习平台软硬件环境见下表。
3.2 级联卷积神经网络
本研究将准确率(Precision,P)、召回率(Recall,R)和平均精度(Mean average precision,mAP)作为模型评估指标。采用迁移学习方法进行鱼群计数模型训练,训练时加载预训练权重。训练过程为800 epochs,前50个epochs利用冻结网络的方式进行训练,学习率为0.001,Batch Size设置为8;之后的750个epochs学习率为0.0001,Batch Size设置为4,每10个epochs保存1次权值,设置多线程读取数据,使用混合精度训练,动量为0.937,采用SGD优化算法。其中,平均精度随迭代次数的变化曲线,以及精确率和召回率变化曲线见下图。平均精度在迭代800次后趋近平稳,约为96.29%。
部分代码如下:
net = cv2.dnn.readNetFromCaffe('path/to/prototxt', 'path/to/caffemodel')
# 加载图像
image = cv2.imread('path/to/image.jpg')
# 对图像进行预处理
blob = cv2.dnn.blobFromImage(cv2.resize(image, (300, 300)), 0.007843, (300, 300), 127.5)
# 输入图像到深度学习模型中进行推理
net.setInput(blob)
detections = net.forward()
# 计数鱼群
fish_count = 0
for i in range(detections.shape[2]):
confidence = detections[0, 0, i, 2]
if confidence > 0.5: # 设置置信度阈值
fish_count += 1
print("鱼群数量:", fish_count)
实现效果图样例
创作不易,欢迎点赞、关注、收藏。
毕设帮助,疑难解答,欢迎打扰!