✅博主简介:本人擅长建模仿真、论文写作与指导,项目与课题交流。项目合作可私信或扫描文章底部二维码。
在交通道路上,抛洒物对行车安全构成了极大的威胁,这些物体往往体积小、种类多样,且分布不规则,导致其在检测和跟踪时面临巨大的挑战。传统的人工采集和维护方式在面对这些问题时效率较低,且难以满足道路实时监控与维护的需求。为了应对这种复杂情况,本文设计了一个基于Jetson nano控制器的道路抛洒物数据采集系统。该系统利用1080P全景摄像头,能够在复杂的交通环境中实时采集视频数据,并将抛洒物逐帧分解为静态图像,从而形成一个专门的道路抛洒物数据集。
本文收集了包括橘子皮、小纸箱、3D打印圆柱、空水瓶、纸巾、小石块等六类小型和中小型难以被检测的抛洒物。抛洒物通常以随机位置出现,大小和形状各异,难以通过常规的图像处理方法识别。通过高频采样,我们将视频数据转化为大量图片,并利用标注工具对存在抛洒物的图片进行标注,生成了最终的道路抛洒物数据集。此数据集不仅包含了道路表面上的抛洒物,还捕捉到了抛洒物在不同天气、光照条件下的表现形式。为后续算法提供了丰富的数据支持,确保算法在不同环境下都能保持高效的检测能力。
(2) 无人机采集的道路裂缝图像数据集构建
道路裂缝是影响道路寿命和行车安全的关键因素,早期检测和修复裂缝对于维持道路的整体质量至关重要。为了有效解决传统人工巡检存在的局限性,本文通过无人机搭载高分辨率摄像设备,采集了不同类型道路的裂缝图像,构建了一个多场景的道路裂缝数据集。
采用DJI Mavic 3无人机,搭载2000万像素的4/3CMOS哈苏相机,在城市道路、国家干线公路、校园内部道路等不同场景下进行低空飞行拍摄。我们共获得了203张分辨率为5280×3956的原始图像,并将这些图像进行切割处理,最终生成了12569张大小为512×512的裂缝图像。这些图像涵盖了不同形态、宽度、深度的裂缝,从细小的表面裂缝到较严重的结构性损坏,确保了数据集的多样性和代表性。在数据集中,经过仔细标注,挑选出了2056张带有明显裂缝的图像,作为训练和测试集使用。这个数据集被命名为UMSC(Unmanned Aerial Vehicle Multiple Scene Cracks),为后续算法的研究和验证提供了坚实的基础。
(3) 基于物影匹配算法的抛洒物跟踪方法
交通道路上的抛洒物通常形态不规则,容易与背景混淆,如何有效地对这些小型目标进行检测和跟踪是一大难点。为了解决这一问题,本文提出了一种基于物影匹配算法的道路小目标跟踪方法——OSMA(Object-Shadow Matching Algorithm)。该算法利用了物体与其影子在连续视频帧中的双轮廓特征,来有效地追踪抛洒物的运动轨迹。
具体实现上,首先采用混合高斯模型对道路背景进行建模,从而分离出前景中的动态物体。通过形态学操作如膨胀和腐蚀,进一步精确前景物体的边缘轮廓。在抛洒物移动时,其物体与影子会在前景中产生两条独立的轮廓线,本文通过连续帧的轮廓匹配算法,识别出这种物影配对特征,将其标记为潜在的抛洒物。随后,通过多帧质心偏移法判断这些潜在目标是否处于静止状态,以避免误判运动中非抛洒物的情况。最终,算法通过对运动中的抛洒物进行位置判定和帧间轮廓匹配,实现了道路小目标的逐帧跟踪。
实验结果表明,该算法在不同光照和复杂背景条件下均表现出较高的鲁棒性。即便在动态环境中,算法也能够准确地识别并跟踪抛洒物,其跟踪精度达到了98%。与传统的物体跟踪算法相比,OSMA算法更具灵活性,适应性更强,能够有效解决道路小目标检测中的难点问题。
(4) 基于GC-YOLOv5s的道路裂缝检测网络
为了实现无人机采集的道路裂缝图像的高效检测,本文设计了一种改进的GC-YOLOv5s裂缝检测网络。原始的YOLOv5s模型在检测不规则目标(如裂缝)时存在定位不准的问题,尤其在面对裂缝的长条形和复杂结构时,表现出明显的不足。为此,本文对原有模型进行了多项改进。
首先,将YOLOv5s中的定位损失函数CIOU替换为GIOU(Generalized Intersection over Union)损失函数,该函数更适用于不规则目标的检测,尤其是在裂缝这种形态复杂且难以捉摸的目标中,表现出了更好的效果。此外,本文还引入了焦点损失函数,以解决裂缝图像中的难易样本不平衡问题。为了进一步提高模型的特征表达能力,本文将YOLOv5s原有的上采样层替换为反卷积层,并引入Ghost模块替代卷积块,以降低网络的参数量。在保持检测精度的同时,成功减少了模型的计算资源需求。
% 道路抛洒物检测与跟踪算法示例代码
% 初始化背景减除器
backgroundSubtractor = vision.ForegroundDetector('NumGaussians', 5, 'LearningRate', 0.01);
% 视频读取
videoReader = VideoReader('road_spillage_video.mp4');
frameCount = 0;
% 创建视频播放器
videoPlayer = vision.VideoPlayer;
while hasFrame(videoReader)
frame = readFrame(videoReader);
frameCount = frameCount + 1;
% 前景检测
foregroundMask = backgroundSubtractor(frame);
% 形态学处理
foregroundMask = imdilate(foregroundMask, strel('square', 3));
foregroundMask = imerode(foregroundMask, strel('square', 3));
% 检测轮廓
contours = bwboundaries(foregroundMask, 'noholes');
% 显示检测结果
imshow(frame);
hold on;
for i = 1:length(contours)
contour = contours{i};
plot(contour(:, 2), contour(:, 1), 'r', 'LineWidth', 2);
end
hold off;
% 播放视频
step(videoPlayer, frame);
% 中断条件
if frameCount > 500
break;
end
end
release(videoPlayer);