首页 > 其他分享 >反人脸识别的思路和实现

反人脸识别的思路和实现

时间:2022-12-26 17:00:54浏览次数:58  
标签:src 人脸识别 实现 pfi 人脸 vec file 思路

反人脸识别的思路和实现

 

一、基本知识和背景

     人脸识别是非常经典的机器识别运用,目前已经在许多地方得到了使用。相关的算法原理和实现发展的都很发达,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();
}​



 

     二)脸部模糊

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

反人脸识别的思路和实现_批量处理_02

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

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

 



//人脸模糊

void blurFace(Mat src)



{    



    GaussianBlur(src,src,Size(19,19),19);



}



 

三)主要流程

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

 

反人脸识别的思路和实现_人脸识别_03

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

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

     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文件夹下的所有文件,结果如下

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

三、反思

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

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

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

 



​来自为知笔记(Wiz)​





反人脸识别的思路和实现

 

一、基本知识和背景

     人脸识别是非常经典的机器识别运用,目前已经在许多地方得到了使用。相关的算法原理和实现发展的都很发达,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();
}​



 

     二)脸部模糊

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

反人脸识别的思路和实现_批量处理_02

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

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

 



//人脸模糊

void blurFace(Mat src)



{    



    GaussianBlur(src,src,Size(19,19),19);



}



 

三)主要流程

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

 

反人脸识别的思路和实现_人脸识别_03

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

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

     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文件夹下的所有文件,结果如下

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

三、反思

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

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

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

 



​来自为知笔记(Wiz)​




标签:src,人脸识别,实现,pfi,人脸,vec,file,思路
From: https://blog.51cto.com/jsxyhelu2017/5969457

相关文章

  • FineUI通过js事件条用后台方法实现弹窗
    一、html标签的onclick事件<buttontype="button"class="btnUpdate"onclick="<%#GetEditUrl(Eval("DetailId"))%>">纠正</button>二、后台弹窗方法publicstrin......
  • 实现app短信验证码功能这样做就很简单!
    现在大多数app短信验证码服务都是由第三方服务商提供的,企业不需要对接运营商就可以让app具备三网发送短信功能,现在app短信验证码使用场景很多,比如说注册、登陆、支付等场景,a......
  • mysql实现limit分页
    1.背景:背景1:查询返回的记录太多了,查看起来很不方便,怎么样能够实现分页查询呢?背景2:表里有4条数据,如果只想要显示第2、3条数据怎么办呢?MySQL中使用LIMIT实现分页......
  • 用UL标签+CSS实现的柱状图
    <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""​​http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd​​​"><htmlxmlns="​​​http://ww......
  • 基于DJango和Pybind11,实现网络后端调用OpenCV算法
    本Blog来源于实际项目,所采用框架组合中,OpenCV实现算法主体、pybind11完成OpenCV的Python封装、django提供Web应用服务,三者协同配合,共同实现“网络后端调用OpenCV算法,解决特......
  • C# 第三方DLL,可以实现PDF转图片,支持32位系统、64位系统
    itextsharp.dll,是一个开源的在C#中用来生成PDF文档的库文件,不少C#爱好者用它制作出了PDF文档生成器。使用时只需在你的C#项目中添加引入此组件即可,使用方法网上有很多,自己查......
  • 前端实现导入,导出功能
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="wid......
  • 列存引擎 Tianmu 如何实现 Delete?| StoneDB 研发分享 #3
    作者:李红建责编:宇亭在第一期研发分享中,我们解释了,为什么Tinamu作为一款列式存储引擎在初期不支持Delete功能的原因,然后对一些友商列式存储引擎的Delete方案进......
  • c++ 使用socket实现C/S端文件的下载传输
    首先是服务器端,大致说下流程:服务器创建线程去处理应答accept(),当接受到客户端连接请求时,首先获取要发送的指定的文件数据总大小给客户端,接着就是循环读取要发送的文件数据......
  • Select I/O模型来实现一个并发处理多个客户端的TCP服务器
    #include<winsock2.h>#include<stdio.h>#pragmacomment(lib,“ws2_32.lib”)intmain(){//加载winsocketWSADATAws;intret;ret=WSAStar......