在进迭时空RISCV开发板上实现USB摄像头实时YOLO检测

引言

随着边缘AI计算的快速发展,RISC-V架构的AI芯片正逐渐成为行业新宠。进迭时空(SpacemiT)推出的K系列芯片凭借其高效的AI推理能力,为边缘计算场景提供了全新可能。本文将详细介绍如何在进迭时空RISCV开发板上,通过USB摄像头实现实时目标检测功能,并部署最新的YOLOv11模型,打造完整的边缘AI视觉应用。

一、硬件准备与环境配置

1.1 硬件清单

  • 进迭时空K1开发板
  • USB摄像头(建议选择UVC兼容型号)
  • 网线(用于SSH连接)
  • 电源适配器

1.2 基础环境搭建

首先,通过SSH从Windows环境连接到RISCV开发板:

ssh username@板子IP地址

接着,创建专用项目目录并克隆官方AI示例仓库:

# 创建项目目录
mkdir ~/yolov11_camera_project
cd ~/yolov11_camera_project

# 克隆官方AI示例仓库
git clone https://gitee.com/bianbu/spacemit-demo.git
cd spacemit-demo

1.3 依赖安装

# 更新软件包列表
sudo apt update

# 安装基础依赖
sudo apt install -y python3 python3-pip libopencv-dev python3-opencv v4l-utils usbutils ffmpeg

# 安装摄像头测试工具
sudo apt install -y fswebcam guvcview

二、USB摄像头配置与测试

2.1 摄像头连接验证

连接USB摄像头后,使用以下命令验证设备识别情况:

# 检查USB设备
lsusb

# 检查视频设备节点
ls /dev/video*

2.2 摄像头测试

# 测试摄像头捕获
fswebcam --no-banner test.jpg

# 如遇权限问题
sudo chmod 666 /dev/video0

2.3 常见问题解决

当遇到VIDIOC_ENUMINPUT: Inappropriate ioctl for device错误时,可尝试以下方法:

  1. 尝试不同设备节点

    fswebcam --device /dev/video1 --no-banner test1.jpg
    
  2. 使用OpenCV直接访问

    import cv2
    cap = cv2.VideoCapture(0)  # 尝试0,1,2等不同索引
    
  3. 检查内核日志

    dmesg | grep -i usb
    
  4. 指定分辨率和格式

    fswebcam --device /dev/video0 --resolution 640x480 --format yuyv test.jpg
    

三、YOLOv11模型部署

3.1 模型准备

# 进入YOLOv11示例目录
cd examples/CV/yolov11

# 安装Python依赖
pip3 install -r requirements.txt --user

# 下载预训练模型
cd model
sh download_model.sh
cd ..

3.2 YOLOv11性能说明

根据官方数据,YOLOv11n在SpacemiT K1上的性能表现如下:

模型 输入大小 数据类型 帧率(4核)
YOLOv11n [1,3,320,320] int8 35 FPS

这一性能指标足以支持实时目标检测应用,尤其适合边缘计算场景。

四、完整应用实现

4.1 创建整合脚本

在项目目录中创建camera_yolov11_demo.py文件:

import cv2
import numpy as np
import time
import sys
import os

# 添加项目路径到Python路径
sys.path.append(os.path.join(os.path.dirname(__file__), "python"))

from test_yolov11 import YOLOv11Detector

def main():
    # 初始化 YOLOv11 检测器
    model_path = "model/yolov11n_int8.kmodel"
    if not os.path.exists(model_path):
        print(f"错误:模型文件 {model_path} 不存在")
        print("请先运行 download_model.sh 脚本下载模型")
        return
    
    print("正在加载YOLOv11模型...")
    detector = YOLOv11Detector(model_path)
    print("模型加载完成")
    
    # 尝试打开摄像头
    camera_index = 0
    cap = cv2.VideoCapture(camera_index)
    
    # 如果默认索引失败,尝试其他索引
    if not cap.isOpened():
        print(f"无法打开摄像头(索引 {camera_index}),尝试其他索引...")
        for i in range(1, 5):
            cap = cv2.VideoCapture(i)
            if cap.isOpened():
                print(f"成功打开摄像头(索引 {i})")
                camera_index = i
                break
    
    if not cap.isOpened():
        print("错误:无法打开任何摄像头设备")
        print("请检查:")
        print("1. 摄像头是否正确连接")
        print("2. 执行 'ls /dev/video*' 查看可用设备")
        print("3. 尝试 'sudo chmod 666 /dev/video*' 赋予权限")
        return
    
    print(f"摄像头(索引 {camera_index})已成功打开,按 'q' 键退出")
    
    # 设置摄像头分辨率以匹配模型输入,提高处理速度
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
    
    fps = 0
    frame_count = 0
    start_time = time.time()
    frame_skip = 0  # 跳帧计数器,用于性能优化
    
    while True:
        # 读取一帧
        ret, frame = cap.read()
        if not ret:
            print("错误:无法读取摄像头帧")
            break
        
        # 每2帧处理1帧,提高实时性能
        frame_skip = (frame_skip + 1) % 2
        if frame_skip != 0:
            # 仅显示,不进行推理
            cv2.putText(frame, f"FPS: {fps} (显示)", (10, 30), 
                       cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
            cv2.imshow('YOLOv11 Camera Detection', frame)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
            continue
        
        # 使用 YOLOv11 进行目标检测
        results = detector.detect(frame)
        
        # 在帧上绘制检测结果
        for obj in results:
            x1, y1, x2, y2 = obj['bbox']
            conf = obj['confidence']
            class_name = obj['class_name']
            
            # 绘制边界框
            cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
            # 绘制标签
            label = f"{class_name} {conf:.2f}"
            cv2.putText(frame, label, (int(x1), int(y1)-10), 
                       cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
        
        # 计算 FPS
        frame_count += 1
        current_time = time.time()
        if current_time - start_time >= 1.0:
            fps = frame_count
            frame_count = 0
            start_time = current_time
        
        # 显示 FPS 和系统信息
        cv2.putText(frame, f"YOLOv11 FPS: {fps}", (10, 30), 
                   cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
        cv2.putText(frame, "Press 'q' to quit", (10, 60), 
                   cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)
        
        # 显示结果
        cv2.imshow('YOLOv11 Camera Detection', frame)
        
        # 按 'q' 键退出
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    # 释放资源
    cap.release()
    cv2.destroyAllWindows()
    print("程序已退出")

if __name__ == "__main__":
    main()

4.2 运行应用

# 确保在正确目录
cd ~/yolov11_camera_project/spacemit-demo/examples/CV/yolov11

# 运行程序
python3 camera_yolov11_demo.py

五、性能优化技巧

为了在RISCV架构上获得最佳性能,以下是几点关键优化建议:

  1. 模型量化:使用int8量化模型(yolov11n_int8.kmodel),官方数据显示可达到35 FPS
  2. 分辨率调整:将摄像头分辨率设置为640x480,平衡画质与性能
  3. 跳帧处理:每2-3帧处理1帧,显著提升实时性能
  4. 内存优化:关闭不必要的后台服务,释放内存资源
  5. 多核利用:确保程序充分利用4个CPU核心

六、结果展示

成功运行后,您将看到实时摄像头画面,其中检测到的物体被绿色边框标记,并显示类别名称和置信度。在SpacemiT K1开发板上,YOLOv11n模型能够达到约30-35 FPS的推理速度,足以满足大多数实时应用场景。

七、扩展应用

基于本项目,您可以进一步扩展以下应用:

  1. 智能安防系统:检测特定物体并触发警报
  2. 零售分析:统计客流量和商品关注度
  3. 工业质检:识别产品缺陷
  4. 智能交通:车辆和行人检测
  5. 结合NLP模块:通过语音指令控制检测功能

进迭时空的AI Demo库还提供了丰富的其他模型,如人脸识别(ArcFace)、姿态估计(YOLOv8-pose)和语义分割(SAM)等,可以与YOLOv11结合创建更复杂的多模态应用。

八、总结

本文详细介绍了如何在进迭时空RISCV开发板上实现USB摄像头与YOLOv11模型的整合应用。通过合理配置硬件、优化软件性能,我们成功在边缘设备上实现了高效的目标检测功能。

进迭时空K系列芯片展现出强大的边缘AI计算能力,特别是在int8量化模型的支持下,能够以较低功耗提供出色的推理性能。随着RISC-V生态的不断完善,这类芯片将在物联网、智能家居、工业自动化等领域发挥越来越重要的作用。

项目源码https://gitee.com/bianbu/spacemit-demo.git
官方文档https://bianbu.spacemit.com/ai/spacemit-demo

作者:全球通史
日期:2025年11月08日


Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐