imageSize = [40 80 3]
input = imageInputLayer(imageSize,'Name','InputLayer','Normalization','zerocenter');
layerL=splittingLayerLeftRight('leftSplitter','left')
layerR=splittingLayerLeftRight('rightSplitter','right')
RtwodConvLayer = convolution2dLayer(5, 32, 'Padding', 2, ...
'BiasLearnRateFactor', 2, 'Weights', ones([5 5 1 32]),'Name','rightConv','numChannels',1);
LtwodConvLayer = convolution2dLayer(5, 32, 'Padding', 2, ...
'BiasLearnRateFactor', 2, 'Weights', ones([5 5 1 32]),'Name','leftConv','numChannels',1);
leftCol = [input; layerL;LtwodConvLayer]
rightCol= [layerR;RtwodConvLayer]
numInputs = 2;
cat_dim = 3;
cat_Layer = concatenationLayer(cat_dim,numInputs,'Name','Cat-Layer');
fc1 = fullyConnectedLayer(1024,'Name', 'FC-1');
relu1 = reluLayer('Name','ReLu-FC-1');
dropout1 = dropoutLayer('Name','dropOut-FC-1');
fcWidth=10;
fc = fullyConnectedLayer(fcWidth,'Name', 'FC-out');
rLayer = regressionLayer("Name","regressionoutput");
outputLayers = [ cat_Layer
fc1
relu1
dropout1
fc
rLayer];
layers= layerGraph([leftCol; outputLayers]);
layers= addLayers(layers,rightCol);
layers = connectLayers(layers,'rightConv','Cat-Layer/in2');
layers = connectLayers(layers,'InputLayer','rightSplitter');
tempoutputfolder = tempname;
mkdir(tempoutputfolder)
numImages = 100;
filenames = {};
imDiffs = [];
for i=1:numImages
leftImg = rand(40,40,3)+rand;
rightImg = rand(40,40,3)+rand;
filenames{i} = [tempoutputfolder filesep 'inputImg_' num2str(i) '.png'];
imwrite([leftImg rightImg],filenames{i});
imDiffs(i) = mean(leftImg(:))-mean(rightImg(:));
end
trainData = table(filenames',imDiffs');
MiniBatchSize= 128;
InitialLearnRate= 1e-3;
LearnRateSchedule= 'piecewise';
LearnRateDropFactor= 0.1;
MaxEpochs = 3000;
LearnRateDropPeriod= 1000;
Verbose= true;
ValidationFrequency=100;
Verbose=false;
Plots='training-progress';
options = trainingOptions('sgdm', ...
'MiniBatchSize', MiniBatchSize, ...
'InitialLearnRate', InitialLearnRate, ...
'LearnRateSchedule', LearnRateSchedule, ...
'LearnRateDropFactor', LearnRateDropFactor, ...
'LearnRateDropPeriod', LearnRateDropPeriod, ...
'MaxEpochs', MaxEpochs, ...
'Verbose', Verbose, ...
'Verbose',Verbose,...
'Plots',Plots);
rcnn=trainNetwork(trainData,layers,options)
classdef splittingLayerLeftRight < nnet.layer.Layer
properties
target
end
properties (Learnable)
end
methods
function layer = splittingLayerLeftRight(name,target)
layer.Name = name;
layer.Description = "splittingLayerLeftRight";
layer.target = target;
end
function Z = predict(layer, X)
imWidth = size(X,2);
if rem(imWidth,2)~=0
error('To split an image into two left/right halves it needs to have an even width');
else
imHalf=imWidth/2;
end
switch layer.target
case 'left'
Z = X(:,1:imHalf,1:3);
case 'right'
Z = X(:,imHalf+1:end,1:3);
end
end
end
end