查看: 2212|回复: 1

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-10 08:31
  • 签到天数: 300 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2020-11-22 21:50:29 | 显示全部楼层 |阅读模式
    分享到:
    拿到板子一般来说应该先点个灯的,不过个人对1.2G A53的性能还是相当期待,因此想先测试下。
    但这一周早些时候花费了大量时间寻找交叉编译opencv的方法,折腾了很久,最后才发现板子TF卡自带的镜像竟然有opencv库。加上gcc编译链也齐全,因此测试用的小程序都可以在板子上直接编译。
    本来个人对Qt生态比较依赖,看了下板子的库,竟然也有Qt,还是5.9.6版本,一个相当新的版本了:
    Qt.png
    opencv也是3.3.0,这大概是18-19年才推出的版本:
    opencv.png
    一开始还相当满意,觉得这块工控板生态很不错。然而很快啊,我就发现我还是想得太简单:
    qmake proble.png
    对于这个问题,搜到的解决方案都是不太搭边的,目前猜测大概还是因为用交叉编译环境构建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算子:
    canny.png
    blur算子:
    blur.png
    contours:
    contours.png

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



    • 对比

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

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


    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-4-27 05:40 , Processed in 0.133990 second(s), 19 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.