飞凌嵌入式
直播中

zealsoft

3年用户 689经验值
擅长:可编程逻辑,嵌入式技术
私信 关注
[技术]

【飞凌RK3568开发板试用体验】使用OpenCV进行人脸识别

本帖最后由 zealsoft 于 2023-1-11 22:10 编辑

感谢“电子发烧友网”和飞凌嵌入式公司提供了本次OK3568开发板的评测机会。
飞凌OK3568-C开发板基于瑞芯微RK3568四核ARM Cortex-A55 处理器的主板,从厂商的宣传看,其主要市场就是人脸识别等视频和图像应用。今天就使用OpenCV自带的DNN模块进行人脸识别,看看其性能如何。

一、OpenCV及其DNN模块
OK3568开发板自带OpenCV 3.4.12,这个版本虽然有点低,但是已经支持DNN进行基于深度学习的人脸检测了。厂商提供的OpenCV基于OpenCL进行了优化,可以较好地支持板载的GPU,从前面的测试可以看出其3D性能还是不错的。
从3.3版开始,OpenCV就支持来自不同框架的模型。OpenCV DNN模块只支持图像和视频的深度学习推理。它不支持微调和训练。不过,OpenCV DNN模块可以作为任何初学者进入基于深度学习的计算机视觉领域的一个完美起点。OpenCV DNN模块对于Intel CPU有深度的优化,性能不错,在ARM上的表现就比较一般了。
我们使用的人脸检查模型是res10_300x300_ssd_iter_140000.caffemodel,这是OpenCV官方提供的一个训练好的模型,应用比较广泛。
我们的测试程序是基于以下代码修改的:https://github.com/LingDong-/fast-many-face-detection-with-cpp-or-openframeworks-on-mac-using-neural-networks。我们没有使用OpenFramworks框架,只使用OpenCV的代码,比较简单。主程序如下(其他所需要的文件请从github上下载):
  1. #include
    #include<time.h>
    #include
    #include
    #include
    #include"caffe_face_det.h"
    using namespacestd;
    #defineMY_TIMEV    struct timeval
    MY_TIMEVclockGetTime(clockid_t _tclock_id)
    {
           struct timespec stTime;
           //该函数的时间精确到纳秒级别
           clock_gettime(_tclock_id, &stTime);
           MY_TIMEV stRet;
           stRet.tv_sec = stTime.tv_sec;
           stRet.tv_usec = stTime.tv_nsec/1000;
           return stRet;  
    }
    int main(intargc, char*argv[]) {
        if(argc <= 1)
        {
           cout << "no file."<< endl;
        }
           MY_TIMEV tmp = {0};
           int timeOffset = 0;
           int timeOffset1 = 0;
          
        caffe_face_det detector;
        detector.setup();
        cv::Mat frame;
        frame = cv::imread(argv[1]);
        cout << "hello there."<< endl;
        tmp = clockGetTime(CLOCK_MONOTONIC);
        //单位ms
        timeOffset = tmp.tv_sec*1000 +tmp.tv_usec/1000;
        vector detections =detector.detect(frame);
        memset(&tmp,0,sizeof(tmp));
        tmp = clockGetTime(CLOCK_MONOTONIC);
        timeOffset1 = tmp.tv_sec*1000 +tmp.tv_usec/1000;
        for (int i = 0; i < detections.size();i++){
                a_det det = detections;
                cv::rectangle(frame,cv::Point(det.left,det.top), cv::Point(det.right,det.bottom),cv::Scalar(0,255,255),3);
            }
         cv:imwrite("result.jpg", frame);
         cout << "Time: " <<(timeOffset1 - timeOffset) << "ms" << endl;
        return 0;
    }

使用如下命令进行编译:
  1. aarch64-buildroot-linux-gnu-g++ -o face-detectmain.cpp--sysroot=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/aarch64-buildroot-linux-gnu/sysroot/-lopencv_imgproc -lopencv_dnn -lopencv_core -lopencv_imgcodecs -lopencv_highgui-std=gnu++11

将生成的face-detect文件和需要的模型文件拷贝到机器上就可以了,没有其他需要的依赖文件。

二、测试结果
我们从网上找了几幅图像就行测试。
第一幅图像是规规矩矩的正面照,OpenCV轻松搞定。
result.jpg


第二幅图片是一个调皮的女孩,OpenCV除了正确地识别了女孩的脸,还把其肩膀误认为是脸。
result2.jpg

第三幅图片是阿根廷国家队在2021年美洲杯夺冠的照片,由于图片尺寸不大,人物多且杂乱,OpenCV的识别效果很差。
result3.jpg


第四幅图片是2022年世界杯阿根廷夺冠后的庆祝照片,相当于上一幅图片,由于人脸基本都是正面照,除了被遮挡的人脸都正确识别出来了,劳塔罗的手被误识别为人脸了,但整体效果不错。
result4.jpg


时间测试方面,我们只计算人脸检测的时间,处理一副图片是620ms左右,基本可以满足像门禁这样的应用的需要。


更多回帖

发帖
×
20
完善资料,
赚取积分