# yolo_multi_input_acl_infer_cpp **Repository Path**: sundaelite/yolo_multi_input_acl_infer_cpp ## Basic Information - **Project Name**: yolo_multi_input_acl_infer_cpp - **Description**: 基于昇腾ACL的目标检测推理样例,支持多路输入 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-06-16 - **Last Updated**: 2025-08-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 目录 - [样例介绍](#样例介绍) - [样例流程图](#样例流程图) - [目录结构](#目录结构) - [获取源码包](#获取源码包) - [第三方依赖安装](#第三方依赖安装) - [样例运行](#样例运行) - [其他资源](#其他资源) - [更新说明](#更新说明) - [已知issue](#已知issue) ## 样例介绍 功能:使用yolo模型对输入数据进行预测推理,推理检测出图片/视频中所有可检测物体,并将推理结果打印到输出上,是一个是基于多路、多线程方案实现的高性能案例,通过多卡并行处理多路数的数据并输出,支持多种输入输出。 样例输入:原始图片jpg文件/视频mp4文件/视频h26X文件/rtsp视频流。 样例输出:带推理结果的图片/带推理结果的视频文件/rtsp视频流展示/cv::imshow窗口展示/打屏显示。 ## 样例流程图 通用目标检测与识别一站式方案是一个是基于多路、多线程方案实现的高性能案例,通过多卡并行处理多路数的数据并输出。 其中整体流程图如下所示: ![流程图](https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/sampleYolov7MultiInput/%E6%B5%81%E7%A8%8B%E5%9B%BE.png) - 管理线程:将线程和队列打包在一起,并完成进程创建、消息队列创建、消息发送和消息接收守护。 - 数据输入线程:对输入图片或视频进行解码。 - 数据预处理线程:对数据输入线程传过来的YUV图片进行处理(resize等操作)。 - 推理线程:使用YOLOV7模型进行推理。 - 数据后处理线程:分析推理结果,输出框点及标签信息。 - 数据输出线程:将框点及标签信息标识到输出数据上。 ## 目录结构 ``` ├── model //模型文件夹,存放样例运行需要的模型文件 │ └── xxxx.onnx ├── data //数据文件夹 │ └── xxxx //测试数据,输入视频 ├── pic //数据文件夹 │ └── xxxx //测试数据,输入图片 ├── inc //头文件文件夹 │ ├── Params.h //声明样例使用的数据结构的头文件 │ └── label.h //声明样例模型使用的类别标签的头文件 ├── out //编译输出文件夹,存放编译生成的可执行文件 │ ├── xxxx //可执行文件 │ └── xxxx //样例运行的输出结果图片/视频 ├── scripts //配置文件+脚本文件夹 │ ├── yolov5.json //样例运行使用的参数配置文件 │ ├── sample_build.sh //快速编译脚本 │ ├── sample_run.sh //快速运行脚本 │ ├── writingMethodForEachInputOutput.json //不同输入输出数据类型参数配置参考文件 │ └── multiInputWithMultiModelPerDevice.json //多device多推理线程多输入数据配置参考文件 ├── src │ ├── acl.json //系统初始化的配置文件 │ ├── CMakeLists.txt //Cmake编译文件 │ ├── dataInput //数据输入解码处理线程文件夹,存放该业务线程的头文件及源码 │ ├── dataOutput //数据输出处理线程文件夹,存放该业务线程的头文件及源码 │ ├── detectInference //检测模型推理线程文件夹,存放该业务线程的头文件及源码 │ ├── detectPreprocess //检测模型预处理线程文件夹,存放该业务线程的头文件及源码 │ ├── detectPostprocess //检测模型后处理线程文件夹,存放该业务线程的头文件及源码 │ ├── pushrtsp //rtsp展示线程文件夹,存放该业务线程的头文件及源码 │ └── main.cpp //主函数,yolo检测功能的实现文件 └── CMakeLists.txt //编译脚本入口,调用src目录下的CMakeLists文件 ``` ## 获取源码包 可以使用以下两种方式下载,请选择其中一种进行源码准备。 ## 第三方依赖安装 设置环境变量,配置程序编译依赖的头文件,库文件路径。“$HOME/Ascend”请替换“Ascend-cann-toolkit”包的实际安装路径。 ``` source /usr/local/Ascend/ascend-toolkit/set_env.sh export ASDK_PATH=/usr/local/Ascend/ascend-toolkit/latest export NPU_HOST_LIB=$ASDK_PATH/runtime/lib64/stub export CPU_ARCH=`arch` export THIRDPART_PATH=/usr/local/Ascend/thirdpart/${CPU_ARCH} #代码编译时链接samples所依赖的相关库文件 export LD_LIBRARY_PATH=${THIRDPART_PATH}/lib:$LD_LIBRARY_PATH:/usr/local/lib64 #运行时链接第三方库文件 export INSTALL_DIR=/usr/local/Ascend/ascend-toolkit/latest #CANN软件安装后的文件存储路径,根据安装目录自行修改 ``` 创建THIRDPART_PATH路径 ``` mkdir -p ${THIRDPART_PATH} ``` - x264 执行以下命令安装x264 ``` cd ${HOME} git clone https://code.videolan.org/videolan/x264.git cd x264 # 安装x264 ./configure --enable-shared --disable-asm make sudo make install sudo cp /usr/local/lib/libx264.so.164 /lib ``` - ffmpeg 执行以下命令安装ffmpeg ``` cd ${HOME} wget http://www.ffmpeg.org/releases/ffmpeg-4.1.3.tar.gz --no-check-certificate tar -zxvf ffmpeg-4.1.3.tar.gz cd ffmpeg-4.1.3 # 安装ffmpeg ./configure --enable-shared --enable-pic --enable-static --disable-x86asm --enable-libx264 --enable-gpl --prefix=${THIRDPART_PATH} make -j8 make install ``` - opencv 执行以下命令安装opencv(注:确保是3.x版本) ``` sudo apt-get install libopencv-dev #其他版本操作系统自行网上查阅安装方式 ``` 如果使用的是opencv4.x版本,可以执行以下命令(4.5.4,4.9.0以通过测试) ``` sudo ln -s /usr/include/opencv4/opencv2 /usr/include/opencv2 ``` - jsoncpp 命令行apt安装jsoncpp: ``` # 安装完成后静态库在系统:/usr/include;动态库在:/usr/lib/x84_64-linux-gnu sudo apt-get install libjsoncpp-dev sudo ln -s /usr/include/jsoncpp/json/ /usr/include/json ``` ## 样例运行 - 全量包准备: ``` shell wget https://tools.obs.cn-south-292.ca-aicc.com:443/samples/yolov7_acl_cpp_multi_input_infer/YOLOV7_MM.zip --no-check-certificate ``` > 注:这里以一路MP4视频为输入,输出保存为离线mp4视频为例演示验证样例运行,关于样例运行所使用的更多相关参数配置说明请参考[样例参数配置说明](./configDemo.md)。 - 数据准备 请从以下链接获取该样例的输入视频,放在data目录下。 ``` cd YOLOV7_MM/data wget https://tools.obs.cn-south-292.ca-aicc.com:443/samples/yolov7_acl_cpp_multi_input_infer/1.jpg --no-check-certificate ``` - ATC模型转换 将yolo原始模型转换为适配昇腾310处理器的离线模型(\*.om文件),放在model路径下。 ``` # 为了方便下载,在这里直接给出原始模型下载及模型转换命令,可以直接拷贝执行。 cd YOLOV7_MM/model # 下载yolov7的原始模型文件及AIPP配置文件 wget https://tools.obs.cn-south-292.ca-aicc.com:443/samples/yolov7_acl_cpp_multi_input_infer/best.onnx --no-check-certificate wget https://tools.obs.cn-south-292.ca-aicc.com:443/samples/yolov7_acl_cpp_multi_input_infer/aipp.cfg --no-check-certificate # 请使用与芯片名相对应的取值进行模型转换,然后再进行推理 wget https://tools.obs.cn-south-292.ca-aicc.com:443/samples/yolov7_acl_cpp_multi_input_infer/atc_bs.sh --no-check-certificate 运行bash atc_bs.sh ``` - 样例编译 执行以下命令,执行编译脚本,开始样例编译。 ``` cd YOLOV7_MM/scripts bash sample_build.sh ``` - 样例运行 执行运行脚本,开始样例运行。 ``` bash sample_run.sh ``` - 样例结果展示 会根据scripts/yolo.json文件配置的结果输出方式输出应用的推理结果,包含物体的检测框信息。 输出数据类型配置为video,输出数据存储在out文件夹下,为名称类似于:**XXXX.mp4** 的视频。 执行成功后,样例将根据配置的输出数据类型,输出不同文件,结果框坐标信息等可能会根据版本、环境有所不同,请以实际情况为准。 - 若输出数据类型配置为pic 输出数据存储在out/文件夹下,为名称类似于**channel_X_out_pic_Y.jpg** 的图片,其中X代表第x路,Y代表第y张图片。 - 若输出数据类型配置为video 输出数据存储在out/output文件夹下,为名称类似于:**XXXX.mp4** 的视频,其中X代表第x路。 - 图片参考yolo.json - 视频参考video.json ## 其他资源 以下资源提供了对通用目标识别样例的更多了解,包括如何进行定制开发和性能提升: **Documentation** - [通用目标识别样例](https://gitee.com/ascend/samples/wikis/%E9%80%9A%E7%94%A8%E7%9B%AE%E6%A0%87%E8%AF%86%E5%88%AB%E6%A0%B7%E4%BE%8B/%E5%89%8D%E8%A8%80/%E6%A6%82%E8%BF%B0) - [AscendCL Samples介绍](../README_CN.md) - [使用AscendCLC API库开发深度神经网络应用](https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/600alpha006/infacldevg/aclcppdevg/aclcppdevg_000000.html) - [昇腾文档](https://www.hiascend.com/document?tag=community-developer) ## 已知issue 暂无