YOLO V5算法的遮挡行人检测算法【附代码】
·

✅博主简介:本人擅长建模仿真、数据分析、论文写作与指导,项目与课题经验交流。项目合作可私信或扫描文章底部二维码。
-
- 利用在大规模数据集上预训练好的模型权重,初始化新的模型训练。这样可以避免从头开始训练,加快模型的收敛速度,同时利用预训练模型学习到的通用特征,提高模型在新数据集上的泛化性能。
-
Mosaic 数据增强方法
- 目的:丰富图片背景信息并增强模型对小目标行人的检测能力。
- 实现方式:将多张图片进行随机裁剪、拼接等操作,合成一张新的图片。这样可以增加数据的多样性,让模型学习到更多不同的场景和目标变化,同时也可以提高模型对小目标行人的检测能力,因为小目标行人在合成的图片中可能会被放大或与其他目标组合出现,增加了模型对小目标的学习机会。
-
K-means++ 聚类算法生成先验框尺寸
- 目的:生成适用于 CrowdHuman 数据集的先验框尺寸。
- 实现方式:K-means++ 聚类算法是一种无监督学习算法,用于将数据点划分为不同的聚类。在 YOLO V5 算法中,先验框的尺寸对目标检测的性能有很大影响。通过对 CrowdHuman 数据集中的目标框进行 K-means++ 聚类,可以得到更适合该数据集的先验框尺寸,提高模型的检测精度。
二、改进策略
-
软非极大值抑制(SoftNMS)算法替换 NMS 算法
- 问题背景:非极大值抑制(NMS)算法在处理行人遮挡问题时存在不足,没有考虑到目标由于遮挡导致二者的预测框之间高度重合的情况。
- 改进方法:选用 SoftNMS 算法替换 NMS 算法。SoftNMS 算法采用对预测框先进行得分衰减再进行过滤的方法,减少遮挡行人漏检数量。当两个预测框高度重合时,SoftNMS 不会直接将其中一个预测框的得分置为 0,而是根据重合程度对得分进行衰减,这样可以减少因遮挡而被误过滤
的预测框,提高遮挡行人的检测率。import torch import torchvision import numpy as np # 定义模型类 class ImprovedYOLOV5(torch.nn.Module): def __init__(self): super(ImprovedYOLOV5, self).__init__() # YOLO V5 模型结构 self.backbone = torchvision.models.resnet50(pretrained=True) self.neck = torch.nn.Sequential( torch.nn.Conv2d(2048, 512, kernel_size=1), torch.nn.BatchNorm2d(512), torch.nn.ReLU(inplace=True), torch.nn.Conv2d(512, 256, kernel_size=3, padding=1), torch.nn.BatchNorm2d(256), torch.nn.ReLU(inplace=True), torch.nn.Conv2d(256, 128, kernel_size=3, padding=1), torch.nn.BatchNorm2d(128), torch.nn.ReLU(inplace=True), ) self.detection_heads = torch.nn.ModuleList([ # 正常检测头 torch.nn.Sequential( torch.nn.Conv2d(128, 256, kernel_size=3, padding=1), torch.nn.BatchNorm2d(256), torch.nn.ReLU(inplace=True), torch.nn.Conv2d(256, (4 + 1 + 1) * 3, kernel_size=1), ), # 微小目标检测头 torch.nn.Sequential( torch.nn.Conv2d(128, 256, kernel_size=3, padding=1), torch.nn.BatchNorm2d(256), torch.nn.ReLU(inplace=True), torch.nn.Conv2d(256, (4 + 1 + 1) * 3, kernel_size=1), ), ]) def forward(self, x): features = self.backbone(x) features = self.neck(features) detections = [head(features) for head in self.detection_heads] return detections # SoftNMS 算法实现 def soft_nms(detections, iou_threshold=0.5, score_threshold=0.3): # SoftNMS 算法具体实现 pass # 数据增强函数 def mosaic_data_augmentation(images): # Mosaic 数据增强具体实现 pass # 训练函数 def train(model, train_loader, optimizer, criterion, epochs): for epoch in range(epochs): for images, labels in train_loader: # 应用 Mosaic 数据增强 augmented_images = mosaic_data_augmentation(images) optimizer.zero_grad() detections = model(augmented_images) # 计算损失 loss = criterion(detections, labels) loss.backward() optimizer.step() # 检测函数 def detect(model, images): detections = model(images) # 应用 SoftNMS refined_detections = soft_nms(detections) return refined_detections
-
增加微小目标检测头
- 问题背景:由于遮挡问题导致身体可见区域变小的部分行人容易被模型忽略。
- 改进方法:扩大输出特征图的尺寸,并在检测端增加一个微小目标检测头。通过扩大输出特征图的尺寸,可以提高模型对小目标的分辨率,更好地检测身体可见区域变小的行人。同时,增加微小目标检测头可以专门针对这些小目标行人进行检测,提升模型对这类行人目标的检测能力。
-
融合改进策略提出 ITS-YOLOV5 算法
- 融合方法:将上述两种改进策略进行融合,提出基于微小检测头融合 SoftNMS 的 YOLOV5 算法(ITS-YOLOV5)。
- 实验结果:在 CrowdHuman 数据集上的检测精度比 YOLOV5 算法提高了 7.7%,达到了 73.2%。这表明融合后的算法在处理遮挡行人问题上具有更好的性能。


更多推荐


所有评论(0)