✅ 博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 具体问题可以私信或扫描文章底部二维码。
(1)随着我国制造工业的迅速发展,对工业零件表面质量的要求越来越高。工业零件表面缺陷的检测逐渐成为计算机视觉领域的研究热点。传统的手工检测方法不仅费时费力,而且容易出现漏检和误检的情况。传统的目标检测技术依赖于人工提取目标特征信息,过程繁琐且效果有限。本文从实际应用场景出发,使用深度学习的目标检测算法,以YOLOv7-tiny为原始模型,并对其进行优化和改进,设计了一种基于GCS_YOLOv7-tiny(GCS: G_ELAN_s Block、CBAM、SiLU)的工业零件表面缺陷检测算法。
首先,本文对现有的缺陷检测技术和基于深度学习的缺陷检测技术进行了调研。传统的缺陷检测技术主要依赖于图像处理方法,如边缘检测、形态学操作等,这些方法需要人工设计特征,且在复杂背景下的表现不佳。而基于深度学习的缺陷检测技术,尤其是卷积神经网络(CNN),能够自动学习特征表示,具有更强的鲁棒性和适应性。本文重点介绍了主流的深度学习缺陷检测方法,包括基于区域建议网络(R-CNN系列)、单阶段检测器(如YOLO系列)和两阶段检测器(如Faster R-CNN)。通过对比分析,指出了不同方法在特征提取和检测性能上的优劣。
为了训练和验证所提出的算法,本文构建了一个包含六种常见缺陷类型的数据集:裂纹(crazing)、夹杂(inclusion)、斑块(patches)、表面麻点(pitted_surface)、氧化轧屑(rolled-in_scale)和划痕(scratches)。每类缺陷初始数据集中包含300张图片,共1800张,图片分辨率为200×200。为了增强数据集的多样性和鲁棒性,本文通过水平翻转、垂直翻转及镜像的方法对原始数据集进行数据增强,最终得到了每类缺陷1200张图片,共计7200张,图片分辨率保持不变。数据增强有助于提高模型的泛化能力,减少过拟合的风险。
(2)本文以YOLOv7-tiny为原始网络模型,设计了GCS_YOLOv7-tiny检测网络。该网络在以下几个方面进行了优化和改进:
轻量化的残差模块(G_ELAN_s Block):通过将Ghost模块、批归一化层(BN层)和SiLU激活函数三部分相结合,设计了轻量化的残差模块G_ELAN_s Block,并替换了原模型中的ELAN_s Block。Ghost模块通过廉价的操作生成更多的特征图,减少了参数数量;BN层提高了模型的收敛速度和稳定性;SiLU激活函数替代了Leaky ReLU,增强了非线性表达能力,从而提升了目标特征信息的提取能力。
加入CBAM注意力机制模块:在原始网络模型主干网络的前两层加入了CBAM注意力机制模块。CBAM是一种通道和空间双重注意力机制,能够自适应地强调重要特征并抑制无关特征,从而提升模型的特征选择能力。通过引入CBAM,模型能够更有效地关注关键区域,提高检测精度。
轻量化的检测头(G_YOLO Hand):在原始网络模型的检测头中,用Ghost模块替换了CBL模块,形成了轻量化的检测头G_YOLO Hand。Ghost模块通过共享权重的方式生成更多的特征图,减少了计算量和内存占用。这使得检测头更加高效,同时保持了较高的检测精度。
激活函数替换:通过将SiLU激活函数替换Leaky ReLU激活函数,进一步提升了目标特征信息的提取能力。SiLU激活函数结合了Sigmoid和ReLU的优点,具有更好的非线性表达能力和梯度传播特性,有助于提高模型的收敛速度和泛化能力。
在本文的数据集上进行了实验,结果表明:本文设计的GCS_YOLOv7-tiny算法不仅将模型大小从11.70MB减小到8.86MB,减小了24.27%,而且在检测精度方面也从86.10%提升到90.50%,提升了4.40%。这说明通过上述优化措施,模型在保持较高检测精度的同时,显著降低了模型的大小,更适合部署在资源受限的设备上。
% 参数设置
num_epochs = 100; % 训练轮数
batch_size = 32; % 批次大小
learning_rate = 0.001; % 学习率
image_size = [200, 200]; % 图像尺寸
num_classes = 6; % 缺陷类别数量
data_dir = 'path/to/dataset'; % 数据集路径
model_path = 'path/to/save/model'; % 模型保存路径
% 加载数据集
imds = imageDatastore(data_dir, 'IncludeSubfolders', true, 'LabelSource', 'foldernames');
[imdsTrain, imdsVal] = splitEachLabel(imds, 0.8, 'randomized');
% 定义数据增强
augmenter = imageDataAugmenter(...
'RandXReflection', true, ...
'RandYReflection', true, ...
'RandRotation', [-10, 10], ...
'RandScale', [0.9, 1.1]);
% 创建增强的数据存储
augimdsTrain = augmentedImageDatastore(image_size, imdsTrain, 'DataAugmentation', augmenter);
augimdsVal = augmentedImageDatastore(image_size, imdsVal);
% 定义YOLOv7-tiny模型
layers = [
imageInputLayer(image_size)
% Backbone
convolution2dLayer(3, 32, 'Padding', 'same')
batchNormalizationLayer
reluLayer
maxPooling2dLayer(2, 'Stride', 2)
convolution2dLayer(3, 64, 'Padding', 'same')
batchNormalizationLayer
reluLayer
maxPooling2dLayer(2, 'Stride', 2)
% CBAM Attention Mechanism
cbamAttentionLayer(64)
% Ghost Module
ghostModule(64, 128)
batchNormalizationLayer
siLULayer
% Detection Head
detectionHeadLayer(num_classes)
% Output Layer
classificationOutputLayer(num_classes, 'Name', 'classification')
];
% 设置训练选项
options = trainingOptions('sgdm', ...
'MaxEpochs', num_epochs, ...
'MiniBatchSize', batch_size, ...
'InitialLearnRate', learning_rate, ...
'Shuffle', 'every-epoch', ...
'Verbose', false, ...
'Plots', 'training-progress');
% 训练模型
net = trainNetwork(augimdsTrain, layers, options);
% 评估模型
YPred = classify(net, augimdsVal);
YTest = imdsVal.Labels;
accuracy = sum(YPred == YTest) / numel(YTest);
disp(['Validation Accuracy: ', num2str(accuracy * 100), '%']);
% 保存模型
save(model_path, 'net');
% 部署模型到Jetson Nano
jetsonModelPath = 'path/to/jetson/model';
save(jetsonModelPath, 'net');
% 使用TensorRT进行优化
trtModel = importONNXModel(jetsonModelPath, 'OutputLayerType', 'Classification');
trtModel = build(trtModel, 'DataType', 'fp16');
save('path/to/optimized/model', 'trtModel');
% 评估优化后的模型
YPredOptimized = classify(trtModel, augimdsVal);
accuracyOptimized = sum(YPredOptimized == YTest) / numel(YTest);
disp(['Optimized Validation Accuracy: ', num2str(accuracyOptimized * 100), '%']);