天天看點

反人臉識别的思路和實作

反人臉識别的思路和實作

一、基本知識和背景

     ​人臉識别是非常經典的機器識别運用,目前已經在許多地方得到了使用。相關的算法原理和實作發展的都很發達,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();

    file_vec = statdir.BeginBrowseFilenames("*.png");

    return Vp;

    處理目前目錄下imgs檔案夾下的所有檔案,結果如下

反人臉識别的思路和實作

三、反思

     ​目前代碼在部署的時候還可以繼續改進,目前需要将haarcascade_frontalface_default.xml拷貝到c:/目錄下,需要建立c:/imgs檔案夾并且将需要變換的圖像拷貝到其中,并且建立d:/imgs檔案夾。這是不友善的,但是作為一個原型,我沒有繼續優化。

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

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

來自為知筆記(Wiz)

目前方向:圖像拼接融合、圖像識别

聯系方式:[email protected]

繼續閱讀