目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导:
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯基于深度学习的工厂化养殖鱼虾识别目标检测系统
设计思路
一、课题背景与意义
在工厂化养殖环境下,虾的游动速度较快,其形状和姿态变化较大。为了保证图像样本的质量,需要使用高分辨率工业相机对养殖池进行抓拍。然而,由于养殖环境的特殊性,样本采集成本高且数量有限。同时,直接对高分辨率图像进行压缩会导致图像细节的丢失,从而影响目标检测的精度。基于YOLOv5框架对数据集进行训练,实现对养殖池内虾的精确识别和计数。这项工作的目标是为实现科学喂养和定量投饵提供数据基础。
二、算法理论原理
2.1 自适应图片裁切算法
基于YOLOv5目标检测框架的养殖虾图像分析和计数研究是通过将图像划分成S×S个网格,并判断目标检测框中心点是否位于特定网格内,实现对养殖虾目标的定位和计数。该框架通过预测目标的坐标位置和目标置信度,实现了高效的多目标检测。相对于前代算法,该框架在检测速度和准确率上取得了显著的提升。
YOLOv5框架的优势在于其高速度和实时性能,通过将图像划分为网格,并在每个网格内执行目标检测,大大减少了计算量。同时,YOLOv5框架通过使用深层卷积神经网络实现更准确的目标检测和定位,提高了检测的精确度和稳定性。
通过自适应裁切与标签映射,我们生成了一个裁切图像数据集,并将其与原始高清图像混合形成总数据集。按照70%的训练集和30%的验证集比例划分数据集,并输入目标检测网络进行训练。通过这个训练过程,我们得到了一个能够实现养殖虾图像分析和计数的模型。该模型可以有效地识别和计数养殖虾目标,为养殖虾产业的管理和监测提供准确和可靠的工具。
2.2 标签映射
为了解决直接压缩高清图像导致细节丢失以及只有少量图像样本的问题,本文提出了一种根据网络输入图像尺寸自适应调节的高分辨率图像裁切算法。该算法的流程如图4所示。通过根据原图尺寸和网络预处理输入图尺寸的计算,确定裁切数量和裁切窗口的滑动步长。这种算法能够根据网络的要求和图像的特性进行自适应的裁切,保留高分辨率图像的细节,并且能够生成更多的图像样本,提供更多的训练数据。综上所述,该算法为解决高清图像压缩和数据稀缺问题提供了一种有效的解决方案。
相关代码:
def crop_image_with_coordinates(image, coordinates, new_width, new_height):
height, width = image.shape[:2]
# 计算裁剪后的坐标映射比例
scale_x = new_width / width
scale_y = new_height / height
# 裁剪图像
cropped_image = cv2.resize(image, (new_width, new_height))
# 计算裁剪后的坐标信息
new_coordinates = []
for x, y, w, h in coordinates:
new_x = int(x * scale_x)
new_y = int(y * scale_y)
new_w = int(w * scale_x)
new_h = int(h * scale_y)
new_coordinates.append((new_x, new_y, new_w, new_h))
return cropped_image, new_coordinates
# 加载原始图像
image = cv2.imread('original_image.jpg')
# 原始坐标信息(示例)
original_coordinates = [(100, 100, 200, 200), (300, 300, 150, 150)]
# 裁剪图像并计算新的坐标信息
new_width = 200
new_height = 200
cropped_image, new_coordinates = crop_image_with_coordinates(image, original_coordinates, new_width, new_height)
# 打印裁剪后的新图像的尺寸和新的坐标信息
print("Cropped Image Size:", cropped_image.shape[:2])
print("New Coordinates:", new_coordinates)
三、检测的实现
3.1 数据集
由于网络上没有现有的合适数据集,我决定亲自前往养殖场进行拍摄,收集图片并创建一个全新的数据集。这个数据集将包含各种养殖虾的场景照片,其中将涵盖虾的不同生长阶段、不同养殖环境和不同养殖设施。通过现场拍摄,我能够捕捉到真实的养殖场景和多样的养殖环境,这将为我的研究提供更准确、可靠的数据。在养殖场拍摄的图片将包括虾的各种姿态、形状和颜色变化,以及虾与周围环境的交互。我将特别关注虾的游动速度和游动过程中的形态变化。此外,我还会记录虾的数量、密度和分布情况,以便在目标检测中考虑到这些因素。
数据增广是一种常用的技术,通过对养殖虾目标检测的自制数据集进行图像翻转、旋转、缩放、平移、裁剪、对比度调整、噪声添加、色彩变换和图像合成等操作,扩充数据的多样性和数量。这样做可以增加数据集的变化范围,提高模型的鲁棒性和泛化能力,为养殖虾目标检测算法提供更准确、可靠的训练数据。在进行数据增广时,需要确保虾的形状、姿态和环境等特征与实际情况相符合,以保持数据的真实性和合理性。
相关代码示例:
# 图像翻转
def flip_image(image):
flipped_image = cv2.flip(image, 1) # 水平翻转,使用1表示水平翻转,0表示垂直翻转
return flipped_image
# 旋转和缩放
def rotate_scale_image(image, angle, scale):
height, width = image.shape[:2]
center = (width / 2, height / 2)
rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)
rotated_image = cv2.warpAffine(image, rotation_matrix, (width, height))
return rotated_image
# 平移和裁剪
def translate_crop_image(image, tx, ty, crop_width, crop_height):
height, width = image.shape[:2]
translation_matrix = np.float32([[1, 0, tx], [0, 1, ty]])
translated_image = cv2.warpAffine(image, translation_matrix, (width, height))
cropped_image = translated_image[ty:ty+crop_height, tx:tx+crop_width]
return cropped_image
3.2 实验环境搭建
为了获得更快的收敛速度和减少训练时间成本,在YOLOv5框架下采用了YOLOv5s预训练权重进行迁移学习。在硬件平台参数方面,中央处理器为Intel i7 7700k,图形计算卡为Nvidia GeForce GTX 1070 Ti,批量大小为16,进行了100轮的训练,共迭代了28,507次。
3.3 实验及结果分析
为验证提出的自适应裁切算法的有效性,将原始图像与自适应裁切算法生成的图像混合作为模型训练数据集,记为模型1。同时,进行了两组对比实验:一组使用原始图像作为训练集,训练得到模型2;另一组仅使用自适应裁切算法生成的图像作为训练集,训练得到模型3。经过训练后,获得了目标检测模型,其识别效果如下所示
改进后的模型在训练过程中能够迅速收敛,并在训练时基本趋于稳定。这表明通过将原始图像与自适应裁切算法生成的图像混合作为训练数据集,能够快速学习和适应目标检测任务。

通过平均精度均值和准确率的评估在目标检测性能和准确性方面表现出较好的结果。自适应裁切算法的使用使得模型能够更好地学习图像的细节特征,并提高了模型的整体准确率。
仅使用原始图像训练,无法学习到细节特征,仅使用裁切后的图像训练,缺乏对整体特征的学习,因此它们在准确率方面表现较低。
相关代码如下:
class_labels = ['fish', 'shrimp']
# 加载测试图像
image = torch.randn(1, 3, 416, 416) # 示例输入图像,尺寸为(1, 3, 416, 416)
# 运行图像通过模型进行推理
with torch.no_grad():
outputs = model(image)
# 解析预测结果
pred_boxes = outputs.pred[0][:, :4] # 预测框坐标
pred_scores = outputs.pred[0][:, 4] # 预测置信度
pred_class_indices = outputs.pred[0][:, 5].long() # 预测类别索引
# 根据置信度阈值过滤预测结果
threshold = 0.5 # 置信度阈值
filtered_indices = pred_scores >= threshold
filtered_boxes = pred_boxes[filtered_indices]
filtered_scores = pred_scores[filtered_indices]
filtered_class_indices = pred_class_indices[filtered_indices]
# 打印过滤后的预测结果
for box, score, class_index in zip(filtered_boxes, filtered_scores, filtered_class_indices):
class_label = class_labels[class_index]
print(f"Class: {class_label}, Score: {score}, Box: {box}")
实现效果图样例
创作不易,欢迎点赞、关注、收藏。
毕设帮助,疑难解答,欢迎打扰!

被折叠的 条评论
为什么被折叠?



