Примеры Faster R-CNN

Создайте сеть обнаружения объектов R-CNN

В этом примере показано, как изменить предварительно обученную сеть ResNet-50 в сеть обнаружения объектов R-CNN. Сеть, созданная в этом примере, может быть обучена с помощью trainRCNNObjectDetector.

% Load pretrained ResNet-50.
net = resnet50();

% Convert network into a layer graph object to manipulate the layers.
lgraph = layerGraph(net);

Процедура, чтобы преобразовать сеть в сеть R-CNN совпадает с рабочим процессом изучения передачи для классификации изображений. Вы заменяете последние 3 слоя классификации на новые слои, которые могут поддержать количество классов объектов, которые вы хотите обнаружить плюс фоновый класс.

В ResNet-50 последние три слоя называют fc1000, fc1000_softmax, и ClassificationLayer_fc1000. Отобразите сеть и увеличьте масштаб раздела сети, которую вы измените.

figure
plot(lgraph)
ylim([-5 16])

% Remove the the last 3 layers. 
layersToRemove = {
    'fc1000'
    'fc1000_softmax'
    'ClassificationLayer_fc1000'
    };

lgraph = removeLayers(lgraph, layersToRemove);

% Display the results after removing the layers.
figure
plot(lgraph)
ylim([-5 16])

Добавьте новые слои классификации в сеть. Слои являются настройкой, чтобы классифицировать количество объектов, которые сеть должна обнаружить плюс дополнительный фоновый класс. Во время обнаружения, сетевых областей кадрированного изображения процессов и классифицирует их как принадлежащий одним из классов объектов или фона.

% Specify the number of classes the network should classify.
numClassesPlusBackground = 2 + 1;

% Define new classfication layers
newLayers = [
    fullyConnectedLayer(numClassesPlusBackground, 'Name', 'rcnnFC')
    softmaxLayer('Name', 'rcnnSoftmax')
    classificationLayer('Name', 'rcnnClassification')
    ];

% Add new layers
lgraph = addLayers(lgraph, newLayers);

% Connect the new layers to the network. 
lgraph = connectLayers(lgraph, 'avg_pool', 'rcnnFC');

% Display the final R-CNN network. This can be trained using trainRCNNObjectDetector.
figure
plot(lgraph)
ylim([-5 16])

Создайте быструю сеть обнаружения объектов R-CNN

Этот пример полагается на Создать пример Сети Обнаружения объектов R-CNN выше. Это преобразовывает предварительно обученную сеть ResNet-50 в Быструю сеть обнаружения объектов R-CNN путем добавления слоя объединения ROI и слоя регрессии ограничительной рамки. Сеть Fast R-CNN может затем быть обучена с помощью trainFastRCNNObjectDetector.

Создайте сеть R-CNN

Запустите путем создания сети R-CNN, которая формирует основание Быстрого R-CNN. Создать пример Сети Обнаружения объектов R-CNN объясняет этот раздел кода подробно.

% Load pretrained ResNet-50.
net = resnet50;
lgraph = layerGraph(net);

% Remove the the last 3 layers from ResNet-50. 
layersToRemove = {
    'fc1000'
    'fc1000_softmax'
    'ClassificationLayer_fc1000'
    };
lgraph = removeLayers(lgraph, layersToRemove);

% Specify the number of classes the network should classify.
numClasses = 2;
numClassesPlusBackground = numClasses + 1;

% Define new classification layers.
newLayers = [
    fullyConnectedLayer(numClassesPlusBackground, 'Name', 'rcnnFC')
    softmaxLayer('Name', 'rcnnSoftmax')
    classificationLayer('Name', 'rcnnClassification')
    ];

% Add new layers.
lgraph = addLayers(lgraph, newLayers);

% Connect the new layers to the network. 
lgraph = connectLayers(lgraph, 'avg_pool', 'rcnnFC');

Добавьте слой регрессии ограничительной рамки

Добавьте слой регрессии поля, чтобы изучить набор смещений поля, чтобы примениться к полям предложения по области. Изученные смещения преобразовывают поля предложения по области так, чтобы они были ближе к исходной ограничительной рамке основной истины. Это преобразование помогает улучшать производительность локализации Быстрого R-CNN.

Слои регрессии поля состоят из полносвязного слоя, сопровождаемого слоем регрессии поля R-CNN. Полносвязный слой сконфигурирован, чтобы вывести набор 4 смещений поля для каждого класса. Фоновый класс исключен, потому что фоновые ограничительные рамки не усовершенствованы.

% Define the number of outputs of the fully connected layer.
numOutputs = 4 * numClasses;

% Create the box regression layers.
boxRegressionLayers = [
    fullyConnectedLayer(numOutputs,'Name','rcnnBoxFC')
    rcnnBoxRegressionLayer('Name','rcnnBoxDeltas')
    ];

% Add the layers to the network
lgraph = addLayers(lgraph, boxRegressionLayers);

Слои регрессии поля обычно соединяются с тем же слоем, с которым соединяется ветвь классификации.

% Connect the regression layers to the layer named 'avg_pool'.
lgraph = connectLayers(lgraph,'avg_pool','rcnnBoxFC');

% Display the classification and regression branches of Fast R-CNN.
figure
plot(lgraph)
ylim([-5 16])

Добавьте ROI слой объединения Max

Следующий шаг должен выбрать который слой в сети использовать в качестве слоя извлечения признаков. Этот слой будет соединен с ROI, макс. объединяющим слой, который объединит функции классификации объединенных областей. Выбор слоя извлечения признаков требует эмпирической оценки. Для ResNet-50 типичным слоем извлечения признаков является выход 4-го блока сверток, который соответствует слою, названному activation40_relu.

featureExtractionLayer = 'activation_40_relu';

figure
plot(lgraph)
ylim([30 42])

Для того, чтобы вставить ROI, макс. объединяющий слой, сначала отключите слои, присоединенные к слою извлечения признаков: res5a_branch2a и res5a_branch1.

% Disconnect the layers attached to the selected feature extraction layer.
lgraph = disconnectLayers(lgraph, featureExtractionLayer,'res5a_branch2a');
lgraph = disconnectLayers(lgraph, featureExtractionLayer,'res5a_branch1');

% Add ROI max pooling layer.
outputSize = [14 14]
outputSize = 1×2

    14    14

roiPool = roiMaxPooling2dLayer(outputSize,'Name','roiPool');

lgraph = addLayers(lgraph, roiPool);

% Connect feature extraction layer to ROI max pooling layer.
lgraph = connectLayers(lgraph, 'activation_40_relu','roiPool/in');

% Connect the output of ROI max pool to the disconnected layers from above.
lgraph = connectLayers(lgraph, 'roiPool','res5a_branch2a');
lgraph = connectLayers(lgraph, 'roiPool','res5a_branch1');

% Show the result after adding and connecting the ROI max pooling layer.
figure
plot(lgraph)
ylim([30 42])

Наконец, соедините слой входа ROI со вторым входом ROI, макс. объединяющего слой.

% Add ROI input layer.
roiInput = roiInputLayer('Name','roiInput');
lgraph = addLayers(lgraph, roiInput);

% Connect ROI input layer to the 'roi' input of the ROI max pooling layer.
lgraph = connectLayers(lgraph, 'roiInput','roiPool/roi');

% Show the resulting faster adding and connecting the ROI input layer.
figure
plot(lgraph)
ylim([30 42])

Сеть готова быть обученной с помощью trainFastRCNNObjectDetector.

Создайте сеть обнаружения объектов Faster R-CNN

Этот пример полагается на Создавание Быстрого примера Сети Обнаружения объектов R-CNN выше. Это преобразовывает предварительно обученную сеть ResNet-50 в сеть обнаружения объектов Faster R-CNN путем добавления слоя объединения ROI, слоя регрессии ограничительной рамки и сети предложения по области (RPN). Сеть Faster R-CNN может затем быть обучена с помощью trainFasterRCNNObjectDetector.

Создайте быструю сеть R-CNN

Запустите путем создания Быстрого R-CNN, который формирует основание Faster R-CNN. Создавание Быстрого примера Сети Обнаружения объектов R-CNN объясняет этот раздел кода подробно.

% Load a pretrained ResNet-50.
net = resnet50;
lgraph = layerGraph(net);

% Remove the last 3 layers. 
layersToRemove = {
    'fc1000'
    'fc1000_softmax'
    'ClassificationLayer_fc1000'
    };
lgraph = removeLayers(lgraph, layersToRemove);

% Specify the number of classes the network should classify.
numClasses = 2;
numClassesPlusBackground = numClasses + 1;

% Define new classification layers.
newLayers = [
    fullyConnectedLayer(numClassesPlusBackground, 'Name', 'rcnnFC')
    softmaxLayer('Name', 'rcnnSoftmax')
    classificationLayer('Name', 'rcnnClassification')
    ];

% Add new object classification layers.
lgraph = addLayers(lgraph, newLayers);

% Connect the new layers to the network. 
lgraph = connectLayers(lgraph, 'avg_pool', 'rcnnFC');

% Define the number of outputs of the fully connected layer.
numOutputs = 4 * numClasses;

% Create the box regression layers.
boxRegressionLayers = [
    fullyConnectedLayer(numOutputs,'Name','rcnnBoxFC')
    rcnnBoxRegressionLayer('Name','rcnnBoxDeltas')
    ];

% Add the layers to the network.
lgraph = addLayers(lgraph, boxRegressionLayers);

% Connect the regression layers to the layer named 'avg_pool'.
lgraph = connectLayers(lgraph,'avg_pool','rcnnBoxFC');

% Select a feature extraction layer.
featureExtractionLayer = 'activation_40_relu';

% Disconnect the layers attached to the selected feature extraction layer.
lgraph = disconnectLayers(lgraph, featureExtractionLayer,'res5a_branch2a');
lgraph = disconnectLayers(lgraph, featureExtractionLayer,'res5a_branch1');

% Add ROI max pooling layer.
outputSize = [14 14];
roiPool = roiMaxPooling2dLayer(outputSize,'Name','roiPool');
lgraph = addLayers(lgraph, roiPool);

% Connect feature extraction layer to ROI max pooling layer.
lgraph = connectLayers(lgraph, featureExtractionLayer,'roiPool/in');

% Connect the output of ROI max pool to the disconnected layers from above.
lgraph = connectLayers(lgraph, 'roiPool','res5a_branch2a');
lgraph = connectLayers(lgraph, 'roiPool','res5a_branch1');

Добавьте Сеть предложения по области (RPN)

Faster R-CNN использует сеть предложения по области (RPN), чтобы сгенерировать предложения по области. RPN производит предложения по области путем предсказания класса, “объекта” или “фона” и смещений поля для набора предопределенных шаблонов ограничительной рамки, известных как "поля привязки". Поля привязки заданы путем обеспечения их размера, который обычно определяется на основе априорного знания шкалы и соотношения сторон объектов в обучающем наборе данных.

Узнайте больше о Полях Привязки для Обнаружения объектов.

Задайте поля привязки и создайте regionProposalLayer.

% Define anchor boxes.
anchorBoxes = [
    16 16
    32 16
    16 32
    ];

% Create the region proposal layer.
proposalLayer = regionProposalLayer(anchorBoxes,'Name','regionProposal');

lgraph = addLayers(lgraph, proposalLayer);

Добавьте слои свертки для RPN и соедините его со слоем извлечения признаков, выбранным выше.

% Number of anchor boxes.
numAnchors = size(anchorBoxes,1);

% Number of feature maps in coming out of the feature extraction layer. 
numFilters = 1024;

rpnLayers = [
    convolution2dLayer(3, numFilters,'padding',[1 1],'Name','rpnConv3x3')
    reluLayer('Name','rpnRelu')
    ];

lgraph = addLayers(lgraph, rpnLayers);

% Connect to RPN to feature extraction layer.
lgraph = connectLayers(lgraph, featureExtractionLayer, 'rpnConv3x3');

Добавьте классификацию RPN выходные слои. Слой классификации классифицирует каждую привязку как "объект" или "фон".

% Add RPN classification layers.
rpnClsLayers = [
    convolution2dLayer(1, numAnchors*2,'Name', 'rpnConv1x1ClsScores')
    rpnSoftmaxLayer('Name', 'rpnSoftmax')
    rpnClassificationLayer('Name','rpnClassification')
    ];
lgraph = addLayers(lgraph, rpnClsLayers);

% Connect the classification layers to the RPN network.
lgraph = connectLayers(lgraph, 'rpnRelu', 'rpnConv1x1ClsScores');

Добавьте регрессию RPN выходные слои. Слой регрессии предсказывает 4 смещения поля для каждого поля привязки.

% Add RPN regression layers.
rpnRegLayers = [
    convolution2dLayer(1, numAnchors*4, 'Name', 'rpnConv1x1BoxDeltas')
    rcnnBoxRegressionLayer('Name', 'rpnBoxDeltas');
    ];

lgraph = addLayers(lgraph, rpnRegLayers);

% Connect the regression layers to the RPN network.
lgraph = connectLayers(lgraph, 'rpnRelu', 'rpnConv1x1BoxDeltas');

Наконец, соедините классификацию, и функция регрессии сопоставляет с входными параметрами слоя предложения по области и слоем объединения ROI к слою предложения по области выход.

% Connect region proposal network.
lgraph = connectLayers(lgraph, 'rpnConv1x1ClsScores', 'regionProposal/scores');
lgraph = connectLayers(lgraph, 'rpnConv1x1BoxDeltas', 'regionProposal/boxDeltas');

% Connect region proposal layer to roi pooling.
lgraph = connectLayers(lgraph, 'regionProposal', 'roiPool/roi');

% Show the network after adding the RPN layers.
figure
plot(lgraph)
ylim([30 42])

Сеть готова быть обученной с помощью trainFasterRCNNObjectDetector.