%构建CNN网络
%输入层,最小检测对象设置为540*960
inputLayer = imageInputLayer([10 10 3]);
%中间层
%定义卷基层参数
filterSize = [3 3];
numFilters =32;
middleLayers = [
%第一轮,只包含CNN和ReLU
convolution2dLayer(filterSize,numFilters,'Padding',1)
reluLayer()
%第二轮,包含CNN、ReLU和Pooling
convolution2dLayer(filterSize,numFilters,'Padding',1)
reluLayer()
maxPooling2dLayer(3,'Stride',2)
];
%输出层
finalLayers = [
%新增一个包含64个输出的全连接层
fullyConnectedLayer(64)
%新增一个非线性ReLU层
reluLayer()
%新增一个2个输出的全连接层,用于判断图像是否半酣检测对象
fullyConnectedLayer(2)
%添加softmax和classification层
softmaxLayer()
classificationLayer()
];
%组合所有层
layers=[
inputLayer
middleLayers
finalLayers
];
%%训练CNN网络
%将数据划分两部分
%前60%数据用于训练,后面40%用于测试
ind = round(size(data1,1)*0.6);
trainData = data1(1:ind,:);
testData = data1(ind+1:end,:);
%训练过程包括4步,每步可以使用单独的参数,与可以使用同一个参数
options=[
%第1步,Training a Region Proposal Network (RPN)
trainingOptions('sgdm','Maxepochs',10,'InitialLearnRate',1e-5,'CheckpointPath',tempdir)
%第2步,Training a Fast R-CNN Network using the RPN from step1
trainingOptions('sgdm','Maxepochs',10,'InitialLearnRate',1e-5,'CheckpointPath',tempdir)
%第3步,Re-training RPN using weight sharing with Fast R-CNN
trainingOptions('sgdm','Maxepochs',10,'InitialLearnRate',1e-6,'CheckpointPath',tempdir)
%第4步,Re-training Fast R-CNN using updated RPN
trainingOptions('sgdm','Maxepochs',10,'InitialLearnRate',1e-6,'CheckpointPath',tempdir)
];
%设置模型的本地存储
doTrainingAndEval = 1;
if doTrainingAndEval
%训练R-CNN神经网络,神经网络工具箱提供了3个函数
%(1)trainRCNNObjectDetector,训练快且检测满,允许指定proposaFcn
%(2)trainFastRCNNObjectDetector,速度较快,允许指定proposaFcn
%(3)trainFasterRCNNObjectDetector,优化运行性能,不需要指定proposaFcn
detector = trainFasterRCNNObjectDetector(trainData,layers,options,...
'NegativeOverlapRange',[0 0.3],...
'PositiveOverlapRange',[0.6 1],...
'BoxPyramidScale',1.2);
else
%加载已经训练好的神经网络
detector = data.detector;
end