目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导:
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯基于深度学习的多目标跟踪系统
设计思路
一、课题背景与意义
在安防领域,视频监控发挥着巨大的作用,但并不是所有目标都需要进行跟踪,否则会对计算资源造成过度消耗和浪费。以施工工地中未佩戴安全帽为特定目标,研究跨域跟踪技术,以减少不必要的计算资源消耗,实现安全生产。通过对未佩戴安全帽目标的跟踪,可以及时发现并采取措施,提高工地安全管理的效果,确保工人的人身安全。
二、算法理论原理
2.1 目标检测算法
在改进过程中,通过优化Focus结构,采用DenseNet的核心组件DenseBlock模块来增强检测精度。DenseBlock模块具有紧密连接性,每个模块包含四层,每一层都会经过非线性变换函数、归一化、激活函数和卷积等操作后传输至后面的网络。模块中的任意两层直接相连,解决了梯度下降过程中梯度消失的问题。通过这一改进,可以提高YOLOv5算法对小目标的检测效果。
相关代码示例:
# 定义DenseBlock模块
class DenseBlock(nn.Module):
def __init__(self, in_channels, growth_rate, num_layers):
super(DenseBlock, self).__init__()
self.layers = nn.ModuleList()
for i in range(num_layers):
self.layers.append(self._make_layer(in_channels + i * growth_rate, growth_rate))
def _make_layer(self, in_channels, growth_rate):
layer = nn.Sequential(
nn.BatchNorm2d(in_channels),
nn.ReLU(inplace=True),
nn.Conv2d(in_channels, growth_rate, kernel_size=3, padding=1)
)
return layer
def forward(self, x):
features = [x]
for layer in self.layers:
new_features = layer(torch.cat(features, dim=1))
features.append(new_features)
return torch.cat(features, dim=1)
提出了三种策略来改进Focus结构,以提升YOLOv5目标检测算法在小目标检测方面的性能。这三种策略分别是:
- 策略A:将DenseBlock前置于Focus结构。这种策略将DenseBlock模块放置在Focus结构之前,使得经过DenseBlock处理后的特征图成为Focus结构的输入。通过这种方式,可以利用DenseBlock的紧密连接性和非线性变换函数对特征进行更充分的提取和增强,进而改善小目标的检测能力。
- 策略B:采用DenseBlock模块替换Focus结构。这种策略将原本的Focus结构完全替换为DenseBlock模块,将DenseBlock作为主干网络的核心组件。由于DenseBlock具有多层紧密连接的结构,可以更好地保留和传递特征信息,从而提高小目标检测的准确性和鲁棒性。
- 策略C:将DenseBlock后置于Focus结构。这种策略将DenseBlock模块放置在Focus结构之后,将Focus结构提取的特征图作为DenseBlock的输入。通过这样的组合,可以在Focus结构的基础上进一步增强特征表达能力,使得网络能够更好地捕捉小目标的细节和上下文信息。
2.2 DeepSORT 算法
DeepSORT算法在SORT的整体框架上进行了改进,主要是通过引入Deep Association Metric来结合目标的外观信息,实现在长时间遮挡情况下的目标跟踪。在Kalman滤波器预测的基础上,使用匈牙利匹配算法进行最大匹配,同时考虑目标的运动信息和外观信息。运动匹配度用于描述目标轨迹与预测轨迹位置之间的马氏距离。对于DeepSORT新增的级联匹配,上半部分使用ReID外观特征模型和运动模型与门限矩阵来限制代价矩阵中大于阈值的值。下半部分是数据关联的部分,其中max_age默认值为70,missing age从0开始迭代更新至70。每次更新迭代都会对轨迹和检测进行匹配,首先优先匹配每次都能成功匹配的轨迹,然后再匹配时间间隔最久的轨迹。通过这样的处理,可以在目标被遮挡后再次成功匹配到目标,减少ID切换的次数。
GIoU是一种用于度量边界框之间重叠程度的距离度量。它是在IoU的基础上进行了改进,解决了IoU存在的一些问题。GIoU的改进之处在于引入了一个修正项,即(C - U) / C。当两个边界框没有重叠部分时,修正项的值为1,将IoU的值减去1,使得GIoU的值不再是0,能够更准确地反映边界框之间的距离。通过使用GIoU作为距离度量,可以更准确地评估边界框之间的重叠程度,对于目标检测、跟踪等任务有助于提高算法的性能。
为了减少丢失的检测并保持轨迹的持久性,DeepSORT算法在目标匹配过程中采取了一些策略。首先,通过IOU匹配排除不可能匹配的目标,减少级联匹配次数以提高处理速度。其次,在检测器与跟踪器配对时,优先使用高分的检测框,而不直接删除低分的检测框。对于低分的检测框,利用其与运动轨迹的相似度来还原真实目标,过滤掉背景。在遮挡或运动模糊等情况下,充分利用上一帧的相关数据来提高检测能力。每个检测框都被保存,并按预测概率分为高分和低分。首先将高分框与轨迹进行关联,然后使用GIoU匹配将较低分数的目标与未匹配的轨迹进行匹配,以降低目标突然转换的情况发生。
DeepSORT算法在目标跟踪过程中采用了多项策略来提高性能。它使用Deep Association Metric结合目标的外观信息进行目标跟踪,通过级联匹配和GIoU距离度量,在长时间遮挡情况下减少ID切换和精确跟踪目标。同时,对于未匹配的检测目标,利用AIL网络进行目标重识别,判断其是否来自相邻摄像头或是首次出现,从而初始化新的跟踪轨迹或更新跟踪信息,实现跨域多目标跟踪。
相关代码示例:
# 初始化跟踪器
tracker = DeepSORT()
# 在每个时间步骤进行目标跟踪
for frame in video_frames:
# 检测并获取当前帧中的目标检测框
detections = detect_objects(frame)
# 使用Deep Association Metric计算目标的特征向量
features = extract_features(detections)
# 对当前帧的目标和已有轨迹进行匹配
matches = tracker.match_targets(features)
# 更新已有轨迹的状态和位置
tracker.update_tracks(matches, detections)
# 处理未匹配到的目标
unmatched_targets = tracker.get_unmatched_targets()
for target in unmatched_targets:
# 使用AIL网络进行目标重识别
reid_result = reidentify_target(target)
if reid_result == "New": # 目标是第一次出现的
tracker.init_new_track(target)
elif reid_result == "Matched": # 目标与相邻摄像头区域的目标匹配
tracker.update_track(target)
# 清理过时的轨迹
tracker.cleanup_tracks()
三、检测的实现
3.1 数据集
由于网络上没有现有的合适的数据集,我决定自己进行拍摄,收集图片并制作一个全新的数据集,专注于多目标跟踪和目标检测。这个数据集包含了各种真实场景下的视频帧,涵盖了不同环境和场景下的多目标跟踪任务。通过现场拍摄,我能够捕捉到真实的场景和多样的工作环境,其中包括人群拥挤、目标遮挡、光照变化等各种挑战性情况。我特别关注目标检测和跟踪中的多目标情况,并确保数据集中包含多个同类目标同时存在的情况,以便更好地评估多目标跟踪算法的性能和鲁棒性。
由于自制的数据集数量有限,我将采用数据增强的方式来扩充数据集,以提高人脸性别目标检测模型的性能和泛化能力。数据增强方法包括镜像翻转、旋转缩放、平移裁剪、亮度对比度调整以及噪声添加等操作,通过这些变换和处理,我可以生成更多样化、更丰富的训练样本。这样的数据增强将为我的研究提供更准确、可靠的数据支持,同时提升模型的鲁棒性和适应能力。
相关代码示例:
# 读取原始图像
image = cv2.imread('gesture_image.jpg')
# 镜像翻转
flipped_image = cv2.flip(image, 1) # 1表示水平翻转,0表示垂直翻转
# 旋转
angle = 30 # 旋转角度
rows, cols = image.shape[:2]
rotation_matrix = cv2.getRotationMatrix2D((cols / 2, rows / 2), angle, 1)
rotated_image = cv2.warpAffine(image, rotation_matrix, (cols, rows))
3.2 实验环境搭建
3.3 实验及结果分析
通过对YOLOv5算法的超参数设置和改进策略的性能对比测试,我们得出了策略B是最优选择的结论。它在多个评估指标上优于其他策略,并在公共和自制数据集上展示了出色的检测结果。这些发现为后续的特定多目标跟踪研究提供了有力的支持,为建筑施工行业的安全帽检测和相关领域的发展做出了积极贡献。
相较于未改进的算法,策略B在mAP值上有显著提升,并在公共数据集和自制数据集上展现出出色的检测效果。这些结果为建筑施工行业的安全帽检测和相关领域的发展提供了有力的支持,并为后续的特定多目标跟踪研究奠定了基础。
通过使用自制数据集进行跨域特定多目标跟踪算法的测试,我们成功实现了对未佩戴安全帽的目标的准确跟踪。改进的算法结合了YOLOv5和DeepSORT,并在跟踪预测之前利用IOU和GIOU匹配方法来排除不可能匹配的目标并关联剩余的轨迹。这种改进方案有效地解决了单摄像头下多目标跟踪中的运动状态变化、目标遮挡和识别精度低等问题。通过与Re-ID算法的结合,我们在自制数据集上验证了算法的可行性,并成功实现了对跨域特定多目标的跟踪。
相关代码示例:
def match_boxes(boxes1, boxes2, threshold):
# 使用IOU和GIOU进行匹配
matched_indices = []
unmatched_indices = list(range(len(boxes2)))
for i, box1 in enumerate(boxes1):
best_match_index = None
best_match_iou = -1
for j, box2 in enumerate(boxes2):
iou_value = giou(box1, box2)
if iou_value > threshold and iou_value > best_match_iou:
best_match_index = j
best_match_iou = iou_value
if best_match_index is not None:
matched_indices.append((i, best_match_index))
unmatched_indices.remove(best_match_index)
return matched_indices, unmatched_indices
创作不易,欢迎点赞、关注、收藏。
毕设帮助,疑难解答,欢迎打扰!