Обнаружение объектов с помощью более быстрого детектора глубокого обучения R-CNN
fasterRCNNObjectDetector объект обнаруживает объекты по изображению, используя детектор объектов Faster R-CNN (области со сверточными нейронными сетями). Чтобы обнаружить объекты на изображении, передайте обученный детектор в detect функция.
При использовании detect настоятельно рекомендуется использовать графический процессор NVIDIA ® с поддержкой CUDA ®. Графический процессор значительно сокращает время вычислений. Для использования графического процессора требуется Toolbox™ параллельных вычислений. Сведения о поддерживаемых вычислительных возможностях см. в разделе Поддержка графического процессора по выпуску (Parallel Computing Toolbox).
Создать fasterRCNNObjectDetector путем вызова trainFasterRCNNObjectDetector функция с данными обучения (требует Toolbox™ глубокого обучения).
detector = trainFasterRCNNObjectDetector(trainingData,...)
ModelName - Наименование классификационной моделиЭто свойство доступно только для чтения.
Имя классификационной модели, указанное как вектор символа или скаляр строки. По умолчанию для имени устанавливается заголовок второго столбца trainingData таблица, указанная в trainFasterRCNNObjectDetector функция. Это имя можно изменить после создания fasterRCNNObjectDetector объект.
Network - Обученная сеть обнаружения объектов Fast R-CNNDAGNetwork объектЭто свойство доступно только для чтения.
Обученная сеть обнаружения объектов Fast R-CNN, указанная как DAGNetwork(Панель инструментов глубокого обучения). Этот объект хранит слои, которые определяют сверточную нейронную сеть, используемую в более быстром детекторе R-CNN.
AnchorBoxes - Размер анкерных коробокЭто свойство доступно только для чтения.
Размер полей привязки, определяемый как матрица M-by-2, где каждая строка имеет формат [ширина высоты ]. Это значение устанавливается во время обучения.
ClassNames - Имена классов объектовЭто свойство доступно только для чтения.
Имена классов объектов, для поиска которых был обучен более быстрый детектор R-CNN, указанные как массив ячеек. Это свойство задается параметром trainingData входной аргумент для trainFasterRCNNObjectDetector функция. Укажите имена классов как часть trainingData таблица.
MinObjectSize - Поддерживается минимальный размер объектаЭто свойство доступно только для чтения.
Минимальный размер объекта, поддерживаемый сетью Faster R-CNN, указанный как вектор [ширина высоты]. Минимальный размер зависит от архитектуры сети.
detect | Обнаружение объектов с помощью более быстрого детектора объектов R-CNN |
В этом примере показано, как обучить детектор объекта Faster R-CNN (области со сверточными нейронными сетями).
Глубокое обучение - это мощный метод машинного обучения, который можно использовать для обучения надежных детекторов объектов. Существует несколько методов глубокого обучения для обнаружения объектов, включая более быстрый R-CNN, и вы смотрите только один раз (YOLO) v2. В этом примере обучается более быстрый детектор транспортного средства R-CNN с помощью trainFasterRCNNObjectDetector функция. Дополнительные сведения см. в разделе Обнаружение объектов.
Загрузить предварительно обученный детектор
Загрузите предварительно обученный детектор, чтобы избежать необходимости ждать завершения обучения. Если вы хотите обучить детектор, установите doTraining переменной true.
doTraining = false; if ~doTraining && ~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 изображений. Многие из этих изображений получены из наборов данных Caltech Cars 1999 и 2001, доступных на веб-сайте Caltech Computational Vision, созданном Пьетро Пероной и используемом с разрешения. Каждое изображение содержит один или два помеченных экземпляра транспортного средства. Небольшой набор данных полезен для изучения процедуры обучения 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)
Создание более быстрой сети обнаружения R-CNN
Более быстрая сеть обнаружения объектов R-CNN состоит из сети извлечения признаков, за которой следуют две подсети. Сеть извлечения функций обычно представляет собой предварительно обученный CNN, например ResNet-50 или Inception v3. Первой подсетью, следующей за сетью извлечения признаков, является сеть предложений области (RPN), обученная генерировать предложения объектов - области на изображении, где объекты, вероятно, существуют. Вторая подсеть обучена предсказывать фактический класс каждого предложения объекта.
Сеть извлечения функций обычно представляет собой предварительно обученный CNN (для получения более подробной информации см. Предварительно обученные нейронные сети (Deep Learning Toolbox)). В этом примере для извлечения элементов используются ResNet-50. Кроме того, в зависимости от требований приложения можно использовать другие предварительно обученные сети, такие как StartNet v2 или ResNet-18.
Использовать fasterRCNNLayers для создания более быстрой сети R-CNN, для которой автоматически предоставляется предварительно подготовленная сеть извлечения функций. fasterRCNNLayers требуется указать несколько входов для параметризации более быстрой сети 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
29 17
46 39
136 116
Дополнительные сведения о выборе полей привязки см. в разделах Оценка полей привязки из данных обучения (Computer Vision Toolbox™) и Поля привязки для обнаружения объектов.
Теперь используйте resnet50 для загрузки предварительно подготовленной модели ResNet-50.
featureExtractionNetwork = resnet50;
Выбрать 'activation_40_relu' в качестве слоя извлечения элементов. Этот слой извлечения элементов выводит карты элементов, которые понижаются в 16 раз. Эта величина понижающей дискретизации является хорошим компромиссом между пространственным разрешением и прочностью выделенных признаков, поскольку признаки, извлеченные далее вниз по сети, кодируют более сильные признаки изображения за счет пространственного разрешения. Выбор оптимального слоя извлечения элементов требует эмпирического анализа. Вы можете использовать analyzeNetwork для поиска имен других потенциальных слоев извлечения элементов в сети.
featureLayer = 'activation_40_relu';Определите количество обнаруживаемых классов.
numClasses = width(vehicleDataset)-1;
Создайте более быструю сеть обнаружения объектов 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 и Более быстрый 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)
Более быстрый поезд R-CNN
Использовать trainingOptions для указания параметров сетевого обучения. Набор 'ValidationData' к предварительно обработанным данным проверки. Набор 'CheckpointPath' во временное место. Это позволяет экономить частично обученные детекторы в процессе обучения. Если обучение прервано, например, из-за отключения питания или сбоя системы, вы можете возобновить обучение с сохраненной контрольной точки.
options = trainingOptions('sgdm',... 'MaxEpochs',10,... 'MiniBatchSize',2,... 'InitialLearnRate',1e-3,... 'CheckpointPath',tempdir,... 'ValidationData',validationData);
Использовать trainFasterRCNNObjectDetector для обучения более быстрого детектора объекта R-CNN, если doTraining является правдой. В противном случае загрузите предварительно подготовленную сеть.
if doTraining % 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{3});
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));
Запустите детектор на всех тестовых изображениях.
detectionResults = detect(detector,testData,'MinibatchSize',4); Вычислите детектор объекта, используя метрику средней точности.
[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); sz = size(data{1}); rout = affineOutputView(sz,tform); data{1} = imwarp(data{1},tform,'OutputView',rout); % Sanitize box data, if needed. data{2} = helperSanitizeBoxes(data{2}, sz); % Warp boxes. data{2} = bboxwarp(data{2},tform,rout); end function data = preprocessData(data,targetSize) % Resize image and bounding boxes to targetSize. sz = size(data{1},[1 2]); scale = targetSize(1:2)./sz; data{1} = imresize(data{1},targetSize(1:2)); % Sanitize box data, if needed. data{2} = helperSanitizeBoxes(data{2}, sz); % Resize boxes. data{2} = bboxresize(data{2},scale); end
Ссылки
[1] Рен, С., К. Он, Р. Гершик и Дж. Сан. «Более быстрое обнаружение объектов R-CNN: на пути к реальному времени с помощью региональных сетей предложений». Транзакции IEEE анализа шаблонов и машинного интеллекта. Том 39, выпуск 6, июнь 2017 г., стр. 1137-1149.
[2] Гиршик, Р., Дж. Донахью, Т. Даррелл и Дж. Малик. «Богатые иерархии элементов для точного обнаружения объектов и семантической сегментации». Материалы Конференции IEEE 2014 года по компьютерному зрению и распознаванию образов. Columbus, OH, июнь 2014, стр. 580-587.
[3] Гиршик, Р. «Быстрый R-CNN». Материалы Международной конференции IEEE 2015 по компьютерному зрению. Сантьяго, Чили, декабрь 2015 года, стр. 1440-1448.
[4] Цитник, К. Л. и П. Доллар. «Поля ребер: поиск предложений объектов из ребер». Европейская конференция по компьютерному зрению. Цюрих, Швейцария, сентябрь 2014 года, стр. 391-405.
[5] Уйлингс, Дж. Р. Р., К. Э. А. ван де Санде, Т. Геверс и А. В. М. Смеулдерс. «Выборочный поиск для распознавания объектов». Международный журнал компьютерного зрения. Том 104, номер 2, сентябрь 2013 г., стр. 154-171.
selectStrongestBboxMulticlass | trainACFObjectDetector | trainFasterRCNNObjectDetector | trainFastRCNNObjectDetector | SeriesNetwork (инструментарий для глубокого обучения) | trainNetwork (инструментарий для глубокого обучения)Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.