-
DVPP能否把YUV格式跟OPENCV的YUV一致?如果不能一致那能否提供转换方法从DVPP YUV转为opencv BGR数据指针 或者 opencv BGR转为DVPP YUV数据?
-
问题来源:https://gitee.com/ascend/modelzoo/issues/I39MDX?from=project-issue问题描述:参考ATC YoloV4 (FP16) (huawei.com) 案例,在转换pytorch模型到 yolov4_bs1_aipp.om 后(使用aipp对图像进行归一化),用案例中的工具benchmark.x86_64输出结果,mAP为59%, 而自己用pyacl 开发的python工具导入模型,输出结果,其mAP仅有43%。问题分析:首先要明确,benchmark和pyacl的输入图片调用的是dvpp的硬件解码图片还是opencv的软解码图片。对于这两种解码方式在图片对齐的要求上有所不同,opencv对齐补充的过程中导致的box偏移可以通过后处理来补回,这样精度不会有损失,而dvpp要求输入图片满足12816的对齐,你的608/128非整数,所以硬件会强制对齐,且无法补回,导致精度损失。这是精度差异的原因之一,你可以尝试把dvpp的输入改为12816对齐的方式来缩小差距。具体理解看链接:https://gitee.com/ascend/modelzoo/wikis/Yolov3%E7%A6%BB%E7%BA%BF%E6%8E%A8%E7%90%86%E7%B2%BE%E5%BA%A6%E8%B0%83%E4%BC%98?sort_id=3154984把resized_image = dvpp.resize(yuv_image, MODEL_WIDTH, MODEL_HEIGHT)的resize接口改为crop_and_paste接口,具体调用方法看acl_dvpp.py文件,如果精度还不达标,就需要修改后处理的画框部分,使与之匹配。
-
问题来源:https://gitee.com/ascend/modelzoo/issues/I38RGJ?from=project-issue问题描述:运行模型时 出现了 Execute model failed for acl.mdl.execute error 100000日志报错:Input size [460800] can not be smaller than op size [3686432] after 64-byte alignment分析:就是输入图片尺寸与模型要求尺寸不对应,可能的原因有1.参数设置的不对2.图片的读入格式不对,比如你的模型要求接受rgb的格式,而你的输入时yuv,这样即使你的长宽参数设置一样,他们依然不匹配,因为他们计算大小的方式不同,rgb要乘3,而yuv是乘1.5,顺便说一下我们用dvpp读取图片的话是yuv格式的,用opencv或者img方法读的是rgb的。至于模型接受的图片存储方法,肯定是要统一的,NCHW和NHWC具体的转换方法opencv有自带的转换函数
-
问题描述:目前业务流程是通过异步解码+异步推理来完成任务需求描述:dvpp中只支持对jpg和png格式的解码,而我们的图像格式除了这两种还有其他格式,比如gif等,因此需要使用opencv配合dvpp来完成图像的解码过程,需要怎么适配dvpp来完成其他格式的解码呢,我们使用的dvpp解码和Execute接口都是异步的(acldvppJpegDecodeAsync, acldvppPngDecodeAsync,aclmdlExecuteAsync),使用opencv来适配dvpp不支持的格式解码时,要怎么做,或者要注意什么,希望给点详细具体的建议
-
【功能模块】【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
【功能模块】python 的openCV功能异常【操作步骤&问题现象】1、正常安装python3.7的openCV后,可以实现图片读取、resize等功能;2、使用VideoCapture拉RTSP流异常,未报错,但是无法获取流的宽高,无法读取图片;3、在X86上运行正常cap = cv2.VideoCapture("rtsp://admin:admin@192.168.2.64:554//Streaming/Channels/1")ret,frame = cap.read()while ret: ret,frame = cap.read() cv2.imwrite(str(i)+".jpg",frame)print("error:",)cap.release()【截图信息】VideoCapture未报错,但是read(),返回false【日志信息】(可选,上传日志内容或者附件)
-
板子版本:C73;OPencv版本:4.3.0语言:C++; cv::Mat img = cv::imdecode(cv::Mat(img_data), CV_LOAD_IMAGE_COLOR); 其中img_data是JPG格式的数据,imdecode速度较慢大概70ms,需要提速,查了相关资料,可能需要在OPencv上采用libjpeg-turbo,这块需要重新编译?是否有参照样例。
-
假设一个列数为W,行数为H的高斯卷计算子gaussKernel,其中W,H均为奇数,描点位置在((H-1)/2 ,(W-1)/2),构建高斯卷积核的步骤如下1.计算高斯矩阵2.计算高斯矩阵的和3.高斯矩阵除以其本身的和,也就是归一化下面利用Python来实现构建高斯卷积算子12345678910def getGaussKernel(sigma, H, W): r, c = np.mgrid[0:H:1, 0:W:1] r -= (H - 1) / 2 c -= (W - 1) / 2 gaussMatrix = np.exp(-0.5 * (np.power(r) + np.power(c)) / math.pow(sigma, 2)) # 计算高斯矩阵的和 sunGM = np.sum(gaussMatrix) # 归一化 gaussKernel = gaussMatrix / sunGM return gaussKernel高斯卷积核可以分离成一维水平方向上的高斯核和一维垂直方向上的高斯核,在OpenCV中给出了构建一维垂直方向上的高斯卷积核的函数:Mat getGaussianKernel(int ksize, double sigma, in ktype = CV/_64F)参数释意ksize一维垂直方向上的高斯核行数,正奇数sigma标准差ktype返回值的数据类型为CV_32F或CV_64F,默认是CV_64F下面通过Python代码来具体的实现图像的高斯平滑,我们首先会对图像水平方向进行卷积,然后再对垂直方向进行卷积,其中sigma代表高斯卷积核的标准差1234567891011121314151617181920212223def gaussBlur(image,sigma,H,W,_boundary = 'fill', _fillvalue = 0): #水平方向上的高斯卷积核 gaussKenrnel_x = cv2.getGaussianKernel(sigma,W,cv2.CV_64F) #进行转置 gaussKenrnel_x = np.transpose(gaussKenrnel_x) #图像矩阵与水平高斯核卷积 gaussBlur_x = signal.convolve2d(image,gaussKenrnel_x,mode='same',boundary=_boundary,fillvalue=_fillvalue) #构建垂直方向上的卷积核 gaussKenrnel_y = cv2.getGaussianKernel(sigma,H,cv2.CV_64F) #图像与垂直方向上的高斯核卷积核 gaussBlur_xy = signal.convolve2d(gaussBlur_x,gaussKenrnel_y,mode='same',boundary= _boundary,fillvalue=_fillvalue) return gaussBlur_xyif __name__ == "__main__": image = cv2.imread("../images/timg.jpg", cv2.IMREAD_GRAYSCALE) cv2.imshow("image",image) #高斯平滑 blurImage = gaussBlur(image, 5, 400, 400, 'symm') #对bIurImage进行灰度级显示 blurImage = np.round(blurImage) blurImage = blurImage.astype(np.uint8) cv2.imshow("GaussBlur", blurImage) cv2.waitKey(0) cv2.destroyAllWindows()运行截图:
-
用的鲲鹏云服务器,配置如下:2vCPUs | 4GB | kc1.large.2CentOS 7.6 64bit with ARM【操作步骤&问题现象】我是按照华为云给出的教程 https://www.huaweicloud.com/kunpeng/software/opencv.html 进行安装opencv的。版本是opencv3.0.0最后 make -j8 时出现了交叉编译错误:Linking CXX static library ****Linking CXX shared library ****Linking CXX executable ****错误见下面的各图。网上找了一轮,各种方法都没解决。请问有装过的朋友,这有可行的解决方法吗?【截图信息】
-
近期多次出现opencv相关问题,这里对此进行总结分享,希望用户可以直接在此找到答案。opencv进行图片预处理可以直接通过opencv进行图片预处理,如resize,crop,rotate等操作。最终返回的都是cv::Mat对象Mat对象传输到device侧针对mat对象,用户需要按照此对象的格式,计算并申请空间。假设是rgb,则aclrtMalloc需要申请 mat.rows*mat.cols*3,然后将mat.data拷贝至device指针。具体代码如下(参考@不吃瓜二郎,参考链接:https://bbs.huaweicloud.com/forum/thread-91378-1-1.html):void *devPtr = nullptr; size_t size = img.cols * img.rows * 3; aclrtMalloc(&devPtr, size, ACL_MEM_MALLOC_NORMAL_ONLY); aclrtMemcpy(devPtr, size, img.data, size, ACL_MEMCPY_HOST_TO_DEVICE);Mat对象传输到host侧并保存类似从host->device,将img.data指针传回host侧,并通过cv::Mat dst(src.rows, src.cols, cv_8UC3, hostPtr)生成新的mat对象,并进行imwrite等操作。使用AIPPAIPP用于调整dvpp输出到模型推理的输入,其默认值设置主要满足dvpp内容。当使用opencv时,可以在代码中实现各种操作,如减均值,减方差。当然也可以借用aipp完成,但是需要注意默认值。如input format默认为yuv420sp,这就不满足mat的格式,需要额外注意。参考链接:https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=91911
-
【问题现象】请教:我在x86框架下的ubuntu18.04,交叉编译适应atlas500环境的arm框架的opencv-python,但是遇到了问题,Libraries始终无法选中.so文件,导致无法使用python编译opencv,请问有大佬知道该怎么做吗?【截图信息】
-
环境:200 DK开发板,ubuntu18.04 server版本,python3.6.4,opencv 4.4.0yolov3已经能够cv2读取处理图片,但是无法读取本地视频左图为远程200DK开发板,右图为本地环境(Windows10),在开发板上无法使用 success, frame = vs.read()进行视频读取,为False
-
【功能模块】【操作步骤&问题现象】opencv读入的图片,rgb格式resieze后 再保存出现了问题,如下图, 部分变灰的是resize后的如果我把rgb 图像再用 opencv转换成 yuv , 再改dvpp acldvppSetPicDescFormat等设置, 转换结果又是对的。读入的图像本身大小为512*512,对齐没问题。【截图信息】【日志信息】(可选,上传日志内容或者附件)Mat src = imread("h.jpg");cvtColor(src, temp_yuv, COLOR_BGR2YUV_I420); int inputWidth = src.cols; int inputHeight = src.rows; char* inputHostBuff = (char*)src.ptr<uchar>(0); int inBufferSize = inputWidth*inputHeight*3;/////////int32_t deviceId_=0;aclrtContext context_;aclrtStream stream_; aclInit(nullptr); aclrtSetDevice(deviceId_); INFO_LOG("open device %d success", deviceId_); aclrtCreateContext(&context_, deviceId_); INFO_LOG("create context success"); aclrtCreateStream(&stream_); INFO_LOG("create stream success"); acldvppChannelDesc *dvppChannelDesc_ = acldvppCreateChannelDesc(); acldvppCreateChannel(dvppChannelDesc_); void *inBufferDev = nullptr; acldvppMalloc(&inBufferDev, inBufferSize); aclrtMemcpy(inBufferDev, inBufferSize, inputHostBuff, inBufferSize, ACL_MEMCPY_HOST_TO_DEVICE); acldvppResizeConfig *resizeConfig_ = acldvppCreateResizeConfig(); uint32_t widthAlignment = 16; uint32_t heightAlignment = 2; uint32_t sizeAlignment = 3; uint32_t sizeNum = 2; uint32_t inputWidthStride = AlignmentHelper(inputWidth, widthAlignment)*3; ///rgb24 uint32_t inputHeightStride = AlignmentHelper(inputHeight, heightAlignment); uint32_t inputBufferSize = inputWidthStride * inputHeightStride ; ////*3/2 acldvppPicDesc *vpcInputDesc_ = nullptr; acldvppPicDesc *vpcOutputDesc_ = nullptr; void *vpcOutBufferDev_ = nullptr; vpcInputDesc_ = acldvppCreatePicDesc(); acldvppSetPicDescData(vpcInputDesc_, reinterpret_cast<char *>(inBufferDev)); acldvppSetPicDescFormat(vpcInputDesc_, PIXEL_FORMAT_RGB_888); acldvppSetPicDescWidth(vpcInputDesc_, inputWidth); acldvppSetPicDescHeight(vpcInputDesc_, inputHeight); acldvppSetPicDescWidthStride(vpcInputDesc_, inputWidthStride); acldvppSetPicDescHeightStride(vpcInputDesc_, inputHeightStride); acldvppSetPicDescSize(vpcInputDesc_, inputBufferSize); int resizeOutWidthStride = AlignmentHelper(outputWidth, widthAlignment); int resizeOutHeightStride = AlignmentHelper(outputHeight, heightAlignment); uint32_t vpcOutBufferSize_ = resizeOutWidthStride * resizeOutHeightStride * sizeAlignment / sizeNum; acldvppMalloc(&vpcOutBufferDev_, vpcOutBufferSize_); vpcOutputDesc_ = acldvppCreatePicDesc(); acldvppSetPicDescData(vpcOutputDesc_, vpcOutBufferDev_); acldvppSetPicDescFormat(vpcOutputDesc_, PIXEL_FORMAT_YUV_SEMIPLANAR_420); acldvppSetPicDescWidth(vpcOutputDesc_, outputWidth); acldvppSetPicDescHeight(vpcOutputDesc_, outputHeight); acldvppSetPicDescWidthStride(vpcOutputDesc_, resizeOutWidthStride); acldvppSetPicDescHeightStride(vpcOutputDesc_, resizeOutHeightStride); acldvppSetPicDescSize(vpcOutputDesc_, vpcOutBufferSize_); aclError ret = acldvppVpcResizeAsync(dvppChannelDesc_, vpcInputDesc_,vpcOutputDesc_, resizeConfig_, stream_);
-
【功能模块】第三方opencv编译不通过。【操作步骤&问题现象】按照下面给的流程操作:https://gitee.com/lovingascend/quick_start/blob/master/Atlas200DK_separate_MD/picture_sample.mdlib库是从:scp -r HwHiAiUser@192.168.1.2:/home/HwHiAiUser/ascend_ddk/arm $HOME/ascend_ddk/机器上copy回来的。【截图信息】cmake:if(target STREQUAL "Simulator_Function") target_link_libraries(main funcsim pthread opencv_world) else() target_link_libraries(main opencv_world ascendcl stdc++ pthread) endif()编译输出:Information:export DDK_PATH=/home/atlas/ascend/toolkit/ascend-toolkit/20.0.RC1/acllib_centos7.6.x86_64 && export NPU_HOST_LIB=/home/atlas/ascend/toolkit/ascend-toolkit/20.0.RC1/acllib_centos7.6.x86_64/acllib/lib64/stub && export && cd /home/atlas/AscendProjects/acl_resnet50_async/build/intermediates && rm -rf * && cmake /home/atlas/AscendProjects/acl_resnet50_async -DCMAKE_SKIP_RPATH=TRUE -Dtarget= -DCMAKE_CXX_COMPILER=g++ && make && echo acl_resnet50_async build successfully.Information:-- The C compiler identification is GNU 7.5.0Information:-- The CXX compiler identification is GNU 7.5.0Information:-- Check for working C compiler: /usr/bin/ccInformation:-- Check for working C compiler: /usr/bin/cc -- worksInformation:-- Detecting C compiler ABI infoInformation:-- Detecting C compiler ABI info - doneInformation:-- Detecting C compile featuresInformation:-- Detecting C compile features - doneInformation:-- Check for working CXX compiler: /usr/bin/g++Information:-- Check for working CXX compiler: /usr/bin/g++ -- worksInformation:-- Detecting CXX compiler ABI infoInformation:-- Detecting CXX compiler ABI info - doneInformation:-- Detecting CXX compile featuresInformation:-- Detecting CXX compile features - doneInformation:-- env INC_PATH: /home/atlas/ascend/toolkit/ascend-toolkit/20.0.RC1/acllib_centos7.6.x86_64Information:-- env LIB_PATH: /home/atlas/ascend/toolkit/ascend-toolkit/20.0.RC1/acllib_centos7.6.x86_64/acllib/lib64/stub;/home/atlas/ascend_ddk/arm/lib/;/lib;/home/atlas/ascend/toolkit/ascend-toolkit/20.0.RC1/acllib_centos7.6.x86_64/atc/lib64Information:-- Configuring doneInformation:-- Generating doneInformation:-- Build files have been written to: /home/atlas/AscendProjects/acl_resnet50_async/build/intermediatesInformation:Scanning dependencies of target mainInformation:[ 12%] Building CXX object src/CMakeFiles/main.dir/utils.cpp.oInformation:[ 25%] Building CXX object src/CMakeFiles/main.dir/model_process.cpp.oInformation:[ 37%] Building CXX object src/CMakeFiles/main.dir/sample_process.cpp.oInformation:[ 50%] Building CXX object src/CMakeFiles/main.dir/memory_pool.cpp.oInformation:[ 62%] Building CXX object src/CMakeFiles/main.dir/main.cpp.oInformation:[ 75%] Building CXX object src/CMakeFiles/main.dir/img_decode.cpp.oInformation:[ 87%] Building CXX object src/CMakeFiles/main.dir/file.cpp.oInformation:[100%] Linking CXX executable ../../../out/mainInformation:/usr/bin/ld: skipping incompatible /home/atlas/ascend_ddk/arm/lib/libopencv_world.so when searching for -lopencv_worldInformation:/usr/bin/ld: cannot find -lopencv_world【日志信息】(可选,上传日志内容或者附件)
上滑加载中
推荐直播
-
算子工具性能优化新特性演示——MatMulLeakyRelu性能调优实操
2025/01/10 周五 15:30-17:30
MindStudio布道师
算子工具性能优化新特性演示——MatMulLeakyRelu性能调优实操
回顾中 -
用代码全方位驱动 OBS 存储
2025/01/14 周二 16:30-18:00
阿肯 华为云生态技术讲师
如何用代码驱动OBS?常用的数据管理,对象清理,多版本对象访问等应该如何编码?本期课程一一演示解答。
即将直播 -
GaussDB数据库开发
2025/01/15 周三 16:00-17:30
Steven 华为云学堂技术讲师
本期直播将带你了解GaussDB数据库开发相关知识,并通过实验指导大家利用java基于JDBC的方式来完成GaussD数据库基础操作。
去报名
热门标签