diff --git a/Samples/YOLOV5MultiInput/README.md b/Samples/YOLOV5MultiInput/README.md index 4c3ffe8b7a0e41bbdada9deacf305b9b4201ea13..9719db5302c2709d3883ea00067c030b299f4f67 100644 --- a/Samples/YOLOV5MultiInput/README.md +++ b/Samples/YOLOV5MultiInput/README.md @@ -5,6 +5,22 @@ 使用多路离线视频流(*.mp4)作为应用程序的输入,基于YoloV5s模型对输入视频中的物体做实时检测,将推理结果信息使用imshow方式显示。 样例代码逻辑如下所示:![输入图片说明](https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/samples-pic/EdgeAndRobotics/%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%A4%BA%E4%BE%8B%E5%9B%BE%E7%89%87.png) +#### 准备环境 + +1. 以HwHiAiUser用户登录开发板。 + +2. 设置环境变量。 + + ``` + # 配置程序编译依赖的头文件与库文件路径 + export DDK_PATH=/usr/local/Ascend/ascend-toolkit/latest + export NPU_HOST_LIB=$DDK_PATH/runtime/lib64/stub + ``` + +3. 安装ACLLite库。 + + 参考[ACLLite仓](https://gitee.com/ascend/ACLLite)安装ACLLite库。 + #### 样例下载 可以使用以下两种方式下载,请选择其中一种进行源码准备。 @@ -32,23 +48,6 @@ cd EdgeAndRobotics-master/Samples/YOLOV5MultiInput ``` -#### 准备环境 - -1. 以HwHiAiUser用户登录开发板。 - -2. 设置环境变量。 - - ``` - # 配置程序编译依赖的头文件与库文件路径 - export DDK_PATH=/usr/local/Ascend/ascend-toolkit/latest - export NPU_HOST_LIB=$DDK_PATH/runtime/lib64/stub - ``` - -3. 安装ACLLite库。 - - 参考[ACLLite仓](https://gitee.com/ascend/ACLLite)安装ACLLite库。 - - #### 运行样例 1. 以HwHiAiUser用户登录开发板,切换到当前样例目录。 diff --git a/Samples/YOLOV5MultiInput/src/main.cpp b/Samples/YOLOV5MultiInput/src/main.cpp index de9336a086392eb7009c07d709ca5da7a4713798..0f2e5ca466c82dee4502c9f29d0795e2a6a26c36 100644 --- a/Samples/YOLOV5MultiInput/src/main.cpp +++ b/Samples/YOLOV5MultiInput/src/main.cpp @@ -188,6 +188,7 @@ void* GetInput(void* arg) { LOG_PRINT("[INFO] start to decode..."); uint32_t frameRate =30; uint32_t cnt = 1; + int isHost = GetRunMode(); while(1) { ret = cap.Read(frame); if (ret) { @@ -202,7 +203,14 @@ void* GetInput(void* arg) { msgData.ChannelId = cfg.channel; msgData.videoEnd = false; cv::Mat yuv_img(frame.height*1.5, frame.width, CV_8UC1); - memcpy(yuv_img.data, (unsigned char*)frame.data.get(), frame.size); + if (isHost) { + void* hostDataBuffer = CopyDataToHost(frame.data.get(), frame.size); + memcpy(yuv_img.data, (unsigned char*)hostDataBuffer, frame.size); + FreeHostMem(hostDataBuffer); + hostDataBuffer = nullptr; + } else { + memcpy(yuv_img.data, (unsigned char*)frame.data.get(), frame.size); + } cv::cvtColor(yuv_img, msgData.srcImg, cv::COLOR_YUV2RGB_NV21); while (1) { if (msgDataQueue.Push(msgData)) { diff --git a/Samples/YOLOV5USBCamera/README.md b/Samples/YOLOV5USBCamera/README.md index 98141b581a9d9f748a3b641479607e471cefb23f..21fd02ac58b7fe2a5268b2beae3ba646e6d79397 100644 --- a/Samples/YOLOV5USBCamera/README.md +++ b/Samples/YOLOV5USBCamera/README.md @@ -7,6 +7,24 @@ 样例结构如下所示: ![输入图片说明](https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/samples-pic/EdgeAndRobotics/%E5%8D%95%E7%BA%BF%E7%A8%8B%E7%A4%BA%E4%BE%8B%E5%9B%BE%E7%89%87.png) +#### 执行准备 + +1. 确认已安装带桌面的镜像且HDMI连接的屏幕正常显示 + +2. 以HwHiAiUser用户登录开发板。 + +3. 设置环境变量。 + + ``` + # 配置程序编译依赖的头文件与库文件路径 + export DDK_PATH=/usr/local/Ascend/ascend-toolkit/latest + export NPU_HOST_LIB=$DDK_PATH/runtime/lib64/stub + ``` + +4. 安装ACLLite库。 + + 参考[ACLLite仓](https://gitee.com/ascend/ACLLite)安装ACLLite库。 + #### 样例下载 可以使用以下两种方式下载,请选择其中一种进行源码准备。 @@ -34,27 +52,18 @@ cd EdgeAndRobotics-master/Samples/YOLOV5USBCamera ``` -#### 执行准备 - -1. 确认已安装带桌面的镜像且HDMI连接的屏幕正常显示 +#### 运行样例 -2. 以HwHiAiUser用户登录开发板。 +1. 准备测试视频。 -3. 设置环境变量。 + 请从以下链接获取该样例的测试视频,放在data目录下。 ``` - # 配置程序编译依赖的头文件与库文件路径 - export DDK_PATH=/usr/local/Ascend/ascend-toolkit/latest - export NPU_HOST_LIB=$DDK_PATH/runtime/lib64/stub + cd ../data + wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/yolov5s/test.mp4 --no-check-certificate ``` -4. 安装ACLLite库。 - - 参考[ACLLite仓](https://gitee.com/ascend/ACLLite)安装ACLLite库。 - -#### 运行样例 - -1. 以HwHiAiUser用户登录开发板,切换到当前样例目录。 + **注:**若需更换测试视频,则需自行准备测试视频,并将测试视频放到data目录下。 2. 获取PyTorch框架的Yolov5模型(\*.onnx),并转换为昇腾AI处理器能识别的模型(\*.om)。 - 当设备内存**小于8G**时,可设置如下两个环境变量减少atc模型转换过程中使用的进程数,减小内存占用。 diff --git a/Samples/YOLOV5USBCamera/data/.keep b/Samples/YOLOV5USBCamera/data/.keep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Samples/YOLOV5USBCamera/src/main.cpp b/Samples/YOLOV5USBCamera/src/main.cpp index 8347a9b7eea1b023d150e3dbbf4eb8929d8ed209..e36acd84c31c2cbeb4e1dc9d83d16df4321845bc 100644 --- a/Samples/YOLOV5USBCamera/src/main.cpp +++ b/Samples/YOLOV5USBCamera/src/main.cpp @@ -13,6 +13,7 @@ #include "acllite_dvpp_lite/ImageProc.h" #include "acllite_om_execute/ModelProc.h" #include "acllite_media/CameraRead.h" +#include "acllite_dvpp_lite/VideoRead.h" #include "acllite_common/Queue.h" #include "label.h" @@ -178,6 +179,62 @@ void GetResult(std::vector& inferOutputs, return; } +void* GetInputVideo(void* arg) { + bool ret = SetCurContext(context); + CHECK_RET(ret, LOG_PRINT("[ERROR] set cur context for pthread %ld failed.", pthread_self()); return NULL); + int32_t deviceId = *(int32_t *)arg; + string videoPath = "../data/test.mp4"; + VideoRead cap(videoPath, deviceId); + CHECK_RET(cap.IsOpened(), LOG_PRINT("[ERROR] open %s failed.", videoPath.c_str()); return NULL); + + ImageProc imageProcess; + ImageData frame; + ImageSize modelSize(modelWidth, modelHeight); + int isHost = GetRunMode(); + LOG_PRINT("[INFO] start to decode..."); + while(1) { + ret = cap.Read(frame); + if (ret) { + ImageData dst; + imageProcess.Resize(frame, dst, modelSize, RESIZE_PROPORTIONAL_UPPER_LEFT); + MsgData msgData; + msgData.data = dst.data; + msgData.size = dst.size; + msgData.videoEnd = false; + cv::Mat yuyvImg(frame.height*1.5, frame.width, CV_8UC1); + if (isHost) { + void* hostDataBuffer = CopyDataToHost(frame.data.get(), frame.size); + memcpy(yuyvImg.data, (unsigned char*)hostDataBuffer, frame.size); + FreeHostMem(hostDataBuffer); + hostDataBuffer = nullptr; + } else { + memcpy(yuyvImg.data, (unsigned char*)frame.data.get(), frame.size); + } + cv::cvtColor(yuyvImg, msgData.srcImg, cv::COLOR_YUV2RGB_NV21); + while (1) { + if (msgDataQueue.Push(msgData)) { + break; + } + usleep(100); + } + } else { + LOG_PRINT("[INFO] frame read end."); + break; + } + } + cap.Release(); + MsgData msgData; + msgData.videoEnd = true; + while (1) { + if (msgDataQueue.Push(msgData)) { + break; + } + usleep(100); + } + LOG_PRINT("[INFO] preprocess add end msgData. tid : %ld", pthread_self()); + return NULL; +} + void* GetInput(void* arg) { bool ret = SetCurContext(context); CHECK_RET(ret, LOG_PRINT("[ERROR] set cur context for pthread %ld failed.", pthread_self()); return NULL); @@ -292,7 +349,11 @@ int main() { context = aclResource.GetContext(); pthread_t preTids, exeTids, posTids; + // run usb camera: pthread_create(&preTids, NULL, GetInput, (void*)&deviceId); + // run mp4 video: + // pthread_create(&preTids, NULL, GetInputVideo, (void*)&deviceId); + pthread_create(&exeTids, NULL, ModelExecute, NULL); pthread_create(&posTids, NULL, PostProcess, NULL);