Skip to content

Latest commit

 

History

History
368 lines (276 loc) · 21 KB

practice1.md

File metadata and controls

368 lines (276 loc) · 21 KB

Практика 1. Инструменты разработки ПО, базовые функции Python, библиотека OpenCV

Цели

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

  • Система контроля версий Git.
  • Базовый функционал языка Python.
  • Библиотека OpenCV.

Структура исходного кода

  1. В папке src расположен файл imagefilter.py, содержащий объявление класса ImageFilter. Необходимо реализовать метод обработки изображения process_image.
  2. В папке samples расположен файл practice1_template.py, в котором представлена функция main - точка входа в программу, использующую фильтр.

Задачи

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

  1. Создать на GitHub копию рабочего репозитория, содержащего практические задания школы, в собственном аккаунте.
  2. Создать локальную копию (на рабочей машине) репозитория, содержащего практические задания школы.
  3. Настроить локальную копию репозитория для последующей синхронизации с сервером.
  4. Создать виртуальную среду и установить необходимые необходимые библиотеки.
  5. Разработать приложение для открытия исходного изображения из файла и сохранения результирующего изображения в файл.
  6. Разработать фильтр для перевода изображения в оттенки серого.
  7. Разработать фильтр для изменения размера изображения.
  8. Разработать фильтр для вырезания квадрата из центральной части изображения.
  9. Сделать "commit" (зафиксировать) разработанные методы в локальном репозитории.
  10. Отправить "pull request" в основной репозиторий, содержащий шаблоны практических заданий школы.

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

  1. Разработать фильтр пикселизации для выделенной области изображения.
  2. Разработать приложение для открытия изображение/видео/видеопотока с веб-камеры и вывода данных на экран.

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

  1. Сделать форк upstream-репозитория.
  2. Клонировать origin-репозиторий к себе на локальную машину (раздел Общие инструкции по работе с Git).
  3. Создать в Anaconda новую виртуальную среду Python.
  4. Установить библиотеку OpenCV в вритуальную среду Python.
  5. Запустить проект и проверить его работоспособность.
  6. Создать рабочую ветку (раздел Общие инструкции по работе с Git).
  7. Реализовать отображение картинки на экране при помощи OpenCV. По мере готовности не забывайте выкладывать изменения в рабочую ветку на сервер.
  8. Реализовать фильтр, который переводит изображение в оттенки серого.
  9. Реализовать фильтр, который изменяет размер изображения.
  10. Реализовать фильтр, который вырезает центральную часть изображения.
  11. Сделать Pull Request в upstream-репозиторий.
  12. Решить задачи списка Дополнительные задачи.

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

  1. Сделать форк upstream-репозитория.

    1. Открыть в браузере upstream-репозиторий https://github.com/itlab-vision/UNN_HPC_SCHOOL_2019_ML.
    2. В правом верхнем углу нажать кнопку Fork.
    3. Выбрать в качестве организации, куда направить форк, организацию, соответствующую вашему аккаунту @github-account.
  2. Клонировать origin-репозиторий к себе на локальную машину (раздел Общие инструкции по работе с Git).

    1. Открыть командную строку Git Bash (или Git Shell в зависимости от того, какой git-клиент установлен на вашей машине). Для этого необходимо найти соответствующий ярлык на рабочем столе или в меню "Пуск".

    2. Воспользоваться перечнем инструкций, описанных в разделе Общие инструкции по работе с Git).

      $ cd C:\
      $ git clone https://github.com/<@github-account>/UNN_HPC_SCHOOL_2019_ML.git
  3. Удостовериться, что семпл работает - запустить командную строку, в ней запустить скрипт с вашим приложением.

    $ cd UNN_HPC_SCHOOL_2019_ML/samples
    $ python practice1_template.py
  4. Создать рабочую ветку (раздел Общие инструкции по работе с Git).

  5. Создать копию файла <project_source>/samples/practice1_template.py и назвать ее <project_source>/samples/practice1_YOUR_NAME.py.

  6. В файле practice1_YOUR_NAME.py добавить чтение параметров командной строки при помощи библиотеки argparse. В семпле уже добавлен код, который создает обработчик для чтения параметров командной строки, вам нужно реализовать добавление новых параметров .

  7. Открыть консоль Anaconda (Anaconda Prompt) и создать новую виртуальную среду.

    $ conda create -n openvino
    $ conda activate openvino
  8. В открытой консоли Anaconda установить библиотеку OpenCV.

    $ conda install opencv
  9. В файле practice1_YOUR_NAME.py реализовать чтение файла изображения при помощи имени файла, полученного из аргументов командной строки, и вывести это изображение на экран. Шпаргалка по OpenCV в Python.

  10. В файле imagefilter.py написать реализацию метода process_image.

    1. Для перевода изображения в оттенки серого используйте функцию cvtColor.
    2. Для изменения размера изображения используйте функцию cvResize.
    3. Для обрезки изображения вычислите центр изображения и максимальную сторону квадрата, которую можно получить из начального изображения, а затем сделайте срез изображения подобно тому, как делаются срезы массивов в numpy.
  11. Прислать Pull Request с внесенными изменениями. Пометить в конце названия (NOT READY). По мере готовности решений основных задач Pull Request можно будет переименовать.

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

    1. Реализовать выделение области для пикселизации с использованием мыши и разработать фильтр пикселизации. Для выделения области необходимо назначить обработчик события на окно, содержащее отображаемое изображение. Для пикселизации необходимо область разделить по вертикали и горизонтали на равные части и в каждой прямоугольной подобласти выполнить размытие.
    2. Разработать приложение для открытия изображения/видео/видеопотока с веб-камеры и вывода данных на экран.

Общие инструкции по работе с Git

В данном разделе описана типичная последовательность действий, которую необходимо выполнить перед тем, как начать работать с проектом. Далее для определенности используется репозиторий CV-SUMMER-CAMP.

  1. Создать аккаунт на github.com, если такой отсутствует. Для определенности обозначим аккаунт github-account.

  2. Сделать fork репозитория https://github.com/itlab-vision/UNN_HPC_SCHOOL_2019_ML (в терминологии Git upstream-репозиторий) к себе в личный профиль с названием github-account. В результате будет создана копия репозитория https://github.com/github-account/UNN_HPC_SCHOOL_2019_ML (origin-репозиторий).

  3. Клонировать origin репозиторий к себе на локальный компьютер, воспользовавшись следующей командой:

    $ git clone https://github.com/   <github-account>   /UNN_HPC_SCHOOL_2019_ML
  4. Перейти в директорию UNN-HPC-SCHOOL-2019-OPENVINO:

    $ cd ./UNN_HPC_SCHOOL_2019_ML
  5. Настроить адрес upstream-репозитория (потребуется при обновлении локальной версии репозитория):

    $ git remote add upstream https://github.com/itlab-vision/UNN_HPC_SCHOOL_2019_ML
  6. Настроить имя пользователя и e-mail, из под которого будут выполняться все операции с репозиторием Git:

    $ git config --local user.name "github-account"
    $ git config --local user.email "github-email"

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

  7. Настроить редактор, который будет использован, если вносятся изменения в историю репозитория (в частности, при слиянии веток).

    $ git config --local core.editor "'C:/Program Files (x86)/Notepad++/notepad++.exe' -n -w"

    Когда сделан форк репозитория у вас создается по умолчанию единственная ветка master. Тем не менее, при решении независимых задач следует создавать рабочие ветки. Далее показаны основные команды для управления ветками на примере ветки practice-1.

  8. Получить список веток:

    $ git branch [-v]
    # [-v] - список с информацией о последних коммитах
  9. Создать ветку:

    $ git branch practice-1
  10. Создать ветку practice-1 и перейти в нее:

    $ git checkout [-b] practice-1
    # [-b] - создание и переход в ветку <branch_name>
  11. Удалить ветку в локальном репозитории:

    $ git branch -d <branch_name>
  12. Удалить ветку на сервере:

    $ git push [remotename] :[branch]
    # [remotename] - имя удалённого репозитория. Если следовать приведённой
    #     инструкции, то origin - репозиторий пользователя github-account, upstream -
    #     репозиторий itlab-vision/UNN_HPC_SCHOOL_2019_ML

При работе с файлами в ветке необходимо управлять изменениями. Далее приведен перечень основных команд в предположении, что текущей рабочей веткой является practice-1.

  1. Получить список текущих изменений:

    $ git status
  2. Пометить файл как добавленный в текущую ветку репозитория (файл будет добавлен после выполнения команды commit):

    $ git add [<file_name>]
    # <file_name> - название файла для добавления в commit
    #     если вместо имени указан символ *, то будут добавлены все новые файлы,
    #     не совпадающие с масками, указанными в .gitignore
  3. Добавить изменения в текущую ветку локального репозитория:

    $ git commit [-m "<message_to_commit>"] [-a]
    # [-a] - автоматически добавляет изменения для существующих на сервере файлов
    #     без выполнения команды git add
    # [--amend] - перезаписывает последний коммит (используется, если не забыты
    #     изменения)
  4. Разместить изменения, которые были добавлены в локальный репозиторий с помощью команды commit:

    $ git push [-u] origin [practice-1]
    # [-u] - отслеживать версию ветки [practice-1] на удалённом сервере
    #     (origin). Позволяет получать изменения с сервера при помощи команды git pull
    #     без явного указания имени удалённого репозитория и имени ветки.
  5. Получить изменения с сервера при помощи команды pull и слить их с отслеживаемыми ветками:

    $ git pull [remotename [<branch name>]]
  6. Удалить файлы или директории (!без опции -f для файлов, состояния которых совпадают с состояниям на сервере):

    $ git rm [-f] [--cached]
    # [-f] - принудительное удаление (файла с измененным состоянием)
    # [--cached] - удаление файлов на сервере, но не в локальной директории
  7. Переименовать файлы (или 3 команды: mv, git rm, git add):

    $ git mv <file_from> <file_to>

Когда в проекте работает несколько человек, то вполне естественная ситуация - необходимость слияния изменений и разрешение конфликтов.

  1. Слияние (вариант 1):

    $ git merge upstream/master # слияние изменений из ветки upstream в master
    $ git merge master # слияние изменений из ветки master в текущую ветку
  2. Слияние (вариант 2):

    $ git checkout <branch_name> # переход в ветку <branch_name> (при необходимости)
    $ git rebase <base_branch> [<branch_name>] # слияние изменений из ветки <base_branch> в ветку <branch_name>
    $ git checkout <base_branch>
    $ git merge <branch_name>
  3. Инструмент для разрешения конфликтов:

    $ git mergetool

Добавление аргументов командной строки в приложение

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

    def build_argparse(): 
        parser = argparse.ArgumentParser()
            
        parser.add_argument('-a1', '--argument1', help = 'your cmd \
            argument', type = str)

где -a1 - короткое имя аргумента, --argument1 - полное имя аргумента, type - тип аргумента (int, float, str и т.д.).

Дополнительные опции:

  • required = True (или False) определяет является ли параметр обязательным.
  • default = 'defaultvalue' - значение параметра по умолчанию.
  • nargs = 2 позволяет передать два значения через пробел.

Чтение параметров в основной программе происходит по их полному имени:

    args = build_argparse().parse_args()
    variable = args.argument1