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

OSCHINA-MIRROR/duping812-jetson-inference

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

Назад | Вперед | Содержание
Распознавание изображений

# Создание собственной программы для распознавания изображений (C++) В предыдущем шаге мы запустили приложение, входящее в репозиторий jetson-inference. Теперь мы пройдем через создание новой программы с нуля для распознавания изображений, названной [`my-recognition`](../examples/my-recognition/my-recognition.cpp). Эта программа сможет существовать как самостоятельный проект вне репозитория, поэтому если вы хотите использовать библиотеку jetson-inference в своих проектах и приложениях, вы можете следовать этому примеру. ```cpp #include #include int main(int argc, char** argv) { // ожидается аргумент командной строки, содержащий имя файла изображения, // поэтому убедитесь, что у вас есть хотя бы 2 аргумента (первый аргумент — это программа) if (argc < 2) { printf("my-recognition: ожидается имя файла изображения в качестве аргумента\n"); printf("пример использования: . /my-recognition my_image.jpg\n"); return 0; } // извлекаем имя файла изображения из массива аргументов командной строки const char* imgFilename = argv[1]; // эти переменные будут хранить указатель на данные изображения и его размеры uchar3* imgPtr = NULL; // общий указатель CPU/GPU на изображение int imgWidth = 0; // ширина изображения (в пикселях) ``````cpp int imgHeight = 0; // высота изображения (в пикселях) // загружаем изображение с диска как uchar3 RGB (24 бита на пиксель) if (!loadImage(imgFilename, &imgPtr, &imgWidth, &imgHeight)) { printf("не удалось загрузить изображение '%s'\n", imgFilename); return 0; } // загружаем сеть распознавания изображений GoogleNet с использованием TensorRT // вы можете использовать imageNet::RESNET_18 для загрузки модели ResNet-18 imageNet* net = imageNet::Create(imageNet::GOOGLENET); // проверяем, что модель сети загружена правильно if (!net) { printf("не удалось загрузить сеть распознавания изображений\n"); return 0; } // эта переменная будет хранить уверенность классификации (от 0 до 1) float confidence = 0.0; // классифицируем изображение, возвращаем индекс класса объекта (или -1 при ошибке) const int classIndex = net->Classify(imgPtr, imgWidth, imgHeight, &confidence); // убедитесь, что возвращённый результат классификации является валидным if (classIndex >= 0) { // получите имя/описание класса объекта const char* classDescription = net->GetClassDesc(classIndex); // выведите результаты классификации printf("изображение распознано как '%s' (класс #%i) с %f%% уверенностью\n", classDescription, classIndex, confidence * 100.0f); } else { // если Classify() вернула < 0, произошла ошибка printf("не удалось классифицировать изображение\n"); } // освободите ресурсы сети перед завершением работы delete net; return 0; } ``` Для вашего удобства и справки, завершённые файлы доступны в директории [`examples/my-recognition`](../) ```/examples/my-recognition) репозитория, но ниже приведённая инструкция будет действовать так, будто они находятся в домашней директории пользователя или в произвольной директории по вашему выбору. ## Настройка проекта Вы можете сохранить пример `my-recognition`, который мы будем создавать, в любом месте на вашем Jetson. Для простоты эта инструкция создаст его в домашней директории пользователя, расположенной по адресу `~/my-recognition`. Выполните следующие команды из терминала для создания необходимой директории и файлов: ```bash $ mkdir ~/my-recognition $ cd ~/my-recognition $ touch my-recognition.cpp $ touch CMakeLists.txt $ wget https://github.com/dusty-nv/jetson-inference/raw/master/data/images/black_bear.jpg $ wget https://github.com/dusty-nv/jetson-inference/raw/master/data/images/brown_bear.jpg $ wget https://github.com/dusty-nv/jetson-inference/raw/master/data/images/polar_bear.jpg ``` Некоторые тестовые изображения также загружаются в папку с помощью команд `wget` выше. Далее мы добавим код для программы в пустые созданные нами здесь исходные файлы. ## Исходный код Откройте `my-recognition.cpp` в вашем редакторе выбора (или запустите `gedit my-recognition.cpp`). Давайте начнем добавлять необходимый код для использования класса [`imageNet`](../c/imageNet.h) для распознавания изображений. #### Включение Сначала включите несколько заголовков, которые нам потребуются: ```cpp // включите заголовок imageNet для распознавания изображений #include // включите заголовок loadImage для загрузки изображений #include ```> **примечание**: заголовки, перечисленные ниже, устанавливаются в директории `/usr/local/include` во время шага `sudo make install` [процесса сборки](building-repo-2.md#compiling-the-project). >           если вы не выполнили команду `sudo make install`, то заголовки не будут найдены при компиляции примера. #### Объявление метода main() и парсинг командной строки Далее объявите метод `main()` и убедитесь, что программа запущена с именем файла изображения в качестве аргумента командной строки: ```cpp // точка входа int main(int argc, char** argv) { // ожидается, что аргумент командной строки будет содержать имя файла изображения, // поэтому убедитесь, что у нас есть хотя бы 2 аргумента (первый аргумент — это имя программы) if (argc < 2) { printf("my-recognition: ожидалось имя файла изображения в качестве аргумента\n"); printf("пример использования: . /my-recognition my_image.jpg\n"); return 0; } // извлекаем имя файла изображения из массива аргументов командной строки const char* imgFilename = argv[1]; } ``` Этот пример загружает и классифицирует изображение, которое указывает пользователь. Программа будет запускаться следующим образом: ``` bash $ ./my-recognition my_image.jpg ```

Имя файла изображения, которое нужно загрузить, должно быть заменено на my_image.jpg. Код выше проверяет, что аргумент командной строки был предоставлен программе.

Загрузка изображения с диска

Объявите некоторые переменные, которые будут хранить размеры изображения и указатели на его память, а затем загрузите изображение с диска с помощью функции loadImage().

  // эти переменные будут хранить указатель на данные изображения и его размеры
  uchar3* imgPtr = NULL;   // общий указатель на изображение для CPU и GPU
  int imgWidth   = 0;      // ширина изображения (в пикселях)
  int imgHeight  = 0;      // высота изображения (в пикселях)
	// загружаем изображение с диска в формате uchar3 RGB (24 бита на пиксель)
  if( !loadImage(imgFilename, &imgPtr, &imgWidth, &imgHeight) )
  {
  	printf("не удалось загрузить изображение '%s'\n", imgFilename);
  	return 0;
  }
```  Загруженное изображение будет храниться в общей памяти, которая отображена как для CPU, так и для GPU. Изображение загружается в формате `uchar3` RGB, но тип пикселя может быть `uchar3, uchar4, float3, float4`. Для получения дополнительной информации см. страницу [Обработка изображений с помощью CUDA](aux-image.md).
#### Загрузка сети распознавания изображений
Используя функцию [`imageNet::Create()`](.Функция загрузки GoogleNet модели с использованием TensorRT, которая уже была загружена при первоначальной [конфигурации репозитория](building-repo-2.md#downloading-models). Модель была предобучена на датасете ImageNet ILSVRC12, который способен распознавать до 1000 различных классов объектов, таких как разные виды фруктов и овощей, множество видов животных, а также повседневные предметы, такие как автомобили, офисная мебель, спортивное оборудование и т. д.```cpp
// загрузка GoogleNet модели распознавания изображений с использованием TensorRT
// вы можете использовать imageNet::RESNET_18 для загрузки ResNet-18
imageNet* net = imageNet::Create(imageNet::GOOGLENET);
// проверка корректности загрузки модели
if (!net)
{
  printf("не удалось загрузить модель распознавания изображений\n");
  return 0;
}

Если необходимо, вы можете загрузить другие предобученные модели, изменив передаваемый в imageNet::Create() enum на один из перечисленных в этой таблице. ResNet-18 (imageNet::RESNET_18) доступен по умолчанию вместе с GoogleNet. Для остальных моделей вам может потребоваться вернуться и загрузить модели, которые вы не выбрали при первоначальной конфигурации.

Классификация изображения

Далее мы будем классифицировать изображение с использованием функции imageNet::Classify():

// эта переменная будет хранить уверенность классификации (от 0 до 1)
float confidence = 0.0;
// классификация изображения, возврат индекса класса объекта (или -1 при ошибке)
const int classIndex = net->Classify(imgPtr, imgWidth, imgHeight, &confidence);

Функция imageNet::Classify() принимает указатель на изображение в памяти GPU и выполняет инференс с использованием TensorRT. Она возвращает индекс класса объекта, на который было распознано изображение, а также значение уверенности результата.#### Интерпретация результатов Если вызов функции imageNet::Classify() не завершился ошибкой, давайте выведем информацию о классификации распознанного объекта:```cpp // проверка корректности возвращенного результата классификации if (classIndex >= 0) { // получение имени/описания класса объекта } else { // если Classify() вернула отрицательное значение, произошла ошибка }

См. также функцию [`imageNet::Classify()`](../c/imageNet.h#L159), которая возвращает целочисленный индекс объекта (от OnClickListener 0 до 1000 для ILSVRC12). Для получения человекочитаемого описания объекта используется функция [`imageNet::GetClassDesc()`](../c/imageNet.h#L140). 
Описания 1000 классов извлекаются из файла [`ilsvrc12_synset_words.txt`](../data/networks/ilsvrc12_synset_words.txt) при загрузке сети (этот файл был предварительно загружен при сборке репозитория jetson-inference).
#### Завершение работы
Перед выходом из программы освободите ресурсы сети, удалив объект сети:
```cpp
// освобождение ресурсов сети перед завершением работы
delete net;
// это конец примера
return 0;
}

Это всё! Не забудьте добавить оператор возврата и закрывающую фигурную скобку в метод main(). Далее нам нужно создать простой файл CMakeLists.txt для нашего нового приложения распознавания с использованием CMake.

Создание файла CMakeLists.txt

Откройте файл ~/my-recognition/CMakeLists.txt в редакторе и добавьте следующий код:

# требуемая версия CMake 2.8 или выше
```cmake_minimum_required(VERSION 2.8)
# объявление проекта my-recognition
project(my-recognition)
# импорт пакетов jetson-inference и jetson-utils
find_package(jetson-utils)
find_package(jetson-inference)
# требуются CUDA и Qt4
find_package(CUDA)
find_package(Qt4)
# настройка Qt4 для сборки
include(${QT_USE_FILE})
add_definitions(${QT_DEFINITIONS})
# компиляция программы my-recognition
cuda_add_executable(my-recognition my-recognition.cpp)
# связывание my-recognition с библиотекой jetson-inference
target_link_libraries(my-recognition jetson-inference)

В будущем вы можете использовать этот файл CMakeLists как шаблон для компиляции собственных проектов, использующих библиотеку jetson-inference. Самые важные части:

  • Импорт проектов jetson-utils и jetson-inference:
find_package(jetson-utils)
find_package(jetson-inference)
  • Связывание с libjetson-inference:
target_link_libraries(my-recognition jetson-inference)

Примечание: эти библиотеки устанавливаются в /usr/local/lib во время шага sudo make install построения. Если вы не выполнили sudo make install, то эти библиотеки не будут найдены при компиляции примера.

Теперь, когда наши исходные файлы завершены, выполните следующие команды командной строки для компиляции программы `my-recognition`:
```bash
$ cd ~/my-recognition
$ cmake .
$ make

Если вы столкнулись с ошибками, убедитесь, что вы выполнили sudo make install при построении репозитория jetson-inference. Вы также можете скачать завершенный, работающий код этого примера из директории examples/my-recognition репозитория.

Запуск примера

Теперь, когда наша программа скомпилирована, давайте классифицируем тестовые изображения, которые мы скачали в начале этого руководства:

$ ./my-recognition polar_bear.jpg
image is recognized as 'ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus' (class #296) with 99.999878% confidence
```bash $ ./my-recognition brown_bear.jpg image is recognized as 'brown bear, bruin, Ursus arctos' (class #294) with 99.928925% confidence ``` ```bash $ ./my-recognition black_bear.jpg image is recognized as 'American black bear, black bear, Ursus americanus, Euarctos americanus' (class #295) with 98.898628% confidence ``` Это завершение этого раздела руководства. Следующим шагом будет классификация потока видео в реальном времени с камеры на борту Jetson. ```

© 2016-2019 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