• 反人脸识别的思路和实现


    反人脸识别的思路和实现

     

    一、基本知识和背景

         人脸识别是非常经典的机器识别运用,目前已经在许多地方得到了使用。相关的算法原理和实现发展的都很发达,Opencv中就有不错的实现。这是现状。

         但是,也正因为此,和人相关的隐私变得令人关注。应用sigvc上面的一个概念叫做“反人脸识别”http://www.sigvc.org/bbs/forum.php?mod=viewthread&tid=3348&highlight=%B7%B4%C8%CB%C1%B3,就是关注用户隐私的一种技术实现。从技术实现上来说,主要分为“人脸识别”和“脸部模糊”两个部分。两个部分的实现难度都不大,关键是“处理输入图片,保护用户隐私”的思路很关键。这里是我的相关研究。

     

    二、实现步骤

         ​一)人脸识别

                    此类人脸识别的图像一般都是全局的图像,比如

         而不是这样以单幅人脸为主要内容的图像

      

         所以在算法的选择上,我还是优先选择了haar的方法,而没有采用肤色模型。我认为对于近景的,需要进行精细地处理的时候,肤色更适合一些。

         那么进行识别:

            对于这种正向的图片,效果还是不错的。可能存在错误识别的区域,但是不影响主体。

     

    void main()

    {
        //读入图片
        Mat src =  imread("c:/m.jpg",0);
        //人脸识别
        string fn_haar = "C:/haarcascade_frontalface_default.xml";
        CascadeClassifier haar_cascade;
        haar_cascade.load(fn_haar);
        vector< Rect_<int> > faces;
        haar_cascade.detectMultiScale(src, faces); //检测多个人脸的
        //画出区域
        for (int i=0;i<faces.size();i++)
        {
             Rect face_i = faces[i];
             rectangle(src,face_i,Scalar(255));
        }
        imshow("src",src);
        cv::waitKey();
        getchar();
    }

         二)脸部模糊

            脸部模糊的方法也是有许多的。俗话说画鬼容易画人难,这里想做出一个人脸比较困难,但是如果想把一个人脸弄成非人脸,就要简单许多。比较常见的是打马赛克,但是手头没有代码(如果哪位有的话欢迎补充),所以就直接采用模糊算法进行处理

          这样处理以后的面部,基本无法看出原来的人是哪个了。需要注意的是GussianBlur的参数需要取得大一点,这样模糊的效果比较好。

        封装成函数,需要注意的是这里直接对图像进行了修改

     

    //人脸模糊
    void blurFace(Mat src)
    {    
        GaussianBlur(src,src,Size(19,19),19);
    }

    三)主要流程

            反人脸识别脸部模糊的方法的主要流程就是识别出人脸,然后进行Guass模糊,然后再和原图合并起来。需要做出批量处理的方式并生成log的。

     

            需要注意的一点是,最终结果的图片还是需要彩色的,但是在处理的过程中可能用的是灰度照片。

         效果如下,应该是识别不出来了吧   

         OK,这里实现了单张的效果,在实际项目中必然需要进行批量处理,并且处理输入输出,一并编写如下

     

    //批量处理读取图片函数
    vector<pair<char*,Mat>>  read_img(const string& dir)
    {
        CStatDir statdir;
        pair<char*,Mat> pfi;
        vector<pair<char*,Mat>> Vp;
        if (!statdir.SetInitDir(dir.c_str()))
        {
            return Vp;
        }
        int cls_id = dir[dir.length()-1]-'0';
        vector<char*>file_vec = statdir.BeginBrowseFilenames("*.jpg");
        int i,s = file_vec.size();
        for (i=0;i<s;i++)
        {
            pfi.first = file_vec[i];
            pfi.second = imread(file_vec[i],0);
            Vp.push_back(pfi);
        }
        file_vec = statdir.BeginBrowseFilenames("*.bmp");
        s = file_vec.size();
        for (i=0;i<s;i++)
        {
            pfi.first = file_vec[i];
            pfi.second = imread(file_vec[i],0);
            Vp.push_back(pfi);
        }
        file_vec = statdir.BeginBrowseFilenames("*.png");
        s = file_vec.size();
        for (i=0;i<s;i++)
        {
            pfi.first = file_vec[i];
            pfi.second = imread(file_vec[i],0);
            Vp.push_back(pfi);
        }
        return Vp;
    }

        处理当前目录下imgs文件夹下的所有文件,结果如下

    三、反思

         目前代码在部署的时候还可以继续改进,目前需要将haarcascade_frontalface_default.xml拷贝到c:/目录下,需要创建c:/imgs文件夹并且将需要变换的图像拷贝到其中,并且创建d:/imgs文件夹。这是不方便的,但是作为一个原型,我没有继续优化。

         我认为比较关键的一点,就是根据你需要突出显示的对象,选择识别的人脸识别的算法。目的就是将人脸抹去,而将需要显示的区域显示出来。

         感谢阅读!希望能够对你有所帮助。



  • 相关阅读:
    关于浏览器及系统的判断
    toggle与slideToggle
    安卓与ios的不同处理
    关于常用循环遍历获取数据
    docker
    Mysql
    rabbitMQ的使用转载
    Git命令行
    vue项目创建完整版
    redis操作(str.hash.list.set)
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/4240043.html
Copyright © 2020-2023  润新知