
AIPC:多摄像头实时目标检测系统
基于OpenVINO和Qt框架开发的多摄像头实时目标检测系统,支持多路RTSP/本地摄像头接入。本系统采用基于YOLOv5n架构的预训练模型,并在此基础上进行迁移学习,通过自定义数据集对模型进行调整。拥有动态切换大屏显示、检测延迟实时监控、目标检测启停控制等UI功能。本系统基于AIPC架构,融合异构计算、边缘推理与自适应调度技术,构建面向智慧社区的智能视频分析系统。
公司名称:中国矿业大学
一、 系统简介
基于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)),界面默认输出多路摄像头,按下每路摄像头对应放大/缩小按钮可更换视频窗口大小。
界面设计图如下所示:
- 多路摄像头未启用检测
(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。
更多推荐
所有评论(0)