Назад | Вперед | Содержание
Распознавание изображений
Имя файла изображения, которое нужно загрузить, должно быть заменено на 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.
Откройте файл ~/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
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )