人臉識別(基於Caffe, 來自tyd)
人臉識別(判斷是否為人臉)
LMDB(數據庫, 為Caffe支持的分類數據源)
mkdir face_detectcd face_detectmkdir train valmkdir train/{0,1}mkdir val/{0,1}- 將人臉數據放到
train/1和val/1下 - 將非人臉數據放到
val/0和val/0下 vim train.txt
0/xxx.jpg 0
1/xxx.jpg 1
vim val.txt
1/xxx.jpg 1
0/xxx.jpg 0
- 拷貝Caffe自帶的腳本根據上面的train.txt和val.txt制作LMDB數據源, 名為
face_detect_lmdb.sh
# 修改部分
EXAMPLE=/home/jh/face_detect
DATA=/home/jh/face_detect
TOOLS=caffe安裝目錄/build/tools
TRAIN_DATA_ROOT=/home/jh/face_detect/train/
VAL_DATA_ROOT=/home/jh/face_detect/val/
# 對輸入的數據進行大小的調整, 大小的調整是要根據我們要使用的網絡模型, 比如AlexNet或者VGG(速度慢)為227x227
RESIZE=true
if $RESIZE; then
RESIZE_HEIGHT=227
RESIZE_WIDTH=227
else
RESIZE_HEIGHT=0
RESIZE_WIDTH=0
fi
# 接着修改GLOG_logtostderr那里的$DATA/train.txt, 這個為那個train.txt, $EXAMPLE/face_train_lmdb, 這個為生成的lmdb數據源的位置
# 下面也一樣, 修改為val.txt, $EXAMPLE/face_val_lmdb, 這個為val的lmdb數據源生成的位置
- 指定
face_detect_lmdb.sh腳本文件, 如果那些face_val_lmdb已經存在則直接報錯, 在執行過程中, 可能會出現Could not open ..., 這個沒有關系, 執行的細節為, 先配置train, 在配置val - 因為數據源很大, 大約4W, 我們生成的lmdb文件為好幾個GB, 再提一下, model大概為好幾百MB
模型調優
- 選擇更深的網絡, 改用VGG-16
- 調整學習率
- 圖像增強
訓練AlexNet網絡(忘了, 去網上找AlexNet的結構圖)
- 對AlexNet進行簡單的修改, 對最后的全連接層從1000改為2
- 創建train.prototxt文件, 在里面寫神經網絡結構
- 創建solver.prototxt文件
- 指定
test_iter, 測試多少個batch test_interval: 1000, 迭代1000次進行測試base_lr: 0.001: 基礎學習率max_iter: 10000: 最大迭代次數gamma: 0.1stepsize: 20000display: 1000: 每1000次迭代顯示一次momentum: 0.9weight_decay: 0.0005snapshot: 10000: 每個10000次保存一次modelsnapshot_prefix: "/path/to/model": 模型保存的目錄solver_mode: CPU: 使用CPU還是GPU
- 指定
執行模型
- 創建一個train.sh腳本
/path/to/caffe train --solver=/path/to/solver.prototxt
sh train.sh執行- 結束會生成一個模型文件(就一個, 就可以直接拿來用了)
網絡訓練速度限制
- 網絡大小
- 輸入數據的大小, 圖片大小
人臉檢測
-
Multi-Scale變換
- 進行多個Scale變換->會導致有多個bbox, 后續需要NMS
- 保存原始的bboxes, 在后續的時候通過scale factor映射到原始圖形上
-
滑動窗口
- 多尺度的Scale變換, 對小人臉(如50x50)進行放大轉為224x224, 對大臉進行縮小; 對原始圖像進行多此縮放, 也就是不斷的乘以scale factor知道到一個臨界值, 變成一個圖像金字塔
