Назад | Вперед | Содержание
Переносное обучение - Обнаружение объектов
В примере ниже мы будем обучать пользовательскую модель обнаружения, которая определяет 8 различных сортов фруктов, хотя вы можете выбрать любой из 600 классов в наборе данных Open Images для обучения вашей модели. Вы можете визуально просматривать набор данных здесь.
Чтобы начать, сначала убедитесь, что у вас установлен JetPack 4.4 или более поздняя версия и PyTorch установлен для Python 3.6 на вашем Jetson. JetPack 4.4 включает TensorRT 7.1, который является минимальной версией TensorRT, поддерживающей загрузку SSD-Mobilenet через ONNX. И скрипты обучения PyTorch для тренировки SSD-Mobilenet написаны для Python 3.6, поэтому PyTorch должен быть установлен для Python 3.6.## Настройка
Примечание: сначала убедитесь, что у вас установлен JetPack 4.4 или более поздняя версия на вашем Jetson и PyTorch установлен для Python 3.6
Код PyTorch для обучения SSD-Mobilenet находится в репозитории под jetson-inference/python/training/detection/ssd
. Если вы не запускаете Docker-контейнер, вам потребуются несколько шагов перед использованием:
# вам нужно выполнить эти команды только в том случае, если вы не используете контейнер
$ cd jetson-inference/python/training/detection/ssd
$ wget https://nvidia.box.com/shared/static/djf5w54rjvpqocsiztzaandq1m3avr7c.pth -O models/mobilenet-v1-ssd-mp-0_675.pth
$ pip3 install -v -r requirements.txt
Эти команды загрузят базовую модель в ssd/models
и установят некоторые необходимые Python-пакеты (эти пакеты уже были установлены в контейнере). Базовая модель была предварительно обучена на другом наборе данных (PASCAL VOC), чтобы мы не должны были обучать SSD-Mobilenet с нуля, что заняло бы гораздо больше времени. Вместо этого мы будем использовать перенос обучения для настройки модели на распознавание новых классов объектов по нашему выбору.## Загрузка данных
Набор данных Open Images содержит более 600 классов объектов, из которых вы можете выбрать. Есть скрипт, называемый open_images_downloader.py
, который автоматически загрузит выбранные вами классы объектов.
Примечание: Чем меньше классов вы используете, тем быстрее будет работать модель во время инференса. Набор данных Open Images также может содержать сотни гигабайт данных в зависимости от выбранных вами классов - поэтому перед загрузкой своих классов убедитесь, что вы ознакомились с разделом Ограничение количества данных ниже. Классы, которые мы будем использовать, это
"Яблоко, Апельсин, Банан, Клубника, Виноград, Груша, Ананас, Арбуз"
, например, для робота по сбору фруктов - хотя вы можете заменить их своими собственными выборами из списка классов. Классы фруктов имеют ~6500 изображений, что является хорошим компромиссом.
$ python3 open_images_downloader.py --class-names "Яблоко, Апельсин, Банан, Клубника, Виноград, Груша, Ананас, Арбуз" --data=data/fruit
...
2020-07-09 16:20:42 - Начало загрузки 6360 изображений.
2020-07-09 16:20:42 - Загружено 100 изображений.
2020-07-09 16:20:42 - Загружено 200 изображений.
2020-07-09 16:20:42 - Загружено 300 изображений.
2020-07-09 16:20:42 - Загружено 400 изображений.
2020-07-09 16:20:42 - Загружено 500 изображений.
``````2020-07-09 16:20:46 - Скачано 600 изображений.
. . .
2020-07-09 16:32:12 - Задача завершена.
По умолчанию, набор данных будет загружен в директорию data/
под jetson-inference/python/training/detection/ssd
(что автоматически монтируется в контейнер), но вы можете изменить это, указав опцию --data=<ПУТЬ>
.
В зависимости от размера вашего набора данных может потребоваться использование внешнего хранилища.
И если вы скачиваете несколько наборов данных, следует хранить каждый набор данных в отдельной поддиректории.
В зависимости от выбранных классов, набор данных Open Images может содержать большое количество данных - в некоторых случаях слишком много, чтобы быть обученным за разумное время для наших целей.
В частности, классы, содержащие людей и транспортные средства, имеют очень большое количество изображений (>250 ГБ).
Поэтому при выборе своих собственных классов перед загрузкой данных рекомендуется сначала запустить скрипт загрузчика с опцией --stats-only
.
Это покажет количество изображений для ваших классов, не загружая фактически никаких изображений.
$ python3 open_images_downloader.py --stats-only --class-names "Apple,Orange,Banana,Strawberry,Grape,Pear,Pineapple,Watermelon" --data=data/fruit
. . .
2020-07-09 16:18:06 - Общее количество доступных изображений: 6360
2020-07-09 16:18:06 - Общее количество доступных рамок: 27188
-------------------------------------
Статистика набора данных 'train'
``` -------------------------------------
Количество изображений: 5145
Количество рамок: 23539
Распределение рамок:
Strawberry: 7553/23539 = 0.32
Orange: 6186/23539 = 0.26
Apple: 3622/23539 = 0.15
Grape: 2560/23539 = 0.11
Banana: 1574/23539 = 0.07
Pear: 757/23539 = 0.03
Watermelon: 753/23539 = 0.03
Pineapple: 534/23539 = 0.02
. . .
-------------------------------------
Общая статистика
-------------------------------------
Количество изображений: 6360
Количество рамок: 27188
примечание: опция
--stats-only
загружает данные аннотации (приблизительно ~1 ГБ), но не загружает изображения. На практике, чтобы сократить время обучения (и использовать меньше места на диске), вы, вероятно, захотите ограничить общее количество изображений до 10К. Хотя чем больше изображений вы используете, тем более точной будет ваша модель. Вы можете ограничить количество загружаемых данных с помощью опции--max-images
или опции--max-annotations-per-class
:*--max-images
ограничивает общее количество изображений в наборе данных до указанного числа, при этом сохраняя распределение изображений по классам примерно таким же, как в исходном наборе данных. Если один класс содержит больше изображений, чем другой, соотношение останется примерно тем же.*--max-annotations-per-class
ограничивает каждую категорию до указанного числа ограничивающих рамок, и если у категории меньше этого числа, доступные данные будут использованы полностью — это полезно, если распределение данных несбалансировано по категориям. Например, если вы хотите использовать только 2500 изображений для набора данных фруктов, вы запустите загрузчик таким образом:
$ python3 open_images_downloader.py --max-images=2500 --class-names "Apple,Orange,Banana,Strawberry,Grape,Pear,Pineapple,Watermelon" --data=data/fruit
Если опция --max-boxes
или --max-annotations-per-class
не установлена, по умолчанию будут загружены все доступные данные — поэтому перед запуском убедитесь, что вы проверили количество данных с помощью --stats-only
. К сожалению, невозможно заранее определить фактические требования к размеру диска для изображений, но общее правило для этого набора данных — выделить ~350КБ на каждое изображение (~2ГБ для фруктов).
Ниже приведена приблизительная производительность обучения SSD-Mobilenet для оценки времени, необходимого для обучения:
Изображений/с | Время на эпоху* | |
---|---|---|
Nano | 4,77 | 17 мин 55 сек |
Xavier NX | 14,65 | 5 мин 50 сек |
Как только ваши данные завершат загрузку, запустите скрипт train_ssd.py
для запуска обучения:
python3 train_ssd.pypy --data=data/fruit --model-dir=models/fruit --batch-size=4 --epochs=30
Примечание: если вы столкнетесь с нехваткой памяти или процесс будет "убит" во время обучения, попробуйте Подключение SWAP и Отключение графического интерфейса.
чтобы сэкономить память, вы также можете уменьшить--batch-size
(по умолчанию 4) и--workers
(по умолчанию 2). Вот некоторые общие опции, которые вы можете использовать для запуска скрипта обучения: | Аргумент | По умолчанию | Описание | |----------------|:-------------:|--------------------------------------------------------| |--data
|data/
| местоположение набора данных | |--model-dir
|models/
| директория для вывода сохраненных точек обученной модели | |--resume
| None | путь к существующей точке сохранения для возобновления обучения | |--batch-size
| 4 | попробуйте увеличить в зависимости от доступной памяти | |--epochs
| 30 | до 100 желательно, но увеличит время обучения | |--workers
| 2 | количество потоков загрузки данных (0 = отключение многопоточности) | С течением времени вы должны заметить уменьшение потерь:
2020-07-10 13:14:12 - Epoch: 0, Step: 10/1287, Avg Loss: 12.4240, Avg Regression Loss: 3.5747, Avg Classification Loss: 8.8493
2020-07-10 13:14:12 - Epoch: 0, Step: 20/1287, Avg Loss: 9.6947, Avg Regression Loss: 4.1911, Avg Classification Loss: 5.5036
2020-07-10 13:14:13 - Epoch: 0, Step: 30/1287, Avg Loss: 8.7409, Avg Regression Loss: 3.4078, Avg Classification Loss: 5.3332
```2020-07-10 13:14:13 - Эпоха: 0, Шаг: 40/1287, Среднее значение потерь: 7. 3736, Среднее значение потерь регрессии: 2. 5356, Среднее значение потерь классификации: 4. 8379
2020-07-10 13:14:14 - Эпоха: 0, Шаг: 50/1287, Среднее значение потерь: 6. 3461, Среднее значение потерь регрессии: 2. 2286, Среднее значение потерь классификации: 4. 1175
...
2020-07-10 13:19:26 - Эпоха: 0, Потери валидации: 5. 6730, Потери регрессии валидации: 1. 7096, Потери классификации валидации: 3. 9634
2020-07-10 13:19:26 - Сохранена модель models/fruit/mb1-ssd-Epoch-0-Loss-5. 672993580500285. pth
Если вы хотите протестировать модель до завершения обучения полным числом эпох, вы можете нажать Ctrl+C
для завершения скрипта обучения и возобновить его позже с помощью аргумента --resume=<CHECKPOINT>
. Вы можете скачать обученную модель для фруктов, которая была обучена 100 эпох здесь.
Следующим шагом является преобразование нашей обученной модели из PyTorch в ONNX, чтобы мы могли загрузить её с помощью TensorRT:
python3 onnx_export.py --model-dir=models/fruit
Это сохранит модель под названием ssd-mobilenet.onnx
в директории jetson-inference/python/training/detection/ssd/models/fruit/
Чтобы классифицировать некоторые статические тестовые изображения, мы будем использовать расширенные параметры командной строки для detectnet
(или detectnet.py
) для загрузки нашего кастомного ONNX-модели SSD-Mobilenet. Для выполнения этих команд рабочий каталог терминала должен находиться в директории: jetson-inference/python/training/detection/ssd/
IMAGES=<путь-к-вашей-jetson-inference>/data/images # замените ваш путь jetson-inference здесь
detectnet --model=models/fruit/ssd-mobilenet.onnx --labels=models/fruit/labels.txt \
``` --input-blob=input_0 --output-cvg=scores --output-bbox=boxes \
"$IMAGES/fruit_*.jpg" $IMAGES/test/fruit_%i.jpg
примечание:
detectnet.py
можно заменить выше для запуска версии программы на Python Ниже приведены некоторые изображения, выведенных в директорию$IMAGES/test
:
Далее | Сбор собственных наборов данных для обнаружения
Назад | Сбор собственных наборов данных для классификации
© 2016-2020 NVIDIA | Содержание
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )