前言

在前面的《常見公開人臉數據集的獲取和製作自定義人臉數據集》文章中,我們已經介紹了常見的人臉數據集以及如何製作自己的數據集,在本章將要進行人臉識別的第二步人臉檢測。在人臉識別任務中,首先是需要檢查一張圖片中是包含有人臉,然後把這個人臉裁剪出來,然後使用臉部的關鍵點進行人臉對齊,最後使用人臉對比方式完成人臉識別。

MTCNN,Multi-task convolutional neural network(多任務卷積神經網絡),將人臉區域檢測與人臉關鍵點檢測放在了一起,總體可分爲P-Net、R-Net、和O-Net三層網絡結構。它是2016年中國科學院深圳研究院提出的用於人臉檢測任務的多任務神經網絡模型,該模型主要採用了三個級聯的網絡,採用候選框加分類器的思想,進行快速高效的人臉檢測。這三個級聯的網絡分別是快速生成候選窗口的P-Net、進行高精度候選窗口過濾選擇的R-Net和生成最終邊界框與人臉關鍵點的O-Net。和很多處理圖像問題的卷積神經網絡模型,該模型也用到了圖像金字塔、邊框迴歸、非最大值抑制等技術。

本項目源碼:https://github.com/yeyupiaoling/PaddlePaddle-MTCNN

環境

  • PaddlePaddle 2.0.1
  • Python 3.7

文件介紹

  • models/Loss.py MTCNN所使用的損失函數,包括分類損失函數、人臉框損失函數、關鍵點損失函數
  • models/PNet.py PNet網絡結構
  • models/RNet.py RNet網絡結構
  • models/ONet.py ONet網絡結構
  • utils/data_format_converter.py 把大量的圖片合併成一個文件
  • utils/data.py 訓練數據讀取器
  • utils/utils.py 各種工具函數
  • train_PNet/generate_PNet_data.py 生成PNet訓練的數據
  • train_PNet/train_PNet.py 訓練PNet網絡模型
  • train_RNet/generate_RNet_data.py 生成RNet訓練的數據
  • train_RNet/train_RNet.py 訓練RNet網絡模型
  • train_ONet/generate_ONet_data.py 生成ONet訓練的數據
  • train_ONet/train_ONet.py 訓練ONet網絡模型
  • infer_path.py 使用路徑預測圖像,檢測圖片上人臉的位置和關鍵的位置,並顯示
  • infer_camera.py 預測圖像程序,檢測圖片上人臉的位置和關鍵的位置即時顯示

數據集下載

  • WIDER Face 下載訓練數據WIDER Face Training Images,解壓的WIDER_train文件夾放置到dataset下。並下載 Face annotations ,解壓把裏面的 wider_face_train_bbx_gt.txt 文件放在dataset目錄下,
  • Deep Convolutional Network Cascade for Facial Point Detection 。下載 Training set 並解壓,將裏面的 lfw_5590 和 net_7876 文件夾放置到dataset下
  • 解壓數據集之後,dataset目錄下應該有文件夾lfw_5590net_7876WIDER_train,有標註文件testImageList.txttrainImageList.txtwider_face_train.txtwider_face_train_bbx_gt.txt

訓練模型

訓練模型一共分爲三步,分別是訓練PNet模型、訓練RNet模型、訓練ONet模型,每一步訓練都依賴上一步的結果。

第一步 訓練PNet模型

PNet全稱爲Proposal Network,其基本的構造是一個全卷積網絡,P-Net是一個人臉區域的區域建議網絡,該網絡的將特徵輸入結果三個卷積層之後,通過一個人臉分類器判斷該區域是否是人臉,同時使用邊框迴歸。與原論文不一樣,筆者去掉了關鍵迴歸。

- cd train_PNet 切換到train_PNet文件夾
- python3 generate_PNet_data.py 首先需要生成PNet模型訓練所需要的圖像數據
- python3 train_PNet.py 開始訓練PNet模型

第二步 訓練RNet模型

全稱爲Refine Network,其基本的構造是一個卷積神經網絡,相對於第一層的P-Net來說,增加了一個全連接層,因此對於輸入數據的篩選會更加嚴格。在圖片經過P-Net後,會留下許多預測窗口,我們將所有的預測窗口送入R-Net,這個網絡會濾除大量效果比較差的候選框,最後對選定的候選框進行Bounding-Box Regression和NMS進一步優化預測結果。與原論文不一樣,筆者去掉了關鍵迴歸。
- cd train_RNet 切換到train_RNet文件夾
- python3 generate_RNet_data.py 使用上一步訓練好的PNet模型生成RNet訓練所需的圖像數據
- python3 train_RNet.py 開始訓練RNet模型

第三步 訓練ONet模型

ONet全稱爲Output Network,基本結構是一個較爲複雜的卷積神經網絡,相對於R-Net來說多了一個卷積層。O-Net的效果與R-Net的區別在於這一層結構會通過更多的監督來識別面部的區域,而且會對人的面部特徵點進行迴歸,最終輸出五個人臉面部特徵點。

- cd train_ONet 切換到train_ONet文件夾
- python3 generate_ONet_data.py 使用上兩部步訓練好的PNet模型和RNet模型生成ONet訓練所需的圖像數據
- python3 train_ONet.py 開始訓練ONet模型

預測

  • python3 infer_path.py 使用圖像路徑,識別圖片中人臉box和關鍵點,並顯示識別結果

  • python3 infer_camera.py 使用相機捕獲圖像,識別圖片中人臉box和關鍵點,並顯示識別結果

參考資料

  1. https://github.com/AITTSMD/MTCNN-Tensorflow
  2. https://blog.csdn.net/qq_36782182/article/details/83624357
小夜