反人臉識別的思路和實現
一、基本知識和背景
人臉識別是非常經典的機器識別運用,目前已經在許多地方得到了使用。相關的算法原理和實現發展的都很發達,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的參數需要取得大一點,這樣模糊的效果比較好。
封裝成函數,需要注意的是這里直接對圖像進行了修改
三)主要流程
反人臉識別臉部模糊的方法的主要流程就是識別出人臉,然后進行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文件夾。這是不方便的,但是作為一個原型,我沒有繼續優化。
我認為比較關鍵的一點,就是根據你需要突出顯示的對象,選擇識別的人臉識別的算法。目的就是將人臉抹去,而將需要顯示的區域顯示出來。
感謝閱讀!希望能夠對你有所幫助。