Цель данной работы состоит в том, чтобы изучить некоторые возможности модуля dnn библиотеки компьютерного зрения OpenCV. В частности, изучить методы организации работы с моделями глубоких нейросетей в формате библиотеки Caffe и их применения для решения задачи классификации изображений.
Основные задачи
Основная задача состоит в том, чтобы разработать консольное приложение для классификации изображений с использованием обученных моделей глубоких нейронных сетей. Приложение должно обеспечивать следующий функционал:
-
Загрузка изображения в формате RGB для последующей классификации.
-
Загрузка и чтение модели глубокой сети, хранящейся в формате библиотеки Caffe. Для определенности предлагается использовать модель GoogLeNet.
-
Предварительная обработка изображения для подачи на вход классификатору:
- Выделение области изображения, размер которой соответствуют размеру входа нейронной сети. Сеть GoogLeNet принимает на вход изображение размера 224x224 в формате RGB.
- Вычитание среднего значения интенсивности, полученного на тренировочной выборке. Для сети GoogLeNet среднее значение составляет (104, 117, 123).
-
Определение класса, которому принадлежит изображение. На выходе сети формируется вектор достоверностей принадлежности изображения каждому из возможных классов, поэтому необходимо выбрать класс с максимальной достоверностью.
Дополнительные задачи
Дополнительно в разработанное приложение можно добавить следующий функционал:
- Отображение исходного изображения.
- Отображение области изображения, выбранной для классификации, и названия класса, которому оно принадлежит с наибольшей вероятностью.
- Отображение исходного изображения и области в одном окне.
- Предварительная обработка изображения посредством применения различных методов сглаживания и фильтрации. Дополнительный анализ результата классификации и значения достоверности принадлежности классу.
Для выполнения практической работы необходимо использовать следующее программное обеспечение:
- Утилита CMake (версия не ниже 2.8).
- Git-клиент (например, git-scm).
- Библиотека OpenCV версии 3.3.0.
- Среда разработки (далее используется Microsoft Visual Studio 2015 Win64, поскольку в состав пакета OpenCV 3.3.0 входят бинарники, собранные для указанной версии среды).
Репозиторий содержит следующие директории и файлы:
samples
- директория, содержащая шаблонный файл исходного кода приложения.README.md
- настоящее описание.CMakeLists.txt
- основной файл для сборки проекта с помощью CMake.help
- директория, содержащая примеры использования некоторых функций библиотеки OpenCV, которые потребуются для выполнения практической работы. Наряду с этим директория содержит лекционные материалы..gitignore
- перечень директорий/файлов, которые игнорируются системой контроля версий.
-
Загрузить проект из репозитория GitHub и создать рабочую ветку в соответствии с вашим ФИО (например, IvanovAA).
git clone https://github.com/UNN-VMK-Software/opencv-dnn-practice cd opencv-dnn-practice git checkout -b IvanovAA cd ..
Примечание: для более детального изучения возможностей системы контроля версий Git рекомендуется воспользоваться материалами Летней межвузовской школы 2016.
-
Создать директорию для размещения файлов решения и проекта, перейти в эту директорию и собрать файлы проекта с помощью CMake.
mkdir opencv-dnn-practice-build cd opencv-dnn-practice-build cmake -DOpenCV_DIR="c:\Program Files\OpenCV-3.3.0\opencv\build" -G "Visual Studio 14 2015 Win64" ..\opencv-dnn-practice
Примечания: В опции
OpenCV_DIR="c:\Program Files\OpenCV-3.3.0\opencv\build"
необходимо указать путь до файлаOpenCVConfig.cmake
библиотеки OpenCV-3.3.0. -
Открыть решение
opencv-dnn-practice-build/opencv_dnn_practice.sln
и собрать проекты, входящие в его состав, нажав правой кнопкой мыши по проектуALL_BUILD
и выбрав из выпадающего меню командуRebuild
. Бинарные файлы будут скопированы в директориюopencv-dnn-practice-build/bin
. Примечание: перед компиляцией при необходимости следует выбрать режим сборкиDebug
(по умолчанию) илиRelease
. -
Запустить пустое приложение. Для этого необходимо открыть консоль из директории
opencv-dnn-practice-build
и выполнитьdnn_sample.exe
. При запуске возможно возникновение ошибки вида "Запуск программы невозможен, так как на компьютере отсутствует opencv_world330.dll". Это означает, что при запуске не были обнаружены бинарные файлы библиотеки OpenCV. Чтобы решить указанную проблему, можно прописать в переменную окруженияPATH
путь до библиотекC:\Program Files\OpenCV-3.3.0\opencv\build\x64\vc14\bin
, либо скопировать соответствующий файл библиотеки к бинарному файлу приложения. Примечание: обратите внимание, что у вас путь может отличаться. -
Открыть файл исходного кода
dnn_sample.cpp
в проектеdnn_sample
для дальнейшего решения задач практической работы. -
Добавить код, обеспечивающий чтение параметров командной строки. Приложение должно принимать следующие параметры:
- Файл с изображением.
- Текстовый файл с описанием модели глубокой сети в формате
prototxt
, который обрабатывается библиотекой Caffe (сеть GoogLeNet и некоторые другие есть в пакете OpenCVc:\Program Files\OpenCV-3.3.0\opencv\sources\samples\data\dnn\bvlc_googlenet.prototxt
). - Бинарный файл
*.caffemodel
с параметрами обученной модели глубокой сети. Обученную сеть GoogLeNet можно скачать по ссылке. - Файл, содержащий перечень распознаваемых классов изображений.
Для набора ImageNet указанный файл также есть в пакете OpenCV
c:\Program Files\OpenCV-3.3.0\opencv\sources\samples\data\dnn\synset_words.txt
.
Примечание: обратите внимание, что у вас пути могут отличаться.
Указание: чтение параметров рекомендуется реализовать с использованием класса
cv::CommandLineParser
. -
Добавить код для загрузки изображения для классификации. Для этого необходимо воспользоваться функцией
сv::imread
. -
Добавить код для загрузки и чтения модели глубокой нейронной сети. Для этого необходимо воспользоваться функцией
cv::dnn::readNetFromCaffe
. -
Добавить код для выполнения предварительной обработки изображения. Для этого необходимо воспользоваться функцией
сv::dnn::blobFromImage
. -
Добавить код для установки полученного изображения в качестве входа сети. Для этого необходимо воспользоваться методом
setInput
объекта классаcv::dnn::Net
. -
Добавить код для выполнения прямого прохода сети для заданного входа и получения вектора достоверностей принадлежности каждому классу. Для этого необходимо воспользоваться методом
forward
объекта классаcv::dnn::Net
. -
Добавить код для определения класса изображения - класса, для которого получено максимальное значение достоверности. Примечание: для этого необходимо в векторе достоверностей найти индекс максимального элемента, загрузить перечень классов изображений из файла и получить содержательное описание класса.
-
Выложить результаты решения основных задач на GitHub в созданную ветку с вашим ФИО (ранее и сейчас для примера используется IvanovAA).
git commit -m "Main problems" -a git push origin IvanovAA
-
Выполнить дополнительные задачи практической работы. В файле help/imgproc-help.md можно найти множество примеров использования модулей highgui и imgproc.