Назад | Вперед | Содержание
Настройка системы
# Сборка проекта из исходного кода
В репозитории предоставлена библиотека ускоренных с помощью TensorRT глубоких нейронных сетей для распознавания изображений, детекции объектов с локализацией (то есть с использованием ограничивающих прямоугольников) и семантического сегментирования. Эта библиотека инференса (`libjetson-inference`) предназначена для запуска на Jetson и включает поддержку как для C++, так и для Python. Различные предобученные модели DNN автоматически загружаются для быстрого запуска.
Последний исходный код или Docker контейнер можно использовать на вашем Jetson после того, как устройство было загружено с помощью JetPack или настроено с помощью предзаполненного образа SD-карты. Вы можете запустить предзагруженный Docker контейнер без необходимости собирать проект или самостоятельно устанавливать PyTorch.### Быстрое руководство
Если вы не используете Docker контейнер, вот сжатая форма команд для сборки/установки проекта напрямую на вашем Jetson:
$ sudo apt-get update
$ sudo apt-get install git cmake libpython3-dev python3-numpy
$ git clone --recursive https://github.com/dusty-nv/jetson-inference
$ cd jetson-inference
$ mkdir build
$ cd build
$ cmake ../
$ make -j$(nproc)
$ sudo make install
$ sudo ldconfig
Далее мы рассмотрим каждый шаг и обсудим различные варианты сборки по пути.### Клонирование репозитория
Чтобы скачать код, перейдите в папку вашего выбора на Jetson. Сначала убедитесь, что установлены git и cmake:
$ sudo apt-get update
$ sudo apt-get install git cmake
Затем клонируйте проект jetson-inference
:
$ git clone https://github.com/dusty-nv/jetson-inference
$ cd jetson-inference
$ git submodule update --init
Помните, что нужно выполнить шаг git submodule update --init
(или клонировать с помощью флага --recursive
).
Пакеты разработки Python
Функциональность Python этого проекта реализована через модули расширения Python, которые предоставляют привязки к исходному коду C++ с использованием Python C API. При настройке проекта, репозиторий ищет версии Python, для которых на системе установлены пакеты разработки, и затем создает привязки для каждой версии Python, присутствующей в системе (например, Python 2.7, 3.6 и 3.7). Также он создает привязки numpy для версий numpy, которые установлены.
По умолчанию, Ubuntu поставляется с предустановленными пакетами libpython-dev
и python-numpy
(для Python 2.7). Хотя интерпретатор Python 3.6 предустановлен Ubuntu, пакеты разработки Python 3.6 (libpython3-dev
) и python3-numpy
не установлены. Эти пакеты разработки необходимы для создания привязок с использованием Python C API.Поэтому, если вы хотите, чтобы проект создавал привязки для Python 3.6, установите эти пакеты перед продолжением:
$ sudo apt-get install libpython3-dev python3-numpy
Установка этих дополнительных пакетов позволит репозиторию создать расширения привязок для Python 3.6, а также для Python 2.7 (который уже предустановлен). После завершения процесса сборки, пакеты jetson.inference
и jetson.utils
будут доступны для использования в ваших Python-окружениях.### Настройка с помощью CMake
Следующим шагом является создание каталога сборки внутри проекта и запуск cmake
для настройки сборки. Когда запускается cmake
, запускается скрипт (CMakePreBuild.sh
), который устанавливает все необходимые зависимости и загружает DNN-модели для вас.
$ cd jetson-inference # пропустить, если текущий рабочий каталог уже jetson-inference/
$ mkdir build
$ cd build
$ cmake ../
Примечание: этот командный запрос запускает скрипт CMakePreBuild.sh
, который запрашивает права sudo при установке некоторых предварительных пакетов на Jetson. Скрипт также загружает предобученные сети с веб-сервисов.### Загрузка моделей
Проект включает в себя множество предобученных сетей, которые вы можете выбрать для загрузки и установки с помощью инструмента Model Downloader (download-models.sh
). По умолчанию, не все модели изначально выбраны для загрузки, чтобы сэкономить место на диске. Вы можете выбрать модели, которые вам нужны, или запустить инструмент позже, чтобы загрузить больше моделей в другой раз.
При первоначальной настройке проекта, cmake
автоматически запустит инструмент загрузки для вас:

> **Примечание**: для пользователей, которые не могут подключиться к Box.com для загрузки моделей, предоставляется зеркальная копия здесь:
> [`https://github.com/dusty-nv/jetson-inference/releases`](https://github.com/dusty-nv/jetson-inference/releases)
Чтобы запустить инструмент загрузки моделей позже, вы можете использовать следующие команды:
```bash
$ cd jetson-inference/tools
$ ./download-models.sh
```
### Установка PyTorch
Если вы используете JetPack 4.2 или более новую версию, запустится другой инструмент, который может опционально установить PyTorch на вашем Jetson, если вы хотите переобучить сети с использованием [переносного обучения](pytorch-transfer-learning.md) позже в руководстве.Этот шаг является необязательным, и если вы не хотите выполнять шаги переносного обучения, вам не нужно устанавливать PyTorch и вы можете пропустить этот шаг.
Если требуется, выберите версии пакетов PyTorch для Python 2.7 и/или Python 3.6, которые вы хотите установить, и нажмите `Enter`, чтобы продолжить. В противном случае, оставьте опции не выбранными, и установка PyTorch будет пропущена.

> **Примечание**: автоматический инструмент установки PyTorch требует JetPack 4.2 (или более новую версию)
> для других версий, см. [`http://eLinux.org/Jetson_Zoo`](https://elinux.org/Jetson_Zoo#PyTorch_.28Caffe2.29) для сборки из исходного кода.
Вы также можете запустить этот инструмент позже, если решите установить PyTorch в другой раз:
``` bash
$ cd jetson-inference/build
$ ./install-pytorch.sh
```
Запуск этих команд предложит вам тот же диалог, как показано выше.
### Сборка проекта
Убедитесь, что вы все еще находитесь в директории `jetson-inference/build`, созданной выше в шаге #3.
Затем запустите `make` и `sudo make install`, чтобы собрать библиотеки, Python-расширения и примеры кода:
``` bash
$ cd jetson-inference/build # пропустите, если рабочая директория уже build/ из выше
$ make
$ sudo make install
$ sudo ldconfig
```
Проект будет собран в `jetson-inference/build/aarch64` с следующей структурой директорий:
```
|-build
\aarch64
\bin где создаются образцы исполняемых файлов
``` \networks где хранятся модели нейронных сетей
\images где хранятся тестовые изображения
\include где находятся заголовочные файлы
\lib где создаются библиотеки
```
В структуре сборки вы можете найти исполняемые файлы в `build/aarch64/bin/`, заголовочные файлы в `build/aarch64/include/`, а также библиотеки в `build/aarch64/lib/`. Эти файлы также устанавливаются в `/usr/local/` во время шага `sudo make install`.
Python-биндинги для модулей [`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) также устанавливаются во время шага `sudo make install` в директорию `/usr/lib/python*/dist-packages/`. Если вы обновите код, не забудьте повторно запустить его.
### Исследование кода
См. документацию по **[API Reference](../README.md#api-reference)** для примитивов визуализации в `libjetson-inference`, включая `imageNet` для распознавания изображений, `detectNet` для локализации объектов и `segNet` для семантической сегментации. Изучите C++ или Python-версии этих объектов в зависимости от предпочитаемого языка.
#### C++
Ниже приведен частичный список класса C++ [`imageNet`](../c/imageNet.h), который мы будем использовать в последующих шагах руководства:
```c++
class imageNet : public tensorNet
{
public:
/**
* Перечисление выбора сети.
*/
enum NetworkType
{
CUSTOM, /**< Пользовательская модель, предоставленная пользователем */
ALEXNET, /**< AlexNet, обученная на 1000-классном ILSVRC12 */
GOOGLENET, /**< GoogleNet, обученная на 1000-классном ILSVRC12 */
GOOGLENET_12, /**< GoogleNet, обученная на 12-классном подмножестве ImageNet ILSVRC12 из руководства */
RESNET_18, /**< ResNet-18, обученная на 1000-классном ILSVRC15 */
RESNET_50, /**< ResNet-50, обученная на 1000-классном ILSVRC15 */
RESNET_101, /**< ResNet-101, обученная на 1000-классном ILSVRC15 */
RESNET_152, /**< ResNet-152, обученная на 1000-классном ILSVRC15 */
VGG_16, /**< VGG-16, обученная на 1000-классном ILSVRC14 */
VGG_19, /**< VGG-19, обученная на 1000-классном ILSVRC14 */
``` INCEPTION_V4, /**< Inception-v4, обученная на 1000-классном ILSVRC12 */
};
/**
* Загрузить новый экземпляр сети
*/
static imageNet* Create( NetworkType networkType=GOOGLENET, uint32_t maxBatchSize=DEFAULT_MAX_BATCH_SIZE,
precisionType precision=TYPE_FASTEST,
deviceType device=DEVICE_GPU, bool allowGPUFallback=true );
/**
* Загрузить новый экземпляр сети
* @param prototxt_path Путь к файлу с описанием сети (deployable network prototxt)
* @param model_path Путь к файлу с моделью (caffemodel)
* @param mean_binary Путь к файлу с бинарным прототипом среднего значения (может быть NULL)
* @param class_labels Путь к файлу со списком меток классов
* @param input Имя слоя входных данных
* @param output Имя слоя выходных данных
* @param maxBatchSize Максимальный размер пакета, который поддерживает и оптимизирована сеть
*/
static imageNet* Create( const char* prototxt_path, const char* model_path,
const char* mean_binary, const char* class_labels,
const char* input=IMAGENET_DEFAULT_INPUT,
const char* output=IMAGENET_DEFAULT_OUTPUT,
uint32_t maxBatchSize=DEFAULT_MAX_BATCH_SIZE,
precisionType precision=TYPE_FASTEST,
deviceType device=DEVICE_GPU, bool allowGPUFallback=true );
/**
* Определить класс изображения с максимальной вероятностью.
* Эта функция выполняет предварительную обработку изображения (вычитание среднего значения и преобразование в формат NCHW), @see PreProcess()
* @param rgba Входное изображение в формате float4 в памяти устройства CUDA.
* @param width Ширина входного изображения в пикселях.
* @param height Высота входного изображения в пикселях.
* @param confidence Необязательный указатель на float, заполненный значением уверенности.
* @returns Индекс максимального класса, или -1 при ошибке.
*/
int Classify( float* rgba, uint32_t width, uint32_t height, float* confidence=NULL );
/**
* Получить количество классов распознавания изображений (обычно Yöntem 1000)
*/
inline uint32_t GetNumClasses() const { return mOutputClasses; }
/**
* Получить описание определенного класса.
*/
inline const char* GetClassDesc( uint32_t index ) const { return mClassDesc[index].c_str(); }
};
```
Все объекты DNN в репозитории наследуются от общего класса [`tensorNet`](./c/tensorNet.h) объект, который содержит общие TensorRT коды.
#### Python
Ниже приведен упрощенный вывод pydoc для Python объекта [`imageNet`](https://rawgit.com/dusty-nv/jetson-inference/python/docs/html/python/jetson.inference.html#imageNet) из пакета [`jetson.inference`](https://rawgit.com/dusty-nv/jetson-inference/python/docs/html/python/jetson.inference.html):
```
jetson.inference.imageNet = class imageNet(tensorNet)
| Объект распознавания изображений DNN - классифицирует изображение
|
| __init__(...)
| Загружает модель распознавания изображений.
|
| Параметры:
| * model: Строка, указывающая путь к файлу модели.
| * labels: Строка, указывающая путь к файлу меток.
| * input_blob: Строка, указывающая имя входного буфера.
| * output_blob: Строка, указывающая имя выходного буфера.
| * topK: Целое число, указывающее количество верхних классов для отображения.
| * threshold: Число, указывающее порог вероятности.
| * backend: Строка, указывающая бэкенд (TensorRT или ONNX).
| * device: Строка, указывающая устройство (CPU или GPU).
| * cudnn_batch_size: Целое число, указывающее размер пакета для CUDNN.
| * cudnn_preload: Логическое значение, указывающее, следует ли загружать данные в память CUDNN.
| * cudnn_preload_size: Целое число, указывающее размер предзагрузки для CUDNN.
| * cudnn_preload_threshold: Число, указывающее порог предзагрузки для CUDNN.
| * cudnn_preload_interval: Число, указывающее интервал предзагрузки для CUDNN.
| * cudnn_preload_wait: Число, указывающее время ожидания предзагрузки для CUDNN.
| * cudnn_preload_max: Число, указывающее максимальное количество предзагрузок для CUDNN.
| * cudnn_preload_min: Число, указывающее минимальное количество предзагрузок для CUDNN.
| * cudnn_preload_step: Число, указывающее шаг предзагрузки для CUDNN.
| * cudnn_preload_scale: Число, указывающее масштаб предзагрузки для CUDNN.
| * cudnn_preload_offset: Число, указывающее смещение предзагрузки для CUDNN.
| * cudnn_preload_seed: Число, указывающее seed предзагрузки для CUDNN.
| * cudnn_preload_rng: Строка, указывающая тип генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_seed: Число, указывающее seed генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state: Строка, указывающая состояние генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_size: Число, указывающее размер состояния генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_seed: Число, указывающее seed состояния генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng: Строка, указывающая тип генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_seed: Число, указывающее seed генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state: Строка, указывающая состояние генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_size: Число, указывающее размер состояния генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_seed: Число, указывающее seed состояния генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng: Строка, указывающая тип генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_seed: Число, указывающее seed генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state: Строка, указывающая состояние генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_size: Число, указывающее размер состояния генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_seed: Число, указывающее seed состояния генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_rng: Строка, указывающая тип генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_rng_seed: Число, указывающее seed генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_rng_state: Строка, указывающая состояние генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_rng_state_size: Число, указывающее размер состояния генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_rng_state_seed: Число, указывающее seed состояния генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_rng_state_rng: Строка, указывающая тип генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_rng_state_rng_seed: Число, указывающее seed генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_rng_state_rng_state: Строка, указывающая состояние генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_rng_state_rng_state_size: Число, указывающее размер состояния генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_rng_state_rng_state_seed: Число, указывающее seed состояния генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_rng_state_rng_state_rng: Строка, указывающая тип генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_rng_state_rng_state_rng_seed: Число, указывающее seed генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_rng_state_rng_state_rng_state: Строка, указывающая состояние генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_rng_state_rng_state_rng_state_size: Число, указывающее размер состояния генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_rng_state_rng_state_rng_state_seed: Число, указывающее seed состояния генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_rng_state_rng_state_rng_state_rng: Строка, указывающая тип генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_rng_state_rng_state_rng_state_rng_seed: Число, указывающее seed генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_rng_state_rng_state_rng_state_rng_state: Строка, указывающая состояние генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_rng_state_rng_state_rng_state_rng_state_size: Число, указывающее размер состояния генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_rng_state_rng_state_rng_state_rng_state_seed: Число, указывающее seed состояния генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_rng_state_rng_state_rng_state_rng_state_rng: Строка, указывающая тип генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_rng_state_rng_state_rng_state_rng_state_rng_seed: Число, указывающее seed генератора случайных чисел для CUDNN.
| * cudnn_preload_rng_state_rng_state_rng_state_rng_state_rng_state_rng | network (строка) -- имя встроенной сети для использования
| допустимые значения: 'alexnet', 'googlenet', 'googlenet-12', 'resnet-18' и т. д.
| по умолчанию 'googlenet'
|
| argv (строки) -- аргументы командной строки, переданные imageNet,
| для загрузки пользовательской модели или пользовательских настроек
|
| Classify(. . . )
| Классифицирует RGBA изображение и возвращает индекс класса объекта и уверенность.
|
| Параметры:
| image (капсула) -- капсула CUDA памяти
| width (int) -- ширина изображения (в пикселях)
| height (int) -- высота изображения (в пикселях)
|
| Возвращает:
| (int, float) -- кортеж, содержащий индекс класса объекта и уверенность
|
| GetClassDesc(. . . )
| Возвращает текстовое описание класса для данного объекта.
|
| Параметры:
| (int) -- индекс класса, между [0, GetNumClasses()]
|
| Возвращает:
| (строка) -- текстовое описание класса объекта
|
| GetNumClasses(. . . )
| Возвращает количество классов объектов, которые может классифицировать эта модель.
|
| Параметры: (нет)
|
| Возвращает:
| (int) -- количество классов объектов, которые поддерживает модель
---------------------------------------------------------------------
```
Затем мы будем использовать объект `imageNet` для выполнения распознавания изображений на Python или C++.
##
Далее | Классификация изображений с помощью ImageNet
Назад | Запуск контейнера Docker
© 2016-2019 NVIDIA | Содержание
Опубликовать ( 0 )