Jetson nano 树莓派 传输视频帧直播 极低延迟

最近要实现一个项目,就是使用Jetson nano,进行人体识别,同时推流视频到公网。

最初的版本是,在Nano跑YOLOV5,再将处理后的图片经过ffmpeg推送到自己搭建的nginx直播服务器,服务器转成hls流,可在网页端实时观看直播。但问题很多:视频帧数低,直播延迟大,大到20秒~40秒,体验效果极差。

针对视频帧数低的问题,解决方案是使用一台GPU服务器专门进行视频处理。

针对直播延迟的问题,解决方案是使用UDP直接传输经过压缩的视频帧,同时使用ws协议对连进来的网页进行转发,达到0.5s以内的延迟。

Nano沦为了一个图片采集、转发的工具。

效果图:
在这里插入图片描述
客户端、服务端、网页端的视频几乎同步。

服务端代码(GPU服务)

import socket
import asyncio
import numpy as np
import cv2 as cv
import binascii
import threading
import copy
import websockets
from queue import Queue
import time
import sys
import os
import random
# 连接断开标志位
conn = False



q = Queue(50)
USERS = []
# UDP
socketserver = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
localhost = "服务器本地IP" # 改成服务器本地IP,不能是回环地址
ws_port = 5766
tcp_port = 9092
socketserver.bind((localhost, tcp_port))


def restart_program():

  python = sys.executable

  os.execl(python, python, * sys.argv)


def S():
    print('打开了UDP服务~但不知道有没有连接,看情况咯')
    print('1、UDP阻塞式读取')
    print('2、异步WS协议视频帧转发')
    print('3、MQTT消息交互')
    while True:
        try:
            data, _ = socketserver.recvfrom(921600)
           
            if len(USERS) > 0:
                q.put(data)
            receive_data = np.frombuffer(data, dtype='uint8')
            # 在这进行图片处理
            r_img = cv.imdecode(receive_data, 1)
            cv.imshow('server', r_img)
            if cv.waitKey(1) & 0xFF == ord('q'):
                break

        except ConnectionResetError as e:
            print(e.args)
            print("重新打开ING。。")
            threading.Thread(target=S).start()
            break
        finally:
            pass




t1 = threading.Thread(target=S)

t1.start()


async def recv_msg(websocket):
    USERS.append(websocket)
    print('连了一条东西进来', USERS, len(USERS))
    while True:
        try:
            if q.qsize() > 0:
                await websocket.send(q.get())
        finally:
            pass

async def main_logic(websocket, path):
    await recv_msg(websocket)


start_server = websockets.serve(main_logic, localhost,ws_port)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

客户端(Nano)代码

import asyncio
import socket
import websockets
import cv2 as cv
import threading
import time

cap = cv.VideoCapture(0)
print(cap)
cap.set(3,480)
cap.set(4,640)

def putDate(frame):
    font = cv.FONT_HERSHEY_SIMPLEX
    datet = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    cv.rectangle(frame, (0,0), (320, 22), (0, 0, 0), -1)
    frame = cv.putText(frame, datet, (0, 20), cv.FONT_HERSHEY_COMPLEX_SMALL, 1.3,
                        (255, 255, 255), 2, cv.LINE_4)

    return frame

def getJPG():
    try:
        ret, frame = cap.read()
        if not ret:
            print("Fking无法抓帧")
        return cv.imencode('.jpg', frame)[1].tobytes()  # cv2转Bytes
    except Exception as e:
        print(e.args)


def MAIN():
    try:
        client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        host = "localhost"  #改成服务器公网IP
        port = 9092         #服务器开放的对应的端口
        print('正在连接。。。')
        client.connect((host, port))
        print("连接成功,WORKING~")
        while True:
            time.sleep(0.1)
            # img = getJPG()
            _, img = cap.read()

            # img = cv.flip(img, 1)
            img = putDate(img)
            cv.imshow('JNano', img)
            if cv.waitKey(1) & 0xFF == ord('q'):
                break
            # 压缩图片
            _, send_data = cv.imencode('.jpg', img, [cv.IMWRITE_JPEG_QUALITY, 50]) # jpg编码压缩
            client.sendto(send_data, (host, port))
    except Exception as e:
        print("寄掉了")
        print(e.args)
        print("即将重试")
        time.sleep(3)
        threading.Thread(target=MAIN).start()

    client.close()


threading.Thread(target=MAIN).start()

其中网页端代码比较多,放个链接。
点此跳转

敬告:以上代码不能直接使用,需要根据自身情况修改IP地址

YOLOv5n的算法特点 YOLOv5n是基于YOLOv5架构的Nano版本,主要针对边缘计算场景设计,通过以下技术实现轻量化和高效性: 网络结构优化 主干网络(Backbone):采用精简的CSPDarknet结构,减少卷积层数量和通道数,降计算量515。 Focus结构(早期版本):通过像素切片操作将输入图像通道数扩展4倍,提升特征提取效率,但最新版本可能移除该结构以进一步简化模型615。 Neck与Head:使用PANet(Path Aggregation Network)进行多尺度特征融合,结合小尺寸预测头(如20×20网格),优化小目标检测能力15。 模型压缩技术 量化(Quantization):将模型权重从FP32转换为INT8,体积减少约70%,同时保持较高精度515。 剪枝(Pruning):移除冗余神经元或通道,进一步压缩模型体积(典型模型大小<2MB)15。 高效推理机制 单阶段检测:将目标定位和分类统一为回归问题,单次前向传播完成检测,推理速度可达30 FPS(320×240分辨率)515。 多正样本匹配:每个真实框由多个预测框匹配,提升训练效率和检测鲁棒性615。 2. 在人数统计系统中的具体应用 (1)检测与跟踪流程 行人检测 YOLOv5n对摄像头输入的每帧图像进行推理,输出行人边界框(Bounding Box)及置信度。 通过非极大值抑制(NMS)过滤重叠检测框,保留高置信度结果615。 动态计数 跟踪算法:结合IOU Tracker或DeepSORT精简版,通过交并比(IOU)或特征匹配关联前后帧目标,避免重复计数1316。 区域统计逻辑:设置虚拟检测线(如入口/出口),根据目标移动方向统计进出人数1316。 (2)嵌入式部署优化 硬件适配 边缘处理器:如ESP32-S3(内置NPU)或STM32H7系列MCU,支持INT8量化模型加速推理515。 功耗设计:动态调整帧率(如无人时降至5 FPS),结合PIR传感器唤醒摄像头,平均功耗可控制在300mW以下15。 模型训练与调优 数据集:使用COCO或自定义数据集,标注行人边界框,并通过Mosaic数据增强提升遮挡场景的泛化能力615。 损失函数:优化定位损失(CIoU Loss)和分类损失,平衡检测精度与速度15。 将以上内容形成思维导图
04-03
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值