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

OSCHINA-MIRROR/duping812-jetson-inference

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

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

# Написание собственной программы для обнаружения объектов В этом шаге руководства мы рассмотрим создание предыдущего примера для реального времени обнаружения объектов на прямом потоке камеры всего за 10 строк кода на Python. Программа загрузит сеть обнаружения с помощью объекта [`detectNet`](https://rawgit.com/dusty-nv/jetson-inference/dev/docs/html/python/jetson.inference.html#detectNet), будет захватывать кадры видео и обрабатывать их, а затем рендерить обнаруженные объекты на дисплее. Для вашего удобства и справки, завершенный исходный код доступен в файле [`python/examples/my-detection.py`](../python/examples/my-detection.py) репозитория, но руководство ниже будет предполагать, что файлы находятся в домашней директории пользователя или в произвольной директории по вашему выбору. Вот краткий обзор 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' для файла

Пока `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#компиляция-проекта). 
```  > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Если вы не выполнили `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/>> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- Nano:&nbsp;&nbsp;[`https://eLinux.org/Jetson_Nano#Cameras`](https://elinux.org/Jetson_Nano#Cameras) <br/>
   > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- Xavier:  [`https://eLinux.org/Jetson_AGX_Xavier#Ecosystem_Products_.26_Cameras`](https://elinux.org/Jetson_AGX_Xavier#Ecosystem_Products_.26_Cameras) <br/>
   > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- 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 )

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

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