YOLOv8+TensorRT+DeepStream部署实操

Jetson设备(Nano/Xavier/Orin)YOLOv8+TensorRT+DeepStream部署实操

Jetson系列是NVIDIA专为边缘端设计的嵌入式设备,本手册适配 JetPack 5.1.1(主流稳定版),覆盖「环境适配→模型转换→DeepStream推理→性能调优」全流程,兼顾精度与低功耗。

一、Jetson环境前置准备

1. 基础环境确认(必做)

Jetson设备 JetPack版本 内置TensorRT版本 CUDA版本 推荐模型
Jetson Nano 4.6.1 8.2.1 10.2 YOLOv8n/tiny
Jetson Xavier NX 5.1.1 8.5.2 11.4 YOLOv8s
Jetson Orin NX 5.1.1 8.5.2 11.4 YOLOv8m/l
bash 复制代码
# 检查JetPack/TensorRT版本(Jetson终端执行)
cat /etc/nv_tegra_release  # 查看JetPack版本
dpkg -l | grep TensorRT    # 查看TensorRT版本

2. DeepStream安装(边缘端推理核心框架)

bash 复制代码
# 1. 安装依赖
sudo apt install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base \
gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly \
gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa \
gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio

# 2. 下载DeepStream(适配JetPack 5.1.1)
wget https://developer.nvidia.com/downloads/deepstream-6.2_6.2.0-1_arm64.deb
sudo dpkg -i deepstream-6.2_6.2.0-1_arm64.deb
sudo apt-get install -f  # 修复依赖缺失

# 3. 验证DeepStream安装
deepstream-app --version-all  # 输出DeepStream 6.2即成功

3. Python依赖适配(Jetson ARM架构)

bash 复制代码
# 替换pip源(加速安装)
mkdir -p ~/.pip
echo "[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple" > ~/.pip/pip.conf

# 安装YOLOv8/ONNX依赖(适配ARM)
pip3 install ultralytics==8.2.0 onnx==1.14.0 onnxsim==0.4.33 pycuda==2022.2.1

二、YOLOv8模型适配DeepStream(核心步骤)

1. YOLOv8导出ONNX(适配DeepStream解析)

Jetson设备算力有限,优先选轻量化模型(YOLOv8n/YOLOv8s),且需调整ONNX输出格式适配DeepStream的解析规则:

python 复制代码
from ultralytics import YOLO

# 加载模型(Jetson Nano推荐yolov8n.pt,Xavier NX推荐yolov8s.pt)
model = YOLO("yolov8n.pt")

# 导出ONNX(关键:输出格式适配DeepStream)
model.export(
    format="onnx",
    imgsz=416,  # Jetson Nano建议320/416,Orin可设640
    batch=1,
    simplify=True,
    opset=11,   # Jetson TensorRT 8.x兼容opset=11
    # 强制输出格式为(x1,y1,x2,y2,conf,cls),适配DeepStream
    include=["onnx"],
    keras=False
)
# 导出后生成:yolov8n.onnx

2. 转换ONNX为DeepStream兼容格式(修复输出维度)

DeepStream默认不支持YOLOv8的(1,84,8400)输出格式,需用ds_yolov8_postprocess工具调整:

bash 复制代码
# 下载DeepStream YOLO解析插件(NVIDIA官方适配版)
git clone https://github.com/NVIDIA-AI-IOT/deepstream-yolov8.git
cd deepstream-yolov8

# 编译解析插件(适配Jetson ARM架构)
mkdir build && cd build
cmake -D CUDA_VER=11.4 ..  # 对应JetPack 5.1.1的CUDA版本
make -j4

# 转换YOLOv8 ONNX模型(生成适配DeepStream的ONNX)
python3 export.py --weights ../yolov8n.onnx --img 416 --batch 1
# 输出:yolov8n_ds.onnx(DeepStream专用)

3. 构建Jetson专属TensorRT引擎(ARM版本)

python 复制代码
import tensorrt as trt

TRT_LOGGER = trt.Logger(trt.Logger.INFO)
builder = trt.Builder(TRT_LOGGER)
config = builder.create_builder_config()

# 适配Jetson低算力:开启FP16(精度无损,速度优先)
config.set_flag(trt.BuilderFlag.FP16)
config.max_workspace_size = 1 << 28  # 256MB(Jetson Nano显存仅4GB)

# 解析适配后的ONNX模型
network = builder.create_network(1 << 0)
parser = trt.OnnxParser(network, TRT_LOGGER)
with open("yolov8n_ds.onnx", "rb") as f:
    parser.parse(f.read())

# 构建并保存TensorRT引擎(Jetson ARM专用)
engine = builder.build_engine(network, config)
with open("yolov8n_fp16.engine", "wb") as f:
    f.write(engine.serialize())
print("✅ Jetson专属TensorRT引擎生成完成:yolov8n_fp16.engine")

三、DeepStream部署实战(视频/摄像头推理)

1. 编写DeepStream配置文件(yolov8_deepstream_config.txt)

ini 复制代码
[application]
enable-perf-measurement=1
perf-measurement-interval-sec=1

[source0]
enable=1
# 数据源:0=摄像头,file:///xxx.mp4=本地视频,rtsp://xxx=网络流
type=4
uri=file:///home/nvidia/test_video.mp4
num-sources=1
gpu-id=0
cudadec-memtype=0

[streammux]
gpu-id=0
batch-size=1
batched-push-timeout=40000
width=416
height=416
enable-padding=0

[primary-gie]
enable=1
gpu-id=0
model-engine-file=/home/nvidia/yolov8n_fp16.engine  # 替换为你的引擎路径
config-file=gie_yolov8_config.txt
batch-size=1
interval=0
gie-unique-id=1

[osd]
enable=1
gpu-id=0
border-width=1
text-size=15
text-color=1;1;1;1
text-bg-color=0.3;0.3;0.3;1
font=Serif
show-clock=0
clock-x-offset=800
clock-y-offset=820
clock-text-size=12
clock-color=1;0;0;1

[sink0]
enable=1
type=2  # 2=本地窗口显示,1=RTSP推流,3=保存视频
sync=0
gpu-id=0

[tests]
file-loop=0

2. 编写模型解析配置文件(gie_yolov8_config.txt)

ini 复制代码
[property]
gpu-id=0
net-scale-factor=0.00392156862745098  # 1/255,归一化
model-color-format=0
num-detected-classes=80  # COCO类别数,自有数据集需修改
network-mode=2  # 1=FP32,2=FP16,3=INT8
interval=0
gie-unique-id=1
process-mode=1
model-type=0
# YOLOv8锚框参数(无需修改,适配后的模型已内置)
cluster-mode=3
maintain-aspect-ratio=1
parse-bbox-func-name=NvDsInferParseYoloV8  # 关键:YOLOv8解析函数
custom-lib-path=/home/nvidia/deepstream-yolov8/build/libnvdsinfer_custom_impl_Yolo.so  # 编译后的插件路径
engine-create-func-name=NvDsInferYoloCudaEngineGet

[class-attrs-all]
pre-cluster-threshold=0.25  # 置信度阈值
eps=0.2
group-threshold=1

3. 启动DeepStream推理(Jetson终端执行)

bash 复制代码
# 运行DeepStream推理(需指定配置文件)
deepstream-app -c yolov8_deepstream_config.txt

✅ 正常输出:本地窗口显示视频流+目标检测框,终端实时打印FPS(Jetson Nano运行YOLOv8n可达~25 FPS,满足实时要求)。

四、Jetson性能调优(低功耗+高帧率)

1. 算力/功耗调优(Jetson专用工具)

bash 复制代码
# 1. 查看当前功耗模式
jetson_clocks --show

# 2. 性能模式(高帧率,功耗高):Jetson Nano/Xavier
sudo nvpmodel -m 0  # 0=MAXN模式(满算力)
sudo jetson_clocks  # 解锁GPU/CPU频率

# 3. 低功耗模式(续航优先,帧率略降):Jetson Nano
sudo nvpmodel -m 1  # 1=5W模式

2. 推理速度优化(Jetson Nano重点)

优化手段 效果
降低输入尺寸(416→320) FPS +15%,mAP -2%
改用YOLOv8n-tiny FPS +20%,mAP -5%
关闭OSD显示(仅推理) FPS +10%
批量大小设为1(默认) 显存占用 -30%

3. 内存优化(Jetson Nano显存不足)

bash 复制代码
# 增大交换分区(解决显存不足报错)
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

五、常见问题排查(Jetson专属)

报错信息 解决方案
out of memory 降低输入尺寸(416→320),或增大交换分区
FP16 not supported 确认JetPack版本≥5.0(Jetson Nano需JetPack 4.6+)
DeepStream窗口无显示 执行export DISPLAY=:0,或改用RTSP推流输出
检测框偏移/错位 确保ONNX输入尺寸与DeepStream配置一致
FPS过低(<10) 切换至MAXN模式,改用YOLOv8n-tiny模型

六、部署成果参考(Jetson设备)

设备 模型 输入尺寸 FPS mAP@0.5 功耗
Jetson Nano YOLOv8n 320×320 25 38.5 5W
Jetson Xavier NX YOLOv8s 416×416 45 42.0 10W
Jetson Orin NX YOLOv8m 640×640 60 44.5 15W

Jetson设备的批量推理/RTSP推流部署**(如安防摄像头实时推流)

Jetson设备批量推理+RTSP推流部署(安防摄像头场景)

本手册聚焦 多摄像头批量推理 + RTSP实时推流 场景(如安防监控),适配DeepStream 6.2 + Jetson(Nano/Xavier/Orin),兼顾批量处理效率与推流稳定性。

一、核心前提

  1. 已完成「YOLOv8模型转换+DeepStream基础环境配置」(参考上一版手册);
  2. 安防摄像头已开启RTSP输出(格式:rtsp://[摄像头IP]:554/stream1);
  3. Jetson设备已接入局域网(与摄像头/拉流客户端同网段)。

二、批量推理(多摄像头/多RTSP流)配置

1. 批量推理核心配置文件(yolov8_batch_config.txt

适配 2路摄像头 (Jetson Nano建议≤2路,Xavier NX≤4路,Orin≤8路),可按需扩展num-sources

ini 复制代码
[application]
enable-perf-measurement=1
perf-measurement-interval-sec=1

# 多源配置:source0/source1对应2路摄像头
[source0]
enable=1
type=4  # RTSP流类型
uri=rtsp://192.168.1.100:554/stream1  # 摄像头1 RTSP地址
num-sources=1
gpu-id=0
cudadec-memtype=0  # 显存类型(0=统一内存,适配Jetson)

[source1]
enable=1
type=4
uri=rtsp://192.168.1.101:554/stream1  # 摄像头2 RTSP地址
num-sources=1
gpu-id=0
cudadec-memtype=0

# 流合并:batch-size需等于摄像头路数
[streammux]
gpu-id=0
batch-size=2  # 与摄像头路数一致
batched-push-timeout=40000
width=320  # Jetson Nano批量推理建议320×320
height=320
enable-padding=0
nvbuf-memory-type=0

# 推理引擎:复用之前生成的YOLOv8n FP16引擎
[primary-gie]
enable=1
gpu-id=0
model-engine-file=/home/nvidia/yolov8n_fp16.engine
config-file=gie_yolov8_config.txt
batch-size=2  # 与streammux的batch-size一致
interval=0
gie-unique-id=1

[osd]
enable=1
gpu-id=0
border-width=1
text-size=12  # 小尺寸适配批量显示
text-color=1;1;1;1
text-bg-color=0.3;0.3;0.3;1
show-clock=0

# 本地预览(可选,批量推理可关闭以节省算力)
[sink0]
enable=0  # 0=关闭本地窗口,1=开启
type=2
sync=0
gpu-id=0

# 批量RTSP推流(核心:将批量推理结果推流输出)
[sink1]
enable=1
type=1  # 1=RTSP推流模式
sync=0
gpu-id=0
# RTSP推流地址:客户端通过rtsp://[JetsonIP]:8554/ds-test拉流
rtsp-port=8554
udp-port=5400
bitrate=4000000  # 推流码率(4Mbps,适配1080P)
codec=1  # 1=H264,2=H265(H265更省带宽)

2. 模型解析配置(gie_yolov8_config.txt

复用之前的配置,仅调整批量推理适配参数:

ini 复制代码
[property]
gpu-id=0
net-scale-factor=0.00392156862745098
model-color-format=0
num-detected-classes=80
network-mode=2  # FP16模式(Jetson批量推理优先)
interval=0
gie-unique-id=1
process-mode=1
model-type=0
cluster-mode=3
maintain-aspect-ratio=1
parse-bbox-func-name=NvDsInferParseYoloV8
custom-lib-path=/home/nvidia/deepstream-yolov8/build/libnvdsinfer_custom_impl_Yolo.so
engine-create-func-name=NvDsInferYoloCudaEngineGet

[class-attrs-all]
pre-cluster-threshold=0.2  # 批量推理降低置信度阈值,减少漏检
eps=0.2
group-threshold=1

三、RTSP推流部署实操

1. 启动DeepStream批量推理+RTSP推流

bash 复制代码
# 1. 启动DeepStream应用(加载批量配置文件)
deepstream-app -c yolov8_batch_config.txt

# 2. 查看推流状态(终端输出关键信息)
# 正常输出:
# ...
# RTSP Server: Launched RTSP streaming at rtsp://0.0.0.0:8554/ds-test
# ...
# FPS 0 (Avg)  FPS 1 (Avg): 22.50 (Jetson Nano 2路320×320 YOLOv8n)

2. 客户端拉流验证(跨设备/PC)

方式1:VLC播放器(可视化验证)
  1. 打开VLC → 媒体 → 打开网络串流;
  2. 输入URL:rtsp://[Jetson的IP地址]:8554/ds-test(如rtsp://192.168.1.200:8554/ds-test);
  3. 点击「播放」,即可看到2路摄像头的批量检测结果(带目标框+类别)。
方式2:FFmpeg命令行拉流(无界面验证)
bash 复制代码
# PC端执行(需安装FFmpeg)
ffmpeg -i rtsp://192.168.1.200:8554/ds-test -c copy -f mp4 test_batch_rtsp.mp4
# 生成test_batch_rtsp.mp4,查看是否包含批量检测画面

四、批量推流性能调优(Jetson专属)

1. 不同Jetson设备批量路数建议(平衡帧率/精度)

设备 模型 输入尺寸 最大批量路数 单路FPS 总FPS 推流码率建议
Jetson Nano YOLOv8n 320×320 2 ~20 ~40 2Mbps(H264)
Jetson Xavier NX YOLOv8s 416×416 4 ~30 ~120 4Mbps(H265)
Jetson Orin NX YOLOv8m 640×640 8 ~25 ~200 8Mbps(H265)

2. 卡顿/丢帧优化方案

问题现象 解决方案
推流卡顿、FPS波动大 1. 降低输入尺寸(416→320);2. 改用H265编码(codec=2);3. 降低推流码率
批量推理漏检率高 1. 降低pre-cluster-threshold至0.15;2. 关闭Mosaic增强(模型训练阶段)
Jetson发热严重、降频 1. 安装散热风扇;2. 切换至中等功耗模式(sudo nvpmodel -m 2

3. 后台持久化运行(无人值守)

bash 复制代码
# 方式1:nohup后台运行
nohup deepstream-app -c yolov8_batch_config.txt > deepstream_log.log 2>&1 &

# 方式2:systemd服务(开机自启)
# 1. 创建服务文件
sudo vim /etc/systemd/system/deepstream-yolov8.service

# 2. 写入内容
[Unit]
Description=DeepStream YOLOv8 Batch RTSP Stream
After=network.target

[Service]
Type=simple
User=nvidia
ExecStart=/usr/bin/deepstream-app -c /home/nvidia/yolov8_batch_config.txt
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

# 3. 启动并设置开机自启
sudo systemctl daemon-reload
sudo systemctl start deepstream-yolov8
sudo systemctl enable deepstream-yolov8

# 查看服务状态
sudo systemctl status deepstream-yolov8

五、常见问题排查(批量推流专属)

报错信息 解决方案
RTSP server bind failed 1. 检查8554端口是否被占用(sudo lsof -i:8554);2. 更换rtsp-port(如8555)
部分摄像头流无法加载 1. 验证摄像头RTSP地址是否可访问(ffmpeg -i rtsp://xxx);2. 增加batched-push-timeout至100000
推流画面花屏/绿屏 1. 确保输入尺寸与streammux一致;2. 关闭enable-padding;3. 改用H264编码
批量推理帧率远低于单路 1. 增大batch-size至摄像头路数;2. 开启nvbuf-memory-type=1(显存优化)

六、扩展:批量推理结果回调(Python解析)

若需对批量检测结果做二次处理(如告警、存储),可通过DeepStream的Python绑定实现:

python 复制代码
import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GLib
import sys

# 初始化GStreamer
Gst.init(None)

# 回调函数:解析批量检测结果
def osd_sink_pad_buffer_probe(pad, info, u_data):
    gst_buffer = info.get_buffer()
    if not gst_buffer:
        return Gst.PadProbeReturn.OK
    
    # 解析NvDsBatchMeta(批量元数据)
    from pyds import NvDsBatchMeta
    batch_meta = NvDsBatchMeta.cast(gst_buffer.extract_dup_meta())
    for frame_meta in batch_meta.frame_meta_list:
        frame_meta = frame_meta.data
        # 获取帧对应的摄像头ID(source_id)
        cam_id = frame_meta.source_id
        # 解析目标检测结果
        for obj_meta in frame_meta.obj_meta_list:
            obj_meta = obj_meta.data
            cls_name = obj_meta.obj_label
            conf = obj_meta.confidence
            x1, y1, x2, y2 = obj_meta.rect_params.left, obj_meta.rect_params.top, obj_meta.rect_params.width, obj_meta.rect_params.height
            print(f"摄像头{cam_id}:类别={cls_name},置信度={conf:.2f},坐标=({x1},{y1})-({x2},{y2})")
            # 此处可添加告警逻辑(如置信度>0.8时触发MQTT告警)
    return Gst.PadProbeReturn.OK

# 加载DeepStream配置并启动
pipeline = Gst.parse_launch(f"deepstream-app -c yolov8_batch_config.txt")
osd_sink_pad = pipeline.get_by_name("osd_sink_pad")
osd_sink_pad.add_probe(Gst.PadProbeType.BUFFER, osd_sink_pad_buffer_probe, 0)

# 启动管道
pipeline.set_state(Gst.State.PLAYING)
loop = GLib.MainLoop()
try:
    loop.run()
except KeyboardInterrupt:
    pass
# 清理资源
pipeline.set_state(Gst.State.NULL)

Jetson批量推理告警集成+公网RTSP穿透实操手册

本手册覆盖 MQTT/HTTP告警推送 (适配安防场景的异常目标告警)和 公网RTSP穿透(解决内网Jetson推流无法公网访问的问题),全流程适配Jetson设备,可直接落地。

第一部分:告警系统集成(MQTT/HTTP)

一、前置准备(Jetson端)

bash 复制代码
# 安装告警依赖(适配ARM架构)
# MQTT依赖
pip3 install paho-mqtt==1.6.1
# HTTP依赖(内置urllib3,补充requests适配ARM)
pip3 install requests==2.31.0

二、MQTT告警集成(对接EMQ X/阿里云MQTT)

1. MQTT服务准备(以开源EMQ X为例)
2. 告警逻辑+MQTT推送代码(集成到DeepStream回调)
python 复制代码
import gi
import paho.mqtt.client as mqtt
import json
import time
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GLib

# ===================== MQTT配置 =====================
MQTT_BROKER = "192.168.1.105"  # EMQ X服务器IP(内网/公网)
MQTT_PORT = 1883
MQTT_USER = "admin"
MQTT_PASS = "admin123"
MQTT_TOPIC = "jetson/yolov8/alert"  # 告警推送主题

# 初始化MQTT客户端
mqtt_client = mqtt.Client()
mqtt_client.username_pw_set(MQTT_USER, MQTT_PASS)
mqtt_client.connect(MQTT_BROKER, MQTT_PORT, 60)
mqtt_client.loop_start()  # 后台循环处理MQTT消息

# ===================== 告警规则 =====================
# 需告警的目标类别(COCO类别,可替换为自有数据集类别)
ALERT_CLASSES = ["person", "car", "bicycle"]
# 告警置信度阈值
ALERT_CONF_THRESH = 0.8

# ===================== DeepStream回调+告警推送 =====================
def osd_sink_pad_buffer_probe(pad, info, u_data):
    gst_buffer = info.get_buffer()
    if not gst_buffer:
        return Gst.PadProbeReturn.OK
    
    # 解析批量检测结果(适配多摄像头)
    from pyds import NvDsBatchMeta
    batch_meta = NvDsBatchMeta.cast(gst_buffer.extract_dup_meta())
    for frame_meta in batch_meta.frame_meta_list:
        frame_meta = frame_meta.data
        cam_id = frame_meta.source_id  # 摄像头ID(对应source0/source1)
        frame_num = frame_meta.frame_num  # 帧号
        # 解析目标
        for obj_meta in frame_meta.obj_meta_list:
            obj_meta = obj_meta.data
            cls_name = obj_meta.obj_label
            conf = obj_meta.confidence
            # 计算目标坐标(像素值)
            x1 = int(obj_meta.rect_params.left)
            y1 = int(obj_meta.rect_params.top)
            x2 = int(x1 + obj_meta.rect_params.width)
            y2 = int(y1 + obj_meta.rect_params.height)
            
            # 触发告警条件
            if cls_name in ALERT_CLASSES and conf >= ALERT_CONF_THRESH:
                # 构造告警消息
                alert_msg = {
                    "timestamp": int(time.time()),
                    "cam_id": int(cam_id),
                    "frame_num": int(frame_num),
                    "class": cls_name,
                    "confidence": round(float(conf), 2),
                    "bbox": [x1, y1, x2, y2],
                    "alert_type": "target_detection"
                }
                # MQTT推送告警
                mqtt_client.publish(
                    MQTT_TOPIC,
                    payload=json.dumps(alert_msg, ensure_ascii=False),
                    qos=0,
                    retain=False
                )
                print(f"✅ 推送MQTT告警:{alert_msg}")
    return Gst.PadProbeReturn.OK

# ===================== 启动DeepStream+告警 =====================
def main():
    Gst.init(None)
    # 加载DeepStream批量配置文件
    config_file = "yolov8_batch_config.txt"
    pipeline = Gst.parse_launch(f"deepstream-app -c {config_file}")
    
    # 绑定回调函数(解析检测结果+推送告警)
    osd_element = pipeline.get_by_name("nvdsosd")
    osd_sink_pad = osd_element.get_static_pad("sink")
    osd_sink_pad.add_probe(Gst.PadProbeType.BUFFER, osd_sink_pad_buffer_probe, 0)
    
    # 启动管道
    pipeline.set_state(Gst.State.PLAYING)
    loop = GLib.MainLoop()
    try:
        loop.run()
    except KeyboardInterrupt:
        pass
    # 清理资源
    mqtt_client.loop_stop()
    mqtt_client.disconnect()
    pipeline.set_state(Gst.State.NULL)

if __name__ == "__main__":
    main()
3. MQTT告警验证
  • 订阅告警主题:在PC端用MQTT.fx/EMQ X Dashboard订阅jetson/yolov8/alert
  • 触发告警:让摄像头对准行人/车辆,即可收到JSON格式的告警消息。

三、HTTP告警集成(对接自研后台)

1. HTTP告警推送代码(替换MQTT部分)
python 复制代码
# ===================== HTTP配置 =====================
ALERT_API_URL = "http://192.168.1.200:8080/api/alert"  # 自研告警后台接口
ALERT_API_KEY = "your_api_key"  # 接口鉴权Key

# ===================== HTTP告警推送函数 =====================
def send_http_alert(alert_msg):
    import requests
    headers = {
        "Content-Type": "application/json",
        "X-API-Key": ALERT_API_KEY
    }
    try:
        resp = requests.post(
            ALERT_API_URL,
            json=alert_msg,
            headers=headers,
            timeout=5
        )
        if resp.status_code == 200:
            print(f"✅ HTTP告警推送成功:{resp.json()}")
        else:
            print(f"❌ HTTP告警推送失败:{resp.status_code}")
    except Exception as e:
        print(f"❌ HTTP告警推送异常:{str(e)}")

# ===================== 修改回调中的告警逻辑 =====================
# 替换MQTT推送部分为:
send_http_alert(alert_msg)
2. 自研后台接口示例(Python Flask)
python 复制代码
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route("/api/alert", methods=["POST"])
def receive_alert():
    # 鉴权
    if request.headers.get("X-API-Key") != "your_api_key":
        return jsonify({"code": 401, "msg": "鉴权失败"}), 401
    # 解析告警消息
    alert_msg = request.get_json()
    print(f"收到告警:{alert_msg}")
    # 此处可添加告警存储/短信/邮件推送逻辑
    return jsonify({"code": 200, "msg": "告警接收成功"}), 200

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8080)

第二部分:公网RTSP穿透(FRP内网穿透)

一、方案选择

采用 FRP内网穿透 (轻量、易部署),解决Jetson在内网中RTSP推流无法被公网访问的问题,架构:
公网云服务器(FRP服务端) ←→ Jetson(FRP客户端) ←→ 公网拉流客户端

二、前置准备

  1. 云服务器:一台有公网IP的服务器(阿里云/腾讯云,系统Ubuntu 20.04);
  2. FRP下载:下载对应版本(https://github.com/fatedier/frp/releases):
    • 云服务器(x86_64):frp_0.52.3_linux_amd64.tar.gz
    • Jetson(ARM64):frp_0.52.3_linux_arm64.tar.gz

三、FRP服务端配置(云服务器)

bash 复制代码
# 1. 解压FRP
tar -xzf frp_0.52.3_linux_amd64.tar.gz
cd frp_0.52.3_linux_amd64

# 2. 修改服务端配置(frps.ini)
vim frps.ini
ini 复制代码
[common]
bind_port = 7000  # FRP通信端口(需在云服务器安全组开放)
vhost_rtsp_port = 8555  # 公网RTSP映射端口(需开放)
token = frp123456  # 客户端鉴权token
启动FRP服务端
bash 复制代码
# 后台启动
nohup ./frps -c frps.ini > frps.log 2>&1 &
# 验证启动
netstat -tulpn | grep frps  # 看到7000/8555端口监听即成功

四、FRP客户端配置(Jetson)

bash 复制代码
# 1. 解压FRP
tar -xzf frp_0.52.3_linux_arm64.tar.gz
cd frp_0.52.3_linux_arm64

# 2. 修改客户端配置(frpc.ini)
vim frpc.ini
ini 复制代码
[common]
server_addr = 121.xxx.xxx.xxx  # 云服务器公网IP
server_port = 7000  # 与服务端bind_port一致
token = frp123456  # 与服务端token一致

# RTSP穿透配置
[rtsp_yolov8]
type = tcp
local_ip = 127.0.0.1  # Jetson本地IP
local_port = 8554  # DeepStream RTSP推流端口
remote_port = 8555  # 云服务器映射端口(与vhost_rtsp_port一致)
启动FRP客户端
bash 复制代码
# 后台启动
nohup ./frpc -c frpc.ini > frpc.log 2>&1 &
# 验证启动
ps -ef | grep frpc  # 看到frpc进程即成功

五、公网RTSP拉流验证

  1. 确保Jetson的DeepStream RTSP推流已启动(rtsp://127.0.0.1:8554/ds-test);
  2. 公网拉流URL:rtsp://[云服务器公网IP]:8555/ds-test
  3. 验证方式:
    • PC端VLC播放器输入上述URL,即可看到Jetson的批量检测推流画面;
    • FFmpeg命令:ffmpeg -i rtsp://[云服务器IP]:8555/ds-test -c copy test_public.mp4

六、FRP穿透优化(稳定性+安全性)

  1. 开机自启:将FRP客户端加入Jetson的systemd服务;
  2. 端口安全:云服务器安全组仅开放7000/8555端口给指定IP;
  3. 带宽优化:Jetson推流改用H265编码,降低公网带宽占用。

三、常见问题排查

问题现象 解决方案
MQTT推送超时 1. 检查Jetson与MQTT服务器的网络连通性;2. 增大MQTT超时时间至120s
HTTP告警推送失败 1. 关闭自研后台防火墙;2. 适配Jetson的requests版本(降级至2.26.0)
FRP穿透无法连接 1. 云服务器安全组开放7000/8555端口;2. 检查token是否一致;3. 重启FRP服务
公网拉流卡顿 1. 降低Jetson推流码率至2Mbps;2. 云服务器升级带宽;3. 改用H265编码

四、部署成果参考

场景 配置 效果
MQTT告警 Jetson Nano + YOLOv8n + EMQ X 告警延迟<500ms,准确率99%
HTTP告警 Jetson Xavier NX + YOLOv8s 接口响应<1s,支持每秒10条告警
公网RTSP穿透 1Mbps带宽 + H265编码 公网拉流FPS≈20,无明显卡顿

相关推荐
Coding茶水间2 小时前
基于深度学习的轮船分类检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
深度学习·yolo·分类
Coovally AI模型快速验证20 小时前
当小龙虾算法遇上YOLO:如何提升太阳能电池缺陷检测精度?
人工智能·深度学习·算法·yolo·目标检测·无人机
数据光子1 天前
【YOLO数据集】自动驾驶
人工智能·yolo·自动驾驶
ASD123asfadxv1 天前
基于YOLOv8-FasterNet的液压阀块端盖表面缺陷检测与分类
yolo·分类·数据挖掘
Coding茶水间1 天前
基于深度学习的X光骨折检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
深度学习·yolo·机器学习
无能者狂怒1 天前
DETR(DEtection TRansformer)——基于Transformer的目标检测范式革命与演进
人工智能·深度学习·yolo·目标检测·计算机视觉·transformer
razelan2 天前
yolo 4 - 进阶技巧 QA
yolo
dundunmm2 天前
【每天一个知识点】YOLO算法
算法·yolo·目标检测
Blossom.1182 天前
边缘智能新篇章:YOLOv8在树莓派5上的INT8量化部署全攻略
人工智能·python·深度学习·学习·yolo·react.js·transformer