智能监控 AI 分析终端开发实战:从搭建到部署完整教程

智能监控 AI 分析终端是 “摄像头 + 边缘 AI 网关 + 本地推理 + 报警输出” 的一体化设备,核心能力是实时分析视频流(如人脸检测、异常行为识别、物体计数),无需依赖云端,就能实现低延迟、高隐私的监控预警。本文以 “RK3588 开发板 + YOLOv8+USB 摄像头” 为例,手把手教你搭建从硬件接线到软件部署的全流程,所有代码均可直接移植到实际项目。

一、智能监控 AI 分析终端核心基础(新手必懂)

1. 终端核心构成

智能监控 AI 分析终端 = 视频采集模块 + 边缘 AI 计算模块 + 报警输出模块 + 存储 / 通信模块,核心区别于传统监控:

特性 传统监控终端 智能监控 AI 分析终端
核心功能 视频录制、实时预览 视频录制 + AI 识别(人脸 / 物体 / 行为)+ 异常报警 + 本地存储
依赖条件 需云端 / 硬盘录像机存储 本地 AI 推理,断网可独立工作,仅上传报警结果
响应速度 无实时分析,需人工回看 本地推理延迟<100ms,异常实时报警
核心组件 摄像头 + 传输模块 摄像头 + AI 开发板(带 NPU)+ 报警设备(LED / 蜂鸣器)

2. 核心应用场景

  • 安防监控:办公室 / 工厂异常闯入检测、陌生人识别、夜间徘徊预警;

  • 工业监控:生产车间人员未戴安全帽检测、设备运行状态识别;

  • 商业监控:门店客流计数、商品被盗检测、VIP 客户识别;

  • 家庭监控:老人 / 儿童活动监测、陌生人闯入报警。

3. 核心技术栈(必学)

  • 硬件:AI 开发板(带 NPU)、USB / 网络摄像头、报警设备(LED / 蜂鸣器)、电源;

  • 系统:Ubuntu 20.04(开发板适配版);

  • AI 框架:Ultralytics YOLOv8(目标检测 / 行为识别)、OpenCV(视频处理);

  • 开发语言:Python(快速开发)、C++(性能优化);

  • 存储 / 通信:本地 SD 卡 / SSD(存储报警视频)、MQTT(上传报警信息到云端)。

二、硬件选型与接线(实战推荐方案)

优先选择 “高性价比 + 生态完善” 的硬件组合,新手入门推荐 RK3588 开发板(内置 NPU,算力充足),工业场景可升级为 Jetson Orin Nano。

1. 硬件清单(入门级 / 工业级)

组件类型 入门级配置(预算 2000~3000 元) 工业级配置(预算 5000~8000 元)
AI 开发板 RK3588 开发板(8GB 内存,内置 6TOPS NPU) 英伟达 Jetson Orin Nano(8GB 内存,20TOPS NPU)
摄像头 USB 高清摄像头(1080P,支持 MJPG 格式) 工业网络摄像头(POE 供电,200 万像素,支持 RTSP 流)
报警设备 LED 指示灯 + 蜂鸣器(GPIO 控制) 声光报警器(RS485 接口,工业级防水)
存储设备 64GB 高速 SD 卡 512GB NVMe SSD(存储报警视频)
电源 12V 5A DC 电源(稳定供电) 12V 10A 宽压电源(适应工业电压波动)
辅助配件 杜邦线、面包板、HDMI 显示器(调试用) POE 交换机、工业防水接线盒、M12 连接器

2. 硬件接线(以 RK3588+USB 摄像头为例)

(1)核心接线图

RK3588 开发板引脚 外设设备 接线说明
USB 3.0 接口 USB 摄像头 传输视频流(1080P@30fps)
GPIO1_1(物理引脚 12) LED 正极 高电平点亮 LED(串联 220Ω 电阻限流)
GPIO1_2(物理引脚 13) 蜂鸣器正极 高电平触发蜂鸣器(串联 1kΩ 电阻)
GND 引脚 LED 负极 + 蜂鸣器负极 公共接地
HDMI 接口 显示器 调试时实时预览视频
网口 路由器 联网上传报警信息

(2)接线注意事项

  • GPIO 引脚需串联电阻:LED 串联 220Ω 电阻,蜂鸣器串联 1kΩ 电阻,避免烧毁引脚;

  • 电源正负极不能接反:开发板和摄像头均需区分正负极,接反会导致设备损坏;

  • 工业场景需屏蔽线:RS485 接口、网线需用屏蔽线,减少电磁干扰。

三、开发环境搭建(以 RK3588+Ubuntu 20.04 为例)

1. 系统安装

  1. 下载 RK3588 适配的 Ubuntu 20.04 镜像(推荐官方提供的 “Ubuntu 20.04 Server with NPU 驱动”);

  2. 用 Etcher 工具将镜像烧录到 64GB SD 卡;

  3. 插入开发板,连接显示器、键盘、电源,开机后完成初始化(设置用户名、密码、WiFi)。

2. 安装核心依赖库

SSH 连接开发板(或直接终端操作),执行以下命令安装 AI 框架和工具库:

\# 更新系统

sudo apt update && sudo apt upgrade -y

\# 安装基础依赖

sudo apt install python3-pip python3-numpy python3-opencv git cmake -y

\# 安装YOLOv8(目标检测核心框架)

pip3 install ultralytics

\# 安装GPIO控制库(RK3588专用)

pip3 install rpi-gpio  # 若不兼容,改用:pip3 install gpiod

\# 安装MQTT通信库(上传报警信息)

pip3 install paho-mqtt

\# 安装视频编码库(解决OpenCV读取摄像头问题)

sudo apt install ffmpeg libavcodec-dev libavformat-dev -y

3. 环境验证

执行以下代码,验证摄像头、YOLOv8、GPIO 是否正常工作:

import cv2

from ultralytics import YOLO

import RPi.GPIO as GPIO

import time

\# 验证摄像头

cap = cv2.VideoCapture(0)  # 0=默认USB摄像头

cap.set(cv2.CAP\_PROP\_FRAME\_WIDTH, 1920)

cap.set(cv2.CAP\_PROP\_FRAME\_HEIGHT, 1080)

ret, frame = cap.read()

if ret:

    print("摄像头工作正常,画面尺寸:", frame.shape)

else:

    print("摄像头读取失败!")

cap.release()

\# 验证YOLOv8

model = YOLO('yolov8n.pt')  # 加载轻量级模型

results = model(frame) if ret else None

if results:

    print("YOLOv8模型加载成功,检测到目标数:", len(results\[0].boxes))

\# 验证GPIO

GPIO.setmode(GPIO.BCM)

GPIO.setup(18, GPIO.OUT)  # GPIO1\_1对应BCM编号18

GPIO.output(18, GPIO.HIGH)

time.sleep(1)

GPIO.output(18, GPIO.LOW)

GPIO.cleanup()

print("GPIO控制正常!")

若无报错,说明环境搭建完成。

四、核心功能开发(四大模块完整代码)

智能监控 AI 分析终端的核心功能的是 “视频采集→AI 识别→异常报警→数据存储 / 上传”,以下是每个模块的实操代码。

1. 模块 1:视频采集(USB / 网络摄像头)

支持 USB 摄像头(入门)和网络摄像头(工业),自动适配视频流格式:

import cv2

import time

class VideoCaptureModule:

    def \_\_init\_\_(self, source=0, is\_rtsp=False):

        """

        source:摄像头源(0=USB摄像头,RTSP地址=网络摄像头)

        is\_rtsp:是否为RTSP流(工业摄像头常用)

        """

        self.is\_rtsp = is\_rtsp

        self.cap = self.\_init\_capture(source)

    def \_init\_capture(self, source):

        """初始化摄像头"""

        cap = cv2.VideoCapture(source)

        if self.is\_rtsp:

            \# 网络摄像头RTSP流配置(降低延迟)

            cap.set(cv2.CAP\_PROP\_BUFFERSIZE, 1)

            cap.set(cv2.CAP\_PROP\_FPS, 30)

        else:

            \# USB摄像头配置(1080P@30fps)

            cap.set(cv2.CAP\_PROP\_FRAME\_WIDTH, 1920)

            cap.set(cv2.CAP\_PROP\_FRAME\_HEIGHT, 1080)

            cap.set(cv2.CAP\_PROP\_FOURCC, cv2.VideoWriter\_fourcc(\*'MJPG'))

        if not cap.isOpened():

            raise Exception(f"摄像头初始化失败!源:{source}")

        return cap

    def get\_frame(self):

        """获取单帧画面"""

        ret, frame = self.cap.read()

        if not ret:

            \# 重试机制(避免临时断流)

            time.sleep(0.1)

            ret, frame = self.cap.read()

        return ret, frame

    def release(self):

        """释放摄像头资源"""

        self.cap.release()

\# 测试:USB摄像头采集

if \_\_name\_\_ == "\_\_main\_\_":

    video = VideoCaptureModule(source=0, is\_rtsp=False)

    while True:

        ret, frame = video.get\_frame()

        if ret:

            cv2.imshow("Video Capture", frame)

            if cv2.waitKey(1) & 0xFF == ord('q'):

                break

        else:

            print("获取画面失败!")

    video.release()

    cv2.destroyAllWindows()

2. 模块 2:AI 识别(YOLOv8 目标检测 / 行为识别)

以 “异常闯入检测” 为例,识别画面中的 “人”,超出设定区域或数量则触发报警:

from ultralytics import YOLO

import cv2

import numpy as np

class AIDetectModule:

    def \_\_init\_\_(self, model\_path='yolov8n.pt', conf\_threshold=0.5):

        """

        model\_path:YOLO模型路径(yolov8n=轻量型,yolov8s=精准型)

        conf\_threshold:置信度阈值(过滤低可信度检测结果)

        """

        self.model = YOLO(model\_path)

        self.conf\_threshold = conf\_threshold

        self.class\_names = self.model.names  # 目标类别名称(0=person,1=bicycle等)

    def detect(self, frame):

        """目标检测:返回检测结果(边界框、类别、置信度)"""

        results = self.model(frame, conf=self.conf\_threshold, device=0)  # device=0使用NPU加速

        detections = \[]

        for r in results:

            boxes = r.boxes.data.cpu().numpy()  # 边界框:\[x1,y1,x2,y2,conf,class]

            for box in boxes:

                x1, y1, x2, y2, conf, cls = box

                detections.append({

                    "class": self.class\_names\[int(cls)],

                    "confidence": float(conf),

                    "bbox": \[int(x1), int(y1), int(x2), int(y2)]

                })

        return detections

    def draw\_detections(self, frame, detections):

        """在画面上绘制检测结果(边界框+标签)"""

        for det in detections:

            x1, y1, x2, y2 = det\["bbox"]

            label = f"{det\['class']} {det\['confidence']:.2f}"

            \# 绘制边界框(红色:人,绿色:其他目标)

            color = (0, 0, 255) if det\["class"] == "person" else (0, 255, 0)

            cv2.rectangle(frame, (x1, y1), (x2, y2), color, 2)

            \# 绘制标签背景

            cv2.rectangle(frame, (x1, y1-20), (x2, y1), color, -1)

            cv2.putText(frame, label, (x1+5, y1-5), cv2.FONT\_HERSHEY\_SIMPLEX, 0.5, (255,255,255), 1)

        return frame

    def check\_abnormal(self, detections, max\_person=1, restricted\_area=None):

        """

        异常检测:

        \- max\_person:最大允许人数

        \- restricted\_area:禁止区域(如\[500,300,1500,800],即x1=500,y1=300,x2=1500,y2=800)

        """

        abnormal = False

        abnormal\_msg = ""

        \# 统计人数

        person\_count = len(\[d for d in detections if d\["class"] == "person"])

        if person\_count > max\_person:

            abnormal = True

            abnormal\_msg = f"人数超标:{person\_count}/{max\_person}"

        \# 检测是否有人进入禁止区域

        if restricted\_area and person\_count > 0:

            rx1, ry1, rx2, ry2 = restricted\_area

            for det in detections:

                if det\["class"] == "person":

                    x1, y1, x2, y2 = det\["bbox"]

                    \# 判断边界框是否与禁止区域重叠

                    if not (x2  > rx2 or y2  > ry2):

                        abnormal = True

                        abnormal\_msg = f"闯入禁止区域!"

        return abnormal, abnormal\_msg

\# 测试:AI识别与异常检测

if \_\_name\_\_ == "\_\_main\_\_":

    video = VideoCaptureModule(source=0)

    ai\_detector = AIDetectModule(model\_path='yolov8n.pt', conf\_threshold=0.5)

    restricted\_area = \[500, 300, 1500, 800]  # 禁止区域(根据实际画面调整)

    while True:

        ret, frame = video.get\_frame()

        if not ret:

            continue

        \# AI检测

        detections = ai\_detector.detect(frame)

        \# 绘制检测结果

        frame\_with\_detections = ai\_detector.draw\_detections(frame, detections)

        \# 绘制禁止区域(红色虚线框)

        cv2.rectangle(frame\_with\_detections, (restricted\_area\[0], restricted\_area\[1]), 

                      (restricted\_area\[2], restricted\_area\[3]), (0,0,255), 2, cv2.LINE\_AA)

        \# 异常检测

        abnormal, abnormal\_msg = ai\_detector.check\_abnormal(detections, max\_person=1, restricted\_area=restricted\_area)

        \# 显示异常信息

        if abnormal:

            cv2.putText(frame\_with\_detections, abnormal\_msg, (50, 50), cv2.FONT\_HERSHEY\_SIMPLEX, 1, (0,0,255), 2)

        cv2.imshow("AI Detection", frame\_with\_detections)

        if cv2.waitKey(1) & 0xFF == ord('q'):

            break

    video.release()

    cv2.destroyAllWindows()

3. 模块 3:异常报警(LED + 蜂鸣器 + 视频存储)

异常时触发本地声光报警,并存储报警视频(保留 10 秒前 + 10 秒后画面):

import RPi.GPIO as GPIO

import cv2

import time

import os

from datetime import datetime

class AlarmModule:

    def \_\_init\_\_(self, led\_pin=18, buzzer\_pin=13, video\_save\_path="./alarm\_videos"):

        """

        led\_pin:LED GPIO引脚(BCM编号)

        buzzer\_pin:蜂鸣器GPIO引脚(BCM编号)

        video\_save\_path:报警视频存储路径

        """

        \# 初始化GPIO

        GPIO.setmode(GPIO.BCM)

        GPIO.setup(led\_pin, GPIO.OUT)

        GPIO.setup(buzzer\_pin, GPIO.OUT)

        self.led\_pin = led\_pin

        self.buzzer\_pin = buzzer\_pin

        \# 初始化视频存储

        self.video\_save\_path = video\_save\_path

        if not os.path.exists(video\_save\_path):

            os.makedirs(video\_save\_path)

        \# 缓存最近10秒画面(用于报警视频)

        self.frame\_buffer = \[]

        self.buffer\_size = 300  # 30fps×10秒=300帧

    def add\_frame\_to\_buffer(self, frame):

        """添加画面到缓存"""

        self.frame\_buffer.append(frame)

        if len(self.frame\_buffer) > self.buffer\_size:

            self.frame\_buffer.pop(0)

    def trigger\_alarm(self, duration=5):

        """触发声光报警(持续duration秒)"""

        print(f"触发报警!持续{duration}秒")

        for \_ in range(duration):

            GPIO.output(self.led\_pin, GPIO.HIGH)

            GPIO.output(self.buzzer\_pin, GPIO.HIGH)

            time.sleep(0.5)

            GPIO.output(self.led\_pin, GPIO.LOW)

            GPIO.output(self.buzzer\_pin, GPIO.LOW)

            time.sleep(0.5)

    def save\_alarm\_video(self, abnormal\_msg):

        """保存报警视频(缓存10秒+后续10秒)"""

        \# 视频文件名:时间\_异常类型.mp4

        timestamp = datetime.now().strftime("%Y%m%d\_%H%M%S")

        filename = f"{timestamp}\_{abnormal\_msg.replace(' ', '\_')}.mp4"

        save\_path = os.path.join(self.video\_save\_path, filename)

        \# 初始化视频写入器

        fourcc = cv2.VideoWriter\_fourcc(\*'mp4v')

        height, width = self.frame\_buffer\[0].shape\[:2]

        out = cv2.VideoWriter(save\_path, fourcc, 30.0, (width, height))

        \# 写入缓存画面

        for frame in self.frame\_buffer:

            out.write(frame)

        \# 再录制10秒实时画面

        cap = cv2.VideoCapture(0)

        for \_ in range(300):

            ret, frame = cap.read()

            if ret:

                out.write(frame)

            time.sleep(1/30)

        cap.release()

        out.release()

        print(f"报警视频保存成功:{save\_path}")

    def cleanup(self):

        """释放资源"""

        GPIO.output(self.led\_pin, GPIO.LOW)

        GPIO.output(self.buzzer\_pin, GPIO.LOW)

        GPIO.cleanup()

\# 测试:报警模块

if \_\_name\_\_ == "\_\_main\_\_":

    alarm = AlarmModule(led\_pin=18, buzzer\_pin=13)

    video = VideoCaptureModule(source=0)

    \# 缓存画面

    for \_ in range(300):

        ret, frame = video.get\_frame()

        if ret:

            alarm.add\_frame\_to\_buffer(frame)

        time.sleep(1/30)

    \# 触发报警并保存视频

    alarm.trigger\_alarm(duration=3)

    alarm.save\_alarm\_video("测试报警")

    \# 清理资源

    alarm.cleanup()

    video.release()

4. 模块 4:数据上传(MQTT + 云端报警通知)

将报警信息(时间、异常类型、视频路径)上传到云端平台(如阿里云 IoT、ThingsBoard):

import paho.mqtt.client as mqtt

import json

import time

import os

class MQTTUploadModule:

    def \_\_init\_\_(self, broker, port, client\_id, username, password, topic="smart\_monitor/alarm"):

        """

        broker:MQTT服务器地址

        port:MQTT端口(默认1883)

        client\_id:客户端ID(唯一)

        username/password:MQTT认证信息

        topic:报警信息上传主题

        """

        self.client = mqtt.Client(client\_id=client\_id)

        self.client.username\_pw\_set(username, password)

        self.broker = broker

        self.port = port

        self.topic = topic

        # 连接回调

        self.client.on\_connect = self.\_on\_connect

        self.client.on\_disconnect = self.\_on\_disconnect

        # 连接MQTT服务器

        self.connect()

    def \_on\_connect(self, client, userdata, flags, rc):

        if rc == 0:

            print("MQTT连接成功")

        else:

            print(f"MQTT连接失败,错误码:{rc}")

    def \_on\_disconnect(self, client, userdata, rc):

        print("MQTT断开连接,尝试重连...")

        time.sleep(5)

        self.connect()

    def connect(self):

        """连接MQTT服务器"""

        try:

            self.client.connect(self.broker, self.port, keepalive=60)

            self.client.loop\_start()  # 启动后台循环

        except Exception as e:

            print(f"MQTT连接异常:{e}")

    def upload\_alarm(self, abnormal\_msg, video\_path):

        """上传报警信息"""

        alarm\_data = {

            "device\_id": "smart\_monitor\_001",

            "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),

            "abnormal\_type": abnormal\_msg,

            "video\_path": video\_path,

            "status": "alarm"

        }

        try:

            payload = json.dumps(alarm\_data)

            result = self.client.publish(self.topic, payload, qos=1)

            result.wait\_for\_publish()

            if result.is\_published():

                print(f"报警信息上传成功:{payload}")

            else:

                print("报警信息上传失败,缓存本地")

                self.\_cache\_alarm(alarm\_data)

        except Exception as e:

            print(f"上传异常:{e}")

            self.\_cache\_alarm(alarm\_data)

    def \_cache\_alarm(self, alarm\_data):

        """断网时缓存报警信息到本地"""

        cache\_path = "./alarm\_cache"

        if not os.path.exists(cache\_path):

            os.makedirs(cache\_path)

        filename = f"cache\_{int(time.time())}.json"

        with open(os.path.join(cache\_path, filename), 'w') as f:

            json.dump(alarm\_data, f)

\# 测试:MQTT上传

if \_\_name\_\_ == "\_\_main\_\_":

    # 替换为你的云端MQTT参数

    mqtt\_uploader = MQTTUploadModule(

        broker="mqtt.aliyuncs.com",

        port=1883,

        client\_id="smart\_monitor\_001",

        username="your\_username",

        password="your\_password"

    )

    # 上传测试报警信息

    mqtt\_uploader.upload\_alarm("测试异常", "./alarm\_videos/test.mp4")

    time.sleep(2)

五、实战案例:办公室异常闯入检测终端

场景说明

办公室下班后(18:00-08:00),检测到 “人” 进入禁止区域(如财务室门口),触发声光报警,保存报警视频并上传云端通知管理员。

完整流程代码

import time

from datetime import datetime

from VideoCaptureModule import VideoCaptureModule

from AIDetectModule import AIDetectModule

from AlarmModule import AlarmModule

from MQTTUploadModule import MQTTUploadModule

if \_\_name\_\_ == "\_\_main\_\_":

    # 1. 初始化各模块

    video = VideoCaptureModule(source=0, is\_rtsp=False)

    ai\_detector = AIDetectModule(model\_path='yolov8n.pt', conf\_threshold=0.5)

    alarm = AlarmModule(led\_pin=18, buzzer\_pin=13)

    mqtt\_uploader = MQTTUploadModule(

        broker="mqtt.aliyuncs.com",

        port=1883,

        client\_id="smart\_monitor\_office",

        username="your\_username",

        password="your\_password"

    )

    # 2. 配置参数

    restricted\_area = \[500, 300, 1500, 800]  # 禁止区域(财务室门口)

    alarm\_hours = \[18, 8]  # 报警时段:18:00-08:00

    max\_person = 0  # 报警时段内禁止任何人进入

    alarm\_cooldown = 300  # 报警冷却时间(5分钟,避免重复报警)

    last\_alarm\_time = 0

    try:

        print("智能监控AI分析终端启动成功!")

        while True:

            # 获取当前时间

            now = datetime.now()

            current\_hour = now.hour

            # 判断是否在报警时段

            in\_alarm\_hour = (current\_hour >= alarm\_hours\[0]) or (current\_hour ours\[1])

            # 1. 视频采集与缓存

            ret, frame = video.get\_frame()

            if not ret:

                time.sleep(0.1)

                continue

            alarm.add\_frame\_to\_buffer(frame)

            # 2. AI识别(仅报警时段开启,节省算力)

            if in\_alarm\_hour:

                detections = ai\_detector.detect(frame)

                # 绘制检测结果和禁止区域

                frame\_with\_detections = ai\_detector.draw\_detections(frame, detections)

                cv2.rectangle(frame\_with\_detections, (restricted\_area\[0], restricted\_area\[1]),

                              (restricted\_area\[2], restricted\_area\[3]), (0,0,255), 2, cv2.LINE\_AA)

                # 异常检测

                abnormal, abnormal\_msg = ai\_detector.check\_abnormal(

                    detections, max\_person=max\_person, restricted\_area=restricted\_area

                )

                # 显示状态信息

                status = f"监控中 | 时段:{'报警时段' if in\_alarm\_hour else '正常时段'}"

                cv2.putText(frame\_with\_detections, status, (50, 50), cv2.FONT\_HERSHEY\_SIMPLEX, 0.8, (0,255,0), 2)

                if abnormal:

                    cv2.putText(frame\_with\_detections, abnormal\_msg, (50, 100), cv2.FONT\_HERSHEY\_SIMPLEX, 1, (0,0,255), 2)

                    # 冷却时间内不重复报警

                    current\_time = time.time()

                    if current\_time - last\_alarm\_time > alarm\_cooldown:

                        # 触发报警

                        alarm.trigger\_alarm(duration=5)

                        # 保存报警视频

                        video\_path = alarm.save\_alarm\_video(abnormal\_msg)

                        # 上传云端

                        mqtt\_uploader.upload\_alarm(abnormal\_msg, video\_path)

                        last\_alarm\_time = current\_time

            else:

                # 正常时段仅显示监控画面

                frame\_with\_detections = frame

                status = f"监控中 | 时段:正常时段"

                cv2.putText(frame\_with\_detections, status, (50, 50), cv2.FONT\_HERSHEY\_SIMPLEX, 0.8, (0,255,0), 2)

            # 实时预览(按q退出)

            cv2.imshow("Smart Monitor AI Terminal", frame\_with\_detections)

            if cv2.waitKey(1) & 0xFF == ord('q'):

                break

    except Exception as e:

        print(f"终端运行异常:{e}")

    finally:

        # 释放资源

        video.release()

        alarm.cleanup()

        cv2.destroyAllWindows()

        print("智能监控AI分析终端已关闭")

部署与调试步骤

  1. 硬件部署:按接线图连接摄像头、LED、蜂鸣器,确保电源稳定;

  2. 软件部署

  • 将所有模块代码放在同一目录下(命名对应import语句);

  • 下载 YOLOv8 模型:wget ``https://github.com/ultralytics/assets/releases/download/v8.1.0/yolov8n.pt

  • 替换 MQTT 参数为你的云端平台信息;

  1. 调试技巧
  • 先在正常时段测试摄像头和 AI 识别,调整restricted_area坐标(根据实际画面);

  • 手动触发异常(进入禁止区域),验证报警和视频存储是否正常;

  • htop命令监控 CPU/NPU 占用率,若帧率低,改用yolov8n.pt轻量模型。

六、进阶优化:提升终端性能与稳定性

1. 提升 AI 推理帧率

  • 模型优化:将 YOLOv8 模型量化为 INT8 格式(用 Ultralytics 量化工具),推理速度提升 2 倍;

  • 硬件加速:确保开发板 NPU 正常工作(RK3588 需安装官方 NPU 驱动,Jetson 需安装 JetPack);

  • 画面降采样:将摄像头分辨率调整为 720P,减少 AI 推理计算量。

2. 增强稳定性

  • watchdog 守护进程:用supervisor工具监控终端程序,崩溃后自动重启;

  • 电源管理:工业场景选用宽压电源,添加备用电池(避免断电断监控);

  • 存储管理:定期清理过期报警视频(保留 30 天),避免 SD 卡 / SSD 满存。

3. 扩展功能

  • 多摄像头联动:支持接入 4 路网络摄像头(用多线程并行处理);

  • 人脸识别:加载 YOLOv8-Face 模型,识别特定人员(如员工 / 陌生人);

  • 云端管理平台:对接 ThingsBoard,实现远程配置参数、查看报警记录。

posted @ 2026-01-16 22:57  wo是个狠人  阅读(0)  评论(0)    收藏  举报