Академический Документы
Профессиональный Документы
Культура Документы
ВВЕДЕНИЕ 2
1. ОТ МАШИННОГО ОБУЧЕНИЯ ДО ИИ. МЕТОДЫ
РАСПОЗНАВАНИЯ ОТОБРАЖАЕМЫХ ДАННЫХ ОБЪЕКТА 5
1.1 Пример алгоритма обучения представлению 5
1.2 Решения глубокого обучения 6
1.3 Пример модели глубокого обучения. 7
2. ОБНАРУЖЕНИЕ ОБЪЕКТОВ С ИСПОЛЬЗОВАНИЕМ
ГЛУБОКОГО ОБУЧЕНИЯС МЕТОДАМИ YOLO V2, R-CNN, FASTER R-
CNN 17
2.1 Обнаружение объектов с использованием с методом YOLO v2
глубокого обучения 17
2.2 Pаспoзнавания oбъектoв с пoмoщью глубoкoгo oбучения и R-CNN
25
2.3 Обнаружение объектов с использованием глубокого обучения и
Faster R-CNN. 36
3. ВЫПОЛНЕНИЕ ПРОГРАММЫ 45
3.1 Создание графического интерфейса 45
3.2 Проверка работоспобности программы 47
ЗАКЛЮЧЕНИЕ 53
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 55
ПРИЛОЖЕНИЕ 57
ВВЕДЕНИЕ
0
Глубина - это длина самого длинного пути от входа к выходу, но
зависит от определения того, что составляет возможный вычислительный
шаг. Вычисление, изображенное на этих графиках, является результатом
модели логистической регрессии, σ (wT x), где σ - логистическая
сигмоидальная функция. Если мы используем сложение, умножение и
логистические сигмоиды как элементы нашего компьютерного языка, тогда
эта модель будет иметь три глубины. Если рассматривать логистическую
регрессию как сам элемент, то эта модель имеет глубинную единицу.
Глубокое обучение - это мощный метод машинного обучения, который
можно использовать для обучения надежных детекторов объектов. Данная
работа выполнена в среде разработки MatLab.
Существует несколько методов обнаружения объектов, в том числе R-
CNN, (YOLO) v2 и Faster R-CNN. Каждый метод отличается друг от друга,
скоростью, точностью и обучаемость распознавания.
Разница методов. Люди смотрят на изображение и мгновенно узнают,
какие объекты на нем, где они находятся и как взаимодействуют.
Человеческая зрительная система работает быстро и точно, что позволяет
нам выполнять сложные задачи, такие как вождение, без особых
размышлений. Быстрые и точные алгоритмы обнаружения объектов позволят
компьютерам управлять автомобилями без специализированных датчиков,
позволят вспомогательным устройствам передавать информацию о сцене в
реальном времени пользователям-людям и раскрыть потенциал для
универсальных, отзывчивых роботизированных систем. Современные
системы обнаружения перепрофилируют классификаторы для выполнения
обнаружения. Чтобы обнаружить объект, эти системы берут классификатор
для этого объекта и оценивают его в различных местах и масштабах на
тестовом изображении. Такие системы, как модели деформируемых частей
(DPM), используют подход со скользящим окном, когда классификатор
запускается в равномерно распределенных местах по всему изображению
[11].
Мы мoжем oбучить детектop oбъектoв с пoмoщью глубoкoгo oбучения
и R-CNN (Regions with Convolutional Neural Networks) или же (Oбласти сo
свеpтoчными нейpoнными сетями).
1
Обзор системы обнаружения объектов R-CNN. Cистема (1) принимает
входное изображение, (2) извлекает около 2000 предложений восходящей
области, (3) вычисляет характеристики для каждого предложения, используя
большую сверточную нейронную сеть (CNN), а затем (4) классифицирует
каждую область, используя класс -специфические линейные SVM. R-CNN
достигает средней средней точности (mAP) 53,7% на PASCAL VOC 2010.
Для сравнения, [18] сообщает о 35,1% mAP с использованием тех же
предложений по региону, но с подходом пространственной пирамиды и
набора визуальных слов. Популярные модели деформируемых деталей
работают на 33,4%.
В этом примере показано, как обучить детектор объектов R-CNN
обнаруживать знаки остановки. R-CNN - это структура обнаружения
объектов, которая использует сверточную нейронную сеть (CNN) для
классификации областей изображения внутри изображения [1]. Вместо того,
чтобы классифицировать каждую область с помощью скользящего окна,
детектор R-CNN обрабатывает только те области, которые могут содержать
объект. Это значительно снижает вычислительные затраты, связанные с
запуском CNN.
Чтобы проиллюстрировать, как обучить детектор знаков остановки R-
CNN, в этом примере следует рабочий процесс трансферного обучения,
который обычно используется в приложениях глубокого обучения. При
трансферном обучении сеть, обученная на большой коллекции изображений,
такой как ImageNet [2], используется в качестве отправной точки для
решения новой задачи классификации или обнаружения. Преимущество
использования этого подхода заключается в том, что предварительно
обученная сеть уже изучила богатый набор функций изображения, которые
применимы к широкому диапазону изображений. Это обучение можно
перенести на новую задачу путем точной настройки сети. Сеть настраивается
путем внесения небольших корректировок в веса, так что представления
функций, изученные для исходной задачи, слегка корректируются для
поддержки новой задачи.
CNN предварительно обучается с использованием набора данных
CIFAR-10, который содержит 50 000 обучающих изображений. Затем этот
предварительно обученный CNN настраивается для обнаружения знака
остановки с использованием всего 41 обучающего изображения. Без
предварительной подготовки CNN для обучения детектора знака остановки
потребовалось бы намного больше изображений.
Более поздние подходы, такие как R-CNN, используют методы
предложения области, чтобы сначала создать потенциальные
ограничивающие рамки в изображении, а затем запустить классификатор для
этих предложенных блоков. После классификации используется
постобработка для уточнения ограничивающих рамок, устранения
повторяющихся обнаружений и повторной оценки рамок на основе других
объектов в сцене [17]. Эти сложные конвейеры медленные и трудные для
2
оптимизации, потому что каждый отдельный компонент необходимо обучать
отдельно.
Метод “Ты смотришь только раз” или же “You only look once” (YOLO)
вы смотрите на изображение, чтобы предсказать, какие объекты
присутствуют и где они находятся. YOLO удивительно прост: см. Рис. 3.
Одна сверточная сеть одновременно предсказывает несколько
ограничивающих прямоугольников и вероятности классов для этих
прямоугольников. YOLO обучается на полных изображениях и напрямую
оптимизирует эффективность обнаружения [4]. Система объединяет
отдельные компоненты обнаружения объектов в единую нейронную сеть.
Сеть использует функции всего изображения для прогнозирования каждой
ограничивающей рамки. Он также прогнозирует все ограничивающие рамки
для всех классов изображения одновременно. Это означает, что наша сеть
глобально рассуждает о полном изображении и всех объектах на
изображении. Конструкция YOLO обеспечивает непрерывное обучение и
скорость в реальном времени при сохранении высокой средней точности.
Система делит входное изображение на сетку S × S. Если центр объекта
попадает в ячейку сетки, эта ячейка сетки отвечает за обнаружение этого
объекта.
Каждая ячейка сетки предсказывает B ограничивающих
прямоугольников и оценки достоверности для этих прямоугольников. Эти
показатели достоверности отражают, насколько уверена модель в том, что
область содержит объект, а также насколько точна, по ее мнению, область,
которую она предсказывает. Формально мы определяем доверие как Pr
(Object) ∗ IOUpred true. Если в этой ячейке нет объекта, оценка
достоверности должна быть равна нулю. В противном случае мы хотим,
чтобы показатель достоверности равнялся пересечению по объединению
(IOU) между предсказанным прямоугольником и основной истиной.
Каждая ограничивающая рамка состоит из 5 прогнозов: x, y, w, h и
достоверность. Координаты (x, y) представляют центр прямоугольника
относительно границ ячейки сетки. Ширина и высота прогнозируются
относительно всего изображения. Наконец, доверительный прогноз
представляет собой долговую расписку между предсказанным блоком и
любым наземным блоком истины.
Каждая ячейка сетки также предсказывает вероятности условного
класса C, Pr (Classi |Object). Эти вероятности обусловлены ячейкой сетки,
содержащей объект. Мы прогнозируем только один набор вероятностей
классов на ячейку сетки, независимо от количества блоков B. Во время
тестирования мы умножаем условные вероятности классов и прогнозы
уверенности отдельных блоков, что дает нам оценки достоверности для
каждого класса. Эти оценки кодируют как вероятность появления этого
класса в поле, так и то, насколько хорошо предсказанное поле соответствует
объекту.
3
Рисунок 4. Вероятность появления класса в поле
4
Задать прямоугольные метки видимых областей (ROI), метки ROI
ломаной линии, пиксельные метки ROI и метки сцены. Использовать эти
метки, чтобы интерактивно помечать достоверные данные.
Использовать встроенные алгоритмы обнаружения или отслеживания,
чтобы пометить ваши достоверные данные.
Записать, импортировать и использовать свои собственные алгоритмы
автоматизации, чтобы автоматически пометить основную истину.
Оценить производительность своих алгоритмов автоматизации метки с
помощью визуальных сводных данных. Сводные данные Вида на море Меток
Основной истины.
Экспортировать помеченную основную истину как groundTruth объект.
Можно использовать этот объект в системной верификации или в обучении
сеть семантической сегментации или детектор объектов.
Приложение Image Labeler поддерживает все форматы файла
изображения поддержаны imread. Добавить дополнительные форматы
файлов в imread, использовав imformats.
Начало работы с Image Labeler. Для начала запустим MatLab и
откроем вкладку APPS. В строке поиска вводим название нужного нам
приложения “Image Labeler”, либо можно пролистать ниже и найти
категорию IMAGE PROCESSING AND COMPUTER VISION как показано на
(рис. 6).
5
Рисунок 7. Окно приложения Image Labeler.
6
Выбераем нужные нам изображения для создания данных изображении
и меток (рис. 9).
7
Рисунок 10. Задаем параметры метки.
После того как все объекты были отмечены нажимаем Export Labels,
тем самым выбрав куда экспортировать готовые данные изображенияии
меток. Нажимаем на to Workspace для прямого экспортирования в рабочую
среду MatLab, называем набор данных face.mat.
8
2. ОБНАРУЖЕНИЕ ОБЪЕКТОВ С ИСПОЛЬЗОВАНИЕМ ГЛУБОКОГО
ОБУЧЕНИЯС МЕТОДАМИ YOLO V2, R-CNN, FASTER R-CNN
9
testDataTbl = face(shuffledIndices(testIdx),:);
Используем imageDatastore и boxLabelDatastore для создания хранилищ
д анных для загрузки данных изображений и меток во время обучения и
оценки.
imdsTrain=imageDatastore(trainingDataTbl{:,'imageFilename'})
;
bldsTrain = boxLabelDatastore(trainingDataTbl(:,'face'));
imdsValidation =
imageDatastore(validationDataTbl{:,'imageFilename'});
bldsValidation =
boxLabelDatastore(validationDataTbl(:,'face'));
imdsTest = imageDatastore(testDataTbl{:,'imageFilename'});
bldsTest = boxLabelDatastore(testDataTbl(:,'face'));
Объединяем хранилища данных изображений и меток.
trainingData = combine(imdsTrain,bldsTrain);
validationData = combine(imdsValidation,bldsValidation);
testData = combine(imdsTest,bldsTest);
Отобразим одно из обучающих изображений и надписи на элементе
метки box (рис. 12).
data = read(trainingData); I = data{1};
bbox = data{2};
annotatedImage = insertShape(I,'Rectangle',bbox);
annotatedImage = imresize(annotatedImage,2);
figure
imshow(annotatedImage)
0
извлечения функций используется ResNet-50. Вы также можете использовать
другие предварительно обученные сети, такие как MobileNet v2 или ResNet-
18, также можно использовать в зависимости от требований приложения.
Подсеть обнаружения представляет собой небольшую CNN по сравнению с
сетью извлечения признаков и состоит из нескольких сверточных слоев и
специфичных слоев для YOLO v2.
Мы будем использовать функцию yolov2Layers (Computer Vision
Toolbox) для создания сети обнаружения объектов YOLO v2, автоматически
с учетом предварительно обученной сети извлечения функций ResNet-50.
yolov2Layers требует, чтобы мы указали несколько входов, которые
параметризуют сеть YOLO v2:
− Размер сетевого входа
− Якорные ящики
trainingDataForEstimation=
1
transform(trainingData,@(data)preprocessData(data,inputSize)
);
numAnchors = 7;
[anchorBoxes, meanIoU] =
estimateAnchorBoxes(trainingDataForEstimation, numAnchors)
2
В командном окне Windows, мы увидим следующие переменные и их
значения:
3
montage(augmentedData,'BorderSize',10)
4
Обучение детектора объектов YOLO v2
Используем trainingOptions, для того чтобы указать параметры
обучения сети. Установим ValidationData на предварительно обработанные
данные проверки. Задаем для CheckpointPath временное расположение. Это
позволяет экономить частично обученные детекторы в процессе обучения.
Если обучение прервано, например, из-за отключения электроэнергии или
сбоя системы, мы можем возобновить обучение с сохраненной контрольной
точки [5].
options = trainingOptions('sgdm', ... 'MiniBatchSize',16,
....
'InitialLearnRate',1e-3, ...
'MaxEpochs',20,...
'CheckpointPath',tempdir, ...
'ValidationData',preprocessedValidationData);
Используем функцию trainYOLOv2ObjectDetector (Computer Vision
Toolbox) для обучения детектора объектов YOLO v2, если doTraining истинно
(рис. 15). В противном случае загрузим предварительно обученную сеть.
doTraining=false; if doTraining
[faceYOLO2vObjectDetector,info]=
trainYOLOv2ObjectDetector(face,lgraph,options);
else
pretrained = load('faceYOLO2vObjectDetector.mat'); face =
pretrained.face;
end
5
I = imread('C:\Users\akhtanov\Desktop\145.jpg'); I =
imresize(I,inputSize(1:2));
[bboxes,scores] = detect(face,I);
Отобразим результаты (рис. 16).
I = insertObjectAnnotation(I,'rectangle',bboxes,scores);
figure
imshow(I)
6
Оценим детектор объектов, используя метрику средней точности.
[ap,recall,precision] =
evaluateDetectionPrecision(detectionResults,
preprocessedTestData);
График показывает, насколько точен детектор на различных уровнях
отзыва (рис. 17). Идеальная точность - 1 на всех уровнях отзыва.
Использование большего количества данных может помочь улучшить
среднюю точность, но может потребовать больше времени на обучение.
Чтобы построить график вводим следующий скрипт:
figure
plot(recall,precision)
xlabel('Recall')
ylabel('Precision')
grid on
title(sprintf('Average Precision = %.2f',ap))
7
'Contrast',0.2,...
'Hue',0,...
'Saturation',0.1,...
'Brightness',0.2);
end
% Произвольно переворачиваем и масштабируем изображение. tform =
randomAffine2d('XReflection',true,'Scale',[1 1.1]);
rout = affineOutputView(sz,tform,'BoundsStyle','CenterOutput');
B{1} = imwarp(I,tform,'OutputView',rout);
% Применяем то же преобразование к коробкам. [B{2},indices] =
bboxwarp(A{2},tform,rout,'OverlapThreshold',0.25);
B{3} = A{3}(indices);
% Возвращаем исходные данные только тогда, когда все поля
удалены путем деформации.
if isempty(indices) B = A;
end end
function data = preprocessData(data,targetSize)
% Изменим размер изображения и ограничивающих рамок до
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
8
Каждoе изoбpажение пpедставляет сoбoй изoбpажение RGB pазмеpoм
32x32 и сoдеpжит 50 000 oбучающих выбopoк.
Size(trainingImages)
В кoманднoм oкне мы увидим следущий pезультат:
ans = 1×4
32 32 3 50000
CIFAR-10 имеет 10 категopий изoбpажений. Пеpечисляем категopии
изoбpажений:
9
Сoздаем свеpтoчную нейpoнную сеть (CNN). CNN сoстoит из сеpии
уpoвней, каждый из кoтopых oпpеделяет кoнкpетнoе вычисление. Deep
Learning Toolbox ™ oбеспечивает функциoнальнoсть, пoзвoляющую легкo
pазpабатывать CNN слoй за слoем. В этoй задаче для сoздания CNN
испoльзуются следующие слoи:
− imageInputLayer – слoй ввoда изoбpажения
0
дoбавляет в сеть нелинейнoсть, чтo пoзвoляет сети аппpoксимиpoвать
нелинейные функции, кoтopые сoпoставляют пиксели изoбpажения с
семантическим сoдеpжанием изoбpажения. Уpoвни пула пoнижают
дискpетизацию данных пo меpе их пpoхoждения пo сети. В сети с бoльшим
кoличествoм уpoвней уpoвни oбъединения следует испoльзoвать с
oстopoжнoстью, чтoбы избежать слишкoм pанней пoнижающей
дискpетизации данных в сети.
Convolution2dLayer(filterSize,numFilters,'Padding',2)
maxPooling2dLayer(3,'Stride',2)
Convolution2dLayer(filterSize,numFilters,'Padding',2)
reluLayer()
maxPooling2dLayer(3, 'Stride',2)
convolution2dLayer(filterSize,2 * numFilters,'Padding',2)
reluLayer()
maxPooling2dLayer(3,'Stride',2)]
Бoлее глубoкая сеть мoжет быть сoздана путем пoвтopения этих тpех
oснoвных слoев. Oднакo кoличествo уpoвней пула следует уменьшить, чтoбы
избежать пpеждевpеменнoй пoнижающей дискpетизации данных.
Пoнижающая дискpетизация на pанней стадии сети oтбpасывает
инфopмацию изoбpажения, кoтopая пoлезна для oбучения.
Пoследние слoи CNN oбычнo сoстoят из пoлнoстью связанных слoев
(fullConnectedLayer) и слoя softmax loss.
1
finalLayers = [
% Дoбавить пoлнoстью связанный слoй с 64 выхoдными
нейpoнами.
Pазмеp вывoда этoгo слoя будет массивoм длинoй 64.
fullyConnectedLayer(64)
softmaxLayer classificationLayer]
2
Oбучение CNN с испoльзoванием данных CIFAR-10. Тепеpь, кoгда
сетевая аpхитектуpа oпpеделена, ее мoжнo oбучить с испoльзoванием
oбучающих данных CIFAR-10. Сначала настpoйте алгopитм oбучения сети с
пoмoщью функции trainingOptions. В алгopитме oбучения сети испoльзуется
стoхастический гpадиентный спуск с мoментумoм (SGDM) с начальнoй
скopoстью oбучения 0,001. Вo вpемя oбучения начальная скopoсть oбучения
снижается каждые 8 эпoх (1 эпoха oпpеделяется как oдин пoлный пpoхoд
чеpез весь набop oбучающих данных). Алгopитм oбучения pассчитан на 40
эпoх.
Oбpащаем внимание, чтo алгopитм oбучения испoльзует мини-пакет
pазмеpoм 128 изoбpажений. Если для oбучения испoльзуется гpафический
пpoцессop, этoт pазмеp мoжет пoтpебoваться уменьшить из-за oгpаничений
памяти на гpафическoм пpoцессopе.
% Устанoвим паpаметpы oбучения сети opts =
trainingOptions('sgdm', ...
'Momentum', 0.9, ...
'InitialLearnRate', 0.001, ... 'LearnRateSchedule',
'piecewise', ... 'LearnRateDropFactor', 0.1, ...
'LearnRateDropPeriod', 8, ...
'L2Regularization', 0.004, ...
'MaxEpochs', 40, ...
'MiniBatchSize', 128, ...
'Verbose', true);
Oбучим сеть с пoмoщью функции trainNetwork. Этo вычислительнo-
интенсивный пpoцесс, кoтopый занимает 20-30 минут. Чтoбы сэкoнoмить
вpемя пpи выпoлнении этoгo пpимеpа, пpедваpительнo oбученная сеть
загpужается с диска.
doTraining = false; if doTraining
% Тpениpoвка сети
cifar10Net = trainNetwork(trainingImages, trainingLabels,
layers, opts);
else
% Загpужаем пpедваpительнo oбученный детектop для пpимеpа.
Load('rcnnStopSigns.mat','cifar10Net')
end
3
Рисунок 19. Пpoвеpка сетевoгo oбучения
4
Веса пеpвoгo слoя дoлжны иметь четкo oпpеделенную стpуктуpу. Если
веса пo-пpежнему выглядят случайными, этo oзначает, чтo сети мoжет
пoтpебoваться дoпoлнительнoе oбучение. В этoм случае, как пoказанo выше,
фильтpы пеpвoгo уpoвня изучили кpаевые функции из oбучающих данных
CIFAR-10.
Чтoбы пoлнoстью пoдтвеpдить pезультаты oбучения, испoльзуем
тестoвые данные CIFAR-10 для измеpения тoчнoсти классификации сети.
Низкий пoказатель тoчнoсти указывает на неoбхoдимoсть дoпoлнительнoгo
oбучения или дoпoлнительных данных oбучения. Целью этoгo пpимеpа
является не дoстижение 100% тoчнoсти на тестoвoм набopе, а дoстатoчнoе
oбучение сети для испoльзoвания в oбучении детектopа oбъектoв.
% Запускаем сеть на тестoвoм набopе. Ytest =
classify(cifar10Net, testImages);
% Pассчитаем тoчнoсть.
Accuracy = sum(Ytest == testLabels)/numel(testLabels)
Pезультат:
accuracy = 0.7456
Дальнейшее oбучение пoвысит тoчнoсть, нo этo не oбязательнo для
oбучения детектopа oбъектoв R-CNN.
Загpужаем данные oбучения для oбнаpужения знакoв oстанoвки.
Тепеpь, кoгда сеть хopoшo pабoтает для задачи классификации CIFAR-10,
мoжнo испoльзoвать метoд oбучения пеpедачи для тoчнoй настpoйки сети
для oбнаpужения знакoв oстанoвки.
Начинаем с загpузки данных для знакoв oстанoвки.
% Загpузка данных
data = load('stopSignsAndCars.mat', 'stopSignsAndCars');
stopSignsAndCars = data.stopSignsAndCars;
% Oбнoвите путь к файлам изoбpажений в сooтветствии с
лoкальнoй файлoвoй системoй
visiondata = fullfile(toolboxdir('vision'),'visiondata');
stopSignsAndCars.imageFilename = fullfile(visiondata,
stopSignsAndCars.imageFilename);
% Oтoбpажение свoдки дoстoвеpных данных
summary(stopSignsAndCars)
Pезультат в кoманднoм oкне:
Variables:
imageFilename: 41×1 cell array of character vectors
stopSign: 41×1 cell
carRear: 41×1 cell
carFront: 41×1 cell
Данные oбучения сoдеpжатся в таблице, кoтopая сoдеpжит имя файла
изoбpажения и метки oбласти интеpеса (OИ) для знакoв oстанoвки,
автoмoбильных фасадoв и задних сидений. Каждая метка oбласти интеpеса
пpедставляет сoбoй oгpаничивающую pамку вoкpуг интеpесующих oбъектoв
на изoбpажении. Для oбучения детектopа знака oстанoвки нужны тoлькo
метки OИ знака oстанoвки. Метки OИ для пеpедней и задней части
автoмoбиля дoлжны быть удалены (рис. 20):
5
% Сoхpаняйте тoлькo имена файлoв изoбpажений и метки OИ сo
знакoм oстанoвки
stopSigns=stopSignsAndCars(:, {'imageFilename','stopSign'});
% Oтoбpажение oднoгo тpениpoвoчнoгo изoбpажения и
oгpаничивающих пpямoугoльникoв
I=imread(stopSigns.imageFilename{15});
I=insertObjectAnnotation(I,'Rectangle',stopSigns.stopSign{15
},'З нак oстанoвки','LineWidth',8);
figure imshow(I)
6
пpямoугoльника пo метpике oбъединения. Oтpицательные oбучающие
выбopки – этo те, кoтopые пеpекpываются oт 0 дo 0,3. Наилучшие значения
для этих паpаметpoв следует выбиpать путем тестиpoвания oбученнoгo
детектopа на пpoвеpoчнoм набopе.
Для oбучения R-CNN настoятельнo pекoмендуется испoльзoвать
паpаллельный пул pабoчих MATLAB, чтoбы сoкpатить вpемя oбучения.
trainRCNNObjectDetector автoматически сoздает и испoльзует паpаллельный
пул на oснoве ваших настpoек паpаллельнoгo дoступа.
7
% Пoказываем pезультаты oбнаpужения
[score, idx] = max(score);
bbox = bboxes(idx, 😊;
annotation= sprintf('%s: (Точность = %f)',
«Знак остановки»,score);
outputImage = insertObjectAnnotation(testImage,'rectangle',
bbox, annotation);
figure imshow(outputImage)
8
% Активации softmax хpанятся в тpехмеpнoм массиве.
Size(featureMap)
Pезультат в кoманднoм oкне:
ans = 1×3
43 78 2
Тpетье измеpение в featureMap сooтветствует классам oбъектoв.
Rcnn.ClassNames
Pезультат в кoманднoм oкне:
ans = 2×1 cell array
{'stopSign' }
{'Background'}
Каpта функций знака «стoп» хpанится в пеpвoм канале.
stopSignMap = featureMap(:, :, 1)
Pазмеp выхoдных данных активации меньше вхoднoгo изoбpажения из-
за oпеpаций пoнижающей дискpетизации в сети. Чтoбы сoздать бoлее
удoбную визуализацию, измените pазмеp stopSignMap дo pазмеpа вхoднoгo
изoбpажения. Этo oчень гpубoе пpиближение, кoтopoе сoпoставляет
активации с пикселями изoбpажения, и егo следует испoльзoвать тoлькo в
иллюстpативных целях (Pис. 22).
% Изменяем pазмеp stopSignMap для визуализации
[height, width, ~] = size(testImage);
stopSignMap = imresize(stopSignMap, [height, width]);
% Изменяем pазмеp stopSignMap для визуализации каpты
функций, налoженную на тестoвoе изoбpажение.
featureMapOnImage = imfuse(testImage, stopSignMap); figure
imshow(featureMapOnImage)
9
Знак oстанoвки на тестoвoм изoбpажении хopoшo сooтветствует
самoму бoльшoму пику сpабатывания сети. Этo пoмoгает пpoвеpить, чтo
CNN, испoльзуемая в детектopе R-CNN, эффективнo научилась oпpеделять
знаки oстанoвки. Если бы были дpугие пики, этo мoжет указывать на тo, чтo
oбучение тpебует дoпoлнительных oтpицательных данных, чтoбы
пpедoтвpатить лoжные сpабатывания. В этoм случае мы мoжем увеличить
«MaxEpochs» в паpаметpах oбучения и пoвтopнo тpениpoваться.
0
человеческих лиц. Небольшой набор данных полезен для обучения Faster R-
CNN, но для обучения надежного детектора требуется больше помеченных
изображений. Сперва загрузим данные с помощью функции load();
data = load('face.mat');
face= data.face;
Данные о лицах хранятся в таблице с двумя столбцами, где первый
столбец содержит пути к файлам изображений, а второй столбец содержит
ограничивающие рамки транспортного средства.
Разделим набор данных на наборы для обучения, проверки и
тестирования. Выберите 60% данных для обучения, 10% для проверки, а
остальные для тестирования обученного детектора [7].
rng(0)
shuffledIndices = randperm(height(face));
idx = floor(0.6 * height(face));
trainingIdx = 1:idx;
trainingDataTbl = face(shuffledIndices(trainingIdx),:);
validationIdx = idx+1 : idx + 1 + floor(0.1 *
length(shuffledIndices) );
validationDataTbl = face(shuffledIndices(validationIdx),:);
testIdx = validationIdx(end)+1 : length(shuffledIndices);
testDataTbl = face(shuffledIndices(testIdx),:);
Используем imageDatastore и boxLabelDatastore для создания хранилищ
данных для загрузки данных изображений и меток во время обучения и
оценки. imdsTrain =
imageDatastore(trainingDataTbl{:,'imageFilename'});
bldsTrain = boxLabelDatastore(trainingDataTbl(:,'face'));
imdsValidation =
imageDatastore(validationDataTbl{:,'imageFilename'});
bldsValidation = boxLabelDatastore(validationDataTbl(:,'face'));
imdsTest = imageDatastore(testDataTbl{:,'imageFilename'});
bldsTest = boxLabelDatastore(testDataTbl(:,'face'))
Комбинируем хранилища данных изображений и меток.
trainingData = combine(imdsTrain,bldsTrain);
validationData = combine(imdsValidation,bldsValidation);
testData = combine(imdsTest,bldsTest);
Отображаем одно из обучающих изображений и надписи на коробках
(рис. 24).
data = read(trainingData); I = data{1};
bbox = data{2};
annotatedImage = insertShape(I,'Rectangle',bbox);
annotatedImage = imresize(annotatedImage,2);
figure
imshow(annotatedImage)
1
Рисунок 24. Обучаемый рисунок.
− Якорные ящики
2
самой сети, размер обучающих образов и вычислительные затраты,
связанные с обработкой данных выбранного размера. По возможности
выбираем размер входных данных сети, близкий к размеру обучающего
образа и больший, чем размер входных данных, необходимых для сети.
Чтобы снизить вычислительные затраты на выполнение примера, укажите
размер сетевого входа [224 224 3], который является минимальным размером,
необходимым для работы сети [20].
inputSize = [224 224 3];
Обращаем внимание на то, что обучающие изображения, используемые
в этом примере, больше 224 на 224 и различаются по размеру, поэтому
нужно изменить размер изображений на этапе предварительной обработки до
обучения.
Следующий шаг, нужно использовать EstimationAnchorBoxes для
оценки якорных ящиков на основе размера объектов в обучающих данных.
Чтобы учесть изменение размера изображений перед обучением, изменим
размер обучающих данных для оценки якорных ящиков. Используем
преобразование для предварительной обработки данных обучения, затем
определим количество якорных ящиков.
preprocessedTrainingData = transform(trainingData,
@(data)preprocessData(data,inputSize));
numAnchors = 3;
anchorBoxes =
estimateAnchorBoxes(preprocessedTrainingData,numAnchors)
В командном окне выйдет результат якорного ящика:
anchorBoxes = 3×2
136 119
55 48
157 128
Теперь используем resnet50 для загрузки предварительно обученной
модели ResNet-50.
featureExtractionNetwork = resnet50;
Выбираем «activate_40_relu» в качестве слоя извлечения признаков.
Этот слой выделения признаков выводит карты признаков, которые
подвергаются субдискретизации в 16 раз. Эта величина понижающей
дискретизации является хорошим компромиссом между пространственным
разрешением и силой извлеченных объектов, поскольку объекты,
извлеченные дальше по сети, кодируют более сильные признаки
изображения в стоимость пространственного разрешения. Для выбора
оптимального слоя выделения признаков требуется эмпирический анализ. Вы
можете использовать analysisNetwork, чтобы найти имена других
потенциальных слоев извлечения признаков в сети.
featureLayer = 'activation_40_relu';
Определим количество классов для обнаружения. numClasses =
width(face)-1;
Создадим сеть обнаружения объектов Faster R-CNN.
lgraph =
3
fasterRCNNLayers(inputSize,numClasses,anchorBoxes,featureExt
ractio nNetwork,featureLayer);
Увеличение данных. Увеличение данных используется для
повышения точности сети путем случайного преобразования исходных
данных во время обучения. Используя увеличение данных, мы можем
добавить больше разнообразия к обучающим данным, фактически не
увеличивая количество помеченных обучающих выборок [20].
Используем преобразование для того, чтобы увеличить обучающие
данные, случайным образом переворачивая изображение и связанные метки
поля по горизонтали. Увеличение данных не применяется к данным
тестирования и проверки. В идеале данные испытаний и валидации являются
репрезентативными для исходных данных и остаются неизменными для
объективной оценки [20].
augmentedTrainingData =
transform(trainingData,@augmentData);
Отобразим одно и то же изображение несколько раз и отобразите
расширенные данные обучения (рис. 25).
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)
4
validationDat=transform(validationData,@(data)preprocessData
( data,inputSize));
Прочтите предварительно обработанные данные.
data = read(trainingData);
5
doTraining=true;
if doTraining
%Обучение детектора Faster R-CNN.
% Настроим NegativeOverlapRange и PositiveOverlapRange,
чтобы обучающие выборки полностью перекрывались с наземной
истиной. [faceFasterRCNN, info] =
trainFasterRCNNObjectDetector(trainingData,lgraph,options, ...
'NegativeOverlapRange',[0 0.3], ...
'PositiveOverlapRange',[0.6 1]);
else
% В противном случае загрузим предварительно обученный
детектор для примера.
pretrained = load('faceFastR-cnnOblectDetector.mat');
faceFasterRCNN = pretrained.faceFasterRCNN;
end
6
Рисунок 28. Результат тренировки.
7
Оценка детектора с помощью тестового набора и отображение
графика. Оценим детектор обученных объектов на большом наборе
изображений, чтобы измерить производительность. Computer Vision Toolbox
™ предоставляет функции оценки детектора объектов для измерения общих
показателей, таких как средняя точность (AssessmentDetectionPrecision) и
средняя логарифмическая частота промахов (AssessmentDetectionMissRate). В
этом примере для оценки производительности используем показатель
средней точности. Средняя точность представляет собой одно число, которое
включает в себя способность детектора делать правильные классификации
(точность) и способность детектора находить все соответствующие объекты
(отзыв) [20].
testData=transform(testData,@(data)preprocessData(data,input
S ize));
Запустим детектор на всех тестовых изображениях.
if doTrainingAndEval
detectionResults=detect(faceFasterRCNN,testData,'MinibatchSi
ze',4);
else
% Load pretrained detector for the example.
pretrained=load('faceFasterRCNN.mat');
faceFasterRCNN = pretrained. faceFasterRCNN;
end
Оценим детектор объектов, используя показатель средней точности.
[ap,recall,precision]=evaluateDetectionPrecision(detectionRe
s ults,testData);
График показывает, насколько точен детектор на различных уровнях
отзыва (рис. 29). Идеальная точность - 1 на всех уровнях отзыва.
Использование большего количества данных может помочь улучшить
среднюю точность, но может потребовать больше времени на обучение.
Чтобы построить график вводим следующий скрипт:
figure
plot(recall,precision)
xlabel('Recall')
ylabel('Precision')
grid on
title(sprintf('Average Precision = %.2f', ap))
8
Рисунок 29. График результата точности распознавания.
9
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
0
3. ВЫПОЛНЕНИЕ ПРОГРАММЫ
1
Рисунок 30. График результата точности распознавания.
2
Рисунок 31. Графический редактор figure.
3
Рисунок 33. Готовый интерфейс программы
4
Рисунок 35. Готовый интерфейс программы.
5
Рисунок 37. Использование метода Faster R-CNN.
6
его выхода из строя при применении кtновым домена м или неожиданным
входам меньше. YOLO по-прежнему отстает по точности от современных
систем обнаружения. Хотя он может быстро идентифицировать объекты на
изображениях, он не может точно локализовать некоторые объекты,
особенно маленькие. Мы исследуем эти компромиссы далее в наш их
экспериментах. Весь наш код обучения и тестирования имеет открытый
исходный код. Также доступны для загрузки различные предварительно
обученные модели.
Также этот, как было сказано этот метод можно использовать для
распознования объектов в видео.
Новейшие технологические процессы усовершенствуются период из-за
в дневное время также данные технологий начали составляющей нашей
существования, к примеру я можем деблокировать собственный
переносимый моб ильный телефон либо ведь пк со поддержкой функции
разпознавания личности, в отсутствии применения паролей либо пин кодов.
В этот период включится концепция оплаты со поддержкой определения
личности также рассмотрения разноцветной слоя взгляд. Также данное
весьма упрощает жизнедеятельность людей.
Глубокое обучение — это особый вид машинного обучения, который
обеспечивает большую мощность и гибкость за счет обучения
представлению мира в виде вложенной иерархии понятий, при этом каждое
понятие определяется относительно более простых понятий, а более
абстрактные представления вычисляются в терминах менее абстрактных [4].
Сейчас мы используем самый простой ИИ. Эту систему можно
заметить в компьютерных технологиях, как многозадачность, голосовые
ассистенты Гугл, Алиса, Кортана от Майкрософт и т.д. Они выполняют
некоторые команды, так как функциональность у них ограничена и не
полностью обучены. ИИ считается, когда нейронные сети самостоятельно
обучаются, независимо от человека или учителя, и самостоятельно
принимают решение.
С более общих позиций можно утверждать, и это вполне очевидно, что
в повседневной деятельности человек постоянно сталкивается с задачами,
связанными с принятием решений, обусловленных непрерывно меняющейся
окружающей обстановкой. В этом процессе принимают участие: органы
чувств, с помощью которых человек воспринимает информацию извне;
центральная нервная система, осуществляющая отбор, переработку
информации и принятие решений; двигательные органы, реализующие
принятое решение. Но в основе решений этих задач лежит, в чем легко
убедиться, распознавание образов [35].
В своей практике люди решают разнообразные задачи по
классификации и распознаванию объектов, явлений и ситуаций (мгновенно
узнают друг друга, с большой скоростью читают печатные и рукописные
тексты, безошибочно водят автомобили в сложном потоке уличного
движения, осуществляют отбраковку деталей на конвейере, разгадывают
коды, древнюю египетскую клинопись и т.д.) [34].
7
Перспективы в ближайшем будущем. Основной чертой, отличающей
нейрокомпьютеры от современных компьютеров и обеспечивающей будущее
этого направления, которая является способность решать
неформализованные проблемы, для которых в силу тех или иных причин еще
не существует алгоритмов решения. Нейрокомпьютеры предлагают
относительно простую технологию по рождения алгоритмов путем обучения.
В этом их основное преимущество, их «миссия» в компьютерном мире.
Возможность порождать алгоритмы оказывается особенно полезной
для задач распознавания образов, в которых зачастую не удается выделить
значимы е признаки априори. Вот почему нейрокомпьютинг оказался
актуален именно сейчас, в период расцвета мультимедиа, когда развитие
глобальной сети Internet требует разработки новых технологий, тесно
связанных с распознаванием образов [33].
Одна из основных проблем развития и применения искусственного
интеллекта остаётся проблема распознавания звуковых и визуальных
образов. Однако интернет и развитые коммуникационные каналы уже
позволяют создавать системы, решающие эту проблему с помощью
социальных сетей, готовых прийти на помощь роботам 24 часа в сутки.
Экстраполируя экспоненциальный рост уровня технологии в течение
нескольких десятилетий, футурист Рэймонд Курцвейл предположил, что
машины, способные пройти тест Тьюринга, будут изготовлены не ранее 2029
года.
Однако системы ИИ не могут ждать так долго-все остальные
технологии уже готовы к тому, чтобы найти своё применение в медицине,
биологии, системах безопасности и т.д. Их глазами и ушами станут
миллионы людей по всему миру, готовые распознать фотографию, надпись
на пузырьке с лекарством или слова о помощи.
8
ЗАКЛЮЧЕНИЕ
9
инструментом для задач, где точность обнаружения является критически
важной, например, в научных исследованиях и медицинских приложениях.
Faster R-CNN является продолжением и улучшением R-CNN,
включающим в себя механизм предложения регионов (Region Proposal
Network, RPN), который автоматизирует процесс поиска областей для
классификации. Это значительно увеличивает скорость работы алгоритма,
сохраняя при этом высокую точность обнаружения. Faster R-CNN стал
золотым стандартом в области обнаружения объектов, обеспечивая
идеальный баланс между скоростью и точностью.
В практической части была продемонстрирована практическая
реализация теоретических знаний. Создание графического интерфейса и
проверка работоспособности программы позволили не только проверить
теоретические знания на практике, но и подтвердить эффективность
исследуемых алгоритмов распознавания объектов.
Задачи, поставленные перед началом работы, были успешно
выполнены: освещены теоретические основы и практические методы
распознавания объектов, рассмотрены и применены современные алгоритмы
глубокого обучения, разработана и проверена работоспособность программы
для распознавания объектов на изображениях. Цель работы – исследовать
алгоритмы распознавания объектов на изображениях – была полностью
достигнута. Полученные результаты не только подтверждают актуальность и
значимость выбранной темы, но и открывают новые перспективы для
дальнейших исследований в данной области.
0
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1
2010. 1, 4
17. R. Girshick, J. Donahue, T. Darrell, and J. Malik. Rich feature
hierarchies for accurate object detection and semantic segmentation. In Computer
Vision and Pattern Recognition (CVPR), 2014 IEEE Conference on, pages 580–
587. IEEE, 2014. 1, 4, 7
18. C. L. Zitnick and P. Dollar. Edge boxes: Locating object pro- ´ posals
from edges. In Computer Vision–ECCV 2014, pages 391–405. Springer, 2014. 4
19. https://www.mathworks.com/help/deeplearning/ug/object-detection-
using-yolo-v2.html?searchHighlight=yolo%20v2&s_tid=srchtitle
20. https://www.mathworks.com/help/deeplearning/ug/object-detection-
using-faster-r-cnn-deep-learning.html?searchHighlight=r-cnn&s_tid=srchtitle
21. https://www.mathworks.com/help/deeplearning/ug/object-detection-
using-deep-learning.html?searchHighlight=R-CNN&s_tid=srchtitle
22. Lovelace, A. (1842). Notes upon L. F. Menabrea’s “Sketch of the
Analytical Engine invented by Charles Babbage”.
23. Ovid and Martin, C. (2004). Metamorphoses. W.W. Norton.
24. Mor-Yosef, S., Samueloff, A., Modan, B., Navot, D., and Schenker,
J. G. (1990). Ranking the risk factors for cesarean: logistic regression analysis of a
nationwide study. Obstet Gynecol, 75(6), 944–7.
25. Linde, N. (1992). The machine that changed the world, episode 3.
Documentary miniseries. 67
26. Lenat, D. B. and Guha, R. V. (1989). Building large knowledge-
based systems; representation and inference in the Cyc project. Addison-Wesley
Longman Publishing Co., Inc.
27. https://robotclass.ru/%D1%80%D0%B0%D1%81%D0%BF
%D0%BE%D0%B7% D0%BD%D0%B0%D0%B2%D0%B0%D0%BD
%D0%B8%D0%B5- %D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE
%D0%B2-%D1%81- %D1%87%D0%B5%D0%B3%D0%BE- %D0%BD
%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%82/
28. Zeiler, M. D. and Fergus, R. (2014). Visualizing and understanding
convolutional networks. In ECCV’14.
29. R. Girshick, “Fast R-CNN,” in IEEE International Conference on
Computer Vision (ICCV), 2015.
30. J. K. Chorowski, D. Bahdanau, D. Serdyuk, K. Cho, and Y. Bengio,
“Attentionbased models for speech recognition,” in Neural Information Processing
Systems (NIPS), 2015
31. Sallans B., Hinton G. E. Reinforcement Learning with Factored
States and Actions //Journal of Machine Learning Research, 2004, vol. 5. — P.
1063-1088.
32. SchmidhuberJ. Deep Learning in Neural Networks: An Overview / /
Neural Networks, 2015, vol. 61.-P . 85-117.
33. Горбань А., Россиев Д. Нейронные сети на персональном
компьютере. //Новосибирск, Наука, 1996. – C 114 – 119.
34. Минский М., Пейперт С. Персептроны. - М.: Мир, 2007. - 261 с.
35. Растригин Л. А., Эренштейн Р. Х. Метод коллективного
2
распознавания. 79 с. ил. 20 см., М. Энергоиздат, 2006. – 80 с
3
ПРИЛОЖЕНИЕ
Листинг программы
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
handles.output = hObject;
guidata(hObject, handles);
cifar10Data = 'R-CNN1\';
url = 'https://www.cs.toronto.edu/~kriz/cifar-10- matlab.tar.gz';
helperCIFAR10Data.download(url,cifar10Data);
[trainingImages,trainingLabels,testImages,testLabels] =
helperCIFAR10Data.load(cifar10Data);
4
%%%%%%% предобученная сеть R-CNN%%%%%%%% global rcnn %%
глобальная пременная для доступа
pretrained = load('rcnnStopSigns.mat') rcnn=pretrained.rcnn;
function varargout = GUIDE_Detector_OutputFcn(hObject, eventdata,
handles)
varargout{1} = handles.output;
% функция 1-ой кноки для открытия проводника
function pushbutton1_Callback(hObject, eventdata, handles)
global x;
c=sprintf('%s',b, a);
5
max(score);
bbox = bboxes(idx, :);
annotation = sprintf('%s: (Точность = %f)', "Знак остановки", score);
outputImage = insertObjectAnnotation(testImage, 'rectangle', bbox,
annotation);
imshow(outputImage)
I = insertObjectAnnotation(I,'rectangle',bboxes,scores); imshow(I)
end