
✅ 博主简介:擅长数据处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 具体问题可以私信或扫描文章底部二维码。
(1)城市有轨电车作为公共交通运输体系的重要组成部分,因其环保、舒适和成本低等特点,在我国大中型城市的主干道路上得到了广泛应用。然而,由于驾驶员可能受到视觉盲区、注意力分散以及突发情况的影响,难以及时准确地观察轨道前方的障碍物信息,特别是行人和动物等移动障碍物,这可能导致交通事故的发生,严重影响行车安全。近年来,基于深度学习的目标检测技术如SSD(Single Shot MultiBox Detector)算法取得了显著进展,为有轨电车前方轨道障碍物检测提供了新的解决方案。
针对SSD算法在检测轨道障碍物时精度不高的问题,本文提出了基于改进SSD的电车轨道障碍物检测算法。首先,在原有SSD框架的基础上,设计了低层特征层语义强化模块,通过引入额外的卷积层来丰富低层特征图的语义信息,从而提高对小目标和细节特征的识别能力。其次,为了减少高层特征层边缘信息的丢失,设计了双阶段反卷积模块,该模块通过两次上采样操作恢复图像的空间分辨率,同时保留重要的边缘信息。此外,添加了自适应注意力机制模块,该模块能够根据输入图像的不同部分自动调整权重,有效降低复杂背景对检测精度的干扰。最后,引入了深度可分离卷积替换VGG16网络中的所有3×3卷积核,以减少计算量并提高检测速度。经过自制数据集的测试表明,执行这些改进操作后的SSD算法比传统SSD的mAP提高了0.68%,显著提升了对轨道障碍物的检测精度。
(2)除了提高检测精度外,本文还关注到SSD算法预设先验框与实际轨道障碍物匹配度不高的问题。为了解决这一问题,本文提出了一种基于k-means聚类的先验框优化方法。具体来说,首先使用k-means算法对PASCAL VOC数据集中真实目标的大小分布进行聚类分析,计算出先验框大小设置与真实目标大小分布之间的线性系数。然后,将这个线性系数应用于自制数据集,通过对自制数据集中真实目标大小分布的聚类分析,并将聚类结果除以线性系数,得到更加适合轨道障碍物检测的先验框大小。另外,利用k-means算法对自制数据集中真实目标的宽高比分布进行聚类分析,将原始宽高比为1:3和3:1的先验框替换为聚类中心的均值,进一步提高了先验框与实际障碍物形状的匹配度。实验结果显示,经过这些改进后,SSD算法在检测轨道障碍物时的mAP提高了1.30%,检测速度也有所提升,达到了0.9f/s。同时,预测框与障碍物真实框之间的匹配度变得更高,使得检测结果更加准确。
(3)为了验证改进SSD算法的有效性和实用性,本文构建了一个自制的城市电车轨道障碍物数据集,并利用该数据集对改进后的SSD算法进行了训练和测试。经过充分的训练和调优,改进SSD算法在该数据集上的mAP达到了82.07%,FPS达到了25.2f/s。与Faster-RCNN、YOLO-V3、SSD和FSSD四种主流目标检测算法相比,改进SSD算法在检测轨道障碍物方面表现出最高的精度。特别是在保持较高检测速度的同时,改进SSD算法在检测精度上明显优于传统的SSD算法。这意味着改进SSD算法不仅能够更准确地检测轨道上的障碍物,还能实时处理图像数据,满足有轨电车运行过程中的实时监控需求。
addpath('ssd-vision');
addpath('utils');
% 参数设置
dataDir = 'path/to/your/dataset'; % 数据集路径
modelPath = 'path/to/your/model'; % 模型路径
classNames = {'obstacle', 'pedestrian', 'animal'}; % 类别名称
inputSize = [300, 300]; % 输入图像尺寸
batchSize = 4; % 批处理大小
numEpochs = 50; % 训练轮数
learningRate = 1e-3; % 学习率
% 加载数据集
[trainData, valData] = loadDataset(dataDir, classNames, inputSize);
% 创建数据读取器
trainReader = imageDatastore(trainData);
valReader = imageDatastore(valData);
% 定义SSD模型
net = ssdNet(inputSize, classNames, 'AnchorBoxes', 'auto', ...
'FeatureLayerNames', {'conv4_3', 'fc7'}, ...
'UseDepthwiseSeparableConv', true, ...
'AttentionModule', true, ...
'SemanticEnhancementModule', true, ...
'DeconvolutionModule', true);
% 设置训练参数
options = trainingOptions('sgdm', ...
'InitialLearnRate', learningRate, ...
'MaxEpochs', numEpochs, ...
'MiniBatchSize', batchSize, ...
'ValidationData', valReader, ...
'ValidationFrequency', 10, ...
'Verbose', false, ...
'Plots', 'training-progress');
% 训练模型
[trainedNet, info] = trainNetwork(trainReader, net, options);
% 保存训练好的模型
save(trainedNet, modelPath);
% 加载训练好的模型
trainedNet = load(modelPath);
% 准备测试数据
testImage = imread('path/to/test/image.jpg'); % 测试图像路径
testImage = imresize(testImage, inputSize); % 调整图像尺寸
testImage = single(testImage) / 255; % 归一化
testImage = permute(testImage, [3, 1, 2]); % 调整维度顺序
testImage = testImage - mean(testImage(:)); % 中心化
testImage = cat(4, testImage, testImage, testImage, testImage); % 构造批处理
% 进行检测
[bboxes, scores, labels] = detect(trainedNet, testImage, 'Threshold', 0.5);
% 显示检测结果
figure;
imshow(testImage(:, :, 1, 1));
hold on;
for i = 1:length(bboxes)
rectangle('Position', bboxes{i}, 'EdgeColor', 'r', 'LineWidth', 2);
text(bboxes{i}(1), bboxes{i}(2) - 10, sprintf('%s: %.2f', char(labels(i)), scores(i)), ...
'Color', 'r', 'FontSize', 10, 'FontWeight', 'bold');
end
title('Detection Results');
hold off;
% 辅助函数定义
function [trainData, valData] = loadDataset(dataDir, classNames, inputSize)
% 加载数据集
% dataDir: 数据集路径
% classNames: 类别名称
% inputSize: 输入图像尺寸
% 读取图像文件
imageFiles = fullfile(dataDir, '*.jpg');
images = imageDatastore(imageFiles, 'LabelSource', 'foldernames');
% 分割训练集和验证集
[trainImages, valImages] = splitEachLabel(images, 0.8, 'randomized');
% 数据增强
augTrain = imageDataAugmenter('RandXReflection', true, ...
'RandYReflection', true, ...
'RandRotation', [-10, 10], ...
'RandScale', [0.8, 1.2]);
% 创建数据读取器
trainData = augmentedImageDatastore(inputSize, trainImages, 'DataAugmentation', augTrain);
valData = augmentedImageDatastore(inputSize, valImages);
end
function [bboxes, scores, labels] = detect(net, img, varargin)
% 使用训练好的模型进行检测
% net: 训练好的模型
% img: 输入图像
% varargin: 其他参数(如阈值)
% 预测
predictions = predict(net, img);
% 解析预测结果
[bboxes, scores, labels] = parsePredictions(predictions, varargin{:});
end
function [bboxes, scores, labels] = parsePredictions(predictions, threshold)
% 解析预测结果
% predictions: 预测输出
% threshold: 置信度阈值
% 提取边界框、分数和标签
bboxes = cellfun(@(x) x{1}, predictions.BoundingBoxes, 'UniformOutput', false);
scores = cellfun(@(x) x{1}, predictions.Scores, 'UniformOutput', false);
labels = cellfun(@(x) x{1}, predictions.Labels, 'UniformOutput', false);
% 应用阈值
for i = 1:length(scores)
validIdx = scores{i} >= threshold;
bboxes{i} = bboxes{i}(validIdx, :);
scores{i} = scores{i}(validIdx);
labels{i} = labels{i}(validIdx);
end
end

1072





