反人臉識别的思路和實作
一、基本知識和背景
人臉識别是非常經典的機器識别運用,目前已經在許多地方得到了使用。相關的算法原理和實作發展的都很發達,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]