Назад | Вперед | Содержание
Обнаружение объектов
net = jetson.inference.detectNet("ssd-mobilenet-v2", threshold=0.5) camera = jetson.utils.videoSource("csi://0") # '/dev/video0' для V4L2 display = jetson.utils.videoOutput("display://0") # 'my_video.mp4' для файла
Пока `display.IsStreaming()`:
`img = camera.Capture()`
`detections = net.Detect(img)`
`display.Render(img)`
`display.SetStatus("Обнаружение объектов | Сеть {:.0f} FPS".format(net.GetNetworkFPS()))`
```
Также есть видео-скринкаст этого руководства по написанию кода на YouTube:
<a href="https://www.youtube.com/watch?v=obt60r8ZeB0&list=PL5B692fm6--uQRRDTPsJDp4o0xbzkoyf8&index=12" target="_blank"><img src="https://github.com/dusty-nv/jetson-inference/raw/master/docs/images/thumbnail_detectnet.jpg" width="750"></a>
## Исходный код
Сначала откройте свой текстовый редактор и создайте новый файл. Ниже мы предположим, что вы сохраните его на вашем устройстве в домашней директории пользователя как `~/my-detection.py`, но вы можете назвать и сохранить его где угодно. Если вы используете контейнер Docker, вам следует сохранить свой код в [монтированной директории](aux-docker).
### Подключенные данные (Mounted Data Volumes)
Аналогично тому, что мы сделали в [Примере Python для распознавания изображений](imagenet-example-python-2.md#установка-проекта).
## Импорт модулей
В начале исходного файла мы импортируем 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), используемых для детекции объектов и захвата изображений с камеры.
```python
import jetson.inference
import jetson.utils
```
> **Примечание**: эти модули Jetson устанавливаются во время шага `sudo make install` [компиляции репозитория](building-repo-2.md#компиляция-проекта).
``` > Если вы не выполнили `sudo make install`, то эти пакеты не будут найдены при запуске примера. ## Загрузка модели детекции
Следующей строкой создайте экземпляр объекта [`detectNet`](https://rawgit.com/dusty-nv/jetson-inference/python/docs/html/python/jetson.inference.html#detectNet), загружающий модель [SSD-Mobilenet-v2](./data/networks/ssd_coco_labels.txt) с 91 классом:
```python
# загрузка модели детекции объектов
net = jetson.inference.detectNet("ssd-mobilenet-v2", threshold=0.5)
```
Обратите внимание, что вы можете изменить строку модели на одно из значений из [этой таблицы](detectnet-console-2.md#доступные-предобученные-модели-детекции) для загрузки другой модели детекции. Мы также устанавливаем порог детекции на значение по умолчанию `0.5` для иллюстрации — вы можете настроить его позже, если это необходимо. ## Открытие потока с камеры
Для подключения к устройству камеры для потока, создадим экземпляр объекта [`videoSource`](https://rawgit.com/dusty-nv/jetson-inference/pytorch/docs/html/python/jetson.utils.html#videoSource):
```python
camera = jetson.utils.videoSource("csi://0") # '/dev/video0' для V4L2
```
Строка, переданная в `videoSource()`, может быть любым допустимым URI ресурса, будь то камера, видеофайл или сетевой поток. Для получения дополнительной информации о потоках видео и протоколах, пожалуйста, обратитесь к странице [Потоки видео с камер и мультимедиа](aux-streaming.md).
> **Примечание**: для совместимых камер, пожалуйста, обратитесь к этим разделам Jetson Wiki: <br/>> - Nano: [`https://eLinux.org/Jetson_Nano#Cameras`](https://elinux.org/Jetson_Nano#Cameras) <br/>
> - Xavier: [`https://eLinux.org/Jetson_AGX_Xavier#Ecosystem_Products_.26_Cameras`](https://elinux.org/Jetson_AGX_Xavier#Ecosystem_Products_.26_Cameras) <br/>
> - TX1/TX2: наборы разработчика включают встроенный модуль сенсора MIPI CSI (0V5693)<br/>
#### Цикл отображения
Далее мы создадим интерфейс вывода видео с помощью объекта [`videoOutput`](https://rawgit.com/dusty-nv/jetson-inference/pytorch/docs/html/python/jetson.utils.html#videoOutput) и создадим основной цикл, который будет работать до тех пор, пока пользователь не выйдет:
```python
display = jetson.utils.videoOutput("display://0") # 'my_video.mp4' для файла
while display.IsStreaming():
# основной цикл будет здесь
``` Обратите внимание, что оставшаяся часть кода ниже должна быть отступлена под этот `while` цикл. Аналогично выше, вы можете заменить строку URI на другие типы выводов, найденные на [этой странице](aux-streaming.md) (например, видеофайлы и т. д.).
#### Пойманное изображение с камеры
Первым делом в основном цикле происходит захват следующего кадра видео с камеры. `camera.Capture()` будет ждать, пока следующий кадр не будет отправлен с камеры и загружен в память GPU.
```python
img = camera.Capture()
```
Возвращенное изображение будет объектом [`jetson.utils.cudaImage`](aux-image.md#image-capsules-in-python), который содержит атрибуты, такие как ширина, высота и формат пикселей:
```python
<jetson.utils.cudaImage>
.ptr # адрес памяти (не используется обычно)
.size # размер в байтах
.shape # кортеж (высота, ширина, каналы)
.width # ширина в пикселях
.height # высота в пикселях
.channels # количество цветовых каналов
.format # строка формата
.mapped # true, если используется ZeroCopy
```
Для получения дополнительной информации о доступе к изображениям из Python, см. страницу [Изменение изображений с помощью CUDA](aux-image.md).
#### Обнаружение объектов
Далее сеть обнаружения обрабатывает изображение с помощью функции `net.Detect()`. Она принимает изображение из `camera.Capture()` и возвращает список обнаружений:
```python
detections = net.Detect(img)
``` Эта функция также автоматически накладывает результаты обнаружения на изображение ввода. Если вы хотите, вы можете добавить команду `print(detections)` здесь, и координаты, уверенность и информация о классе будут выведены в терминал для каждого результата обнаружения. Также обратитесь к документации по [`detectNet`](https://rawgit.com/dusty-nv/jetson-inference/python/docs/html/python/jetson.inference.html#detectNet) для получения информации о различных членах структуры `Detection`, которые возвращаются для прямого доступа к ним в пользовательском приложении.
#### Визуализация
Наконец, мы визуализируем результаты с помощью OpenGL и обновляем заголовок окна для отображения текущей производительности:
```python
display.Render(img)
display.SetStatus("Обнаружение объектов | Сеть {:.0f} FPS".format(net.GetNetworkFPS()))
```
Функция `Render()` автоматически переворачивает бэкбенд и выводит изображение на экран.
#### Список исходного кода
Вот и все! Для полноты, вот полный исходный код Python-скрипта, который мы только что создали:
```python
import jetson.inference
import jetson.utils
net = jetson.inference.detectNet("ssd-mobilenet-v2", threshold=0.5)
camera = jetson.utils.videoSource("csi://0") # '/dev/video0' для V4L2
display = jetson.utils.videoOutput("display://0") # 'my_video.mp4' для файла
while display.IsStreaming():
img = camera.Capture()
detections = net.Detect(img)
display.Render(img)
display.SetStatus("Обнаружение объектов | Сеть {:.0f} FPS".format(net.GetNetworkFPS()))
```
Обратите внимание, что эта версия предполагает использование камеры с интерфейсом MIPI CSI. См.раздел выше по [`Открытию потока камеры`](#opening-the-camera-stream) для получения информации о том, как изменить его для использования другого типа ввода.
## Запуск программы
Чтобы запустить приложение, которое мы только что написали, просто запустите его из терминала с помощью интерпретатора Python:
```bash
$ python3 my-detection.py
```
Чтобы настроить результаты, вы можете попробовать изменить модель, которая загружается, а также порог обнаружения.
Приятного использования!
<p align="right">Далее | <b><a href="segnet-console-2.md">Семантическое сегментирование с SegNet</a></b>
<br/>
Назад | <b><a href="detectnet-camera-2.md">Запуск демонстрации обнаружения в реальном времени</a></p>
</b><p align="center"><sup>© OnClickListener 2016-2019 NVIDIA | </sup><a href="../README.md#hello-ai-world"><sup>Содержание</sup></a></p>
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )