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

OSCHINA-MIRROR/duping812-jetson-inference

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

Назад | Далее | Содержание
Моно-глубина

# Моно-глубина с помощью DepthNet Сенсоры глубины полезны для задач, таких как картографирование, навигация и обнаружение препятствий. Однако исторически для этого требовался стереокамера или RGB-D камера. Теперь существуют DNN, которые могут определить относительную глубину из одного монохромного изображения (также известное как моно-глубина). См. статью [MIT FastDepth](https://arxiv.org/abs/1903.03273) для одного из подходов к решению этой задачи с использованием полностью сверточных сетей (Fully-Convolutional Networks, FCNs).

Объект depthNet принимает на вход одно цветное изображение и выводит карту глубины. Карта глубины окрашивается для визуализации, но также доступен неокрашенный поле глубины для прямого доступа к глубинам. depthNet доступен для использования из Python и C++.

В качестве примеров использования класса depthNet мы предоставляем образец программ для C++ и Python:

  • depthnet.cpp (C++)
  • depthnet.py (Python)Эти образцы могут определить глубину из изображений, видео и потоков с камеры. Для получения дополнительной информации о различных типах поддерживаемых входных/выходных потоков, см. страницу Потоковое видео с камеры и мультимедиа.## Моно-глубина на изображениях Сначала попробуем запустить образец depthnet на некоторых примерных изображениях. В дополнение к путям входных/выходных данных, есть некоторые дополнительные опции командной строки, которые являются необязательными:
  • необязательный флаг --network, который изменяет используемую модель глубины (рекомендуемое значение по умолчанию — fcn-mobilenet).
  • необязательный флаг --visualize, который может быть комбинацией значений input, depth через запятую.
    • По умолчанию используется --visualize=input,depth, что отображает входное и изображение глубины рядом.
    • Чтобы просмотреть только изображение глубины, используйте --visualize=depth.
  • необязательное значение --depth-size, которое масштабирует размер карты глубины относительно входного изображения (по умолчанию — 1.0).
  • необязательный флаг --filter-mode, который выбирает режим фильтрации point или linear, используемый для увеличения разрешения (по умолчанию установлено значение linear).
  • необязательный флаг --colormap, который устанавливает цветовую карту для использования при визуализации (по умолчанию установлено значение viridis_inverted). Если вы используете Docker-контейнер, рекомендуется сохранять выходные изображения в смонтированном каталоге images/test. Эти изображения будут легко доступны на вашем устройстве по адресу jetson-inference/data/images/test (для получения дополнительной информации см.).Смонтированные данные). Вот несколько примеров оценки глубины для моно-изображений на внутренних сценах:
    # C++
    $ . /depthnet "images/room_*.jpg" images/test/depth_room_%i.jpg
    # Python
    $ . /depthnet.py "images/room_*.jpg" images/test/depth_room_%i.jpg
    > **Примечание**: в первый раз, когда вы запускаете каждую модель, TensorRT затрачивает несколько минут на оптимизацию сети.
    >           Этот оптимизированный файл сети затем кэшируется на диске, поэтому будущие запуски с использованием этой модели будут загружаться быстрее. И вот несколько примеров, взятых с внешних сцен: ```bash # C++ $ . /depthnet "images/trail_*.jpg" images/test/depth_trail_%i.jpg # Python $ . /depthnet.py "images/trail_*.jpg" images/test/depth_trail_%i.jpg ``` ## Оценка глубины моно-изображений с видео Чтобы запустить оценку глубины моно-изображений на потоке с камеры или видео, передайте путь к устройству или файлу с [страницы потокового вещания и мультимедиа](aux-streaming.md). ```bash # C++ $ . /depthnet /dev/video0 # csi://0 если используется MIPI CSI камера # Python $ . /depthnet.py /dev/video0 # csi://0 если используется MIPI CSI камера ``` > **Примечание**: если экран слишком мал для отображения выходных данных, вы можете использовать `--depth-scale=0.`5` для уменьшения размера
    >           изображения глубины или уменьшить размер камеры с помощью `--input-width=X --input-height=Y` ## Получение исходного поля глубины Если вы хотите получить доступ к исходному полю глубины, вы можете сделать это с помощью `depthNet.GetDepthField()`. Это вернет одноканальное изображение с плавающей запятой, которое обычно меньше (224x224), чем исходный ввод — это представляет собой чистый выход модели. С другой стороны, цветное изображение глубины, используемое для визуализации, увеличивается до соответствия разрешению исходного ввода (или до любого масштаба, заданного параметром `--depth-size`).Ниже приведен псевдокод на Python и C++ для доступа к полю глубины в сыром виде:

Python

import jetson.inference
import jetson.utils
import numpy as np

# Загрузка сети монокулярной глубины
net = jetson.inference.depthNet()

# depthNet использует одно и то же память для поля глубины,
# поэтому вам нужно сделать это только один раз (не каждую кадровую съемку)
depth_field = net.GetDepthField()

# cudaToNumpy() отображает cudaImage поля глубины на numpy
# это отображение является постоянным, поэтому вам нужно сделать это только один раз
depth_numpy = jetson.utils.cudaToNumpy(depth_field)

print(f"разрешение поля глубины {depth_field.width}x{depth_field.height}, формат={depth_field.format}")

while True:
    img = input.Capture()  # Предполагается, что вы создали поток входного видео
    net.Process(img)
    jetson.utils.cudaDeviceSynchronize()  # Ждем завершения обработки GPU, чтобы мы могли использовать результаты на CPU
    # Находим минимальные и максимальные значения с помощью numpy
    min_depth = np.amin(depth_numpy)
    max_depth = np.amax(depth_numpy)

C++

#include <jetson-inference/depthNet.h>

// Загрузка сети монокулярной глубины
depthNet* net = depthNet::Create();

// depthNet использует одно и то же память для поля глубины,
// поэтому вам нужно сделать это только один раз (не каждую кадровую съемку)
float* depth_field = net->GetDepthField();
const int depth_width = net->GetDepthWidth();
const int depth_height = net->GetDepthHeight();

while(true)
{
    uchar3* img = NULL;
    input->Capture(&img);  // Предполагается, что вы создали поток входного видео
    net->Process(img, input->GetWidth(), input->GetHeight());
    // Ждем завершения обработки GPU
    CUDA(cudaDeviceSynchronize());
}
```    // теперь вы можете безопасно получить доступ к depth_field с CPU (или GPU)
     for(int y=0; y < depth_height; y++)
         for(int x=0; x < depth_width; x++)
             printf("глубина x=%i y=%i -> %f\n", x, y, depth_map[y * depth_width + x]);
 }

Попытка измерения абсолютных расстояний с помощью монокулярной глубины может привести к неточностям, так как она обычно более эффективна для оценки относительной глубины. Диапазон значений в исходном поле глубины может варьироваться в зависимости от сцены, поэтому эти значения часто пересчитываются динамически. Например, во время визуализации выполняется гистограммное уравнение по полю глубины для более равномерного распределения цветовой карты по диапазону значений глубины. Далее мы познакомимся с концепциями Transfer Learning и обучим собственные модели DNN на Jetson с использованием PyTorch.

Далее | Transfer Learning с PyTorch
Назад | Оценка позы с PoseNet

© 2016-2021 NVIDIA | Содержание

Опубликовать ( 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