Назад | Вперед | Содержание
Распознавание изображений
# Написание собственной программы для распознавания изображений (Python)
В предыдущем шаге мы запустили образец приложения, входящее в репозиторий `jetson-inference`.
Теперь мы пройдем через создание новой программы с нуля на Python для распознавания изображений, названной [`my-recognition.py`](../python/examples/my-recognition.py).
Этот скрипт загружает произвольное изображение с диска и классифицирует его с помощью объекта [`imageNet`](https://rawgit.com/dusty-nv/jetson-inference/python/docs/html/python/jetson.inference.html#imageNet).
Завершенный исходный код доступен по адресу [`python/examples/my-recognition.py`](../python/examples/my-recognition.py)
```python
# !/usr/bin/python3
import jetson.inference
import jetson.utils
import argparse
# парсинг командной строки
parser = argparse.ArgumentParser()
parser.add_argument("filename", type=str, help="имя файла изображения для обработки")
parser.add_argument("--network", type=str, default="googlenet", help="модель для использования, может быть: googlenet, resnet-18 и т. д.")
args = parser.parse_args()
# загрузка изображения (в общую память CPU/GPU)
img = jetson.utils.loadImage(args.filename)
# загрузка сети распознавания
net = jetson.inference.imageNet(args.network)
# классификация изображения
class_idx, confidence = net.Classify(img)
# нахождение описания объекта
class_desc = net.GetClassDesc(class_idx)
# вывод результата
print("изображение распознано как '{:s}' (класс #{:d}) с {:f}% уверенностью".format(class_desc, class_idx, confidence * 100))```python
format(class_desc, class_idx, confidence * 100))
```
## Настройка проекта
Если вы используете контейнер Docker, вы захотите сохранить свой код в [монтированном каталоге](aux-docker.md#mounted-data-volumes).
Таким образом, ваш код не будет потерян при выключении контейнера.
Для простоты, этот гайд создаст его в каталоге на вашем устройстве-хосте под домашним каталогом пользователя, расположенным по адресу `~/my-recognition-python`, а затем примонтирует этот путь в контейнер.
Запустите эти команды из терминала (за пределами контейнера) для создания каталога, исходного файла и загрузки некоторых тестовых изображений:
```bash
# запустите эти команды за пределами контейнера
$ cd ~/
$ mkdir my-recognition-python
$ cd my-recognition-python
$ touch my-recognition.py
$ chmod +x my-recognition.py
$ wget https://github.com/dusty-nv/jetson-inference/raw/master/data/images/black_bear.jpg
$ wget https://github.com/dusty-nv/jetson-inference/raw/master/data/images/brown_bear.jpg
$ wget https://github.com/dusty-nv/jetson-inference/raw/master/data/images/polar_bear.jpg
```bash
Затем, когда вы запустите контейнер, [подключите директорию](aux-docker.md#mounted-data-volumes), которую вы только что создали:
$ docker/run.sh --volume ~/my-recognition-python:/my-recognition-python # подключена внутри контейнера к /my-recognition-python
```
Далее мы добавим Python-код для программы в пустой исходный файл, созданный здесь.
## Исходный код
Откройте `my-recognition.py` в редакторе вашего выбора (или запустите `gedit my-recognition.py`).
Вы можете редактировать файл снаружи контейнера.
Сначала добавим последовательность shebang в самый верх файла для автоматического использования интерпретатора Python:
```python
#! /usr/bin/python3
```
Далее мы импортируем Python-модули, которые будем использовать в скрипте.
#### Импорт модулей
Добавьте `import`-инструкции для загрузки модулей [`jetson.inference`](https://rawgit.com/dusty-nv/jetson-inference/python/docs/html/python/jetson.inference.html) и [`jetson.utils`](https://rawgit.com/dusty-nv/jetson-inference/python/docs/html/python/jetson.utils.html), используемых для распознавания изображений и загрузки изображений. Также загрузим стандартный пакет `argparse` для парсинга командной строки.
```python
import jetson.inference
import jetson.utils
import argparse
```
> **Примечание**: эти модули Jetson устанавливаются во время шага `sudo make install` [компиляции репозитория](building-repo-2.md#compiling-the-project). Если вы не выполнили `sudo make install`, то эти пакеты не будут найдены при запуске примера.
#### Парсинг командной строки
Далее добавим некоторый шаблонный код для парсинга имени файла изображения и необязательного параметра `--network`:
```python
# парсинг командной строки
parser = argparse.ArgumentParser()
parser.add_argument("filename", type=str, help="имя файла изображения для обработки")
parser.add_argument("--network", type=str, default="googlenet", help="модель для использования, может быть: googlenet, resnet-18 и т. д. (см. --help для других)")
opt = parser.parse_args()
```
Пример загружает и классифицирует изображение, которое указывает пользователь. Запуск ожидается следующим образом:
```bash
$ ./my-recognition.py my_image.jpg
```Для загрузки изображения необходимо заменить `my_image.jpg` на имя файла, который вы хотите загрузить. Также можно опционально указать параметр `--network`, чтобы изменить сеть классификации (по умолчанию используется GoogleNet):
```bash
$ ./my-recognition.py --network=resnet-18 my_image.jpg
```
Дополнительная информация о загрузке других сетей представлена в разделе [Загрузка других моделей классификации](imagenet-console-2.md#downloading-other-classification-models) предыдущей страницы.#### Загрузка изображения с диска
Изображения можно загружать с диска в общую память CPU/GPU с помощью функции `loadImage()`. Поддерживаемые форматы: JPG, PNG, TGA и BMP.
Добавьте следующую строку для загрузки изображения с указанным именем файла из командной строки:
```python
img = jetson.utils.loadImage(opt.filename)
```
Возвращенное изображение будет объектом класса `jetson.utils.cudaImage`, который содержит атрибуты, такие как ширина, высота и формат пикселей:
```python
.ptr # адрес памяти (не используется обычно)
.size # размер в байтах
.shape # кортеж (высота, ширина, каналы)
.width # ширина в пикселях
.height # высота в пикселях
.channels # количество цветовых каналов
.format # строка формата
.mapped # true, если используется ZeroCopy
```
Дополнительная информация о работе с изображениями из Python представлена на странице [Работа с изображениями с помощью CUDA](aux-image.md). Для простоты здесь загружается только одно изображение. Для загрузки видео или последовательности изображений следует использовать API `videoSource`, как это делается в предыдущем примере `imagenet.py`.#### Загрузка сети распознавания изображений
С помощью объекта `imageNet` следующий код загружает требуемую модель классификации с использованием TensorRT. Если вы не указали другую сеть с помощью флага `--network`, по умолчанию загружается GoogleNet, который был загружен при первоначальной сборке репозитория `jetson-inference` (по умолчанию также загружается модель `ResNet-18`). Все доступные модели классификации предобучены на наборе данных ImageNet ILSVRC, который может распознавать до 1000 различных классов объектов, таких как разные виды фруктов и овощей, множество различных видов животных, а также повседневные предметы, созданные человеком, такие как автомобили, офисная мебель, спортивное оборудование и т. д.
```python
# загрузка сети распознавания
net = jetson.inference.imageNet(opt.network)
```
#### Классификация изображения
Далее мы будем классифицировать изображение с помощью сети распознавания с помощью функции `imageNet.Classify()`:
```python
# классификация изображения
class_idx, confidence = net.Classify(img)
```
`imageNet.Classify()` принимает изображение и его размеры, а затем выполняет инференцию с использованием TensorRT. Она возвращает кортеж, содержащий целочисленный индекс класса объекта, который был распознан изображение, а также значение уверенности в виде числа с плавающей точкой.
#### Интерпретация результатов
Как последний шаг, давайте получим описание класса и выведем результаты классификации:
```python
# получение описания класса
class_desc = net.GetClassDesc(class_idx)
# вывод результата
print("изображение распознано как '{:s}' (класс #{:d}) с {:f}% уверенностью".format(class_desc, class_idx, confidence * 100))
```
`imageNet.Classify()` возвращает индекс распознанного класса объекта (от `0` до `999` для этих моделей, обученных на ILSVRC).
С учетом индекса класса, функция `imageNet.GetClassDesc()` вернет строку, содержащую текстовое описание этого класса.
Эти описания автоматически загружаются из файла [`ilsvrc12_synset_words.txt`](../data/networks/ilsvrc12_synset_words.txt).
Это всё! Это все Python-код, который нам нужен для классификации изображений. См. [полный исходный код](#coding-your-own-image-recognition-program-python) выше.
## Запуск примера
Теперь, когда наш Python-программа завершена, давайте классифицируем тестовые изображения, которые мы [скачали](#setting-up-the-project) в начале этой страницы:
```bash
$ ./my-recognition.py polar_bear.jpg
изображение распознано как 'ледовый медведь, полярный медведь, Ursus Maritimus, Thalarctos maritimus' (класс #296) с 99.999878% уверенностью
```

```bash
$ ./my-recognition.py brown_bear.jpg
изображение распознано как 'brown bear, bruin, Ursus arctos' (класс #294) с уверенностью 99.928925%
```
```bash
$ ./my-recognition.py black_bear.jpg
изображение распознано как 'American black bear, black bear, Ursus americanus, Euarctos americanus' (класс #295) с уверенностью 98.898628%
```
```bash
$ ./my-recognition.py --network=resnet-18 polar_bear.jpg
```изображение распознано как 'ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus' (класс #296) с уверенностью 99,743396%
```
Далее мы рассмотрим создание версии на C++ этой программы.
##
Далее | Создание собственной программы распознавания изображений (C++)
Назад | Классификация изображений с использованием ImageNet
© 2016-2019 NVIDIA | Содержание
Опубликовать ( 0 )