jetson-inference 实战:用 Flask + REST 打造多模型 WebRTC 交互式 DNN 控制台
人工智能计算机视觉深度学习微调【免费下载链接】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 仓库中的 Flask REST 示例讲解如何基于 Flask 微框架与 REST JSON 接口构建一个可在浏览器中实时观看、动态切换与调参的多模型深度学习推理控制台。读完本文你将掌握该 WebApp 的启动方式、多 DNN 模型加载方法、前后端 REST 通信机制与每个模型可调参数的对应端点并能结合源码理解其底层实现。Flask 示例概览Web 前端与 DNN 推理的桥接Flask 是一个广受欢迎的 Python Web 微框架负责把 HTTP/HTTPS 请求路由到用户实现的 Python 函数。在这个示例中Flask 承担了两层职责一是托管 WebRTC 视频流的页面呈现二是处理来自前端用户操作的后端 REST 请求让网页能够在运行时动态控制属性、触发推理内容。该示例是一个可交互的 DNN playground多个视觉模型可以被同时加载并在 WebApp 中自由开关每种模型的各种设置都可以通过 UI 实时调整界面组件使用 Bootstrap CSS 进行样式化。示例的四个核心源文件及其职责如下文件职责python/www/flask/app.pyFlask 主程序路由、命令行参数、启动服务器与流线程python/www/flask/stream.pyWebRTC 视频采集/传输与推理调度的后台线程python/www/flask/model.pyDNN 模型的封装加载、推理Process与可视化Visualizepython/www/flask/templates/index.html前端页面视频播放、模型控制面板的呈现与交互此外还有两个关键辅助文件utils.py 提供后端 REST 属性读写工具函数templates/macros.html 提供渲染控制组件的 Jinja 宏模板。启动示例一条命令拉起 WebRTC 流与推理进入示例目录、安装依赖并启动app.py它会同时启动 Flask Web 服务器和一条独立运行的流处理线程负责 WebRTC 的采集、传输与推理$ cd jetson-inference/python/www/flask $ pip3 install -r requirements.txt $ python3 app.py --detectionssd-mobilenet-v2 --poseresnet18-hand --actionresnet18-kinetics依赖清单 requirements.txt 中仅包含flask一项因为其余推理与视频能力jetson_inference、jetson_utils来自仓库本体需按项目 README.md 的构建流程预先安装好 Python 绑定python/bindings。启动后在浏览器中访问https://JETSON-IP:8050即可开始播放/发送流。要点如下默认端口 8050可通过--portN命令行参数更改源码见 app.py 第 35 行parser.add_argument(--port, default8050, ...)。默认输入输出均为 WebRTC--input默认值为webrtc://:8554/input--output默认值为webrtc://:8554/outputapp.py 第 39-40 行。改用其他视频输入通过--input指定例如--input/dev/video0使用直接连接 Jetson 的 V4L2 摄像头也可传入 CSI 摄像头地址或视频文件完整输入类型说明见 aux-streaming.md 中 Input Streams 一节。接收浏览器摄像头必须启用 HTTPS/SSLWebRTC 传输与网页默认走加密通道详见下文启用 HTTPS/SSL一节以及 webrtc-server.md 的说明。前端页面会依据是否为 WebRTC 输入自动适配在 index.html 中当send_webrtc为真时页面会在加载时调用checkMediaDevices()枚举浏览器的视频输入设备并填充到 Webcam 下拉框用户点击 Send 即可将本机摄像头经 WebRTC 发送到 Jetson 侧参与推理该功能需要 HTTPS 才能获取浏览器权限当输入为本地设备时页面则直接自动播放已运行的流。同时加载多种 DNN 模型该示例支持同时加载并运行多类 DNN 模型图像分类、目标检测、语义分割、姿态估计、动作识别以及背景移除。启动应用时通过命令行参数选择加载哪些模型$ python3 app.py \ --classificationresnet18 \ --detectionssd-mobilenet-v2 \ --segmentationfcn-resnet18-mhp \ --poseresnet18-body \ --actionresnet18-kinetics \ --backgroundu2net注意取决于你的 Jetson 型号与后台进程负载可能没有足够内存一次加载全部模型也可能没有足够算力让它们全部实时运行。可以参考 pytorch-transfer-learning.md 中的 Mounting Swap挂载交换分区与 Disabling the Desktop GUI关闭桌面图形界面来释放内存。想要查看内置模型清单运行python3 app.py --help或直接查看 data/networks/models.json。--help输出的参数说明由 stream.py 中的usage()汇总而来它拼接了videoSource、videoOutput与Model.Usage()的帮助文本后者依次包含imageNet/detectNet/segNet/actionNet/poseNet/backgroundNet的用法说明model.py 第 150-155 行。Model.__init__model.py 第 31-85 行按type分派加载不同的网络类classification→imageNet可选threshold、smoothing参数detection→detectNet若未指定output_layer则默认生成{scores: , bbox: }segmentation→segNetpose→poseNetaction→actionNetbackground→backgroundNet。模型在页面中以可折叠卡片card呈现每个卡片带一个展开/收起按钮card_headercollapse_handler宏卡片内是控制组件的组合。REST 查询前端 UI 与后端推理的实时联动该应用在 webrtc-html.md 所述的基础 WebRTC HTML/JavaScript 流式播放代码之上叠加了 REST JSON 查询用于动态更新组件与参数。后端的路由桩代码在 app.py前端的 JavaScript 查询在 templates/index.html并通过模板与宏来减少新增设置项时的样板代码。以分类模型为例完整的开关 阈值调节实现如下# backend - app.py (Python) app.route(/classification/enabled, methods[GET, PUT]) def classification_enabled(): return rest_property(stream.models[classification].IsEnabled, stream.models[classification].SetEnabled, bool) app.route(/classification/confidence_threshold, methods[GET, PUT]) def classification_confidence_threshold(): return rest_property(stream.models[classification].net.GetThreshold, stream.models[classification].net.SetThreshold, float)!-- frontend - index.html (Jinja/HTML/JavaScript) -- {{ checkbox(classification_enabled, /classification/enabled, Classification Enabled) }} {{ slider(classification_confidence_threshold, /classification/confidence_threshold, Confidence Threshold) }}后端rest_property()的 GET/PUT 语义utils.py 中的rest_property(getter, setter, type, keyNone)封装了读写 REST JSON 属性的全部样板逻辑GET 请求调用getter()取值若传入了key则取返回字典中的该键最后flask.jsonify(value)序列化为 JSON 返回给前端PUT 请求用type(flask.request.get_json())把请求体 JSON 强制转换为目标类型如bool、float、int若有key则setter(**{key: value})否则setter(value)随后返回 HTTP 200每次请求都会在 Jetson 终端打印一行日志客户端IP - - REST 方法 路径 值。检测模型的追踪参数minFrames、dropFrames、overlapThreshold就利用了key参数rest_property(GetTrackingParams, SetTrackingParams, int, keyminFrames)app.py 第 105-115 行实现对同一个字典参数对象中不同键的单独读写。前端Jinja 宏与 fetch 客户端index.html 中的{{ ... }}是 Jinja 模板表达式由 Flask 在服务端渲染页面时求值用于按命令行参数动态生成模型卡片。具体控件由 macros.html 提供slider(id, rest_path, label, min, max, step, oninput)生成 range 滑块get_id()通过rest_get()拉取当前值回填oninput事件经debounce触发rest_put()把新值推送到后端step 1时显示值会格式化为两位小数checkbox(id, rest_path, label, oninput)生成开关同样封装了rest_get/rest_put与初始回填card_header/collapse_handler生成 Bootstrap 折叠卡片头与事件处理。前端 REST 客户端由 static/rest.js 实现基于原生fetchAPIrest_get(url)返回解析后的 JSONrest_put(url, data)以PUT方法发送JSON.stringify(data)并设置Content-type: application/json; charsetUTF-8请求头。滑块拖拽时还借助 static/debounce.js 做防抖避免高频 PUT 请求压垮后端。各模型的可调参数与 REST 端点一览app.py 为每类模型按命令行参数动态注册路由只有加载了对应模型才会注册对应端点完整端点映射如下分类--classificationimageNetGET/PUT /classification/enabled→IsEnabled/SetEnabledboolGET/PUT /classification/confidence_threshold→GetThreshold/SetThresholdfloatGET/PUT /classification/output_smoothing→GetSmoothing/SetSmoothingfloat目标检测--detectiondetectNetGET/PUT /detection/enabledGET/PUT /detection/confidence_threshold→GetConfidenceThreshold/SetConfidenceThresholdGET/PUT /detection/clustering_threshold→GetClusteringThreshold/SetClusteringThresholdGET/PUT /detection/overlay_alpha→GetOverlayAlpha/SetOverlayAlphafloat前端滑块范围 0-255、步长 1GET/PUT /detection/tracking_enabled→IsTrackingEnabled/SetTrackingEnabledbool开启后前端才会显示下方三个追踪参数滑块GET/PUT /detection/tracking_min_frames→GetTrackingParams/SetTrackingParamskeyminFramesint滑块 0-60GET/PUT /detection/tracking_drop_frames→ 同上keydropFramesint滑块 0-60GET/PUT /detection/tracking_overlap_threshold→ 同上keyoverlapThreshold语义分割--segmentationsegNetGET/PUT /segmentation/enabledGET/PUT /segmentation/overlay_alpha→GetOverlayAlpha/SetOverlayAlphafloat滑块 0-255姿态估计--poseposeNetGET/PUT /pose/enabledGET/PUT /pose/confidence_threshold→GetThreshold/SetThresholdfloat动作识别--actionactionNetGET/PUT /action/enabledGET/PUT /action/confidence_threshold→GetThreshold/SetThresholdGET/PUT /action/skip_frames→GetSkipFrames/SetSkipFramesint滑块 0-30背景移除--backgroundbackgroundNetGET/PUT /background/enabled前端 index.html 中每种模型的卡片都只在对应模型被加载模板变量非空时才渲染例如分类卡片的Confidence Threshold滑块默认min0.0, max1.0, step0.01检测的Overlay Alpha与分割的Overlay Alpha则显式指定min0, max255, step1。推理管线流线程如何逐帧运行模型stream.py 的Stream继承threading.Thread构造时通过videoSource(args.input)与videoOutput(args.output)创建输入输出源码见 stream.py 第 42-43 行。它按背景→分割→分类→检测→姿态→动作的顺序维护self.models字典——该顺序即叠加层overlay的合成顺序保证背景移除与分割结果先绘制、文本类标注最后叠加。主循环process()每帧执行四步第 68-84 行self.input.Capture()采集一帧图像对每个模型调用model.Process(img)执行推理对每个模型调用model.Visualize(img)绘制结果检测的检测框、分割的类别着色、姿态的关键点/骨架连线、分类与动作的文本标签等self.output.Render(img)把合成结果编码输出。同时每 25 帧在终端打印一次统计captured N frames from input output (W x H)。app.py在定义完所有路由后调用stream.start()启动该线程再以app.run(hostargs.host, portargs.port, ssl_contextssl_context, debugTrue, use_reloaderFalse)启动 Web 服务器app.py 第 155-164 行--host默认0.0.0.0即绑定所有网卡接口。加载自定义模型除内置预训练模型外app.py还支持加载用户自有的自定义模型相关命令行参数如下app.py 第 47-50 行--labelslabels.txt 路径类别标签--colorscolors.txt 路径类别着色用于检测/分割--input-layer模型输入层名称--output-layer输出层名称多个以逗号分隔。这些参数会透传给 model.py 的Model.__init__例如检测模型要求output_layer必须能拆出scores与bbox两个 key传入字符串时按逗号拆分为前两个元素否则抛出ValueErrormodel.py 第 58-73 行。自定义模型对应的标签与着色文件需要与 data/networks/models.json 中登记的内置条目保持相同的格式约定。启用 HTTPS / SSL接收浏览器摄像头、以及在公网场景下传输 WebRTC 流与网页内容官方均推荐启用 HTTPS 加密详细背景见 webrtc-server.md 的 Enabling HTTPS / SSL 一节。首先生成自签名证书$ cd jetson-inference/data $ openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -sha256 -days 365 -nodes -subj /CNlocalhost $ export SSL_KEY/jetson-inference/data/key.pem $ export SSL_CERT/jetson-inference/data/cert.pem当设置$SSL_KEY与$SSL_CERT环境变量后本仓库的应用会自动启用 HTTPS。若不想用环境变量也可以在启动 Flask 示例时显式传入命令行参数$ python3 app.py --ssl-keykey.pem --ssl-certcert.pem --detectionssd-mobilenet-v2app.py 中--ssl-key与--ssl-cert的默认值正是从环境变量SSL_KEY/SSL_CERT读取第 36-37 行并在第 160-161 行将二者组合为ssl_context传给app.run()。注意首次用自签名证书访问页面时浏览器会提示安全警告选择继续访问即可证书可存放在任意路径若使用 Docker 容器则建议放在data/目录下因为它会挂载回宿主机容器退出后证书依然保留。延伸阅读webrtc-html.md上一节的纯 HTML/JavaScript 前端本示例的流式播放代码基础webrtc-dash.md下一节基于 Plotly 的仪表盘变体python/www/dash同样是 WebApp 框架系列webrtc-server.mdWebRTC 服务器的发送/接收/全双工模式与 HTTPS 配置aux-streaming.mdvideoSource/videoOutput支持的各类视频流输入输出python/examples仓库提供的一组可运行 Python 示例便于对比控制台与 Web 两种推理形态。赞分享人工智能计算机视觉深度学习微调【免费下载链接】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 WebRTC 网页应用实战基于 HTML/JavaScript 的 DNN 推理流媒体前端jetson inference WebRTC 网页应用实战基于 HTML/JavaScript 的 DNN 推理流媒体前端 本文是 jetson infer人工智能计算机视觉深度学习微调突破边缘视觉限制Jetson-inference WebRTC与Unity3D低延迟交互方案突破边缘视觉限制Jetson inference WebRTC与Unity3D低延迟交互方案 在边缘计算场景中实时视觉数据的高效传输与三维引擎的无缝集成一直人工智能计算机视觉深度学习微调Flask Shellflask shell 交互控制台原理与请求上下文实战Flask Shellflask shell 交互控制台原理与请求上下文实战 flask shell 是 Flask 提供的 CLI 命令它在一个已加载好应后端Web框架上一篇mkdocstrings 性能优化10个技巧让你的文档构建速度提升3倍下一篇推荐开源项目Asp.Net-Core-Inventory-Order-Management-System创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考