1回答

0收藏

[评测分享] 【米尔FZ3深度学习计算卡】PS端opencv运算性能小测试

#板卡评测 #板卡评测 3583 人阅读 | 1 人回复 | 2020-11-22

拿到板子一般来说应该先点个灯的,不过个人对1.2G A53的性能还是相当期待,因此想先测试下。
但这一周早些时候花费了大量时间寻找交叉编译opencv的方法,折腾了很久,最后才发现板子TF卡自带的镜像竟然有opencv库。加上gcc编译链也齐全,因此测试用的小程序都可以在板子上直接编译。
本来个人对Qt生态比较依赖,看了下板子的库,竟然也有Qt,还是5.9.6版本,一个相当新的版本了:

opencv也是3.3.0,这大概是18-19年才推出的版本:

一开始还相当满意,觉得这块工控板生态很不错。然而很快啊,我就发现我还是想得太简单:

对于这个问题,搜到的解决方案都是不太搭边的,目前猜测大概还是因为用交叉编译环境构建Qt的时候有某些地方没有配置对吧。从板载的库来说,这个带有百度AI的镜像应该是经过深度定制的,其他功能都挺完善的,没有发现特别的问题,但官方没有提供这个镜像的交叉编译环境,想要自己提取再重新交叉编译Qt还是挺复杂的,因此暂时避开Qt。失去了Qt的qmake,只能寻求不太熟悉的cmake了。


  • 测试试验

所幸opencv所在的/usr/lib是系统能够自动识别的路径,如果是/usr/local/lib下面,编写CmakeList.txt的时候就麻烦了。
新建一个canny文件夹,进去新建一个canny.c文件:

现在测试一段canny算子运算能力:
  1. #include <opencv2/opencv.hpp>
  2. #include<opencv2/highgui/highgui.hpp>
  3. #include<opencv2/imgproc/imgproc.hpp>
  4. using namespace cv;


  5. //-----------------------------------【main( )函数】-------------------------------------------
  6. //            描述:控制台应用程序的入口函数,我们的程序从这里开始
  7. //-----------------------------------------------------------------------------------------------
  8. int main()
  9. {
  10.         struct timespec tpstart;
  11.         struct timespec tpmiddle;
  12.         struct timespec tpend;
  13.         long timedif;
  14.         clock_gettime(CLOCK_MONOTONIC, &tpstart);

  15.         //载入原始图
  16.         Mat srcImage = imread("/home/qt/qt_for_opencv/28.jpg",1);  //工程目录下应该有一张名为1.jpg的素材图
  17.         Mat srcImage1 = srcImage.clone();

  18.         //显示原始图
  19.         ///imshow("【原始图】Canny边缘检测", srcImage);

  20.         clock_gettime(CLOCK_MONOTONIC, &tpmiddle);

  21.         //----------------------------------------------------------------------------------
  22.         //        一、最简单的canny用法,拿到原图后直接用。
  23.         //----------------------------------------------------------------------------------
  24.         //Canny(srcImage, srcImage, 150, 100, 3);
  25.         ///imshow("【效果图】Canny边缘检测", srcImage);


  26.         //----------------------------------------------------------------------------------
  27.         //        二、高阶的canny用法,转成灰度图,降噪,用canny,最后将得到的边缘作为掩码,拷贝原图到效果图上,得到彩色的边缘图
  28.         //----------------------------------------------------------------------------------
  29.         Mat dstImage, edge, grayImage;

  30.         // 【1】创建与src同类型和大小的矩阵(dst)
  31.         dstImage.create(srcImage1.size(), srcImage1.type());

  32.         // 【2】将原图像转换为灰度图像
  33.         cvtColor(srcImage1, grayImage, CV_BGR2GRAY);

  34.         // 【3】先用使用 3x3内核来降噪
  35.         blur(grayImage, edge, Size(3, 3));

  36.         // 【4】运行Canny算子
  37.         Canny(edge, edge, 3, 9, 3);

  38.         //【5】将g_dstImage内的所有元素设置为0
  39.         dstImage = Scalar::all(0);

  40.         //【6】使用Canny算子输出的边缘图g_cannyDetectedEdges作为掩码,来将原图g_srcImage拷到目标图g_dstImage中
  41.         srcImage1.copyTo(dstImage, edge);

  42.         //【7】显示效果图
  43.         ///imshow("【效果图】Canny边缘检测2", dstImage);*/

  44.         clock_gettime(CLOCK_MONOTONIC, &tpend);
  45.         timedif = 1000000 * (tpend.tv_sec - tpstart.tv_sec) + (tpend.tv_nsec - tpstart.tv_nsec) / 1000;
  46.         fprintf(stdout, "it took %ld microseconds\n", timedif);
  47.         timedif = 1000000 * (tpend.tv_sec - tpmiddle.tv_sec) + (tpend.tv_nsec - tpmiddle.tv_nsec) / 1000;
  48.         fprintf(stdout, "it took %ld microseconds\n", timedif);

  49.         waitKey(0);

  50.         return 0;
  51. }
复制代码



新建CmakeList.txt,添加内容:
  1. # project name
  2. PROJECT(canny)
  3. # requirement of cmake version
  4. cmake_minimum_required(VERSION 3.5)

  5. # set the directory of executable files
  6. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ./)

  7. # find required opencv
  8. find_package(OpenCV REQUIRED)
  9. # directory of opencv headers
  10. include_directories(${OpenCV_INCLUDE_DIRS})
  11. # name of executable file and path of source file
  12. add_executable(canny canny.cpp)
  13. # directory of opencv library
  14. link_directories(${OpenCV_LIBRARY_DIRS})
  15. # opencv libraries
  16. target_link_libraries(canny ${OpenCV_LIBS})
复制代码

执行命令:
  1. camke .
复制代码

执行make:



  • 执行效果

canny算子:

blur算子:

contours:


实际上还有个自己写的小程序的,应用了surf在内的几个算子,同样的A53四核运算时间在1s以上,更能看出测试效果。但在2020年之前surf算子的专利还没有过期,因此一直放在opencv的contrib模块,这个板子的opencv库明显是没有编译contrib模块的,因此只能遗憾地放弃了。



  • 对比

没有对比就不够直观。为了直观感受这个板子纯CPU运算能力到底如何,还缺一个横向对比。
但看了一遍手上的其他板子,性能都太过羸弱,与之相近的同样A53 4核的树莓派只能跑个32位系统,简直是虐菜。找来找去还是一块晶辰的S905比较合适,这颗核心时28nm制程,主频1.5G,比这块板子主频高一点,但制程落后,GPU同样位Mail-T450。

顺便附上手头其他板子,包括树莓派在内的一些测试结果:

同样的4核ARM A53看起来差距不大,性能都相当可以,ZU3低频还略占上风,纯CPU性能是足够通用计算了,接下来就是看AI部分了。


分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条