1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/duping812-jetson-inference

Клонировать/Скачать
pytorch-ssd.md 21 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 02.06.2025 15:38 5e07e18

Назад | Вперед | Содержание
Переносное обучение - Обнаружение объектов

# Перетренировка SSD-Mobilenet Далее мы будем обучать собственную модель обнаружения объектов SSD-Mobilenet с использованием PyTorch и набора данных [Open Images](https://storage.googleapis.com/openimages/web/visualizer/index.html?set=train&type=detection&c=%2Fm%2F06l9r). SSD-Mobilenet — это популярная архитектура сети для реального времени обнаружения объектов на мобильных и встраиваемых устройствах, которая объединяет [SSD-300](https://arxiv.org/abs/1512.02325) Single-Shot MultiBox Detector с [Mobilenet](https://arxiv.org/abs/1704.04861) backbone.

В примере ниже мы будем обучать пользовательскую модель обнаружения, которая определяет 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 сек
  • измерено на наборе данных фруктов (5145 изображений для обучения, размер батча 4)

Обучение модели SSD-Mobilenet

Как только ваши данные завершат загрузку, запустите скрипт 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 эпох здесь.

Преобразование модели в ONNX

Следующим шагом является преобразование нашей обученной модели из PyTorch в ONNX, чтобы мы могли загрузить её с помощью TensorRT:

python3 onnx_export.py --model-dir=models/fruit

Это сохранит модель под названием ssd-mobilenet.onnx в директории jetson-inference/python/training/detection/ssd/models/fruit/

Обработка изображений с помощью TensorRT

Чтобы классифицировать некоторые статические тестовые изображения, мы будем использовать расширенные параметры командной строки для 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:

## Запуск программы с веб-камеры Вы также можете попробовать запустить перетренированную модель растений на веб-камере или видеопотоке, как показано ниже: ```bash detectnet --model=models/fruit/ssd-mobilenet.onnx --labels=models/fruit/labels.txt \ --input-blob=input_0 --output-cvg=scores --output-bbox=boxes \ csi://0 ``` Для получения дополнительной информации о других источниках камеры/видео, пожалуйста, обратитесь к [Веб-камера и мультимедиа](aux-streaming.md).

Далее | Сбор собственных наборов данных для обнаружения
Назад | Сбор собственных наборов данных для классификации

© 2016-2020 NVIDIA | Содержание

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/duping812-jetson-inference.git
git@api.gitlife.ru:oschina-mirror/duping812-jetson-inference.git
oschina-mirror
duping812-jetson-inference
duping812-jetson-inference
master