Обнаружьте объекты с помощью детектора глубокого обучения Faster R-CNN
fasterRCNNObjectDetector
объект обнаруживает объекты от изображения, с помощью Faster R-CNN (области с нейронными сетями свертки) детектор объектов. Чтобы обнаружить объекты в изображении, передайте обученный детектор detect
функция.
При использовании detect
функция, использование CUDA® включило NVIDIA®, графический процессор с вычисляет возможность 3.0, или выше настоятельно рекомендован. Графический процессор значительно уменьшает время вычисления. Использование графического процессора требует Parallel Computing Toolbox™.
Создайте fasterRCNNObjectDetector
объект путем вызова trainFasterRCNNObjectDetector
функция с обучающими данными (требует Deep Learning Toolbox™).
detector = trainFasterRCNNObjectDetector(trainingData,...)
ModelName
— Имя модели классификацииЭто свойство доступно только для чтения.
Имя модели классификации в виде вектора символов или строкового скаляра. По умолчанию имя определяется к заголовку второго столбца trainingData
таблица, заданная в trainFasterRCNNObjectDetector
функция. Можно изменить это имя после создания fasterRCNNObjectDetector
объект.
Network
— Обученная сеть обнаружения объектов Fast R-CNN.DAGNetwork
объектЭто свойство доступно только для чтения.
Обученная сеть обнаружения объектов Fast R-CNN. в виде DAGNetwork
Объект (Deep Learning Toolbox). Это объектно-ориентированная память слои, которые задают сверточную нейронную сеть, используемую в детекторе Faster R-CNN.
AnchorBoxes
— Размер полей привязкиЭто свойство доступно только для чтения.
Размер полей привязки в виде M-by-2 матрица, где каждая строка находится в формате [height width]. Это значение установлено во время обучения.
ClassNames
— Имена класса объектаЭто свойство доступно только для чтения.
Имена классов объектов, которые детектор Faster R-CNN был обучен найти в виде массива ячеек. Это свойство установлено trainingData
входной параметр для trainFasterRCNNObjectDetector
функция. Задайте имена классов как часть trainingData
таблица.
MinObjectSize
— Минимальный размер объекта поддержанЭто свойство доступно только для чтения.
Минимальный размер объекта поддержан сетью Faster R-CNN в виде [height width] вектор. Минимальный размер зависит от сетевой архитектуры.
detect | Обнаружьте объекты с помощью детектора объектов Faster R-CNN |
В этом примере показано, как обучить Faster R-CNN (области со сверточными нейронными сетями) детектор объектов.
Глубокое обучение является мощным методом машинного обучения, который можно использовать, чтобы обучить устойчивые детекторы объектов. Несколько методов глубокого обучения для обнаружения объектов существуют, включая Faster R-CNN и вы только смотрите однажды (YOLO) v2. Этот пример обучает детектор транспортного средства Faster R-CNN с помощью trainFasterRCNNObjectDetector
функция. Для получения дополнительной информации смотрите, что Обнаружение объектов использует Глубокое обучение.
Загрузите предварительно обученный детектор
Загрузите предварительно обученный детектор, чтобы избежать необходимости ожидать обучения завершиться. Если вы хотите обучить детектор, установите doTrainingAndEval
переменная к истине.
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 изображений. Каждое изображение содержит один или два помеченных экземпляра транспортного средства. Маленький набор данных полезен для исследования метода обучения Faster R-CNN, но на практике, более помеченные изображения необходимы, чтобы обучить устойчивый детектор. Разархивируйте изображения транспортного средства и загрузите достоверные данные транспортного средства.
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)
Создайте сеть обнаружения Faster R-CNN
Сеть обнаружения объектов Faster R-CNN состоит из сети извлечения признаков, сопровождаемой двумя подсетями. Сеть извлечения признаков обычно является предварительно обученным CNN, таким как ResNet-50 или Начало v3. Первая подсеть после сети извлечения признаков является сетью предложения по области (RPN), обученной сгенерировать объектные предложения - области в изображении, где объекты, вероятно, будут существовать. Вторая подсеть обучена предсказать фактический класс каждого объектного предложения.
Сеть извлечения признаков обычно является предварительно обученным CNN (для получения дополнительной информации смотрите Предварительно обученные Глубокие нейронные сети (Deep Learning Toolbox)). Этот пример использует ResNet-50 для извлечения признаков. Можно также использовать другие предварительно обученные сети, такие как MobileNet v2 или ResNet-18, в зависимости от требований к приложению.
Используйте fasterRCNNLayers
автоматически создавать сеть Faster R-CNN, учитывая предварительно обученную сеть извлечения признаков. fasterRCNNLayers
требует, чтобы вы задали несколько входных параметров, которые параметрируют сеть Faster R-CNN:
Сетевой входной размер
Поля привязки
Сеть извлечения признаков
Во-первых, задайте сетевой входной размер. При выборе сетевого входного размера считайте минимальный размер требуемым запустить саму сеть, размер учебных изображений и вычислительную стоимость, понесенную путем обработки данных в выбранном размере. Когда это возможно, выберите размер входного сигнала сети, который близок к размеру обучающего изображения и больше, чем размер входного сигнала, необходимый для сети. Чтобы уменьшить вычислительные затраты на выполнение примера, укажите размер входного сигнала сети [224 224 3], который является минимальным размером, необходимым для запуска сети.
inputSize = [224 224 3];
Обратите внимание на то, что учебные изображения, используемые в этом примере, больше, чем 224 224 и отличаются по размеру, таким образом, необходимо изменить размер изображений на шаге предварительной обработки до обучения.
Затем используйте estimateAnchorBoxes
оценить поля привязки на основе размера объектов в обучающих данных. С учетом изменения размеров изображений до обучения измените размер обучающих данных для оценки полей привязки. Используйте transform
чтобы предварительно обработать обучающие данные, затем задайте количество полей привязки и оцените поля привязки.
preprocessedTrainingData = transform(trainingData, @(data)preprocessData(data,inputSize)); numAnchors = 3; anchorBoxes = estimateAnchorBoxes(preprocessedTrainingData,numAnchors)
anchorBoxes = 3×2
136 119
55 48
157 128
Для получения дополнительной информации о выборе полей привязки, seeEstimate Поля Привязки От Обучающих данных (Computer Vision Toolbox™) и Поля Привязки для Обнаружения объектов.
Теперь используйте resnet50
загружать предварительно обученную модель ResNet-50.
featureExtractionNetwork = resnet50;
Выберите 'activation_40_relu'
как слой извлечения признаков. Этот слой извлечения объектов выводит карты объектов, которые уменьшены в 16 раз. Такое количество понижающей дискретизации является хорошим компромиссом между пространственным разрешением и силой извлеченных объектов, поскольку объекты, извлеченные далее по сети, кодируют более сильные объекты изображения за счет пространственного разрешения. Выбор оптимального слоя выделения признаков требует эмпирического анализа. Можно использовать analyzeNetwork
найти имена других потенциальных слоев извлечения признаков в сети.
featureLayer = 'activation_40_relu';
Задайте количество классов, чтобы обнаружить.
numClasses = width(vehicleDataset)-1;
Создайте сеть обнаружения объектов Faster R-CNN.
lgraph = fasterRCNNLayers(inputSize,numClasses,anchorBoxes,featureExtractionNetwork,featureLayer);
Можно визуализировать сеть с помощью analyzeNetwork
или Deep Network Designer от Deep Learning Toolbox™.
Если больше управления требуется по архитектуре сети Faster R-CNN, используйте Deep Network Designer, чтобы спроектировать сеть обнаружения Faster R-CNN вручную. Для получения дополнительной информации смотрите Начало работы с R-CNN, Быстрым R-CNN и Faster R-CNN.
Увеличение данных
Увеличение данных используется, чтобы улучшить сетевую точность путем случайного преобразования исходных данных во время обучения. При помощи увеличения данных можно добавить больше разнообразия в обучающие данные, на самом деле не имея необходимость увеличить число помеченных обучающих выборок.
Используйте 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)
Обучите Faster R-CNN
Используйте trainingOptions
задавать сетевые опции обучения. Установите 'ValidationData'
к предварительно обработанным данным о валидации. Установите 'CheckpointPath'
к временному местоположению. Это включает сохранение частично обученных детекторов во время учебного процесса. Если обучение прервано, такой как отключением электроэнергии или системным отказом, можно возобновить обучение с сохраненной контрольной точки.
options = trainingOptions('sgdm',... 'MaxEpochs',10,... 'MiniBatchSize',2,... 'InitialLearnRate',1e-3,... 'CheckpointPath',tempdir,... 'ValidationData',validationData);
Используйте trainFasterRCNNObjectDetector
обучать детектор объектов Faster R-CNN если doTrainingAndEval
верно. В противном случае загрузите предварительно обученную сеть.
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
Этот пример был проверен на графическом процессоре Nvidia(TM) Titan X с 12 Гбайт памяти. Обучение сети заняло приблизительно 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)
Оцените детектор Используя набор тестов
Оцените обученный детектор объектов на большом наборе изображений, чтобы измерить уровень. Computer Vision Toolbox™ обеспечивает функции оценки детектора объектов, чтобы измерить общие метрики, такие как средняя точность (evaluateDetectionPrecision
) и средние журналом коэффициенты непопаданий (evaluateDetectionMissRate
). В данном примере используйте среднюю метрику точности, чтобы оценить эффективность. Средняя точность обеспечивает один номер, который включает способность детектора сделать правильные классификации (точность) и способность детектора найти все соответствующие объекты (отзыв).
Примените к тестовым данным то же преобразование предварительной обработки, что и к обучающим данным.
testData = transform(testData,@(data)preprocessData(data,inputSize));
Запустите детектор на всех тестовых изображениях.
if doTrainingAndEval detectionResults = detect(detector,testData,'MinibatchSize',4); else % Load pretrained detector for the example. pretrained = load('fasterRCNNResNet50EndToEndVehicleExample.mat'); detectionResults = pretrained.detectionResults; end
Оцените детектор объектов с помощью средней метрики точности.
[ap, recall, precision] = evaluateDetectionPrecision(detectionResults,testData);
Точность/отзыв (PR), который подсвечивает кривая, насколько точный детектор на различных уровнях отзыва. Идеальная точность 1 на всех уровнях отзыва. Использование большего количества данных может помочь улучшить среднюю точность, но может потребовать большего количества учебного времени. Постройте кривую PR.
figure plot(recall,precision) xlabel('Recall') ylabel('Precision') grid on title(sprintf('Average Precision = %.2f', ap))
Вспомогательные Функции
function data = augmentData(data) % Randomly flip images and bounding boxes horizontally. tform = randomAffine2d('XReflection',true); rout = affineOutputView(size(data{1}),tform); data{1} = imwarp(data{1},tform,'OutputView',rout); data{2} = bboxwarp(data{2},tform,rout); end function data = preprocessData(data,targetSize) % Resize image and bounding boxes to targetSize. scale = targetSize(1:2)./size(data{1},[1 2]); data{1} = imresize(data{1},targetSize(1:2)); data{2} = bboxresize(data{2},scale); end
Ссылки
[1] Жэнь, S. K. Он, Р. Джершик и Дж. Сун. "Faster R-CNN: К Обнаружению объектов В реальном времени с Сетями Предложения по области". Транзакции IEEE Анализа Шаблона и Искусственного интеллекта. Издание 39, Выпуск 6, июнь 2017, стр 1137-1149.
[2] Girshick, R., Дж. Донахью, Т. Даррелл и Дж. Малик. "Богатые Иерархии Функции для Точного Обнаружения объектов и Семантической Сегментации". Продолжения 2 014 Конференций по IEEE по Компьютерному зрению и Распознаванию образов. Колумбус, OH, июнь 2014, стр 580-587.
[3] Girshick, R. "Быстрый R-CNN". Продолжения 2 015 Международных конференций IEEE по вопросам Компьютерного зрения. Сантьяго, Чили, декабрь 2015, стр 1440-1448.
[4] Zitnick, C. L. и P. Доллар. "Поля ребра: Определение местоположения Объектных Предложений от Ребер". Европейская Конференция по Компьютерному зрению. Цюрих, Швейцария, сентябрь 2014, стр 391-405.
[5] Уиджлингс, J. R. R. К. Э. А. ван де Сэйнд, Т. Джеверс и А. В. М. Смеулдерс. "Выборочный Поиск Алгоритма распознавания". Международный журнал Компьютерного зрения. Издание 104, Номер 2, сентябрь 2013, стр 154-171.
selectStrongestBboxMulticlass
| trainACFObjectDetector
| trainFasterRCNNObjectDetector
| trainFastRCNNObjectDetector
| SeriesNetwork
(Deep Learning Toolbox) | trainNetwork
(Deep Learning Toolbox)У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.