基于MATLAB的交通路标识别
最近我在做一个关于交通路标识别的小项目,发现使用MATLAB进行原型开发非常高效。今天,我们将一边编写代码,一边交流如何创建一个能够识别六种常见路标的图形用户界面(GUI)程序。程序的使用非常简单:启动程序、选择图片、自动显示识别结果,操作简便到连幼儿园小朋友都能轻松上手。

整个项目的实现主要分为四个步骤:
- 准备带有标签的路标数据集(我们使用的是德国交通标志基准库的一个子集)
- 利用HOG特征和颜色直方图进行特征提取
- 训练一个多分类的SVM模型
- 使用GUIDE构建一个交互式界面
首先,我们来看看数据准备阶段。假设每种类别的图片都已存储在各自的文件夹中:
imds = imageDatastore('traffic_signs', ...
'IncludeSubfolders',true,...
'LabelSource','foldernames');
通过上述方法可以直接完成数据集的加载,文件夹名称会自动转换为对应的标签,这对于有强迫症的人来说无疑是个福音。
在预处理过程中,我们选择了HSV颜色空间而非传统的RGB空间:
% 读图预处理三板斧
img = imread(filepath);
img = imresize(img,[64 64]); % 统一尺寸
hsv = rgb2hsv(img); % 转HSV颜色空间
为什么选择HSV呢?因为像红色的禁止标志和蓝色的指示牌在HSV空间中更容易进行分割。例如,提取红色区域时,可以采用以下方式:
red_mask = (hsv(:,:,1)>0.95 | hsv(:,:,1)<0.05) & hsv(:,:,2)>0.6;
这种方式相比在RGB空间中的直接分割更加可靠。
接下来是特征提取的部分,这是整个项目的核心:
hog = extractHOGFeatures(img,'CellSize',[8 8]);
color_hist = imhist(img(:,:,1),16)'; % R通道直方图
features = [hog color_hist];
HOG特征用于捕捉图像的形状信息,而颜色直方图则补充了色彩信息。实验表明,这种组合的识别准确率比单独使用HOG提高了12%。需要注意的是,HOG的CellSize不宜设置过小,8x8像素既能保持特征的有效性,又能避免维度过于庞大。
分类器的训练也非常简单,只需两行代码即可完成:
classifier = fitcecoc(trainingFeatures, trainingLabels);
predictedLabels = predict(classifier, testFeatures);
fitcecoc函数内部使用SVM进行一对一分类,实际测试中,在配备i5处理器的笔记本电脑上训练200张图片大约只需要几分钟的时间。想要查看模型的准确率?添加一个混淆矩阵即可:
plotconfusion(testLabels, predictedLabels)
如果混淆矩阵的对角线特别明亮,这意味着分类器的表现相当不错。

GUI的设计是整个项目的灵魂所在。使用GUIDE工具拖拽出一个界面,左侧放置一个axes控件用于显示图片,右侧放置一个ListBox用于展示识别结果。关键的回调函数应该这样编写:
% 选择图片按钮回调
[file, path] = uigetfile({'*.jpg;*.png','图像文件'});
img = preprocessing(imread(fullfile(path,file)));
imshow(img, 'Parent', handles.axes1);
% 识别按钮回调
features = extractFeatures(img);
label = predict(classifier, features);
set(handles.result_list,'String',['识别结果:' char(label)]);
重要的是将预处理和特征提取的函数封装好,这样可以使主程序看起来更加整洁。实际上,在2015款MacBook上识别一张图片大约需要0.8秒,性能勉强可以接受。
当然,在开发过程中也遇到了一些挑战:
- 遇到内存不足的错误?尝试将HOG的CellSize从[4 4]改为[8 8],通常可以立即解决问题。
- 蓝色标志总是被误识别?可以在颜色直方图中加入S通道的统计信息。
- GUI偶尔会卡顿?检查是否在回调函数中遗漏了drawnow命令,以强制刷新界面。
当将完整的项目上传至GitHub后,有学弟询问是否可以识别国内的路标。其实很简单,只需要更换训练集为本地拍摄的图片,然后重新训练模型即可。理论上,只要特征设计得当,即使识别功夫熊猫也不是不可能(虽然有点夸张)。
值得一提的是,从MATLAB 2022a版本开始,它支持自动生成AI模型的代码。因此,将项目中的SVM替换为ResNet只需修改几行代码。但对于这样一个小型项目,传统方法已经足够强大,而且无需显卡加速。

项目代码仓库位于[假装这里有个链接],欢迎自行下载。未来,我们可以尝试使用手机摄像头进行实时识别,那将是一个真正的实战项目。


雷达卡


京公网安备 11010802022788号







