Назад | Вперед | Содержание
Переносное обучение - классификация
# Перетренировка на наборе данных PlantCLEF
Далее мы обучим модель, способную классифицировать 20 различных видов растений и деревьев из набора данных
PlantCLEF.

Ниже приведен 1,5 ГБ поднабор, который включает 10 475 изображений для обучения, 1 155 изображений для проверки и 30 изображений для тестирования по 20 классам растений и деревьев. Классы были выбраны из PlantCLEF 2017 из категорий, которые имели не менее 500 изображений для обучения в исходном наборе данных:
```
• дуб
• бук
• камыш
• кедр
• клевер
• кипарис
• василек
• пырей
• клен
• тополь
• папоротник
• фиг
• ель
• можжевельник
• тополь
• ядовитая ива
• гинкго
• клена
• ландыш
• тюльпанное дерево
```
Чтобы начать, сначала убедитесь, что у вас установлен [PyTorch](pytorch-transfer-learning.md#установка-pytorch) на вашем Jetson, затем загрузите набор данных ниже и запустите скрипт обучения. После этого мы протестируем перетренированную модель в TensorRT на статических изображениях и прямом потоке камеры.
## Загрузка данныхВыполните следующие команды для загрузки и извлечения подготовленного набора данных PlantCLEF:
```bash
$ cd jetson-inference/python/training/classification/data
$ wget https://nvidia.box.com/shared/static/vbsywpw5iqy7r38j78xs0ctalg7jrg79.gz -O PlantCLEF_Subset.tar.gz
$ tar xvzf PlantCLEF_Subset.tar.gz
```
Зеркала набора данных доступны по следующим ссылкам:
*
https://drive.google.com/file/d/14pUv-ZLHtRR-zCYjznr78mytFcnuR_1D/view?usp=sharing
*
https://nvidia.box.com/s/vbsywpw5iqy7r38j78xs0ctalg7jrg79
## Перетренировка модели ResNet-18
Мы будем использовать тот же скрипт обучения, который использовали в предыдущем примере, расположенный по адресу
Переход к разделу [python/training/classification/](https://github.com/dusty-nv/jetson-inference/tree/master/python/training/classification). По умолчанию он настроен для обучения модели ResNet-18, но вы можете изменить это с помощью флага `--arch`.Чтобы запустить обучение, выполните следующие команды:
```bash
$ cd jetson-inference/python/training/classification
$ python3 train.py --model-dir=models/plants data/PlantCLEF_Subset
```
> **Примечание:** Если вы столкнулись с нехваткой памяти или процесс был "убит" во время обучения, попробуйте [Монтирование SWAP](pytorch-transfer-learning.md#mounting-swap) и [Отключение графического интерфейса](pytorch-transfer-learning.md#disabling-the-desktop-gui).
> Чтобы сэкономить память, вы также можете уменьшить `--batch-size` (по умолчанию 8) и `--workers` (по умолчанию 2).При запуске обучения вы должны увидеть текст с консоли, подобный следующему:
```bash
Use GPU: 0 for training
=> dataset classes: 20 ['ash', 'beech', 'cattail', 'cedar', 'clover', 'cyprus', 'daisy', 'dandelion', 'dogwood', 'elm', 'fern', 'fig', 'fir', 'juniper', 'maple', 'poison_ivy', 'sweetgum', 'sycamore', 'trout_lily', 'tulip_tree']
=> using pre-trained model 'resnet18'
=> reshaped ResNet fully-connected layer with: Linear(in_features=512, out_features=20, bias=True)
Epoch: [0][ 0/1307] Time 49. 345 (49. 345) Data 0. 561 ( 0. 561) Loss 3. 2172e+00 (3. 2172e+00) Acc@1 0. 00 ( 0. 00) Acc@5 25. 00 ( 25. 00)
Epoch: [0][ 10/1307] Time 0. 779 ( 5. 211) Data 0. 000 ( 0. 060) Loss 2. 3915e+01 (1. 5221e+01) Acc@1 0. 00 ( 5. 68) Acc@5 12. 50 ( 27. 27)
Epoch: [0][ 20/1307] Time 0. 765 ( 3. 096) Data 0. 000 ( 0. 053) Loss 3. 6293e+01 (2. 1256e+01) Acc@1 0. 00 ( 5. 95) Acc@5 37. 50 ( 27. 38)
Epoch: [0][ 30/1307] Time 0. 773 ( 2. 346) Data 0. 000 ( 0. 051) Loss 2. 8803e+00 (1. 9256e+01) Acc@1 37. 50 ( 6. 85) Acc@5 62. 50 ( 27. 42)
Epoch: [0][ 40/1307] Time 0. 774 ( 1. 962) Data 0. 000 ( 0. 050) Loss 3. 7734e+00 (1. 5865e+01) Acc@1 12. 50 ( 8. 84) Acc@5 37. 50 ( 29. 88)
Epoch: [0][ 50/1307] Time 0. 772 ( 1. 731) Data 0. 000 ( 0. 049) Loss 3. 0311e+00 (1. 3756e+01) Acc@1 25. 00 ( 10. 29) Acc@5 37. 50 ( 32. 35)
Epoch: [0][ 60/1307] Time 0. 773 ( 1. 574) Data 0. 000 ( 0. 048) Loss 3. 2433e+00 (1. 2093e+01) Acc@1 0. 00 ( 9. 84) Acc@5 25. 00 ( 32. 79)
Epoch: [0][ 70/1307] Time 0. 806 ( 1. 462) Data 0. 000 ( 0. 048) Loss 2. 9213e+00 (1. 0843e+01) Acc@1 12. 50 ( 8. 98) Acc@5 37. 50 ( 33. 27)
```
Эпоха: [0][ 80/1307] Время 0. 792 ( 1. 379) Данные 0. 000 ( 0. 048) Потеря 3. 2370e+00 (9. 8715e+00) Acc@1 0. 00 ( 9. 26) Acc@5 25. 00 ( 34. 41)
Эпоха: [0][ 90/1307] Время 0. 770 ( 1. 314) Данные 0. 000 ( 0. 048) Потеря 2. 4494e+00 (9. 0905e+00) Acc@1 25. 00 ( 9. 75) Acc@5 75. 00 ( 36. 26)
Эпоха: [0][ 100/1307] Время 0. 801 ( 1. 261) Данные 0. 001 ( 0. 048) Потеря 2. 6449e+00 (8. 4769e+00) Acc@1 25. 00 ( 10. 40) Acc@5 62. 50 ( 37. 00)
См. [Метрики обучения](pytorch-cat-dog).md#training-metrics) на предыдущей странице для описания статистики в выводе выше.
### Точность модели
На набор данных PlantCLEF из 10 475 изображений обучение ResNet-18 занимает примерно ~15 минут на эпоху на Jetson Nano, или около 8 часов для обучения модели на 35 эпох. Ниже приведен график для анализа прогресса обучения эпох против точности модели:

На примерно эпохе 30 модель ResNet-18 достигает 75% точности Top-5, а на эпохе 65 она сходится на 85% точности Top-5. Интересно, что эти точки стабильности и сходимости модели происходят в схожие моменты для ResNet-18, как и для предыдущей модели Cat/Dog. Точность Top-1 модели составляет 55%, что мы обнаружим достаточно эффективной на практике, учитывая разнообразие и сложность содержания набора данных PlantCLEF (т. е. несколько перекрывающихся видов растений на одном изображении и множество фотографий листьев и стволов деревьев, которые практически невозможно различить друг от друга).
По умолчанию скрипт обучения настроен на выполнение на 35 эпох, но если вы не хотите ждать столько времени для тестирования своей модели, вы можете завершить обучение раньше и перейти к следующему шагу (по желанию перезапустив обучение позже с того места, где остановились). Вы также можете скачать эту завершенную модель, обученную на полных 100 эпох, сюда:
*
https://nvidia.box.com/s/dslt9b0hqq7u71o6mzvy07w0onn0tw66
Обратите внимание, что модели сохраняются в `jetson-inference/python/training/classification/data/plants/`, включая checkpoint последней эпохи и лучшую модель с самой высокой точностью классификации. Вы можете изменить директорию, в которую сохраняются модели, изменяя флаг `--model-dir`.
## Преобразование модели в ONNX
Точно так же, как в примере с кошками/собаками, нам нужно будет конвертировать наш обученный модель из PyTorch в ONNX, чтобы мы могли загрузить его с помощью TensorRT:
```bash
python3 onnx_export.py --model-dir=models/plants
```
Это создаст модель под названием `resnet18.onnx` в директории `jetson-inference/python/training/classification/models/plants/`
## Обработка изображений с помощью TensorRT
Для классификации некоторых статических тестовых изображений, как и раньше, мы будем использовать расширенные параметры командной строки для `imagenet` для загрузки нашего кастомизированного модели ResNet-18, которую мы переобучили выше. Для выполнения этих команд рабочая директория терминала должна оставаться в директории: `jetson-inference/python/training/classification/`
```bash
NET=models/plants
DATASET=data/PlantCLEF_Subset
# C++
imagenet --model=$NET/resnet18.onnx --input_blob=input_0 --output_blob=output_0 --labels=$DATASET/labels.txt $DATASET/test/cattail.jpg cattail.jpg
# Python
imagenet.py --model=$NET/resnet18.onnx --input_blob=input_0 --output_blob=output_0 --labels=$DATASET/labels.txt $DATASET/test/cattail.jpg cattail.jpg
```

```bash
# C++
imagenet --model=$NET/resnet18.onnxonnx --input_blob=input_0 --output_blob=output_0 --labels=$DATASET/labels.txt $DATASET/test/elm.jpg elm.jpg
# Python
imagenet.py --model=$NET/resnet18.onnx --input_blob=input_0 --output_blob=output_0 --labels=$DATASET/labels.txt $DATASET/test/elm.jpg elm.jpg
```

```bash
# C++
imagenet --model=$NET/resnet18.onnx --input_blob=input_0 --output_blob=output_0 --labels=$DATASET/labels.txt $DATASET/test/juniper.jpg juniper.jpg
# Python
imagenet.py --model=$NET/resnet18.onnx --input_blob=input_0 --output_blob=output_0 --labels=$DATASET/labels.txt $DATASET/test/juniper.jpg juniper.jpg
```

В наборе данных включены несколько тестовых изображений, или вы можете загрузить свои собственные изображения для тестирования.
### Обработка всех тестовых изображений
Если вы хотите классифицировать все тестовые изображения за один раз, вы можете запустить программу на всей директории:
``` bash
mkdir $DATASET/test_output
imagenet --model=$NET/resnet18.onnx --input_blob=input_0 --output_blob=output_0 --labels=$DATASET/labels.txt \\
$DATASET/test $DATASET/test_output
```
В этом случае все изображения будут считываться из директории `test/` датасета и сохраняться в директорию `test_output/`.Для получения дополнительной информации о загрузке/сохранении последовательностей изображений, см. страницу [Camera Streaming and Multimedia](aux-streaming.md#sequences).
Запуск программы для работы с потоковым видео с камеры
Вы также можете попробовать запустить перетренированную модель растений на потоковом видео с камеры, как показано ниже:
# C++ (MIPI CSI)
imagenet --model=$NET/resnet18.onnx --input_blob=input_0 --output_blob=output_0 --labels=$DATASET/labels.txt csi://0
# Python (MIPI CSI)
imagenet.py --model=$NET/resnet18.onnx --input_blob=input_0 --output_blob=output_0 --labels=$DATASET/labels.txt csi://0

Похоже, мне следует быть начеку относительно ядовитой ивы!
Далее мы рассмотрим инструмент на основе камеры для сбора и маркировки собственных датасетов, захваченных из потокового видео.
Далее | Сбор собственных датасетов классификации
Назад | Перетренировка на датасете кошек/собак
© 2016-2019 NVIDIA | Содержание
Опубликовать ( 0 )