Цель данной работы - решить задачу классификации объектов, используя средства модуля Dnn библиотеки OpenCV. Работа с обученными нейронными сетями.
Основные задачи:
- Скачать обученную сеть
squeezenet1.1
. - Разработать приложение для классификации изображений.
Дополнительные задачи:
- Добавить возможность классификации по части изображения, заданной пользователем.
- Реализовать вывод названия классов (список имен класов содержится в файле
*.labels
). - Реализовать вывод top-3 (top-5, top-10) классов, предложенных классификатором.
В папке src
расположен файл classificator.h
, который содержит объявление абстрактного класса Classificator
.
Класс имеет следующие чисто виртуальные методы:
Classify
- метод для классификации изображений при помощи нейронной сети.
- Скачать обученную сеть
squeezenet1.1
. - Разработать класс
DnnClassificator
(наследника классаClassificator
) для решения задачи классифкации объектов. - Реальзовать загрузку модели нейронной сети
squeezenet1.1
в конструктореDnnClassificator
. - Реализовать метод
Classify
классаDnnClassificator
. - Реализовать чтение изображения (см. Практика 1).
- Выполнить классификацию полученного изображения.
- Прочитать список имен клаассов, определить название класса, котоый предсказала нейросеть.
- Выполнить дополнительные задачи.
-
Клонировать origin-репозиторий к себе на локальную машину (см. Практика 1).
-
Собрать проект и проверить его работоспособность, запустив проект practice2.
- Воспользоваться инструкцией по сборке и запуску из Практики 1. - Запустить проект practice2 и удостовериться, что он успешно отработал. ```bash $ cd CV-SUMMER-CAMP-build/bin $ practice2.exe ```
-
Создать рабочую ветку
practice-2
(см. Практика 1). -
В папке
<openvino>/deployment_tools/tools/model_downloader/
(IntelSWTools) запустить скриптdownloader.py
с параметрами--name squeezenet1.1 --output <destination_folder>
$ cd C:\Intel\computer_vision_sdk\deployment_tools\model_downloader $ python downloader.py --name squeezenet1.1 --output <destination_folder>
Если запустить данный скрипт без параметров, то можно увидеть названия всем моделей, доступных для загрузки через данный скрипт.
-
Объявить класс
DnnClassificator
, наследника абстрактного классаClassificator
, в файлесlassification.h
. -
В файле
сlassification.сpp
реализовать методы классаDnnClassificator
. -
На вход конструктор класса
DnnClassificator
принимает следующие параметры:- путь
<path-to-model>
до файла*.caffemodel
, содержащий веса модели; - путь
<path-to-config>
до файла*.prototxt
с конфигурацией модели; - путь
<path-to-labels>
до файла*.labels
с именами классов; - ширина
inputWidth
входного изображения; - высота
inputHeight
входного изображения; - вектор
mean
средних значений, которые были использованы при тренировке сети (по умолчаниюScalar(0,0,0,0)
); - признак
swapRB
неоходимости обмена местамиR
иВ
каналов изображения.
- путь
-
Конструктор класса
DnnClassificator
реализует следующий функционал:- инициирует поля класса (см. принимаемые параметры).
- реализует загрузку модели.
- Для работы с моделью используется класс
Net
модуля dnn OpenCV; - Для загрузки модели используется метод
readNet(<path-to-model>, <path-to-config>, string)
; - Для настройки дополнительных параметров модели используются методы
setPreferableBackend(0)
иsetPreferableTarget(0)
классаNet
.
- Для работы с моделью используется класс
-
Реализовать метод
DnnClassificator::Classify
, выполняющий следующую последовательность действий:- выполнить предобработку.
- cоздать объект
inputTensor
классаMat
; - вызвать функцию
blobFromImage(image, inputTensor, scale, Size(inputWidth, inputHeight), mean, swapRB, false);
, конвертирующую изображение в тензор.- вызвать метод
setInput(inputTensor)
классаNet
для установки объекта классификации. - запустить вычисления нейронной сети, используя метод
forward()
классаNet
. Результат работы записать вMat
. - результаты работы нейронной сети конвертировать в вектор вероятностей принадлежности к классам, используя метод
reshape(1,1)
классаMat
.
- вызвать метод
-
Создать копию файла
<project_source>/samples/practice2.cpp
и назвать ее<project_source>/samples/practice2_YOUR_NAME.cpp
. Далее работать с файлом<project_source>/samples/practice2_YOUR_NAME.cpp
. -
В файле
<project_source>/samples/practice2_YOUR_NAME.cpp
реализовать чтение реализовать чтение файла изображения при помощи имени файла, полученного из аргументов командной строки--i
. -
В файле
<project_source>/samples/practice2_YOUR_NAME.cpp
создать объект классаDnnClassificator
. Применить методClassify
к изображению:- путь к весам модели задается через командную строку посредством ключа
--model_path
; - путь к конфигурации модели задается через командную строку посредством ключа
--config_path
; - путь к меткам задается через командную строку посредством ключа
--label_path
.
- путь к весам модели задается через командную строку посредством ключа
-
Определите класс с наибольшей вероятностью принадлежности исходного изображения к нему. вывести номер класса на экран. Подсказка: воспользуйтесь функцией
minMaxLoc
. -
Убедиться, что проект успешно собирается и создается новый исполняемый файл
<project_build>/bin/practice2_YOUR_NAME.exe
. -
Прислать Pull Request с внесенными изменениями. Пометить в конце названия
(NOT READY)
. По мере готовности решений основных задач Pull Request можно будет переименовать.Полный список принимаемых параметров можно посмотреть запустив исполняемый файл с ключом--help
. См. документацию к классуcv::dnn::Net
(методыreadNet
,setInput
иforward
) и пространству имен cv:dnn (методblobFromImage
). Также полезным будет посмотреть примеры работы с dnn из официальных семплов OpenCV -
Решить задачи из списка Дополнительные задачи.