1.算法仿真效果
matlab2022a仿真结果如下:
CNN训练结果
GA优化之后的CNN训练结果
GA优化过程得到的均值收敛过程
CNN与GA优化CNN的识别率对比
本课题采用的数据库如下:
2.算法涉及理论知识概要
基于GA-CNN遗传优化卷积神经网络的手势识别算法是一种结合了遗传算法(GA)和卷积神经网络(CNN)的深度学习算法,用于手势识别任务。该算法利用遗传算法优化卷积神经网络的参数,以提高手势识别的准确率和鲁棒性。
手势识别是指通过分析手势图像或视频,识别出人的手势动作。随着深度学习技术的不断发展,卷积神经网络已成为手势识别领域的一种主流方法。然而,传统的卷积神经网络方法通常需要大量的标注数据进行训练,且易受光照、角度、遮挡等因素的干扰。为了解决这些问题,研究者们提出了基于遗传算法的卷积神经网络优化方法。
GA-CNN算法的基本思想是将遗传算法与卷积神经网络相结合,利用遗传算法搜索最优的网络参数,以获得更好的手势识别性能。具体而言,GA-CNN算法包括两个阶段:遗传算法优化阶段和卷积神经网络分类阶段。
2.1遗传算法优化阶段
遗传算法是一种基于生物进化原理的优化算法,通过模拟生物进化过程中的选择、交叉、变异等操作,搜索最优解。在GA-CNN算法中,遗传算法用于优化卷积神经网络的参数,包括卷积核大小、步长、池化大小等。以下是遗传算法优化的基本公式:
(1) 选择操作:以适应度函数为依据,选择出适应度较高的个体组成下一代种群。适应度函数通常为分类准确率或损失函数的倒数。
(2) 交叉操作:以一定的交叉概率对选出的个体进行交叉操作,产生新的个体。常见的交叉操作包括点交叉、均匀交叉等。
(3) 变异操作:以一定的变异概率对个体进行变异操作,引入新的基因组合。常见的变异操作包括随机插入、随机删除等。
通过不断迭代选择、交叉、变异操作,遗传算法可以逐渐搜索到最优的网络参数。
2.2 卷积神经网络分类阶段
卷积神经网络是一种深度学习算法,用于图像分类、目标检测等任务。在GA-CNN算法中,卷积神经网络用于对手势图像进行分类。以下是卷积神经网络的基本公式:
(1) 卷积操作:通过卷积核将输入图像的局部区域与卷积核进行卷积运算,得到卷积层的输出。常见的卷积操作包括全连接层、卷积层、池化层等。
(2) ReLU激活函数:通过非线性激活函数增加网络的非线性表达能力,常用的激活函数包括ReLU、sigmoid、tanh等。
(3) 池化操作:通过池化函数对卷积层的输出进行下采样,减少计算复杂度,常用的池化函数包括最大池化、平均池化等。
通过多层的卷积、激活、池化操作,卷积神经网络可以对手势图像进行分类。在GA-CNN算法中,我们使用优化后的网络参数进行手势识别任务,以获得更好的分类性能。
基于GA-CNN遗传优化卷积神经网络的手势识别算法是一种结合了遗传算法和卷积神经网络的深度学习算法,用于手势识别任务。该算法利用遗传算法搜索最优的网络参数,以获得更好的手势识别性能。通过不断迭代选择、交叉、变异操作,遗传算法可以逐渐搜索到最优的网络参数。在GA-CNN算法中,我们使用优化后的网络参数进行手势识别任务,以获得更好的分类性能。
3.MATLAB核心程序
while gen < MAXGEN
gen
Pe0 = 0.999;
pe1 = 0.001;
FitnV=ranking(Objv);
Selch=select('sus',Chrom,FitnV);
Selch=recombin('xovsp', Selch,Pe0);
Selch=mut( Selch,pe1);
phen1=bs2rv(Selch,FieldD);
for a=1:1:NIND
X = phen1(a,:);
%计算对应的目标值
[epls] = func_obj(X);
E = epls;
JJ(a,1) = E;
end
Objvsel=(JJ);
[Chrom,Objv]=reins(Chrom,Selch,1,1,Objv,Objvsel);
gen=gen+1;
Error2(gen) = 100-mean(JJ);
end
tt=smooth(Error2,MAXGEN);
figure
plot(tt,'linewidth',2);
grid on
xlabel('迭代次数');
ylabel('遗传算法优化过程');
legend('Average fitness');
[V,I] = min(JJ);
X = phen1(I,:);
Layers = round(X(1));
lr = X(2);
digitDatasetPath = ['images\'];
imds = imageDatastore(digitDatasetPath,'IncludeSubfolders', true, 'LabelSource', 'foldernames');
%划分数据为训练集合验证集,训练集中每个类别包含1张图像,验证集包含其余图像的标签
[imdsTrain, imdsValidation] = splitEachLabel(imds,0.6,'randomized');%
if Layers == 2
%定义卷积神经网络的基础结构
layers = [
imageInputLayer([160 120 1]);%注意,400,150为能量图的大小,不能改
%第1个卷积层
convolution2dLayer(4, 15, 'Padding', 'same');%第一个卷积层
batchNormalizationLayer;
reluLayer;
maxPooling2dLayer(2, 'Stride', 2);
%第2个卷积层
convolution2dLayer(4, 15, 'padding', 'same');
batchNormalizationLayer;
reluLayer;
maxPooling2dLayer(2, 'Stride', 2);
%全连接层
fullyConnectedLayer(5);
%softmax
softmaxLayer;
%输出分类结果
classificationLayer;];
end
if Layers == 3
%定义卷积神经网络的基础结构
layers = [
imageInputLayer([160 120 1]);%注意,400,150为能量图的大小,不能改
%第1个卷积层
convolution2dLayer(4, 15, 'Padding', 'same');%第一个卷积层
batchNormalizationLayer;
reluLayer;
maxPooling2dLayer(2, 'Stride', 2);
%第2个卷积层
convolution2dLayer(4, 15, 'padding', 'same');
batchNormalizationLayer;
reluLayer;
maxPooling2dLayer(2, 'Stride', 2);
%第3个卷积层
convolution2dLayer(4, 15, 'padding', 'same');
batchNormalizationLayer;
reluLayer;
maxPooling2dLayer(2, 'Stride', 2);
%全连接层
fullyConnectedLayer(5);
%softmax
softmaxLayer;
%输出分类结果
classificationLayer;];
end
if Layers == 4
%定义卷积神经网络的基础结构
layers = [
imageInputLayer([160 120 1]);%注意,400,150为能量图的大小,不能改
%第1个卷积层
convolution2dLayer(4, 15, 'Padding', 'same');%第一个卷积层
batchNormalizationLayer;
reluLayer;
maxPooling2dLayer(2, 'Stride', 2);
%第2个卷积层
convolution2dLayer(4, 15, 'padding', 'same');
batchNormalizationLayer;
reluLayer;
maxPooling2dLayer(2, 'Stride', 2);
%第3个卷积层
convolution2dLayer(4, 15, 'padding', 'same');
batchNormalizationLayer;
reluLayer;
maxPooling2dLayer(2, 'Stride', 2);
%第4个卷积层
convolution2dLayer(4, 15, 'padding', 'same');
batchNormalizationLayer;
reluLayer;
maxPooling2dLayer(2, 'Stride', 2);
%全连接层
fullyConnectedLayer(5);
%softmax
softmaxLayer;
%输出分类结果
classificationLayer;];
end
if Layers == 5
%定义卷积神经网络的基础结构
layers = [
imageInputLayer([160 120 1]);%注意,400,150为能量图的大小,不能改
%第1个卷积层
convolution2dLayer(4, 15, 'Padding', 'same');%第一个卷积层
batchNormalizationLayer;
reluLayer;
maxPooling2dLayer(2, 'Stride', 2);
%第2个卷积层
convolution2dLayer(4, 15, 'padding', 'same');
batchNormalizationLayer;
reluLayer;
maxPooling2dLayer(2, 'Stride', 2);
%第3个卷积层
convolution2dLayer(4, 15, 'padding', 'same');
batchNormalizationLayer;
reluLayer;
maxPooling2dLayer(2, 'Stride', 2);
%第4个卷积层
convolution2dLayer(4, 15, 'padding', 'same');
batchNormalizationLayer;
reluLayer;
maxPooling2dLayer(2, 'Stride', 2);
%第5个卷积层
convolution2dLayer(4, 15, 'padding', 'same');
batchNormalizationLayer;
reluLayer;
maxPooling2dLayer(2, 'Stride', 2);
%全连接层
fullyConnectedLayer(5);
%softmax
softmaxLayer;
%输出分类结果
classificationLayer;];
end
%设置训练参数
options = trainingOptions('sgdm', ...
'InitialLearnRate', lr, ...
'MaxEpochs', 1000, ...
'Shuffle', 'every-epoch', ...
'ValidationData', imdsValidation, ...
'ValidationFrequency', 10, ...
'Verbose', false, ...
'Plots', 'training-progress');
rng(1)
%使用训练集训练网络
net = trainNetwork(imdsTrain, layers, options);
%对验证图像进行分类并计算精度
YPred = classify(net, imdsValidation);
YValidation = imdsValidation.Labels;
accuracy = 100*sum(YPred == YValidation) / numel(YValidation);
save R2.mat accuracy tt Layers lr