Назад | Далее | Содержание
Обнаружение объектов
# Обнаружение объектов с помощью DetectNet
В предыдущих примерах распознавания выводились вероятности классов, представляющие собой всю входную изображение. Теперь мы сосредоточимся на **обнаружении объектов** и нахождении местоположения различных объектов в кадре путем извлечения их ограничивающих прямоугольников. В отличие от классификации изображений, сети для обнаружения объектов способны обнаруживать множество различных объектов на одном кадре.

Объект [`detectNet`](../c/detectNet.h) принимает изображение в качестве входных данных и выводит список координат обнаруженных ограничивающих прямоугольников вместе с их классами и значениями уверенности. Объект [`detectNet`](../c/detectNet.h) доступен для использования из [Python](https://rawgit.com/dusty-nv/jetson-inference/python/docs/html/python/jetson.inference.html#detectNet) и [C++](../c/detectNet.h). См. ниже для различных [предварительно обученных моделей обнаружения](#предварительно-обученные-модели-обнаружения) доступных для загрузки. По умолчанию используется модель [91-классная](../data/networks/ssd_coco_labels.txt).txt) SSD-Mobilenet-v2, обученная на наборе данных MS COCO, которая обеспечивает реальное время производительность инференса на Jetson с использованием TensorRT.
В качестве примеров использования класса `detectNet` мы предоставляем образцы программ для C++ и Python:
- [`detectnet.cpp`](../examples/detectnet/detectnet.cpp) (C++)
- [`detectnet.py`](../python/examples/detectnet.py) (Python)
Эти образцы способны обнаруживать объекты в изображениях, видео и потоках с камеры. Для получения дополнительной информации о различных типах входных/выходных потоков, поддерживаемых, см. страницу [Потоковое вещание с камеры и мультимедиа](aux-streaming.md).
### Обнаружение объектов на изображениях
Сначала попробуем использовать программу `detectnet` для обнаружения объектов на статических изображениях. В дополнение к путям входных/выходных данных, есть некоторые дополнительные опции командной строки:
- необязательный флаг `--network`, который изменяет [модель обнаружения](detectnet-console-2.md#предварительно-обученные-модели-обнаружения) (по умолчанию используется SSD-Mobilenet-v2).
- необязательный флаг `--overlay`, который может быть комбинацией, разделённой запятыми, значений `box`, `labels`, `conf` и `none`
- По умолчанию используется `--overlay=box,labels,conf`, что отображает рамки, метки и значения уверенности.
- необязательный параметр `--alpha`, который устанавливает значение альфа-смешивания, используемое при наложении (по умолчанию `120`).- необязательный параметр `--threshold`, который устанавливает минимальный порог для обнаружения (по умолчанию `0.5`).
Если вы используете [Docker-контейнер](aux-docker.md), рекомендуется сохранять выходные изображения в смонтированном каталоге `images/test`.
Эти изображения будут легко доступны на вашем устройстве по пути `jetson-inference/data/images/test` (для дополнительной информации см. [Смонтированные данные](aux-docker.md#mounted-data-volumes)).
Ниже приведены примеры обнаружения пешеходов на изображениях с использованием по умолчанию модели SSD-Mobilenet-v2:
```bash
# C++
$ ./detectnet --network=ssd-mobilenet-v2 images/peds_0.jpg images/test/output.jpg # --network флаг необязателен
# Python
$ ./detectnet.py --network=ssd-mobilenet-v2 images/peds_0.jpg images/test/output.jpg # --network флаг необязателен
```

```bash
# C++
$ ./detectnet images/peds_1.jpg images/test/output.jpg
# Python
$ ./detectnet.py images/peds_1.jpg images/test/output.jpg
```

> **Примечание**: в первый раз, когда вы запускаете каждую модель, TensorRT может занять несколько минут для оптимизации сети.
> Оптимизированная сеть затем кэшируется на диске, поэтому будущие запуски с использованием модели будут загружаться быстрее.
Ниже приведены дополнительные примеры обнаружения, выводимые консольными программами.
[91-классовый](../data/networks/ssd_coco_labels.txt)txt) набор данных MS COCO, на котором были обучены модели на основе SSD, включает людей, транспортные средства, животных и различные типы домашних предметов для обнаружения.

Различные изображения находятся в каталоге `images/` для тестирования, таких как `cat_*.jpg`, `dog_*.jpg`, `horse_*.jpg`, `peds_*.jpg`, и т. д.
### Обработка каталога или последовательности изображений
Если у вас есть несколько изображений, которые вы хотите обработать одновременно, вы можете запустить программу `detectnet` с путем к директории, содержащей изображения, или с использованием шаблонного выражения:
```bash
# C++
./detectnet "images/peds_*.jpg" images/test/peds_output_%i.jpg
# Python
./detectnet.py "images/peds_*.jpg" images/test/peds_output_%i.jpg
```
> **Примечание:** при использовании шаблонных выражений всегда заключайте их в кавычки (`"*.jpg"`). В противном случае операционная система автоматически расширит последовательность и изменит порядок аргументов на командной строке, что может привести к перезаписи одного из входных изображений выходным.
Для получения дополнительной информации о загрузке/сохранении последовательностей изображений, см. страницу [Трансляция с камеры и мультимедиа](aux-streaming.md#sequences).
### Обработка видеофайлов
Вы также можете обрабатывать видео с диска. Некоторые тестовые видео находятся на вашем Jetson в директории `/usr/share/visionworks/sources/data`
```bash
# C++
./detectnet /usr/share/visionworks/sources/data/pedestrians.mp4 images/test/pedestrians_ssd.mp4
# Python
. /detectnet.py /usr/share/visionworks/sources/data/pedestrians.mp4 images/test/pedestrians_ssd.mp4
```

```bash
# C++
. /detectnet /usr/share/visionworks/sources/data/parking.avi images/test/parking_ssd.avi
# Python
. /detectnet.py /usr/share/visionworks/sources/data/parking.avi images/test/parking_ssd.avi
```

Помните, что вы можете использовать параметр `--threshold` для изменения чувствительности детекции (по умолчанию значение равно 0.5).
### Доступные предобученные модели детекции
Ниже приведена таблица предобученных моделей детекции объектов, доступных для [скачивания](building-repo-2.md#downloading-models), и соответствующего параметра `--network` для `detectnet` для загрузки предобученных моделей:
| Модель | CLI аргумент | NetworkType enum | Классы объектов |
| ------------------------|--------------------|--------------------|----------------------|
| SSD-Mobilenet-v1 | `ssd-mobilenet-v1` | `SSD_MOBILENET_V1` | 91 ([COCO classes](../data/networks/ssd_coco_labels.txt)) |
| SSD-Mobilenet-v2 | `ssd-mobilenet-v2` | `SSD_MOBILENET_V2` | 91 ([COCO classes](../data/networks/ssd_coco_labels.txt)) |
| SSD-Inception-v2 | `ssd-inception-v2` | `SSD_INCEPTION_V2` | 91 ([COCO classes](../data/networks/ssd_coco_labels.txt)) |
| DetectNet-COCO-Dog | `coco-dog` | `COCO_DOG` | собаки |
| DetectNet-COCO-Bottle | `coco-bottle` | `COCO_BOTTLE` | бутылки |
| DetectNet-COCO-Chair | `coco-chair` | `COCO_CHAIR` | стулья | | DetectNet-COCO-Airplane | `coco-airplane` | `COCO_AIRPLANE` | самолеты |
| ped-100 | `pednet` | `PEDNET` | пешеходы |
| multiped-500 | `multiped` | `PEDNET_MULTI` | пешеходы, багаж |
| facenet-120 | `facenet` | `FACENET` | лица |
> **Примечание**: для загрузки дополнительных сетей запустите [инструмент загрузки моделей](building-repo-2.md#downloading-models)
> `$ cd jetson-inference/tools`
> `$ ./download-models.sh`
### Запуск различных моделей обнаружения
Вы можете указать, какую модель загрузить, установив флаг `--network` на командной строке одним из соответствующих аргументов CLI из таблицы выше. По умолчанию загружается SSD-Mobilenet-v2, если не указано опциональное значение флага `--network`.
Например, если вы выбрали загрузку SSD-Inception-v2 с помощью [инструмента загрузки моделей](building-repo-2.md#downloading-models), вы можете использовать его следующим образом:
```bash
# C++
$ ./detectnet --network=ssd-inception-v2 input.jpg output.jpg
# Python
$ ./detectnet.py --network=ssd-inception-v2 input.jpg output.jpg
```
### Исходный код
Для справки ниже приведен исходный код для [`detectnet.py`](../python/examples/detectnet.py):
```python
import jetson.inference
import jetson.utils
import argparse
import sys
# разбор командной строки
parser = argparse.ArgumentParser(description="Определение объектов в потоке видеокамеры в реальном времени с помощью DNN для обнаружения объектов.")
parser.add_argument("input_URI", type=str, default="", nargs='?', help="URI входного потока")
parser.add_argument("--network", type=str, default="ssd-mobilenet-v2", help="Модель DNN для использования (default: ssd-mobilenet-v2)")
parser.add_argument("--threshold", type=float, default=0.5, help="Порог вероятности для отображения объектов (default: 0.5)")
args = parser.parse_args()
``````markdown
add_argument("output_URI", type=str, default="", nargs='? ', help="URI адреса выходного потока")
parser.add_argument("--network", type=str, default="ssd-mobilenet-v2", help="загружаемая предварительно обученная модель (см. ниже для вариантов)")
parser.add_argument("--overlay", type=str, default="box,labels,conf", help="флаги накладываемого слоя обнаружения (например, --overlay=box,labels,conf)\nдопустимые комбинации: 'box', 'labels', 'conf', 'none'")
parser.add_argument("--threshold", type=float, default=0.5, help="минимальный порог обнаружения для использования")
try:
opt = parser.parse_known_args()[0]
except:
print("")
parser.print_help()
sys.exit(0)
# загружаем сеть обнаружения объектов
net = jetson.inference.detectNet(opt.network, sys.argv, opt.threshold)
# создаем источники видео и выходы
input = jetson.utils.videoSource(opt.input_URI, argv=sys.argv)
output = jetson.utils.videoOutput(opt.output_URI, argv=sys.argv)
# обрабатываем кадры до тех пор, пока пользователь не выйдет
while True:
# захватываем следующий кадр
img = input.Capture()
# обнаруживаем объекты на изображении (с накладыванием слоя)
detections = net.Detect(img, overlay=opt.overlay)
# выводим обнаруженные объекты
print("обнаружено {:d} объектов на изображении".format(len(detections)))
for detection in detections:
print(detection)
# рендерим изображение
output.Render(img)
# обновляем строку состояния
output.SetStatus("{:s} | Сеть {:.0f} FPS".format(opt.network, net.GetNetworkFPS()))
# выводим информацию о производительности
net.PrintProfilerTimes()
# выходим при достижении конца потока входных/выходных данных
if not input.IsStreaming() or not output.IsStreaming():
break
```
Далее мы выполним обнаружение объектов на потоке видеокамеры в реальном времени.
##
Далее | Запуск демонстрации обнаружения объектов на потоке видеокамеры в реальном времени
Назад | Запуск демонстрации распознавания объектов на потоке видеокамеры в реальном времени
© 2016-2019 NVIDIA | Содержание
Опубликовать ( 0 )