公司名称:中国矿业大学

一、 系统简介

基于OpenVINO和Qt框架开发的多摄像头实时目标检测系统,支持多路RTSP/本地摄像头接入。本系统采用基于YOLOv5n架构的预训练模型,并在此基础上进行迁移学习,通过自定义数据集对模型进行调整。拥有动态切换大屏显示、检测延迟实时监控、目标检测启停控制等UI功能。本系统基于AIPC架构,融合异构计算、边缘推理与自适应调度技术,构建面向智慧社区的智能视频分析系统。系统架构图如下所示:

二、 系统核心AI功能设计

2.1 多模态数据融合处理

本系统依托AIPC异构计算单元(CPU+GPU+NPU)构建多源接入框架,实现视频数据的智能感知与预处理。采用异构数据接入框架,支持最大12路RTSP流媒体(H.264/H.265)与本地USB摄像头的混合接入。通过OpenCV VideoCapture自适应解码模块处理不同分辨率(720p-4K)、帧率(15-60fps)的视频流,建立统一的数据缓冲队列。

2.2 边缘智能分析引擎

本系统采用基于YOLOv5n架构的INT8量化模型部署,通过迁移学习在COCO数据集上进行微调。如下图所示,使用OpenVINO的benchmark_app插件分别测试FP32和INT8精度的yolov5n模型。同时使用CPU推理,比较两种精度的相同模型的吞吐量可得,经OpenVINO模型优化器压缩(INT8量化)后,模型体积减少70%的同时吞吐量增加60%。

(a)FP32和INT8精度的模型体积

(b)测试 FP32精度的yolov5n模型吞吐量为115.62帧/秒

(c) 测试INT8量化后的yolov5n模型吞吐量为181.27帧/秒

同时本系统设计多级线程池架构:视频处理线程(12个I/O线程)、推理线程(绑定CPU/GPU物理核心)和渲染线程,通过Qt的元对象系统实现线程间通信,实时处理流水线构建三级线程池(采集/推理/渲染)通过双缓冲队列实现预处理(色彩空间转换+张量标准化)与推理的流水线并行。以下为部分核心代码:

视频处理线程(frameprocessor.cpp)

void FrameProcessor::process() {
    while (!stopProcessing) {
        cv::Mat frame;
        if (cap.read(frame)) {
            if (detectionEnabled) {
                processedFrame = detector->detect(frame, latency);
            }
            emit frameReady(convertToQImage(processedFrame));
        }
    }
}

推理线程(objectdetector.cpp)

cv::Mat ObjectDetector::detect(const cv::Mat& frame, int& latency, bool enabled) {
    if (!modelLoaded || !enabled) return frame;
    auto start = std::chrono::high_resolution_clock::now();
    cv::Mat resizedImage;
    cv::resize(frame, resizedImage, cv::Size(640, 640)); 
    resizedImage.convertTo(resizedImage, CV_32F, 1.0/255); 
    cv::cvtColor(resizedImage, resizedImage, cv::COLOR_BGR2RGB);
    ov::Tensor inputTensor = inferRequest.get_input_tensor();
    float* blob = inputTensor.data<float>();
    memcpy_chw(resizedImage, blob); 
    inferRequest.infer(); 
    const float* detections = inferRequest.get_output_tensor().data<float>();
    parse_detections(detections, frame.size()); 
    cv::dnn::NMSBoxes(boxes_, confidences_, 0.3, 0.4, indices_); 
     cv::Mat result = visualize_results(frame);
    latency = calc_latency(start); 
    return result;
}

渲染线程(mainwindow.cpp)

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent), ui(new Ui::MainWindow) {
    ui->setupUi(this);
    cameraDevices = {"rtsp://admin:12345@192.168.3.150", ...};
    std::string modelPath = "/path/to/yolov5n.xml";
    for (int i = 0; i < cameraDevices.size(); ++i) {
        CameraItem item;
        item.detector = new ObjectDetector(modelPath, classNames);
        item.processor = new FrameProcessor(cameraDevices[i], item.detector);         item.thread = new QThread(this); 
        item.widgetPlaceholder = ui->videoWidget1;
        item.latencyTextEdit = ui->latencyTextEdit1;
        item.startDetectionButton = ui->detectButton1;
        connect(item.processor, &FrameProcessor::frameReady, this, [=](const QImage &img, int latency) {
            item.videoLabel->setPixmap(QPixmap::fromImage(img).scaled(...));
            item.latencyTextEdit->setText("延迟: " + QString::number(latency) + " ms");
        });
        item.processor->moveToThread(item.thread);
        item.thread->start();
        connect(ui->detectButton1, &QPushButton::clicked, this, [=]() { 
            startDetection(i); 
        });
        cameraItems.push_back(item);
    }
    bigVideoLabel = new QLabel(ui->bigvideoWidget);
    connect(ui->videoButton1, &QPushButton::clicked, this, [=]() { updateBigVideoStream(0); });
}

2.3 智能流控制模块

1. 四路视频显示区域(三小一大):可根据具体需求更换视频窗口大小、数量以及位置。

2. 实时延迟显示窗口 :实时显示各通道延迟指标(帧解码/推理/渲染全链路统计),实时输出检测延迟,窗口大小、数量、位置以及其他信息,可根据需求更改。

3. 检测启停控制按钮 :开发状态机控制引擎,支持多通道独立启停检测,界面默认输出未检测捕获视频,按下每路摄像头对应开始/停止检测按钮可更换检测状态。

4. 画面放大/缩小按钮:暂停非活动流处理(setPaused(true)),界面默认输出多路摄像头,按下每路摄像头对应放大/缩小按钮可更换视频窗口大小。

界面设计图如下所示:

  1. 多路摄像头未启用检测

b)多路摄像头启用检测

三、 部署过程

3.1 软件环境

组件

版本要求

操作系统

OpenVINO

Qt

OpenCV

Ubuntu 20.04 LTS

≥2023.3.0

≥5.15

≥4.5

3.2 硬件环境

组件

配置

说明

CPU

GPU

内存

显存

存储

Intel Core Ultra 9

Intel Arc 140V

32G

18G

200G

适用于多任务处理和轻度计算任务

提供足够的图形处理能力,支持深度学习推理

保证系统和应用程序的流畅运行

支持高分辨率视频处理和图形渲染

存储操作系统、应用程序和数据

3.3 软件部署

3.3.1 配置OpenCV

a) 安装相关依赖

sudo apt-get update

sudo apt-get upgrade

sudo apt-get install build-essential

sudo apt-get install build-essential cmake

sudo apt-get update

b) 安装OpenCV依赖

sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libatlas-base-dev gfortran libgtk2.0-dev libjpeg-dev libpng-dev ccache     libtiff-dev         libopenjp2-7-dev

c) 安装OpenCV 4.10.0

sudo apt install git

git clone https://github.com/opencv/opencv.git

cd opencv

git checkout 4.10.0

d) 编译OpenCv

编译opencv的目的是为了使用自定义功能,并且启用额外模块,同时确保安装的版本能够适应本人需求和系统环境。

mkdir build

cd build

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_GENERATE_PKGCONFIG=ON ..

sudo make -j8

sudo make install

确保 OpenCV 安装完成,可以通过以下命令查看 OpenCV 版本:

pkg-config --modversion opencv4

3.3.2配置OpenVINO

a)下载OpenVINO toolkit

首先在openvino官网上下载openvino toolkit,选择ubuntu20.04,然后在目标嵌入式系统上解压tgz文件。

b) 配置OpenVINO依赖

进入install_dependencies目录,找到install_openvino_dependencies.sh,在当前目录下打开终端输入

sudo -E ./install_openvino_dependencies.sh

下载依赖,然后加载环境变量,到此OpenVINO运行时部署完成。

echo "source  <openvino_install_dir>/setupvars.sh" >> ~/.bashrc

source ~/.bashrc

然后运行打包好的多摄像头目标检测系统执行文件,即可使用。

c) 使用cmake编译插件(可选)

openvino_toolkit包带有C++和python API,推荐使用cmake来编译插件,在openvino根目录下新建构建目录build。

mkdir build

cd build

其中<openvino_install_dir>替换为实际openvino安装地址,然后编译。

cmake -DCMAKE_BUILD_TYPE=Release <openvino_install_dir>/samples/cpp

make -j$(nproc)

编译完成之后。将会在build目录下生成路径/intel64/Release,进入目录后可以看到已经编译好的各个插件的执行文件,比如benchmark_app,hello_query_device。

Logo

为开发者提供丰富的英特尔开发套件资源、创新技术、解决方案与行业活动。欢迎关注!

更多推荐