Skip to content

Latest commit

 

History

History
108 lines (82 loc) · 10.2 KB

README_2.md

File metadata and controls

108 lines (82 loc) · 10.2 KB

Практика 2. Классификация изображений при помощи нейронных сетей

Цели

Цель данной работы - решить задачу классификации объектов, используя средства модуля Dnn библиотеки OpenCV. Работа с обученными нейронными сетями.

Задачи

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

  1. Скачать обученную сеть squeezenet1.1.
  2. Разработать приложение для классификации изображений.

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

  1. Добавить возможность классификации по части изображения, заданной пользователем.
  2. Реализовать вывод названия классов (список имен класов содержится в файле *.labels).
  3. Реализовать вывод top-3 (top-5, top-10) классов, предложенных классификатором.

Структура программы

В папке src расположен файл classificator.h, который содержит объявление абстрактного класса Classificator.

Класс имеет следующие чисто виртуальные методы:

  1. Classify - метод для классификации изображений при помощи нейронной сети.

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

  1. Скачать обученную сеть squeezenet1.1.
  2. Разработать класс DnnClassificator (наследника класса Classificator) для решения задачи классифкации объектов.
  3. Реальзовать загрузку модели нейронной сети squeezenet1.1 в конструкторе DnnClassificator.
  4. Реализовать метод Classify класса DnnClassificator.
  5. Реализовать чтение изображения (см. Практика 1).
  6. Выполнить классификацию полученного изображения.
  7. Прочитать список имен клаассов, определить название класса, котоый предсказала нейросеть.
  8. Выполнить дополнительные задачи.

Детальная инструкция по выполнению работы

  1. Клонировать origin-репозиторий к себе на локальную машину (см. Практика 1).

  2. Собрать проект и проверить его работоспособность, запустив проект practice2.

       - Воспользоваться инструкцией по сборке и запуску из Практики 1.
       
       - Запустить проект practice2 и удостовериться, что он успешно отработал.
    
       ```bash
       $ cd CV-SUMMER-CAMP-build/bin
       $ practice2.exe
       ```
    
  3. Создать рабочую ветку practice-2(см. Практика 1).

  4. В папке <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>

    Если запустить данный скрипт без параметров, то можно увидеть названия всем моделей, доступных для загрузки через данный скрипт.

  5. Объявить класс DnnClassificator, наследника абстрактного класса Classificator, в файле сlassification.h.

  6. В файле сlassification.сpp реализовать методы класса DnnClassificator.

  7. На вход конструктор класса DnnClassificator принимает следующие параметры:

    • путь <path-to-model>до файла *.caffemodel, содержащий веса модели;
    • путь <path-to-config> до файла *.prototxt с конфигурацией модели;
    • путь <path-to-labels>до файла *.labels с именами классов;
    • ширина inputWidth входного изображения;
    • высота inputHeight входного изображения;
    • вектор mean средних значений, которые были использованы при тренировке сети (по умолчанию Scalar(0,0,0,0));
    • признак swapRBнеоходимости обмена местами R и В каналов изображения.
  8. Конструктор класса DnnClassificator реализует следующий функционал:

    • инициирует поля класса (см. принимаемые параметры).
    • реализует загрузку модели.
      • Для работы с моделью используется класс Net модуля dnn OpenCV;
      • Для загрузки модели используется метод readNet(<path-to-model>, <path-to-config>, string);
      • Для настройки дополнительных параметров модели используются методы setPreferableBackend(0) и setPreferableTarget(0) класса Net.
  9. Реализовать метод 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.
  10. Создать копию файла <project_source>/samples/practice2.cpp и назвать ее <project_source>/samples/practice2_YOUR_NAME.cpp. Далее работать с файлом <project_source>/samples/practice2_YOUR_NAME.cpp.

  11. В файле <project_source>/samples/practice2_YOUR_NAME.cpp реализовать чтение реализовать чтение файла изображения при помощи имени файла, полученного из аргументов командной строки --i.

  12. В файле <project_source>/samples/practice2_YOUR_NAME.cppсоздать объект класса DnnClassificator. Применить метод Classify к изображению:

    • путь к весам модели задается через командную строку посредством ключа --model_path;
    • путь к конфигурации модели задается через командную строку посредством ключа --config_path;
    • путь к меткам задается через командную строку посредством ключа --label_path.
  13. Определите класс с наибольшей вероятностью принадлежности исходного изображения к нему. вывести номер класса на экран. Подсказка: воспользуйтесь функцией minMaxLoc.

  14. Убедиться, что проект успешно собирается и создается новый исполняемый файл <project_build>/bin/practice2_YOUR_NAME.exe.

  15. Прислать Pull Request с внесенными изменениями. Пометить в конце названия (NOT READY). По мере готовности решений основных задач Pull Request можно будет переименовать.Полный список принимаемых параметров можно посмотреть запустив исполняемый файл с ключом --help. См. документацию к классу cv::dnn::Net (методы readNet, setInput и forward) и пространству имен cv:dnn (метод blobFromImage). Также полезным будет посмотреть примеры работы с dnn из официальных семплов OpenCV

  16. Решить задачи из списка Дополнительные задачи.