反人臉識別的思路和實現


反人臉識別的思路和實現

 

一、基本知識和背景

     人臉識別是非常經典的機器識別運用,目前已經在許多地方得到了使用。相關的算法原理和實現發展的都很發達,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文件夾。這是不方便的,但是作為一個原型,我沒有繼續優化。

     我認為比較關鍵的一點,就是根據你需要突出顯示的對象,選擇識別的人臉識別的算法。目的就是將人臉抹去,而將需要顯示的區域顯示出來。

     感謝閱讀!希望能夠對你有所幫助。

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM