Skip to content

Latest commit

 

History

History
218 lines (173 loc) · 14.2 KB

README.md

File metadata and controls

218 lines (173 loc) · 14.2 KB

Практика. Классификация изображений с использованием возможностей модуля dnn библиотеки OpenCV

Содержание

  1. Цели
  2. Задачи
  3. Последовательность выполнения работы
  4. Структура репозитория
  5. Полезные ссылки

Цели

Цель данной работы состоит в том, чтобы изучить некоторые возможности модуля dnn библиотеки компьютерного зрения OpenCV. В частности, изучить методы организации работы с моделями глубоких нейросетей в формате библиотеки Caffe и их применения для решения задачи классификации изображений.

Задачи

Основные задачи

Основная задача состоит в том, чтобы разработать консольное приложение для классификации изображений с использованием обученных моделей глубоких нейронных сетей. Приложение должно обеспечивать следующий функционал:

  1. Загрузка изображения в формате RGB для последующей классификации.

  2. Загрузка и чтение модели глубокой сети, хранящейся в формате библиотеки Caffe. Для определенности предлагается использовать модель GoogLeNet.

  3. Предварительная обработка изображения для подачи на вход классификатору:

    • Выделение области изображения, размер которой соответствуют размеру входа нейронной сети. Сеть GoogLeNet принимает на вход изображение размера 224x224 в формате RGB.
    • Вычитание среднего значения интенсивности, полученного на тренировочной выборке. Для сети GoogLeNet среднее значение составляет (104, 117, 123).
  4. Определение класса, которому принадлежит изображение. На выходе сети формируется вектор достоверностей принадлежности изображения каждому из возможных классов, поэтому необходимо выбрать класс с максимальной достоверностью.

Дополнительные задачи

Дополнительно в разработанное приложение можно добавить следующий функционал:

  1. Отображение исходного изображения.
  2. Отображение области изображения, выбранной для классификации, и названия класса, которому оно принадлежит с наибольшей вероятностью.
  3. Отображение исходного изображения и области в одном окне.
  4. Предварительная обработка изображения посредством применения различных методов сглаживания и фильтрации. Дополнительный анализ результата классификации и значения достоверности принадлежности классу.

Программное обеспечение

Для выполнения практической работы необходимо использовать следующее программное обеспечение:

  1. Утилита CMake (версия не ниже 2.8).
  2. Git-клиент (например, git-scm).
  3. Библиотека OpenCV версии 3.3.0.
  4. Среда разработки (далее используется Microsoft Visual Studio 2015 Win64, поскольку в состав пакета OpenCV 3.3.0 входят бинарники, собранные для указанной версии среды).

Структура репозитория

Репозиторий содержит следующие директории и файлы:

  • samples - директория, содержащая шаблонный файл исходного кода приложения.
  • README.md - настоящее описание.
  • CMakeLists.txt - основной файл для сборки проекта с помощью CMake.
  • help - директория, содержащая примеры использования некоторых функций библиотеки OpenCV, которые потребуются для выполнения практической работы. Наряду с этим директория содержит лекционные материалы.
  • .gitignore - перечень директорий/файлов, которые игнорируются системой контроля версий.

Общая последовательность выполнения работы

  1. Загрузить проект из репозитория GitHub и создать рабочую ветку в соответствии с вашим ФИО (например, IvanovAA).

    git clone https://github.com/UNN-VMK-Software/opencv-dnn-practice
    cd opencv-dnn-practice
    git checkout -b IvanovAA
    cd ..

    Примечание: для более детального изучения возможностей системы контроля версий Git рекомендуется воспользоваться материалами Летней межвузовской школы 2016.

  2. Создать директорию для размещения файлов решения и проекта, перейти в эту директорию и собрать файлы проекта с помощью 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.

  3. Открыть решение opencv-dnn-practice-build/opencv_dnn_practice.sln и собрать проекты, входящие в его состав, нажав правой кнопкой мыши по проекту ALL_BUILD и выбрав из выпадающего меню команду Rebuild. Бинарные файлы будут скопированы в директорию opencv-dnn-practice-build/bin. Примечание: перед компиляцией при необходимости следует выбрать режим сборки Debug (по умолчанию) или Release.

  4. Запустить пустое приложение. Для этого необходимо открыть консоль из директории opencv-dnn-practice-build и выполнить dnn_sample.exe. При запуске возможно возникновение ошибки вида "Запуск программы невозможен, так как на компьютере отсутствует opencv_world330.dll". Это означает, что при запуске не были обнаружены бинарные файлы библиотеки OpenCV. Чтобы решить указанную проблему, можно прописать в переменную окружения PATH путь до библиотек C:\Program Files\OpenCV-3.3.0\opencv\build\x64\vc14\bin, либо скопировать соответствующий файл библиотеки к бинарному файлу приложения. Примечание: обратите внимание, что у вас путь может отличаться.

  5. Открыть файл исходного кода dnn_sample.cpp в проекте dnn_sample для дальнейшего решения задач практической работы.

  6. Добавить код, обеспечивающий чтение параметров командной строки. Приложение должно принимать следующие параметры:

    • Файл с изображением.
    • Текстовый файл с описанием модели глубокой сети в формате prototxt, который обрабатывается библиотекой Caffe (сеть GoogLeNet и некоторые другие есть в пакете OpenCV c:\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.

  7. Добавить код для загрузки изображения для классификации. Для этого необходимо воспользоваться функцией сv::imread.

  8. Добавить код для загрузки и чтения модели глубокой нейронной сети. Для этого необходимо воспользоваться функцией cv::dnn::readNetFromCaffe.

  9. Добавить код для выполнения предварительной обработки изображения. Для этого необходимо воспользоваться функцией сv::dnn::blobFromImage.

  10. Добавить код для установки полученного изображения в качестве входа сети. Для этого необходимо воспользоваться методом setInput объекта класса cv::dnn::Net.

  11. Добавить код для выполнения прямого прохода сети для заданного входа и получения вектора достоверностей принадлежности каждому классу. Для этого необходимо воспользоваться методом forward объекта класса cv::dnn::Net.

  12. Добавить код для определения класса изображения - класса, для которого получено максимальное значение достоверности. Примечание: для этого необходимо в векторе достоверностей найти индекс максимального элемента, загрузить перечень классов изображений из файла и получить содержательное описание класса.

  13. Выложить результаты решения основных задач на GitHub в созданную ветку с вашим ФИО (ранее и сейчас для примера используется IvanovAA).

    git commit -m "Main problems" -a
    git push origin IvanovAA
  14. Выполнить дополнительные задачи практической работы. В файле help/imgproc-help.md можно найти множество примеров использования модулей highgui и imgproc.