新闻详情

新闻详情

首页 / 资讯中心 / 详情

从零编写基于 jetson-inference 的图像识别程序:imageNet 实战指南

发布时间:2026/9/25 6:58:56来源:尧图网络
从零编写基于 jetson-inference 的图像识别程序:imageNet 实战指南
人工智能计算机视觉深度学习微调【免费下载链接】jetson-inferenceHello AI World guide to deploying deep-learning inference networks and deep vision primitives with TensorRT and NVIDIA Jetson.项目地址https://gitcode.com/gh_mirrors/je/jetson-inference点击查看免费下载导读本篇指南以 docs/imagenet-example.md 为骨架完整讲解如何在 NVIDIA Jetson 上从零编写一个独立的图像识别程序my-recognition从项目目录搭建、CMake 配置到调用 imageNet 类完成加载图片 → TensorRT 推理 → 输出分类结果的全流程。读完本文后你将掌握在自有项目中以 C 方式集成jetson-inference库的完整方法并能切换 GoogleNet、AlexNet、ResNet-18 等十余种预训练分类模型。仓库中 examples/my-recognition 目录存放了本示例的完整可运行代码可直接对照学习。本教程是 jetson-inference Hello AI World 系列中Image Recognition图像识别一节的核心实操部分上一环节 imagenet-console 演示了如何运行仓库自带的命令行识别工具本环节则把这些能力拆开指导你亲手写出属于自己的识别程序——它完全独立于仓库存在因此在你自己的应用项目中集成jetson-inference库时完全可以照搬本示例的工程组织方式。前置准备构建并安装 jetson-inference在编写my-recognition之前需要先在 Jetson 上完成仓库的构建与安装。核心步骤如下完整细节见 docs/building-repo.md$ 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有两个关键点直接决定后续示例能否编译通过sudo make install必须执行。my-recognition的代码通过#include jetson-inference/imageNet.h引用头文件并通过find_package(jetson-inference)链接库这些头文件与库分别安装到/usr/local/include和/usr/local/lib下均来自该安装步骤。跳过它编译时就会报找不到头文件/库的错误。模型会自动下载。配置阶段cmake ../会启动 CMakePreBuild.sh 并调用 Model Downloader 工具tools/download-models.sh下载预训练网络。默认选中 GoogleNet 与 ResNet-18若日后想补充其他模型随时可以重新运行$ cd jetson-inference/tools $ ./download-models.sh本文示例默认使用 GoogleNet 模型在构建阶段已自动下载无需额外操作。设置项目目录与测试图片my-recognition可以放在 Jetson 上任意位置。为简单起见本教程将其创建在用户主目录下的~/my-recognition。在终端中依次执行$ mkdir ~/my-recognition $ cd ~/my-recognition $ touch my-recognition.cpp $ touch CMakeLists.txt $ wget 图片直链1 # 下载 black_bear.jpg 测试图 $ wget 图片直链2 # 下载 brown_bear.jpg 测试图 $ wget 图片直链3 # 下载 polar_bear.jpg 测试图说明原始教程通过wget从仓库 data/images 目录拉取三张测试图片。在本仓库中这三张图已位于 data/images/black_bear.jpg、data/images/brown_bear.jpg、data/images/polar_bear.jpg你也可以直接从仓库目录拷贝或在后面运行示例小节改用仓库内任意一张示例图片如 data/images/banana_0.jpg。接下来向两个空源文件填充代码。编写 my-recognition.cpp 源码用任意编辑器打开my-recognition.cpp如gedit my-recognition.cpp按下面几个步骤逐段加入代码。仓库中的完整版本见 examples/my-recognition/my-recognition.cpp。1. 引入头文件// include imageNet header for image recognition #include jetson-inference/imageNet.h // include loadImage header for loading images #include jetson-utils/loadImage.hc/imageNet.h 声明了 imageNet 类即本文的主角——基于 TensorRT 的图像识别网络封装。loadImage.h来自jetson-utils库提供从磁盘加载图片的loadImageRGBA()/loadImage()等函数。注意这两个头文件在sudo make install步骤中被安装到/usr/local/include下若未执行该步骤编译时会找不到它们。2. 声明 main() 并解析命令行参数// main entry point int main( int argc, char** argv ) { // a command line argument containing the image filename is expected, // so make sure we have at least 2 args (the first arg is the program) if( argc 2 ) { printf(my-recognition: expected image filename as argument\n); printf(example usage: ./my-recognition my_image.jpg\n); return 0; } // retrieve the image filename from the array of command line args const char* imgFilename argv[1];程序按如下方式运行./my-recognition my_image.jpg其中my_image.jpg替换为实际图片路径。上述代码检查argc 2确保用户传入了图片文件名参数argv[0]是程序自身。3. 从磁盘加载图片// these variables will be used to store the image data and dimensions // the image data will be stored in shared CPU/GPU memory, so there are // pointers for the CPU and GPU (both reference the same physical memory) float* imgCPU NULL; // CPU pointer to floating-point RGBA image data float* imgCUDA NULL; // GPU pointer to floating-point RGBA image data int imgWidth 0; // width of the image (in pixels) int imgHeight 0; // height of the image (in pixels) // load the image from disk as float4 RGBA (32 bits per channel, 128 bits per pixel) if( !loadImageRGBA(imgFilename, (float4**)imgCPU, (float4**)imgCUDA, imgWidth, imgHeight) ) { printf(failed to load image %s\n, imgFilename); return 0; }这里有两个值得深入理解的设计点共享内存mapped memory加载后的图片存放在同时映射到 CPU 与 GPU 地址空间的共享内存中。imgCPU与imgCUDA两个指针虽然分属不同地址空间但指向的是同一份物理内存无需执行cudaMemcpy()拷贝。CPU 侧代码用imgCPUCUDA kernel 内用imgCUDA本示例的推理由 TensorRT 在 GPU 上执行因此后续Classify()传入imgCUDA指针。像素格式loadImageRGBA()以float4RGBA 格式加载每通道 32 位浮点像素值范围 0.0255.0。仓库里的最终版 examples/my-recognition/my-recognition.cpp 实际使用loadImage()加载为uchar3RGB每像素 24 位两种方式在 imageNet 的Classify()模板接口下均可直接工作因为该接口会根据指针类型自动推断图片格式见下文Classify 的格式自适应。4. 加载图像识别网络// load the GoogleNet image recognition network with TensorRT // you can use imageNet::ALEXNET to load AlexNet model instead imageNet* net imageNet::Create(imageNet::GOOGLENET); // check to make sure that the network model loaded properly if( !net ) { printf(failed to load image recognition network\n); return 0; }imageNet::Create()c/imageNet.h加载预训练模型并用 TensorRT 构建推理引擎默认加载GoogleNet模型在最初构建仓库时已自动下载。也可以改为imageNet::ALEXNET加载 AlexNet。两个模型都基于 ImageNet ILSVRC12 数据集训练可识别多达1000 类物体类别清单见 data/networks/ilsvrc12_synset_words.txt涵盖水果蔬菜、各类动物、以及车辆、办公家具、运动器材等日常人造物体。从源码实现看c/imageNet.cpp 中imageNet::Create(const char* network, ...)传入的模型名会在data/networks/models.json中按类型classification查表见 data/networks/models.json取出对应的prototxt、model、labels文件路径后再进入init()完成tensorNet::LoadNetwork()与类别信息加载。Create()在加载失败时返回NULL因此务必做空指针检查。5. 对图片进行分类推理// this variable will store the confidence of the classification (between 0 and 1) float confidence 0.0; // classify the image with TensorRT on the GPU (hence we use the CUDA pointer) // this will return the index of the object class that the image was recognized as (or -1 on error) const int classIndex net-Classify(imgCUDA, imgWidth, imgHeight, confidence);imageNet::Classify()c/imageNet.h接收 GPU 显存中的图像指针使用 TensorRT 完成推理返回分类结果索引识别出的物体类别编号ILSVRC12 下为 01000 之间的整数若没有任何类别的置信度达到阈值则返回-1若发生运行时错误则返回-2。置信度通过confidence出参返回取值范围 01。源码级原理Classify 内部发生了什么对照 c/imageNet.cpp 的实现Classify()的完整调用链分为三个阶段预处理preProcess()将任意尺寸的输入图片下采样并转换到网络输入张量mInputs[0].CUDA。对 Caffe 模型执行cudaTensorMeanBGR()转换到 band-sequential BGR 并做均值像素减法GoogLeNet 的均值向量为(104.007, 116.669, 122.679)对 ONNX 模型执行cudaTensorNormMeanRGB()按 ImageNet 标准mean(0.485,0.456,0.406)、std(0.229,0.224,0.225)归一化Inception-v4 则使用cudaTensorNormRGB()归一化到[-1,1]。网络推理ProcessNetwork()调用 TensorRT 执行引擎在 GPU 上跑完整网络输出各类别得分到mOutputs[0]。后处理遍历mNumClasses个类别的输出过滤掉低于阈值mThreshold默认0.01见 c/imageNet.h 中IMAGENET_DEFAULT_THRESHOLD的类别取置信度最高者作为结果。Classify()还提供一个模板重载根据传入指针类型自动推断图片格式imageFormatFromTypeT()支持rgb8、rgba8、rgb32f、rgba32f四种格式这也是仓库版 examples/my-recognition/my-recognition.cpp 能直接传uchar3*指针的原因。Classify 的 Top-K 变体除单结果版外c/imageNet.h 还提供Classify(image, width, height, Classifications, int topK)重载将满足置信度阈值的前 K 个(classID, confidence)结果按置信度从高到低排序返回c/imageNet.cpp 中通过std::sort实现。topK默认 1 表示只返回最高置信度结果传0则返回所有达标类别。这在需要次优候选或做结果过滤的应用场景非常有用。6. 解读分类结果// make sure a valid classification result was returned if( classIndex 0 ) { // retrieve the name/description of the object class index const char* classDescription net-GetClassDesc(classIndex); // print out the classification results printf(image is recognized as %s (class #%i) with %f%% confidence\n, classDescription, classIndex, confidence * 100.0f); } else { // if Classify() returned 0, an error occurred printf(failed to classify image\n); }Classify()返回的是整数类别索引对人类不友好因此用imageNet::GetClassDesc(classIndex)c/imageNet.h取回人类可读的类别描述。这 1000 个类别的描述在模型加载时从 data/networks/ilsvrc12_synset_words.txt 解析而来源码见 c/imageNet.cpp 的loadClassInfo()会校验类别数与网络输出维度一致。相关接口还包括GetClassSynset(index)返回类别 synset 编号如n01580077、GetNumClasses()返回类别总数通常为 1000、GetClassLabel()为GetClassDesc()的别名详见 c/imageNet.h。7. 退出前的清理// free the networks resources before shutting down delete net; // this is the end of the example! return 0; }程序结束前delete网络对象释放 TensorRT 引擎与 CUDA 资源。别忘了补上return 0;和 main() 的右花括号——到此my-recognition.cpp就完成了。编写 CMakeLists.txt 构建脚本打开~/my-recognition/CMakeLists.txt加入以下内容仓库版见 examples/my-recognition/CMakeLists.txt# require CMake 2.8 or greater cmake_minimum_required(VERSION 2.8) # declare my-recognition project project(my-recognition) # import jetson-inference and jetson-utils packages. # note that if you didnt do sudo make install # while building jetson-inference, this will error. find_package(jetson-utils) find_package(jetson-inference) # CUDA and Qt4 are required find_package(CUDA) find_package(Qt4) # setup Qt4 for build include(${QT_USE_FILE}) add_definitions(${QT_DEFINITIONS}) # compile the my-recognition program cuda_add_executable(my-recognition my-recognition.cpp) # link my-recognition to jetson-inference library target_link_libraries(my-recognition jetson-inference)这份 CMakeLists 本身就是一个可复用的模板未来任何想使用jetson-inference库的独立项目都可以照抄。最核心的三行是find_package(jetson-utils) find_package(jetson-inference) ... target_link_libraries(my-recognition jetson-inference)find_package引入jetson-utils与jetson-inference两个工程提供头文件与库的查找路径target_link_libraries将可执行文件链接到libjetson-inference。注意这两个库通过sudo make install安装到/usr/local/lib跳过该步骤则找不到库链接时报错。仓库版 examples/my-recognition/CMakeLists.txt 在更新后还加入了可选的find_package(VPI 2.0)与link_directories(/usr/lib/aarch64-linux-gnu/tegra)为 Jetson 的libnvbuf-utils添加链接路径并移除了 Qt4 依赖——如果你的 CMake 版本较新且不需要 Qt可以按仓库版精简配置。编译示例源文件就绪后运行以下命令编译my-recognition$ cd ~/my-recognition $ cmake . $ make如果遇到错误请确认构建 jetson-inference 仓库时执行过sudo make install步骤见 docs/building-repo.md。运行示例并验证识别结果程序编译成功后用它来分类本教程开头下载的三张测试图片$ ./my-recognition polar_bear.jpg image is recognized as ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus (class #296) with 99.999878% confidence$ ./my-recognition brown_bear.jpg image is recognized as brown bear, bruin, Ursus arctos (class #294) with 99.928925% confidence$ ./my-recognition black_bear.jpg image is recognized as American black bear, black bear, Ursus americanus, Euarctos americanus (class #295) with 98.898628% confidence可以看到三张熊的图片分别被正确识别为ice bear / polar bear#296、brown bear#294、American black bear#295置信度均超过 98%。类别编号与描述一一对应 data/networks/ilsvrc12_synset_words.txt 中的条目。提示程序首次运行加载模型时TensorRT 可能需要几分钟来优化网络这份优化后的引擎会被缓存到磁盘后续启动会快很多。扩展切换其他分类模型my-recognition目前硬编码加载 GoogleNet。通过修改imageNet::Create(...)的入参或参考仓库命令行工具 examples/imagenet/imagenet-console.cpp 的--network参数用法即可切换模型。仓库 data/networks/models.json 中注册的全部内置分类模型如下网络CLI 参数NetworkType 枚举文档版示例备注AlexNetalexnetALEXNET1000 类 ILSVRC12GoogleNetgooglenetGOOGLENET默认网络1000 类 ILSVRC12GoogleNet-12googlenet-12GOOGLENET_12ILSVRC12 的 12 类子集ResNet-18resnet-18RESNET_181000 类 ILSVRC15ResNet-50resnet-50RESNET_501000 类 ILSVRC15ResNet-101resnet-101RESNET_1011000 类 ILSVRC15ResNet-152resnet-152RESNET_1521000 类 ILSVRC15VGG-16vgg-16VGG-161000 类 ILSVRC15VGG-19vgg-19VGG-191000 类 ILSVRC15Inception-v4inception-v4INCEPTION_V41000 类 ILSVRC15这些网络均通过 tools/download-models.sh 按需下载默认只下载 GoogleNet 与 ResNet-18。一般规律是网络越复杂分类精度通常越高但推理耗时也相应增加实际取舍取决于 Jetson 设备算力与实时性要求。从命令行创建网络时imageNet::Create(int argc, char** argv)见 c/imageNet.cpp还可以通过如下参数加载自定义模型--networkNETWORK内置预训练模型名上表 CLI 参数列--modelMODEL自定义模型路径支持.caffemodel、UFF、ONNX--prototxtPROTOTXTCaffe 模型对应的 deploy prototxt--labelsLABELS类别标签文本文件路径--input-blobINPUT/--output-blobOUTPUT输入/输出层名默认data/prob见 c/imageNet.h 中IMAGENET_DEFAULT_INPUT/IMAGENET_DEFAULT_OUTPUT--thresholdCONF最小置信度阈值默认 0.01--smoothingWEIGHT时间平滑权重默认关闭--profile开启 TensorRT 逐层性能分析。其中--threshold与--smoothing两个参数尤其值得说明SetThreshold()默认0.01低于该置信度的类别会被忽略Classify()返回-1表示无类别达标。适用于需要控制误报率的场景。SetSmoothing()默认关闭基于 EWMA指数加权移动平均对连续帧的置信度做时间平滑减少识别结果的抖动与噪声。传[0,1]之间的权重时作为平滑系数传大于 1 的整数N时表示按约最近 N 帧平均等价于权重1/N。权重越接近 1 对变化越敏感但噪声越大设为 0 或 1 即关闭。其累加实现见 c/imageNet.cpp 的applySmoothing()buffer[n] factor * (output[n] - buffer[n])。在实时视频识别场景如 docs/imagenet-camera.md 的摄像头示例中该参数非常实用。小结与下一步至此你已经完成了一个完全独立于仓库的、可运行的图像识别程序掌握了一个最小可复制的 C 工程模板imageNetloadImage CMake 三件套理解了imageNet::Create()的模型加载机制、Classify()的预处理-推理-后处理调用链、类别描述的解析来源以及阈值与时间平滑两个关键调参手段。下一步建议阅读 docs/imagenet-console.md了解命令行工具的完整用法与多模型对比实验阅读 docs/imagenet-camera.md将识别能力迁移到 Jetson 板载摄像头的实时视频流上会用到上面提到的平滑参数若需在 Python 中使用仓库 python/examples/imagenet-console.py 提供了等价的 Python 实现参考 c/imageNet.h 与 c/imageNet.cpp 的完整注释探索 Top-K 分类、自定义模型加载等进阶能力。赞分享人工智能计算机视觉深度学习微调【免费下载链接】jetson-inferenceHello AI World guide to deploying deep-learning inference networks and deep vision primitives with TensorRT and NVIDIA Jetson.项目地址https://gitcode.com/gh_mirrors/je/jetson-inference点击查看免费下载相关推荐Linux打印机协议转换引擎深度解析foo2zjs架构设计与实战应用Linux打印机协议转换引擎深度解析foo2zjs架构设计与实战应用 在Linux生态系统中打印机支持一直是技术挑战的核心领域之一。foo2zjs项目作为开人工智能计算机视觉深度学习微调NocoBase文件上传大小限制配置指南彻底解决20MB上传报错NocoBase文件上传大小限制配置指南彻底解决20MB上传报错 在 NocoBase 中使用附件字段上传文件时很多用户会遇到一个固定天花板文件稍大一人工智能计算机视觉深度学习微调jetson-inference 图像识别实战用 imageNet 控制台程序在 Jetson 上分类图片jetson inference 图像识别实战用 imageNet 控制台程序在 Jetson 上分类图片 本篇技术指南聚焦 jetson inference人工智能计算机视觉深度学习微调上一篇从数据到架构Karakeep数据模型设计与数据库实现全解析下一篇终极指南如何快速掌握Wasmer多语言SDK集成创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

ROS2+MoveIt2实战:Panda机械臂笛卡尔路径规划与避障全流程 2026/9/25 7:40:30

ROS2+MoveIt2实战:Panda机械臂笛卡尔路径规划与避障全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
迪文串口TFT屏通用驱动:从指令集到可复用代码的落地路径 2026/9/25 7:40:29

迪文串口TFT屏通用驱动:从指令集到可复用代码的落地路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
美股与A股市场反应差异解析及套利策略 2026/9/25 7:40:23

美股与A股市场反应差异解析及套利策略

1. 市场反应差异现象解析最近观察到的一个有趣现象:某些行业利好或利空消息在美股市场快速反应后,A股市场往往需要延迟一段时间才会出现类似的价格变动。这种跨市场间的信息传导延迟,本质上反映了不同市场结构、参与者构成和交易机制带来的价…

阅读更多 →
AEME 2026国际学术会议:航空航天与机械工程前沿解析 2026/9/25 7:40:23

AEME 2026国际学术会议:航空航天与机械工程前沿解析

1. 会议背景与核心价值2026年航空航天工程与机械工程国际学术会议(AEME 2026)是南京航空航天大学主办的重量级行业盛会。作为在亚洲地区具有重要影响力的学术平台,这个会议已经连续举办多届,形成了稳定的学术交流传统。今年选址北…

阅读更多 →
Cadence Allegro与Altium Designer封装原理图对比 2026/9/25 7:40:23

Cadence Allegro与Altium Designer封装原理图对比

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
AMS芯片设计从0.18um到55nm:工艺迁移中的模拟电路实战经验 2026/9/25 7:40:23

AMS芯片设计从0.18um到55nm:工艺迁移中的模拟电路实战经验

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉