Face Recognition with FaceNet - Yy's Program
文章推薦指數: 80 %
Face Recognition with FaceNet. Google在2015年提出透過深度學習的方式處理人臉辨識的系統FaceNet 該 ... 2019年7月16日星期二 FaceRecognitionwithFaceNet Google在2015年提出透過深度學習的方式處理人臉辨識的系統FaceNet 該論文的連結可參考此處 很快的這個方法就席捲了人臉辨識的應用 許多過去傳統的人臉辨識演算法都不敵FaceNet 在論文中提到,其採用LFW人臉資料庫進行benchmark 並以99.63%的準確率,打破了過去的紀錄 而在YouTubeFaces人臉資料庫也進行了測試 依舊創下高達95.12%的準確率 若是想要研究人臉辨識,一定要認識FaceNet 關於原文版本如果不好閱讀,可參考下面這篇翻譯版 中文翻譯的易讀版 核心的部份這邊就不多談了 簡單說一下FaceNet的運作流程 一般認為深度學習的方式就是透過訓練資料進行學習 訓練好的Model能夠辨識各種不同種類的物件 因此當你input一個圖檔,他能output一個類別名稱給你 例如傳入一張貓的圖片,就會輸出"貓"這個類別出來,如下圖: 那人臉辨識要怎麼運作?? 傳入一張周杰倫的照片,就會輸出"周杰倫"這個類別出來嗎? 但深度學習的訓練需要大量的資料以及時間 人臉辨識有辦法做嗎? 每次要增加一個人,是不是要準備大量的照片?然後還要很長的訓練時間? 上述這樣實在太不合乎使用邏輯了 因此FaceNet的做法並非輸出分類結果 而是輸出量化特徵值,如下圖: FaceNet的產出就是Embeddings(128或512個特徵值) (舊版的Pre-TrainedModel產生128個特徵值、新版的產生512特徵值) 當你傳入一張周杰倫的照片,FaceNet輸出128個特徵值 當你傳入一張郭富城的照片,FaceNet輸出128個特徵值 只要將兩個結果做歐式距離(EuclideanDistance)的計算 值越小代表這兩張臉越相似,值越大代表差異越大 因此這樣的作法是不是很簡單呢!! 基本上的流程會如下圖: 1.先進行人臉偵測,取出人臉的影像 2.人臉影像前置處理(resize、prewhiten) 3.把處理後的影像給FaceNet進行運作 4.取得特徵值並計算歐式距離 5.計算的distance小於閥值則認為是同一個人 (正常計算出來的dinstance介於0~2之間) 因此當你開始要研究如何實作的時候 google上只能找到python... (廢話...原作者就已經提供python的程式了...) 或是頂多找到c++的程式 因此這大概又是全世界第一篇用C#來實作的介紹... 要用C#跑TensorFlow,前面的文章有介紹過幾個 大致上就是TensorFlowSharp以及EmguTF 這裡以EmguTF作為範例 首先先下載FaceNet已經處理好的Pre-TrainedModels 可直接在GitHub的頁面下載 下載下來後 只要取其中的.pb檔即可,如下圖: 依照原有既定的邏輯 要先處理人臉偵測,而人臉偵測可以參考上一篇介紹的方法 整個範例採用EmguTF套件與EmguCV套件來實作 這裡實作了,如何讀入剛剛所下載的Pre-TrainedModel 並建立TFSession 與 TFGraph 接著透過EmguCV把人臉的影像讀進來 偵測出人臉後,把人臉的影像節取出來,並進行Resize FaceNet需Resize至160x160的大小 resize後的image需轉換成Tensor物件 轉換程式可以參考EmguTF的範例程式TensorConvert.cs 這裡使用的版本如下: 將影像的Mat傳入,取得該影像的Tensor物件:tensorImage 以上都算是比較簡單的部分 再來的處理就比較麻煩 第一個是SessionRun的實作 來看一下原始Python的SourceCode:compare.py 在sess.run裡面會帶入一個參數feed_dict,包含images跟一個False 但是在EmguTF的Tensor物件並沒有帶入bool的建構式 所以必須自行在EmguTF的SourceCode加入一個新的建構式 才能建立一個newTensor(false)物件 接著透過以下的程式進行處理 SessionRun的方式如下,並取得特徵值boxes boxes就是一個一維陣列(128或512個值) 利用這個值,進行歐式距離的計算 即可求出每個人臉的差異結果 Distance的求法很簡單,如下: 用上述的方法就可以求出兩個相同長度的一維陣列的歐式距離 以上的做法可以順利把人臉的影像傳進去給FaceNet 並取得一個一為陣列boxes的值 於是開始著手進行準備資料 收集了150個人的人臉照片,平均一個人1~6張不等作為訓練照片 藝人的照片占多數為主 接著再準備上述150個人,另外500張人臉照片作為測試 500張測試照,角度不同,甚至還有黑白照片 但依據這樣的實作會發現 計算出來的distance值,好像不太準耶?? 無論Threshold的值如何訂,準確率都很低 大概只有不到20%...整個傻眼... 在仔細研究原專案的SourceCode:facenet.py 會發現該專案把影像傳給FaceNet時 會先進行一些前處理,包含一個叫做prewhiten的方法 這個看似簡單的方法,卻至關重要!! 裡面使用了叫做Numpy的python套件 是一個方便處理矩陣運算的工具套件 np.mean、np.std、np.maximum、np.multiply...一連四個矩陣運算 如果今天要改實作到別的語言... 只能去爬Numpy中這幾個方法的邏輯 然後...自己實作 也可以參考C++的sourcecode,裡面有OpenCV的語法可以參考 實作完成後,將人臉影像進行上述的影像處理運算 再傳入FaceNet取得特徵值進行比對 實測了目前GitLab提供的兩個新的Model 20180408-102900.pb以及 20180402-114759.pb (這兩個Model會產出512個特徵值) 以及一個舊的Model 20170512-110547.pb (產出128個特徵值) 一樣的測試資料,閥值訂在0.8 20180408-102900.pb ==> 70.3% 20180402-114759.pb ==> 84.5% 20170512-110547.pb ==> 93.8% 舊版的Model實測出:93.8%的準確率!!! AMAZING!! 雖然不太理解為什麼舊版的測試效果反而比較好XDD 而且版本之間的準確率落差還蠻巨大 由於藝人的照片是上google隨便亂抓的 有奇怪的光源、角度、甚至不同年代的妝容 因此藝人的照片算是拉低了很多辨識率 但就以20170512-110547.pb的實測結果 辨識率還是相當驚人呢!!! 而後續提出的新的Model 也提出了新的計算距離的算法 可嘗試使用cosinesimilarity來計算兩個一維陣列的距離 或許還可以得到更好的辨識效果呢!! 張貼者: yy 於 凌晨2:32 以電子郵件傳送這篇文章BlogThis!分享至Twitter分享至Facebook分享到Pinterest 標籤: 人臉辨識, C#, EmguCV, emgutf, facerecognition, FaceNet, tensorflow, TensorFlowSharp 2則留言: 達Ming2020年9月17日晚上11:28請問一下,你的明星人面庫是那裡下載的?謝回覆刪除回覆yy2020年9月28日晚上8:57自己上網抓的刪除回覆回覆回覆新增留言載入更多… 較新的文章 較舊的文章 首頁 訂閱: 張貼留言(Atom) yy 檢視我的完整簡介 熱門文章 使用EmguCV 影像辨識-YOLOdarknet編譯建置方法 C#影像處理的速度極限 EmguCVImageProcess:Manipulatingthepixelspart1 C#有關async/await的實作方式 TrainingTesseractOCR3.0.1 從AI到deeplearning影像辨識 C#YOLOWrapper:Alturos.Yolo VisualStudio2012建立安裝專案 EmguCVImageProcess:Manipulatingthepixelspart2 網誌存檔 ► 2020 (3) ► 七月 (1) ► 六月 (1) ► 五月 (1) ▼ 2019 (13) ► 十一月 (1) ▼ 七月 (1) FaceRecognitionwithFaceNet ► 六月 (1) ► 五月 (1) ► 四月 (3) ► 二月 (3) ► 一月 (3) ► 2013 (26) ► 十一月 (1) ► 十月 (2) ► 九月 (1) ► 八月 (2) ► 七月 (2) ► 六月 (3) ► 五月 (4) ► 四月 (2) ► 三月 (2) ► 二月 (3) ► 一月 (4) ► 2012 (25) ► 十二月 (4) ► 十一月 (3) ► 十月 (3) ► 九月 (4) ► 八月 (6) ► 七月 (5) 標籤 C# (57) .NET (53) Image (38) EmguCV (37) ImageProcess (37) 影像辨識 (6) Capture (5) Video (5) VideoProcess (5) Windows (5) filtering (5) imagerecognition (5) objectrecognition (5) tensorflow (5) AI (4) Erode (4) Func (4) VisualStudio2010 (4) YOLO (4) cornersdetection (4) darknet (4) dilate (4) emgutf (4) histogram (4) Bitmap (3) CI/CD (3) Canny (3) Cannyalgorithm (3) Morphological (3) ObjectDetection (3) VisualStudio2017 (3) WindowsForm (3) WindowsService (3) buildserver (3) edgesdetection (3) gitlab (3) gitlabrunner (3) 侵蝕 (3) 形態學 (3) 擴張 (3) 物件辨識 (3) 邊緣偵測 (3) Alturos.Yolo (2) Backprojecting (2) Closing (2) CvInvoke (2) DNN (2) GPU (2) Houghtransform (2) MSVS2017 (2) OpenCV (2) OpenCV3.4.0 (2) Performance (2) SURF (2) Sobelfilter (2) SpeededUpRobustFeatures (2) TensorFlowSharp (2) VisualStudio2012 (2) YOLOv3 (2) connectedcomponents (2) cuda10.0 (2) cudnn (2) cudnn64_7.dll (2) cvFindFundamentalMat (2) epipolarlines (2) extractingcontours (2) fundamentalmatrix (2) linesdetection (2) x64 (2) 物件偵測 (2) 閉鎖 (2) AP (1) AlexeyAB.darknet (1) AppDomain (1) AppDomainSetup (1) BackgroundSubstractorMOG2 (1) BeginInvoke (1) BruteForceMatcher (1) CPU (1) ColorDialog (1) Computervision (1) DLL (1) Error1001 (1) FN (1) FP (1) FaceNet (1) Fastdetection (1) FeatureDetection (1) FeatureTracking (1) FeaturefromAcceleratedSegmentTest (1) FitLine (1) GCA憑證 (1) GTX1080Ti (1) Gaussianfilter (1) GrabCut (1) Haarcascades (1) HarrisCorner (1) InstallShieldLE (1) Laplacian (1) Line2DFitting (1) Log4Net (1) MVC (1) Meanfilter (1) Medianfilter (1) Memory (1) Model-View-Controller (1) OCR (1) OpenFileDialog (1) Opening (1) Orca (1) PerformanceCounter (1) Process (1) RANSAC (1) RTX2070 (1) RTX2080 (1) Robertsoperator (1) SIFT (1) Saltandpeppernoise (1) Sandcastle (1) Scale-InvariantFeatureTransform (1) Scharroperator (1) ServiceController (1) Sobeloperator (1) System.BadImageFormatException (1) TN (1) TP (1) Task.Run (1) Tesseract (1) Tesseract3.0.1 (1) VideoWriter (1) Watershed (1) YOLOWrapper (1) YOLOv4 (1) Zero-crossing (1) app.config (1) approximatepolygon (1) artifacts (1) async (1) async/await (1) averageprecision (1) await (1) background (1) boundingrectangle (1) boxfilter (1) caffe (1) cameracalibration (1) certificatechain (1) circlesdetection (1) convexhull (1) convolution (1) cvComputeCorrespondEpilines (1) cvCornerHarris (1) cvFindHomography (1) cvInitUndistortRectifyMap (1) cvRemap (1) cvRunningAvg (1) cvWarpPerspective (1) deeplearning (1) enclosingcircle (1) facedetection (1) facerecognition (1) fast (1) firefox (1) foreground (1) goodfeaturestotrack (1) haarcascade_frontalface_alt2.xml (1) homography (1) hysteresisthresholding (1) imageclassification (1) imagepyramids (1) instancesegmentation (1) lock (1) mAP (1) meanshiftalgorithm (1) mixtureofGaussian (1) modelzoo (1) opencv_face_detector_uint8.pb (1) precision (1) probing (1) pyrDown (1) pyrUp (1) recall (1) res10_300x300_ssd_iter_140000_fp16.caffemodel (1) runningaverage (1) symmetricalmatchingscheme (1) tensorflowmodelzoo (1) testingserver (1) x86 (1) xcopy (1) 人臉辨識 (1) 分水嶺演算法 (1) 去背 (1) 召回率 (1) 安全連線失敗 (1) 安裝專案 (1) 巨集 (1) 建置事件 (1) 影像切割,前景切割 (1) 憑證串鍊 (1) 憑證串鍊失敗 (1) 效能 (1) 斷開 (1) 準確率 (1) 監控 (1) 線段偵測 (1) 邊角偵測 (1) 非同步 (1) 訂閱 發表文章 Atom 發表文章 留言 Atom 留言 總網頁瀏覽量
延伸文章資訊
- 1Face Recognition with FaceNet - Yy's Program
Face Recognition with FaceNet. Google在2015年提出透過深度學習的方式處理人臉辨識的系統FaceNet 該 ...
- 2研究人員以AI技術產製人臉萬能金鑰,成功欺騙人臉辨識系統
... Latent Space Evolution」,透過AI技術產製9張人臉作為萬能金鑰,成功欺騙3大人臉辨識系統FaceNet、SphereFace及Dlib,成功機率約5成。
- 3人臉辨識模型Google Facenet 介紹與使用 - MakerPRO
本篇文章介紹Facenet 的辨識模型和架構,並在Keras 環境下實際測試。 近年來透過深度學習以及CNN,不但開啟了人臉辨識領域的新紀元,也讓傳統的LBP、HOG ...
- 4人臉辨識模型Google Facenet 介紹與使用 | 健康跟著走
人臉辨識模型- 本篇文章介紹Facenet的辨識模型和架構,並在Keras環境下實際測試。近年來透過深度學習以及CNN,不但開啟了人臉辨識領域的新...
- 5基於FaceNet之偽裝人臉身份辨識
本論文提出基於FaceNet之偽裝人臉身份辨識系統,其目的為當辨識目標穿著偽裝物品時,系統可以正確識別身份。系統使用Single Shot Multibox Detector (SSD)檢測臉部...