Skip to content

stdema/Object-Detection-Using-Faster-R-CNN-Deep-Learning

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 

Repository files navigation

Object-Detection-Using-Faster-R-CNN-Deep-Learning

Faster R-CNN(Regions with Convolutional Neural Networks) 사물 검출기를 훈련시키는 방법을 다룹니다.

사전 훈련된 검출기 다운로드하기

훈련이 완료될 때까지 기다릴 필요가 없도록 사전 훈련된 검출기를 다운로드합니다.

doTrainingAndEval = false;
if ~doTrainingAndEval && ~exist('fasterRCNNResNet50EndToEndVehicleExample.mat','file')
    disp('Downloading pretrained detector (118 MB)...');
    pretrainedURL = 'https://www.mathworks.com/supportfiles/vision/data/fasterRCNNResNet50EndToEndVehicleExample.mat';
    websave('fasterRCNNResNet50EndToEndVehicleExample.mat',pretrainedURL);
end

데이터 세트 불러오기

295개의 영상을 포함하는 규모가 작은 레이블 지정된 데이터셋을 사용합니다. 각 영상에는 차량에 대해 레이블 지정된 건수가 한 건 또는 두 건 있습니다.

unzip vehicleDatasetImages.zip
data = load('vehicleDatasetGroundTruth.mat');
vehicleDataset = data.vehicleDataset;

첫 번째 열은 영상 파일 경로를 포함하고, 두 번째 열은 차량 경계 상자를 포함합니다.

데이터셋을 훈련 세트, 검증 세트, 테스트 세트로 분할합니다. 60%를 훈련용으로, 10%를 검증용으로, 나머지를 훈련된 검출기의 테스트용으로 선택합니다.

rng(0)
shuffledIndices = randperm(height(vehicleDataset));
idx = floor(0.6 * height(vehicleDataset));

trainingIdx = 1:idx;
trainingDataTbl = vehicleDataset(shuffledIndices(trainingIdx),:);

validationIdx = idx+1 : idx + 1 + floor(0.1 * length(shuffledIndices) );
validationDataTbl = vehicleDataset(shuffledIndices(validationIdx),:);

testIdx = validationIdx(end)+1 : length(shuffledIndices);
testDataTbl = vehicleDataset(shuffledIndices(testIdx),:);

imageDatastore와 boxLabelDatastore를 사용하여 훈련과 평가 과정에서 영상 및 레이블 데이터를 불러오기 위한 데이터저장소를 만듭니다.

imdsTrain = imageDatastore(trainingDataTbl{:,'imageFilename'});
bldsTrain = boxLabelDatastore(trainingDataTbl(:,'vehicle'));

imdsValidation = imageDatastore(validationDataTbl{:,'imageFilename'});
bldsValidation = boxLabelDatastore(validationDataTbl(:,'vehicle'));

imdsTest = imageDatastore(testDataTbl{:,'imageFilename'});
bldsTest = boxLabelDatastore(testDataTbl(:,'vehicle'));

영상 데이터저장소와 상자 레이블 데이터저장소를 결합합니다.

trainingData = combine(imdsTrain,bldsTrain);
validationData = combine(imdsValidation,bldsValidation);
testData = combine(imdsTest,bldsTest);

상자 레이블과 함께 훈련 영상 중 하나를 표시합니다.

data = read(trainingData);
I = data{1};
bbox = data{2};
annotatedImage = insertShape(I,'Rectangle',bbox);
annotatedImage = imresize(annotatedImage,2);
figure
imshow(annotatedImage)

화면 캡처 2021-08-28 045011

Faster R-CNN 검출 신경망 만들기

Faster R-CNN 객체 검출 신경망은 하나의 특징 추출 신경망과 그 뒤에 오는 2개의 하위 신경망으로 구성됩니다. 특징 추출에 ResNet-50을 사용합니다. fasterRCNNLayers를 사용하여, 사전 훈련된 특징 추출 신경망이 주어졌을 때 자동으로 Faster R-CNN 신경망을 만듭니다. 먼저 신경망 입력 크기를 지정합니다. 소요되는 계산 비용을 줄이기 위해 신경망을 실행하는 데 필요한 최소 크기인 [224 224 3]으로 신경망 입력 크기를 지정하십시오.

inputSize = [224 224 3];

다음으로, estimateAnchorBoxes를 사용하여 훈련 데이터의 사물 크기를 기반으로 앵커 상자를 추정합니다. transform을 사용하여 훈련 데이터를 전처리한 후에 앵커 상자의 개수를 정의하고 앵커 상자를 추정합니다.

preprocessedTrainingData = transform(trainingData, @(data)preprocessData(data,inputSize));
numAnchors = 3;
anchorBoxes = estimateAnchorBoxes(preprocessedTrainingData,numAnchors)

이제 resnet50을 사용하여 사전 훈련된 ResNet-50 모델을 불러옵니다.

featureExtractionNetwork = resnet50;

'activation_40_relu'를 특징 추출 계층으로 선택합니다.

featureLayer = 'activation_40_relu';

검출할 클래스의 개수를 정의합니다.

numClasses = width(vehicleDataset)-1;

Faster R-CNN 객체 검출 신경망을 만듭니다.

lgraph = fasterRCNNLayers(inputSize,numClasses,anchorBoxes,featureExtractionNetwork,featureLayer);

데이터 증대

transform을 사용하여 영상과 영상에 해당하는 상자 레이블을 가로 방향으로 무작위로 뒤집어서 훈련 데이터를 증대합니다. 동일한 영상을 여러 차례 읽어 들이고 증대된 훈련 데이터를 표시합니다.

augmentedTrainingData = transform(trainingData,@augmentData);
augmentedData = cell(4,1);
for k = 1:4
    data = read(augmentedTrainingData);
    augmentedData{k} = insertShape(data{1},'Rectangle',data{2});
    reset(augmentedTrainingData);
end
figure
montage(augmentedData,'BorderSize',10)

훈련 데이터 전처리하기

증대된 훈련 데이터와 검증 데이터를 전처리하여 훈련에 사용할 수 있도록 준비합니다.

trainingData = transform(augmentedTrainingData,@(data)preprocessData(data,inputSize));
validationData = transform(validationData,@(data)preprocessData(data,inputSize));

영상과 경계 상자를 표시합니다.

data = read(trainingData);
I = data{1};
bbox = data{2};
annotatedImage = insertShape(I,'Rectangle',bbox);
annotatedImage = imresize(annotatedImage,2);
figure
imshow(annotatedImage)

화면 캡처 2021-08-28 054743

Faster R-CNN 훈련시키기

trainingOptions를 사용하여 신경망 훈련 옵션을 지정합니다. 'ValidationData'를 전처리된 검증 데이터로 설정합니다. 'CheckpointPath'를 임시 위치로 설정합니다.

options = trainingOptions('sgdm',...
    'MaxEpochs',10,...
    'MiniBatchSize',2,...
    'InitialLearnRate',1e-3,...
    'CheckpointPath',tempdir,...
    'ValidationData',validationData);

doTrainingAndEval이 true인 경우, trainFasterRCNNObjectDetector를 사용하여 Faster R-CNN 사물 검출기를 훈련시킵니다. 그렇지 않은 경우는 사전 훈련된 신경망을 불러오십시오.

if doTrainingAndEval
    % Train the Faster R-CNN detector.
    % * Adjust NegativeOverlapRange and PositiveOverlapRange to ensure
    %   that training samples tightly overlap with ground truth.
    [detector, info] = trainFasterRCNNObjectDetector(trainingData,lgraph,options, ...
        'NegativeOverlapRange',[0 0.3], ...
        'PositiveOverlapRange',[0.6 1]);
else
    % Load pretrained detector for the example.
    pretrained = load('fasterRCNNResNet50EndToEndVehicleExample.mat');
    detector = pretrained.detector;
end

신경망을 훈련시키는 데는 약 20분정도가 소요됩니다. 짧게 확인해 보려면 하나의 테스트 영상에 대해 검출기를 실행하십시오.

I = imread(testDataTbl.imageFilename{1});
I = imresize(I,inputSize(1:2));
[bboxes,scores] = detect(detector,I);

결과를 표시합니다.

I = insertObjectAnnotation(I,'rectangle',bboxes,scores);
figure
imshow(I)

화면 캡처 2021-08-28 055241

About

Faster R-CNN(Regions with Convolutional Neural Networks) 사물 검출기를 훈련시키는 방법을 다룹니다.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors