В этом примере показано, как модифицировать предварительно обученную сеть 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 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. Он преобразует предварительно подготовленную сеть ResNet-50 в сеть обнаружения объектов Fast R-CNN путем добавления уровня объединения ROI и уровня регрессии ограничивающей рамки. Сеть Fast R-CNN может быть обучена с помощью trainFastRCNNObjectDetector.
Создание сети R-CNN
Начните с создания сети R-CNN, которая составляет основу Fast 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');
Добавить слой регрессии ограничивающей рамки
Добавьте слой регрессии прямоугольника, чтобы узнать набор смещений прямоугольника для применения к полям предложений области. Полученные смещения преобразуют поля предложений по областям так, чтобы они были ближе к исходной ограничительной рамке. Это преобразование помогает повысить производительность локализации Fast 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, который будет объединять функции для классификации объединенных областей. Выбор слоя извлечения элемента требует эмпирической оценки. Для ResNet-50 типичным слоем извлечения признаков является выход 4-го блока сверток, который соответствует слою с именем activation40_relu.
featureExtractionLayer = 'activation_40_relu';
figure
plot(lgraph)
ylim([30 42])
Чтобы вставить слой максимального объединения окупаемости инвестиций, сначала отсоедините слои, присоединенные к слою извлечения элементов: 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.
Этот пример основан на приведенном выше примере создания сети быстрого обнаружения объектов R-CNN. Он преобразует предварительно подготовленную сеть ResNet-50 в более быструю сеть обнаружения объектов R-CNN путем добавления уровня объединения ROI, уровня регрессии ограничивающей рамки и сети предложений области (RPN). Более быстрая сеть R-CNN может быть обучена с помощью trainFasterRCNNObjectDetector.
Создание быстрой сети R-CNN
Начните с создания Fast 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)
Более быстрый 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.