ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

jetson-inference 实战:在 NVIDIA Jetson 上用 segNet 实时运行语义分割摄像头 Demo

jetson-inference 实战:在 NVIDIA Jetson 上用 segNet 实时运行语义分割摄像头 Demo 人工智能计算机视觉深度学习微调【免费下载链接】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点击查看免费下载本篇技术指南基于 jetson-inference 仓库讲解如何将 segnet 示例程序C与 segnet.pyPython从静态图片分割扩展到实时摄像头流分割涵盖 MIPI CSI、V4L2、RTP/RTSP 三类输入源的 URI 用法、--network/--visualize/--alpha/--filter-mode等核心参数的作用与取值、视频录制输出以及从 segNet 类与 CUDA 内核层面理解其底层实现。读完本文你可以在 Jetson 上直接跑起实时分割 Demo并能按场景自由切换预训练模型与可视化方式。一、Demo 概述从图片分割到实时视频流segnet示例程序在 前一篇命令行分割教程 中用于处理静态图片而它本身是一个通用的流处理程序输入既可以是图片文件也可以是实时摄像头视频流。程序内部通过videoSource输入与videoOutput输出两个抽象接口统一处理所有流类型因此只需更换命令行中的资源 URIResource URI就能无缝切换到实时分割。从源码调用链看segnet.cpp 的主循环依次完成四件事videoSource::Create()解析输入 URI 并创建输入流videoOutput::Create()解析输出 URI 并创建输出流segNet::Create()加载分割网络并读取--alpha、--filter-mode、--visualize、--ignore-class等参数循环执行input-Capture()取帧 →net-Process()推理 →net-Overlay()/net-Mask()生成可视化 →output-Render()渲染显示。Python 版 segnet.py 的逻辑完全一致只是把缓冲区管理抽到了 segnet_utils.py 的segmentationBuffers类中。二、支持的摄像头输入类型与 URI 语法实时 Demo 支持的摄像头输入包括输入类型URI 示例说明MIPI CSI 摄像头csi://0CSI 通道 0多路相机时把0换成对应通道号V4L2 摄像头/dev/video0Linux 视频设备节点USB 摄像头一般在此RTP / RTSP 网络流rtsp://username:passwordip:port网络摄像头或视频服务器关于流协议的完整说明含file://、v4l2://、rtsp://、webrtc://、display://等前缀、编解码器支持列表、输入输出侧全部命令行参数请参见 Camera Streaming and Multimedia 页面。在该页的输入流表格中可以查到csi://、v4l2://、file://前缀均可省略/dev/video0即 V4L2 相机的简写支持的解码器包括 H.264、H.265、VP8、VP9、MPEG-2、MPEG-4、MJPEG输出侧默认会创建 OpenGL 显示窗口除非指定--headless。从源码结构看URI 的解析与解码/编码器选择全部封装在videoSource/videoOutputjetson-utils 库中segnet程序自身只关心“取一帧、处理一帧、渲染一帧”这也是同一套示例代码能同时处理图片、视频文件与摄像头的根本原因。摄像头选型参考Jetson Nano常见搭配 Raspberry Pi Camera Module v2IMX219 传感器Jetson AGX Xavier可选用 Jetson 生态合作的 CSI 相机参见 aux-streaming.mdJetson TX1 / TX2 开发套件板载自带 MIPI CSI 传感器模块OV5693。三、启动实时分割 DemoC 与 Python先确保已完成项目构建或进入 Docker 容器见 Building the Project from Source 与 Running the Docker ContainerC 程序segnet位于构建产物目录Python 脚本segnet.py位于 python/examples/ 下。运行--help可以查看全部命令行选项其中与 segNet 直接相关的核心参数如下参数作用默认值--networkmodel切换分割模型可用模型见下表fcn-resnet18-voc-320x320--visualize可视化模式接受mask和/或overlayoverlay,mask--alphaoverlay 的 alpha 混合值0–255150C 源码中为 150.0--filter-mode采样方式point或linearlinear--ignore-class在可视化结果中忽略的类别名void--stats仅 Python打印各分割类别占比统计关闭注命令行文档与示例中--alpha默认值曾写作 120而当前仓库源码 segNet.h 中SEGNET_DEFAULT_ALPHA定义为 150segnet.cpp 与 segnet.py 均按 150.0 解析。本文以仓库实际源码为准。C 典型启动方式$ ./segnet --networkmodel csi://0 # MIPI CSI 摄像头 $ ./segnet --networkmodel /dev/video0 # V4L2 摄像头 $ ./segnet --networkmodel /dev/video0 output.mp4 # 摄像头画面实时分割并保存为视频文件Python 典型启动方式$ ./segnet.py --networkmodel csi://0 # MIPI CSI 摄像头 $ ./segnet.py --networkmodel /dev/video0 # V4L2 摄像头 $ ./segnet.py --networkmodel /dev/video0 output.mp4 # 摄像头画面实时分割并保存为视频文件当省略输出参数时默认会弹出 OpenGL 窗口display://0实时显示结果把输出 URI 换成output.mp4等视频文件即可一边预览一边把带分割叠加的画面编码保存输出编码器默认 H.264详见 aux-streaming.md 输出选项。四、可用模型与场景选型--network决定加载哪套 FCN-ResNet18 预训练模型。所有模型均为 21 类 FCN-ResNet18 结构在不同数据集与分辨率上训练并导出为 ONNX 格式由 TensorRT 加载优化。在 models.json 的 segmentation 分组 中每个模型都登记了下载 URL、解压目录、fcn_resnet18.onnx模型文件以及配套的classes.txt类别标签与colors.txt类别颜色首次使用时会自动下载。数据集分辨率CLI 参数精度Jetson NanoJetson XavierCityscapes512x256fcn-resnet18-cityscapes-512x25683.3%48 FPS480 FPSCityscapes1024x512fcn-resnet18-cityscapes-1024x51287.3%12 FPS175 FPSCityscapes2048x1024fcn-resnet18-cityscapes-2048x102489.6%3 FPS47 FPSDeepScene576x320fcn-resnet18-deepscene-576x32096.4%26 FPS360 FPSDeepScene864x480fcn-resnet18-deepscene-864x48096.9%14 FPS190 FPSMulti-Human512x320fcn-resnet18-mhp-512x32086.5%34 FPS370 FPSMulti-Human640x360fcn-resnet18-mhp-640x36087.1%23 FPS325 FPSPascal VOC320x320fcn-resnet18-voc-320x32085.9%45 FPS508 FPSPascal VOC512x320fcn-resnet18-voc-512x32088.5%34 FPS375 FPSSUN RGB-D512x400fcn-resnet18-sun-512x40064.3%28 FPS340 FPSSUN RGB-D640x512fcn-resnet18-sun-640x51265.1%17 FPS224 FPSCLI 参数省略分辨率后缀时加载该数据集的最低分辨率模型例如--networkfcn-resnet18-cityscapes等价于 512x256 版本“精度”指模型在其验证集上的像素级分类准确率性能为 JetPack 4.2.1、nvpmodel 0MAX-N、GPU FP16 模式下的实测数据完整参数列表同时定义在 segNet.h 的 SEGNET_USAGE_STRING 中模型名、--model/--prototxt/--labels/--colors/--input-blob/--output-blob等自定义模型加载选项也一一列明。模型与场景的对应关系Cityscapes面向城市街景DeepScene面向越野森林小径与植被室外机器人路径跟随Multi-Human Parsing (MHP)对人体部位手臂、腿、头、不同服饰做密集标注Pascal VOC覆盖常见的人、动物、车辆与家居物体SUN RGB-D覆盖办公室与家庭常见的室内物体与场景。五、可视化效果与参数调优在 OpenGL 窗口中程序默认同时显示两块画面左侧为实时摄像头画面叠加半透明分割结果overlay右侧为纯色分割掩码mask。以下分别用三个模型演示。1. Multi-Human Parsing 模型人体部位分割# C $ ./segnet --networkfcn-resnet18-mhp csi://0 # Python $ ./segnet.py --networkfcn-resnet18-mhp csi://02. SUN RGB-D 模型室内场景分割# C $ ./segnet --networkfcn-resnet18-sun csi://0 # Python $ ./segnet.py --networkfcn-resnet18-sun csi://03. DeepScene 模型越野/森林场景分割# C $ ./segnet --networkfcn-resnet18-deepscene csi://0 # Python $ ./segnet.py --networkfcn-resnet18-deepscene csi://0可以自由组合不同模型与分辨率在室内外不同环境下试验--visualize只输出 mask、只输出 overlay、或两者同时输出。参数背后的实现细节--alpha0–255控制 overlay 中分割颜色的不透明度。从 segNet.cpp 的 SetOverlayAlpha 实现 看它会遍历所有类别把各类颜色的 alpha 通道mClassColors[n].w统一设为该值如果某个类别曾在colors.txt中显式指定过 alphamColorsAlphaSet[n]为真则默认跳过除非显式传explicit_exemptfalse。例如--alpha200会让叠加层更淡、原画面更清晰。--filter-modepoint / linear控制掩码上采样到显示分辨率时的采样方式。point为最近邻采样linear为双线性插值segNet.h 的 FilterMode 枚举 对应FILTER_POINT/FILTER_LINEAR。低分辨率模型如 512x256配合point会出现明显的像素块状边缘linear则更平滑。--visualizeoverlay / mask对应 segNet.h 的 VisualizationFlagsVISUALIZE_OVERLAY、VISUALIZE_MASK。C 侧通过 VisualizationFlagsFromStr 解析字符串同时输出两种模式时segnet.cpp 的 allocBuffers 会分配三个 CUDA 映射缓冲区overlay 全尺寸、mask 半尺寸、composite 拼接并调用cudaOverlay内核把两块图左右拼合Python 侧 segmentationBuffers.Alloc 采用相同的布局策略mask 在有 overlay 时降采样一半。--ignore-class默认 void把不需要显示的类别如背景void从可视化中排除由 segNet::Process 传入。附加Python 的--stats统计模式Python 版额外提供--stats参数通过 segmentationBuffers.ComputeStats 在低分辨率分类网格上统计每类像素的计数与占比逐帧打印「类别 ID、类别名、计数、百分比」适合快速评估当前场景中各物体所占画面比例。六、进阶把 Demo 改造成你自己的实时分割程序两个示例本身就是很好的编程模板Csegnet主循环segnet.cpp展示了标准用法——Capture()取帧 →Process()推理 →Overlay()/Mask()生成可视化 →Render()渲染并在状态栏实时显示TensorRT 版本 | 网络名 | FPSsegNet::GetNetworkFPS 提供推理帧率PrintProfilerTimes()打印各层耗时。Pythonsegnet.py用jetson_inference.segNet与jetson_utils的videoSource/videoOutput/cudaOverlay完成同样的流程segnet.py 中还注释了硬编码加载自定义模型的 APInet segNet(modelmodel/fcn_resnet18.onnx, labelsmodel/labels.txt, colorsmodel/colors.txt, input_blobinput_0, output_bloboutput_0)自定义模型在 C 侧对应 segNet::Create 的完整重载prototxt、caffemodel/uff/onnx、类别标签、类别颜色、输入/输出 blob 名均可显式指定以及命令行方式--model、--labels、--colors、--input-blob、--output-blob。默认输入/输出 blob 名分别为input_0与output_0segNet.h 宏定义。如果想批量处理一段摄像头画面并统计结果还可以结合 segnet-console-2.md 的目录/序列处理images/room_*.jpg通配符输入 output_%i.jpg序列输出进行离线验证后再上实时流。七、小结通过segnet/segnet.py的同一套代码框架jetson-inference 把静态图片分割无缝扩展到了 MIPI CSI、V4L2 与 RTP/RTSP 三类实时摄像头输入核心是videoSource/videoOutput对流的统一抽象配合segNet的Process→Overlay/Mask推理可视化管线。参数层面--network决定模型与场景、--visualize决定显示形态、--alpha控制透明度、--filter-mode控制采样平滑度。结合仓库中的 segNet.h、segNet.cpp、models.json 与 aux-streaming.md你可以在此基础上接入自己的摄像头与自定义 ONNX 分割模型构建面向机器人、安防、室内感知等场景的实时像素级环境理解系统。赞分享人工智能计算机视觉深度学习微调【免费下载链接】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点击查看免费下载相关推荐如何配置 Umi-OCR 的 HTTP 接口允许局域网设备访问如何配置 Umi OCR 的 HTTP 接口允许局域网设备访问 默认情况下Umi OCR 的 HTTP 接口只监听本机环回地址 127.0.0.1 其他设人工智能计算机视觉深度学习微调Buzz 离线转录4 步跑出第一个本地字幕Buzz 离线转录4 步跑出第一个本地字幕 你有一台 2 小时的会议录音放在桌面上今天要拿到文字稿但上传给云服务前总要先犹豫一下。Buzz 是一款开源的人工智能计算机视觉深度学习微调在 Jetson 上运行分割模型jetson-inference 的 segnet-console 命令行实战在 Jetson 上运行分割模型jetson inference 的 segnet console 命令行实战 本篇技术指南聚焦 jetson inferen人工智能计算机视觉深度学习微调上一篇【亲测免费】 AudioKit 开源项目教程下一篇dateparse在企业项目中的应用日志解析、数据导入等实战案例创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表