Настройка нейронной сети для детекции необходимых объектов

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


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

В качестве примера для детекции объектов будем использовать алгоритм YOLOv3. Дополнительные материалы по статье вы сможете найти на github странице. Пример установки и настройки осуществляется на ОС Windows 10.

В первую очередь нам необходимо скачать или клонировать необходимые материалы для переобучения нейронной сети под определенный тип объекта с данной github страницы. Для того чтобы не возникало проблем с доступом или разрешениями, материалы лучше разместить в директории своей учетной записи, например: C:Usersuser_nameDocumentsNN.

1. Переходим в папку yolov3-master, вызываем терминал (командную строку) и выполняем команду pip install -U -r requirements.txt. При запуске команды некоторые из пакетов не установились, т.к в репозитории pip для windows, пакетов с таким названием не существует. Чтобы установка прошла успешно, в requirements.txt мы должны закомментировать несколько пакетов («torch >= 1.5» и «pycocotools»). Затем установить pytorch с помощью следующей команды:

pip install torch==1.5.0 torchvision==0.6.0 -f https://download.pytorch.org/whl/torch_stable.html

Пакет pycocotools в нашем случае не понадобится. Также необходимо скачать и установить CUDA tools, для того чтобы ваши вычисления проходили на видеокарте, что в разы увеличивает скорость переобучения.

2. После успешного завершения установки можем приступать к подготовке данных. Для лучшей работы алгоритма фотографии для обучения необходимо брать с материалов, на которых будет производится обработка. Например, необходимо обработать видеоматериалы с камер видеонаблюдения, которые установлены в помещении, где объекты располагаются под большим углом. В такой ситуации будет очень сложно обучить алгоритм для детекции объектов, которые сильно отличаются от картинок в интернете, на которых была обучена нейронная сеть. Таким образом, обучающая выборка составляется либо из скрин-снимков по видеоматериалам, либо с помощью ручной съемки фотоаппаратом. Размер обучающей выборки может сильно варьироваться, все зависит от характера задачи. В данном примере набор данных состоит из 46 картинок, на которых изображены три типа объектов (ручка, карандаш, маркер). Фотосъемка производилась на фоне стола и листа А4.

3. Следующий этап состоит в разметке объектов на изображении. Однако, перед тем как приступить к разметке, необходимо увеличить обучающую выборку с помощью нескольких методов аугментации. Это важно для улучшения способностей нейронной сети к распознаванию объектов в различных вариациях. Несколько примеров аугментации можно найти в данной тетрадке. По завершении аугментации объединяем оригинальные изображения с результатом аугментации в одну папку (важно, изображения должны располагаться в корне папки yolov3_master, например: C:Usersuser_nameDocumentsNN yolov3_masterimages). Далее с помощью программы labelImg проводим разметку объектов, последовательно выполняя следующие шаги:

  1. выбираем папку с изображениями (…yolov3_masterimages);
  2. выбираем папку для сохранения меток. Необходимо создать новую папку с названием labels, в той же директории где изображения (….yolov3_masterlabels);
  3. меняем тип меток c PascalVOC на YOLO;
  4. нажимаем на инструмент выделения объектов;
  5. полностью выделяем все объекты, для которых хотим обучить алгоритм;
  6. задаем название для каждого из типов объектов (Pen, Pencil, Marker), после первого ввода эти названия буду доступны в списке для следующих изображений;
  7. подтверждаем;
  8. сохраняем метку;
  9. переходим к следующему изображению и повторяем пункты 4 – 8.

В результате в папке labels появятся текстовые документы с названиями изображений, в которых содержится метка класса и четыре координаты — нормализованные значения x,y,w,h, которые описывают расположение прямоугольника для каждого объекта на изображении (1 – это номер строки в редакторе Notepad++ и не относится к содержимому документа):

4. Далее нам необходимо разделить подготовленную выборку на обучающую и тестовую. В данном случае необходимо создать 2 текстовых документа (train_112.txt и test_24.txt), в которых будут указаны полный путь расположения для каждого изображения. Пример создания документов можно найти в тетрадке.

5. Для того чтобы искомые объекты были именованными необходимо создать файл с расширением .names, например objects.names, в котором указаны имена в том же порядке, как указано в classes.txt в папке labels. Выглядит примерно так:

Далее необходимо создать файл с расширением .data, например conf.data, в котором указано количество классов (в данном примере 3), файлы с именами объектов, а также файлы с расположением изображений для обучающей и тестовой выборки:

Файлы objects.names, conf.data и последующие файлы необходимо поместить в следующую директорию: yolov3_masterdata, заранее удалив с неё все файлы.

6. Для переобучения необходимо настроить конфигурационный файл, для этого с папки (…yolov3_mastercfg) копируем файл yolov3-spp.cfg в папку (…yolov3_masterdata). Далее необходимо отредактировать строки (636,643 — 722,729 — 809,816) для каждого из трех слоев:

Где, filters = (5 + n) * 3 и classes = n. n – количество классов (в данном примере 3).

7. Далее необходимо скачать веса для настроенного конфигурационного файла. Для этого со страницы скачиваем файл yolov3-spp.pt и помещаем его в (…yolov3_masterdata). Для примера используется алгоритм yolov3-spp. Однако существует еще несколько вариаций алгоритма, например, yolov3-tiny, что является облегченной версией yolov3-spp. Облегченная версия менее точна, но при это скорость обработки материалов значительно выше.

8. Переходим непосредственно к переобучению алгоритма под свой тип объекта. Для этого в папке …yolov3_master запускаем командную строку и вводим следующую команду:

python train.py --cfg data/yolov3-spp.cfg --data data/conf.data --weights data/yolov3-spp.pt --nosave

После запуска команды может возникнуть ошибка следующего характера:

Для решения данной проблемы необходимо закомментировать строки в файле utils.py в папке utils:

В теле функции check_git_status закомментируем все строки кроме print, в который передадим любую строку, например, «ss».

Также может появиться ошибка следующего вида:

Данная ошибка говорит о том, что не хватает памяти видеокарты для построения вычислительного графа. Одним из способов решения данной проблемы является уменьшение размера батча при обучении. Для этого в файле (…yolov3_master rain.py) необходимо изменить параметр batch_size, по умолчанию установлено 16, изменим на меньшее значение (8 или 4) кратное 4:

Также данное значение можно передать явно, используя значение параметра при инициализации:

python train.py --cfg data/yolov3-spp.cfg --data data/conf.data --weights data/yolov3-spp.pt --batch-size 4 --nosave

В примере выше мы указали конфигурационный файл, файл с информацией об обучающей выборке, веса и параметр сохранения.

Параметр —nosave указывает на то что будет сохранен только финальный файл с весами. Также можно настроить в файле train.py режим сохранения, например, если вы хотите сохранять веса каждые 400 epoch:

Также важно указать параметр —epochs, количество эпох зависит от типа объектов, объема обучающей выборки и других факторов. В данном примере изначально было 46 изображений, с помощью методов аугментации набор данных увеличился до 136, из них 112 – обучающая выборка, 24 – тестовая выборка. Вычисления проводились на видеокарте GTX 1060 6 GB. Первая попытка проводилась для 300 эпох, обучение заняло порядка 2.5 часов. Выявилась очень плохая точность алгоритма. Вторая попытка проводилась для 1200 эпох, обучение заняло ~ 12 часов. По окончании обучения в папку (…yolov3_masterweights) сохранятся веса — файл last.pt. Для того чтобы проверить работоспособность алгоритма необходимо запустить следующую команду:

python detect.py --weights weights/last.pt --cfg data/yolov3-spp.cfg --names data/objects.names

Перед запуском команды необходимо поместить изображения для обработки алгоритмом в папку (…yolov3_masterdatasamples). Результат появится в папке (…yolov3_masteroutput).

Таким образом, проведено переобучение готовой нейронной сети, которая была способна определять 80 классов объектов, под новые 3 типа объекта, не вошедших в этот список. Для объекта «маркер» алгоритм не совсем точен, уверенность составляет меньше 0.5. Одной из причин может быть малый размер обучающей выборки, т.к. в данном примере изображений с маркерами было 26 %, остальное ручки и карандаши.

ссылка на оригинал статьи https://habr.com/ru/post/506166/

Источник


Источник: savepearlharbor.com

Комментарии: