毕业设计选题-基于深度学习的鸟类识别目标检测系统 人工智能 机器学习 卷积神经网络
毕业设计选题:基于深度学习的鸟类识别检测算法系统的研究。该系统利用先进的计算机视觉技术和深度学习算法,旨在实现准确和高效的鸟类物种识别和检测。为计算机科学、人工智能、图像处理等专业的毕业生提供了一个具有挑战性和创新性的研究课题。无论您对深度学习技术保持浓厚兴趣,还是希望在鸟类识别、生物多样性监测或环境保护领域深入研究,将为您提供丰富的资源和启发。通过深入学习和实践,您将掌握鸟类识别检测算法系统的设
目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导:
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯基于深度学习的鸟类识别目标检测系统
课题背景和意义
传统的鸟类调查和监测方法需要大量的时间和人力,并且对专业知识和经验有较高的要求。鸟类识别目标检测系统可以通过深度学习技术,利用大规模的鸟类图像数据进行训练,实现自动化的鸟类识别和目标检测。可以提高鸟类物种的调查和监测效率,减少人力资源和时间成本,同时降低对专业知识的依赖。
实现技术思路
一、 鸟类识别方法
1.1 卷积神经网络
卷积神经网络在图像领域方面可以说是大放异彩。在图像的分类识别,目标检测,行为研究,甚至是自然语言处理上都有很好的表现。卷积层是卷积神经网络的基础,没有卷积层得到的特征,后续的其他任务如分类等也就无法进行。整个卷积过程也不难理解,实质上就是矩阵计算,输入图像的矩阵信息上面的数值与卷积核的对应位置的矩阵上面的数值相乘,如果卷积核不移动的话,那就是在二维空间下得到一个经过矩阵计算的数值,整个卷积过程通过移动卷积核得到不同位置的特征图,特征图与卷积核对应位置相乘的数值再将其相加求和。
池化层主要工作就是降采样,目的就是降低维度。池化层常见的实现方式一般有两种,一种是平均池化,将特征图上面的矩阵分块操作,设特征图大小是4×4,步长为2,那么也就分成分成4个2×2的矩阵,之后分别求每个区域矩阵的平均值。另外一种就是最大池化,最大池化与平均池化的区别就不将每个区域的值相加求平均值,而是直接在每个区域中选择最大的一个数值作为结果。池化层保留了上一部分卷积的特征信息同时对信息进一步的下采样,实现参数量减少的目的,减少网络的运行负担,也有一定的防止过拟合的作用。
全连接层(fully connected layers,FC)在整个卷积神经网络中的工作是不同于其他网络层的,在提取特征的同时还起到分类器的作用。全连接层是将特征图或者特征矩阵展开为可用于分类的一维特征向量,将从网络中学到的“分布式特征表示”映射到样本标记空间中从而实现分类功能。随着卷积神经网络的发展,全连接层逐步的被可以减少参数的全局平均池化层取代。
激活函数的主要作用是解决卷积神经网络在传递过程中永远是线性的问题,该问题出现的原因主要是在网络中如果只是使用卷积和池化操作的话,输入和输出数据不管怎么变换都是线性的,因为都是经过wx+b计算产生的,激活函数就是用来改变这种线性组合的一个函数。激活卷积层是卷积神经网络的基础,没有卷积层得到的特征,后续的其他任务如分类等也就无法进行。
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1)
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
def forward(self, x):
x = self.conv1(x)
x = self.pool(x)
return x
model = Net()
input_tensor = torch.randn(1, 3, 32, 32)
output = model(input_tensor)
1.2 轻量型网络
研究的分类任务以轻量型网络为出发点,SqueezeNet是很经典的轻量级网络,它的核心思想是通过对特征图进行降维和升维的过程达到先压缩再拓展的目的。SqueezeNet的核心模块为Fire模块,首先将输入特征的维度通过1×1卷积进行压缩,然后通过1×1卷积,3×3卷积对卷积层进行维度扩展,这种1×1卷积升高纬度和降低维度的方式在主体网络MobileNetV3中的bneck块中也有所体现。
ShuffleNet在轻量级网络中也有着特殊的地位,ShuffleNet的发展经过V1,V2阶段。ShuffleNet V1创新性的提出了channel shuffle操作,并且通过分组卷积的方式来实现网络的加速,其中分组卷积(Group Convolution)不是ShuffleNet的独创内容。
1.3 特征融合网络
在实际的标签生成过程中,对于计算生成语义相关度很高的混合图像来说,需要的是每一个原始的图像像素和响应的标签的语义相关性,对于这个相关性使用类激活图CAM来解决这一问题,这使得经过分类训练的CNN能够学习执行对象定位,而且不需要使用任何边界框注释。类激活图允许可视化任何给定图像上的预测类分数,突出显示由网络检测到的有区别的对象部分。可视化有助于对于一个区域相关性的解释,同时也可以更好的了解网络的内部运行。
MobileNet网络是一种轻量级网络,专门为嵌入式和移动端的设备而设计的网络,它可以在逼近甚至超过一些深度模型的识别精度的前提下,大大缩减模型的参数量。深度可分离卷积分为两个部分,一部分是dw卷积,一个是pw卷积。所以深度卷积计算量的结果是两部分卷积计算的和。
MobileNetV2的逆残差结构先使用11×卷积进行升维,使得维度更深,之后通过dw卷积获取特征信息,最后在使用11×卷积降维,实现捷径连接(shortcut)。这样就将传统的两头大中间小,改进成中间小两头大的结构,称之为逆残差结构。在逆残差结构中需要注意,不是每一个残差结构都是有捷径的。只有在stride=1的存在shortcut连接,在stride=2的不存在shortcut连接,原因就是因为残差结构必须是输入的残差输出的维度是一致的。
model.eval()
with torch.no_grad():
output = model(image_tensor)
scores = torch.nn.functional.softmax(output, dim=1).squeeze()
predicted_class_idx = torch.argmax(scores).item()
cam_weights = list(model.parameters())[-2]
cam_features = torch.matmul(cam_weights[predicted_class_idx], features.squeeze())
cam = nn.functional.interpolate(cam_features.unsqueeze(0), size=(image.shape[0], image.shape[1]), mode='bilinear', align_corners=False)
cam = cam.squeeze().numpy()
cam = np.maximum(cam, 0)
cam = cam / np.max(cam)
二、 数据集
由于缺乏合适的公开鸟类识别数据集,所以自己收集数据。在户外拍摄各种鸟类的照片,并在互联网上搜集了一些鸟类图像。尽管我收集到的图片数量有限,但为了充分利用这些数据,我采用了数据扩充的技术。
数据扩充是一种通过对原始图像进行各种变换和增强来生成更多样本的方法。我对收集到的鸟类图像进行了多种预处理操作,包括调整图像大小、随机裁剪、翻转和旋转等。这些操作不仅增加了数据集的多样性,还有助于训练模型对不同角度、姿势和环境条件下的鸟类进行更准确的识别。
train_datagen = ImageDataGenerator(
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True
)
validation_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='categorical'
)
validation_generator = validation_datagen.flow_from_directory(
validation_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='categorical'
)
三、实验及结果分析
3.1 实验环境搭建
实验主要使用Python语言在GPU加速环境下进行实验,使用PyTorch深度学习框架,因为图像分类本身对计算机的配置要求比较高,为了提高训练速度,决定在服务器上部署实验,来完成模型的训练工作。选择为RTS A5000,PyTorch版本1.7.1,cuda11.0,Python3.8。
参数设置为学习率采用分步学习率,分布学习率是在epoch中设置不同的学习率是0.1、0.01还是0.001,batch-size为16,epoch为300,损失函数为交叉熵函数,并采用了随机梯度下降算法SGD作为网络优化方法。
3.2 实验对比分析
针对优化注意力机制的验证实验中,出现的采用不同的通道注意力,空间注意力和混合注意力机制CBAM反而没有原始的SE注意力机制准确率更高的问题进行分析解决。通过增加预训练权重的方式继续对添加不同注意力的MobileNetV3-small网络进行消融实验。
添加预训练权重之后,只添加CA通道注意力的模型准确率比只添加SE通道注意力的模型准确率提高了0.6%,采用的通道注意力模块在提升模型识别精度上的有效性。此外,同时使用通道注意力和空间注意力的CBAM模块使模型的准确率提高了1.49%,验证了最终的采用CBAM来替换原始的SE注意力机制改进的有效性。
通过融合SnapMix数据增强和对bneck瓶颈块的内部进行改进,最终得到了FCSM模型。该模型的整体性能优于原始的MobileNetV3-small模型,识别精度也优于POOF和Part-based CNN。模型更加轻量化。
model.fit(
train_generator,
steps_per_epoch=train_generator.samples // batch_size,
validation_data=validation_generator,
validation_steps=validation_generator.samples // batch_size,
epochs=10
)
test_generator = validation_datagen.flow_from_directory(
test_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='categorical'
)
score = model.evaluate(test_generator)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
实现效果图样例
最后
我是海浪学长,创作不易,欢迎点赞、关注、收藏。
毕设帮助,疑难解答,欢迎打扰!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)