Цель данной работы - освоить инструменты разработки программного обеспечения, перечисленные ниже, на примере решения задачи обработки изображений посредством фильтрации или пикселизации отдельной области.
- В папке
src
расположен файлimagefilter.py
, содержащий объявление классаImageFilter
. Необходимо реализовать метод обработки изображенияprocess_image
. - В папке
samples
расположен файлpractice1_template.py
, в котором представлена функцияmain
- точка входа в программу, использующую фильтр.
Основные задачи:
- Создать на GitHub копию рабочего репозитория, содержащего практические задания школы, в собственном аккаунте.
- Создать локальную копию (на рабочей машине) репозитория, содержащего практические задания школы.
- Настроить локальную копию репозитория для последующей синхронизации с сервером.
- Создать виртуальную среду и установить необходимые необходимые библиотеки.
- Разработать приложение для открытия исходного изображения из файла и сохранения результирующего изображения в файл.
- Разработать фильтр для перевода изображения в оттенки серого.
- Разработать фильтр для изменения размера изображения.
- Разработать фильтр для вырезания квадрата из центральной части изображения.
- Сделать "commit" (зафиксировать) разработанные методы в локальном репозитории.
- Отправить "pull request" в основной репозиторий, содержащий шаблоны практических заданий школы.
Дополнительные задачи:
- Разработать фильтр пикселизации для выделенной области изображения.
- Разработать приложение для открытия изображение/видео/видеопотока с веб-камеры и вывода данных на экран.
- Сделать форк upstream-репозитория.
- Клонировать origin-репозиторий к себе на локальную машину (раздел Общие инструкции по работе с Git).
- Создать в Anaconda новую виртуальную среду Python.
- Установить библиотеку OpenCV в вритуальную среду Python.
- Запустить проект и проверить его работоспособность.
- Создать рабочую ветку (раздел Общие инструкции по работе с Git).
- Реализовать отображение картинки на экране при помощи OpenCV. По мере готовности не забывайте выкладывать изменения в рабочую ветку на сервер.
- Реализовать фильтр, который переводит изображение в оттенки серого.
- Реализовать фильтр, который изменяет размер изображения.
- Реализовать фильтр, который вырезает центральную часть изображения.
- Сделать Pull Request в upstream-репозиторий.
- Решить задачи списка Дополнительные задачи.
-
Сделать форк upstream-репозитория.
- Открыть в браузере upstream-репозиторий https://github.com/itlab-vision/UNN_HPC_SCHOOL_2019_ML.
- В правом верхнем углу нажать кнопку Fork.
- Выбрать в качестве организации, куда направить форк, организацию,
соответствующую вашему аккаунту
@github-account
.
-
Клонировать origin-репозиторий к себе на локальную машину (раздел Общие инструкции по работе с Git).
-
Открыть командную строку Git Bash (или Git Shell в зависимости от того, какой git-клиент установлен на вашей машине). Для этого необходимо найти соответствующий ярлык на рабочем столе или в меню "Пуск".
-
Воспользоваться перечнем инструкций, описанных в разделе Общие инструкции по работе с Git).
$ cd C:\ $ git clone https://github.com/<@github-account>/UNN_HPC_SCHOOL_2019_ML.git
-
-
Удостовериться, что семпл работает - запустить командную строку, в ней запустить скрипт с вашим приложением.
$ cd UNN_HPC_SCHOOL_2019_ML/samples $ python practice1_template.py
-
Создать рабочую ветку (раздел Общие инструкции по работе с Git).
-
Создать копию файла
<project_source>/samples/practice1_template.py
и назвать ее<project_source>/samples/practice1_YOUR_NAME.py
. -
В файле
practice1_YOUR_NAME.py
добавить чтение параметров командной строки при помощи библиотекиargparse
. В семпле уже добавлен код, который создает обработчик для чтения параметров командной строки, вам нужно реализовать добавление новых параметров . -
Открыть консоль Anaconda (Anaconda Prompt) и создать новую виртуальную среду.
$ conda create -n openvino $ conda activate openvino
-
В открытой консоли Anaconda установить библиотеку OpenCV.
$ conda install opencv
-
В файле
practice1_YOUR_NAME.py
реализовать чтение файла изображения при помощи имени файла, полученного из аргументов командной строки, и вывести это изображение на экран. Шпаргалка по OpenCV в Python. -
В файле
imagefilter.py
написать реализацию методаprocess_image
.- Для перевода изображения в оттенки серого используйте функцию
cvtColor
. - Для изменения размера изображения используйте функцию
cvResize
. - Для обрезки изображения вычислите центр изображения и максимальную
сторону квадрата, которую можно получить из начального изображения,
а затем сделайте срез изображения подобно тому, как делаются срезы
массивов в
numpy
.
- Для перевода изображения в оттенки серого используйте функцию
-
Прислать Pull Request с внесенными изменениями. Пометить в конце названия
(NOT READY)
. По мере готовности решений основных задач Pull Request можно будет переименовать. -
Решить задачи списка Дополнительные задачи.
- Реализовать выделение области для пикселизации с использованием мыши и разработать фильтр пикселизации. Для выделения области необходимо назначить обработчик события на окно, содержащее отображаемое изображение. Для пикселизации необходимо область разделить по вертикали и горизонтали на равные части и в каждой прямоугольной подобласти выполнить размытие.
- Разработать приложение для открытия изображения/видео/видеопотока с веб-камеры и вывода данных на экран.
В данном разделе описана типичная последовательность действий, которую
необходимо выполнить перед тем, как начать работать с проектом. Далее
для определенности используется репозиторий CV-SUMMER-CAMP
.
-
Создать аккаунт на github.com, если такой отсутствует. Для определенности обозначим аккаунт
github-account
. -
Сделать 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-репозиторий). -
Клонировать origin репозиторий к себе на локальный компьютер, воспользовавшись следующей командой:
$ git clone https://github.com/ <github-account> /UNN_HPC_SCHOOL_2019_ML
-
Перейти в директорию
UNN-HPC-SCHOOL-2019-OPENVINO
:$ cd ./UNN_HPC_SCHOOL_2019_ML
-
Настроить адрес upstream-репозитория (потребуется при обновлении локальной версии репозитория):
$ git remote add upstream https://github.com/itlab-vision/UNN_HPC_SCHOOL_2019_ML
-
Настроить имя пользователя и e-mail, из под которого будут выполняться все операции с репозиторием Git:
$ git config --local user.name "github-account" $ git config --local user.email "github-email"
Примечание: если не выполнить указанную операцию при попытке размещения изменений на сервер, они попадут под аккаунтом пользователя компьютера.
-
Настроить редактор, который будет использован, если вносятся изменения в историю репозитория (в частности, при слиянии веток).
$ git config --local core.editor "'C:/Program Files (x86)/Notepad++/notepad++.exe' -n -w"
Когда сделан форк репозитория у вас создается по умолчанию единственная ветка master. Тем не менее, при решении независимых задач следует создавать рабочие ветки. Далее показаны основные команды для управления ветками на примере ветки
practice-1
. -
Получить список веток:
$ git branch [-v] # [-v] - список с информацией о последних коммитах
-
Создать ветку:
$ git branch practice-1
-
Создать ветку
practice-1
и перейти в нее:$ git checkout [-b] practice-1 # [-b] - создание и переход в ветку <branch_name>
-
Удалить ветку в локальном репозитории:
$ git branch -d <branch_name>
-
Удалить ветку на сервере:
$ git push [remotename] :[branch] # [remotename] - имя удалённого репозитория. Если следовать приведённой # инструкции, то origin - репозиторий пользователя github-account, upstream - # репозиторий itlab-vision/UNN_HPC_SCHOOL_2019_ML
При работе с файлами в ветке необходимо управлять изменениями. Далее приведен
перечень основных команд в предположении, что текущей рабочей веткой
является practice-1
.
-
Получить список текущих изменений:
$ git status
-
Пометить файл как добавленный в текущую ветку репозитория (файл будет добавлен после выполнения команды
commit
):$ git add [<file_name>] # <file_name> - название файла для добавления в commit # если вместо имени указан символ *, то будут добавлены все новые файлы, # не совпадающие с масками, указанными в .gitignore
-
Добавить изменения в текущую ветку локального репозитория:
$ git commit [-m "<message_to_commit>"] [-a] # [-a] - автоматически добавляет изменения для существующих на сервере файлов # без выполнения команды git add # [--amend] - перезаписывает последний коммит (используется, если не забыты # изменения)
-
Разместить изменения, которые были добавлены в локальный репозиторий с помощью команды
commit
:$ git push [-u] origin [practice-1] # [-u] - отслеживать версию ветки [practice-1] на удалённом сервере # (origin). Позволяет получать изменения с сервера при помощи команды git pull # без явного указания имени удалённого репозитория и имени ветки.
-
Получить изменения с сервера при помощи команды
pull
и слить их с отслеживаемыми ветками:$ git pull [remotename [<branch name>]]
-
Удалить файлы или директории (!без опции
-f
для файлов, состояния которых совпадают с состояниям на сервере):$ git rm [-f] [--cached] # [-f] - принудительное удаление (файла с измененным состоянием) # [--cached] - удаление файлов на сервере, но не в локальной директории
-
Переименовать файлы (или 3 команды:
mv
,git rm
,git add
):$ git mv <file_from> <file_to>
Когда в проекте работает несколько человек, то вполне естественная ситуация - необходимость слияния изменений и разрешение конфликтов.
-
Слияние (вариант 1):
$ git merge upstream/master # слияние изменений из ветки upstream в master $ git merge master # слияние изменений из ветки master в текущую ветку
-
Слияние (вариант 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>
-
Инструмент для разрешения конфликтов:
$ 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