shamangary's Blog

OpenFace Installation/Setup by Hand (安裝OpenFace)

| Comments

Target(目標):

The post is the setup guildeline of the OpenFace face recoginition sample code. Due to the development of the GPU and the Cuda version, the original installation guideline is not working for my computer. Therefore I record how did I setup the OpenFace step-by-step in order to save the time for the next people who need this.

由於在2016年之前,對於face recoginition這個問題已經有許多方法效果顯示為極好(Deepface,FaceNet),然而他們使用的training dataset都是私人的,並且可能不是寫在torch的介面上,是故我們torch7的使用者們來使用開源的OpenFace是個合適的選擇。然而,由於硬體和支援的軟體(GPU,Cuda)每年都在發展,是故不同的硬體可能不適用他的安裝方式,在此我記錄下自己的安裝方式以供之後的人參考。

OpenFace:

Home:
https://cmusatyalab.github.io/openface/
Setup: (This is not working for my environment. View on 2016/8/23)
https://cmusatyalab.github.io/openface/setup/

Environment(環境):

Ubuntu 14.04
Nvidia GTX 1070
Cuda 8.0

Required Library(必須的資料庫):

OpenCV

安裝OpenCV一直都是很麻煩的一件事情,特別是在你用了最新的GPU後很有可能舊的安裝方法或版本就不適用了,這裡記錄一下成功和失敗的版本。

Fail: OpenCV 2.4.11, OpenCV on the github (View on 2016/8/23)
Success: OpenCV 2.4.13

官網直接推薦你使用2.4.11,然而你會發現這跟Cuda 8.0不和,如果直接用github上的OpenCV也會不和,必須直接去OpenCV的官網下載2.4.13才能使用,估計大概是因為2016/5/19才更新的2.4.13有特別針對1070和Cuda 8.0做優化(這講起來也很合理,這硬體其實出現沒有多久)

選對了版本後安裝就按照官網的方式就很簡單了
http://docs.opencv.org/2.4/doc/tutorials/introduction/linux_install/linux_install.html

[compiler] sudo apt-get install build-essential
[required] sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
[optional] sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

cd ~/opencv
mkdir release
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
make
sudo make install

FFmepg

(Openface doesn't need this one, but I put it here for convenient.)
http://www.j4.com.tw/comp-qna/ubuntu-install-ffmpeg-and-obs-studio/
http://www.linuxquestions.org/questions/programming-9/lavdevice-not-found-4175441900/

Dlib

Fail: dlib-18.16
Sucess: dlib-19.1.0

https://pypi.python.org/pypi/dlib
由於直接使用OpenFace官網提供的我也無法成功,然而我去下載19.1.0之後按照他們網頁的安裝也無法成功,成功的是下載19.1.0後按照OpenFace的安裝方法安裝才成功(WTF)。

下載dlib-19.1.0並解壓縮下載的檔案後,執行下面動作,但會發現缺少Boost

cd dlib-19.1.0/python_examples
mkdir build
cd build
cmake ../../tools/python
cmake --build . --config Release
sudo cp dlib.so /usr/local/lib/python2.7/dist-packages

還好19.1.0裡面把怎麼安裝boost都寫好了,error一跑出來就知道怎麼修正,是故按照下面處理後,再回去上面安裝dlib即可

-- Could NOT find Boost
--  *****************************************************************************************************
--  To compile Boost.Python yourself download boost from boost.org and then go into the boost root folder
--  and run these commands: 
--     ./bootstrap.sh --with-libraries=python
--     ./b2
--     sudo ./b2 install
--  *****************************************************************************************************

Checking OpenCV and Dlib

如果上面都處理完了我們來確認一下是否有正確安裝好,OpenFace的官網也提供好了確認的方法

python2
import cv2
import dlib

---------2017/10/02更新-------------
如果遇到cv2 no module named cv2的話,用下面指令安裝即可

pip install opencv-python

如果什麼問題都沒有大概你就是裝好囉(^.<)V,我是說需要的資料庫而已

Torch7

接下來Torch本身也是有許多需要的東西的,官網提供如下

dpnn
nn
optim
csvigo
cutorch and cunn (only with CUDA)
fblualib (only for training a DNN)
tds (only for training a DNN)
torchx (only for training a DNN)
optnet (optional, only for training a DNN)

其中比較常見的是(nn, cutorch, cunn)因為一般的CNN和程式都需要用到這三個
雖然呢雖然,官網說可以用以下命令一次全部裝完

**Warning: DO NOT USE THE FOLLOWING COMMAND**

for NAME in dpnn nn optim optnet csvigo cutorch cunn fblualib torchx tds; do luarocks install $NAME; done

但是呢我用了一下torch就整個爆掉了呢呵呵呵呵呵呵呵呵呵(╯-_-)╯ ~╩╩
所以我又刪掉了整個torch重裝了一次◢▆▅▄▃ ╰(ʘдʘ╬)╯ ▃▄▅▆◣

還好torch是很親民的,刪也簡單灌也簡單,Torch7的官網寫的很清楚(由此可知好的開源維護是多麼重要)
http://torch.ch/docs/getting-started.html#_

回過頭來,審視了一下OpenFace的code,估計八成是因為cutorch和cunn不太能重裝(我也不知道為什麼),所以我們拿掉已經有的(nn, cutorch, cunn)這三者再試一次
2017/07/18更新:有時候重新安裝torch的時候會失敗,也是因為cutorch等等的問題,原因是當torch更新的時候,他們很可能會需要新的cuda或是cudnn,這時候你可能就要先更新他們,你再安裝torch就不會有問題了。

for NAME in dpnn optim optnet csvigo fblualib torchx tds; do luarocks install $NAME; done

這樣就安裝成功了,並且沒有出現問題,是故我們以後在安裝其他東西的時候要小心不要動到cutorch或cunn之類的東西會比較好。

順帶一提只有STN在安裝的時候比較麻煩一點,但在OpenFace中並不需要我們只是順便一提而已

Install STN
luarocks install https://raw.githubusercontent.com/qassemoquab/stnbhwd/master/stnbhwd-scm-1.rockspec

OpenFace

安裝前置蠻簡單的

sudo python2 setup.py install
sh models/get-models.sh

順帶一提,他們官網的很多執行建議都沒有寫前標,例如說python2和th等等,可能是因為他在哪裡有執行某種環境變數,但我在這就是都寫上去就是。

Dataset

在開始之前,我們先說明之後會用到的比較大需要下載的dataset,下面自動和手動的都要下載才行
自動下載小dataset:
注意前面要寫bash而不是sh(我也不知道為什麼)

bash ./data/download-lfw-subset.sh

手動下載大dataset:
http://vis-www.cs.umass.edu/lfw/
我們下載前兩個(在網頁中要找一下):

#lfw:(put the content of this one into ./data/lfw/raw)
All images as gzipped tar file
(173MB, md5sum a17d05bd522c52d84eca14327a23d494)

#lfw-deepfunneled:(put the content of this one into ./data/lfw/deepfunneled)
[new] All images aligned with deep funneling 
(111MB, md5sum 68331da3eb755a505a502b5aacb3c201)

還有pairs.txt的資訊也要手動下載,放到./data/lfw/的底下去
http://vis-www.cs.umass.edu/lfw/pairs.txt

上面四個下載完後,需要解壓縮的就解壓縮,然後都放到./data/底下,所以會有下面的資料夾和檔案

./data/lfw/raw
./data/lfw-subset
./data/lfw/deepfunneled
./data/lfw/pairs.txt

Demo

很奇怪的是有幾個需要web的demo我通通都無法執行,上網查了目前還無法解決。

Demo3倒是可以執行
http://cmusatyalab.github.io/openface/demo-3-classifier/
首先Demo3最下面的"Minimal Working Example to Extract Features"不用下載lfw-subset也可以執行

##Minimal Working Example to Extract Features
#command (remember to add "python2" and "th")
mkdir -p classify-test/raw/{lennon,clapton}
cp images/examples/lennon-* classify-test/raw/lennon
cp images/examples/clapton-* classify-test/raw/clapton
python2 ./util/align-dlib.py classify-test/raw align outerEyesAndNose classify-test/aligned --size 96
th ./batch-represent/main.lua -outDir classify-test/features -data classify-test/aligned

#warning
OpenBLAS Warning : Detect OpenMP Loop and this application may hang. Please rebuild the library with USE_OPENMP=1 option.

#output
nImgs:  4
Represent: 4/4

#How to fix the warning?
-- Add this line to the function "repBatch()" inside "./batch-represent/batch-represent.lua"
torch.setnumthreads(1)

上面還是要注意加上python2和th就可以執行了,執行過程會出現warning是OpenBLAS和OpenMP的問題,不過似乎還是可以執行完成,這個原因似乎是因為torch某次更新把USE_OPENMP=1這個flag給移除了。
https://github.com/torch/ezinstall/issues/26
藉由限制thread的數目我們也可以解決這個問題了。

Preprocessing

接下來我們看一下Demo3和Training new neural network models都有的前處理
http://cmusatyalab.github.io/openface/demo-3-classifier/
1. Create raw image directory
關於dataset,在Minimal Working Example to Extract Features中使用的只是幾張images,這裡我們對之後會使用的dataset進行一個下載的動作。

2. Preprocess the raw images

#Change 8 to however many separate processes you want to run: 
for N in {1..8}; do python2 ./util/align-dlib.py <path-to-raw-data> align outerEyesAndNose <path-to-aligned-data> --size 96 & done

#Prune out directories with less than 3 images per class with:
python2 ./util/prune-dataset.py <path-to-aligned-data> --numImagesThreshold 3

Replace <path-to-raw-data> and <path-to-aligned-data> by the path of step.1

3. Generate Representations

th ./batch-represent/main.lua -outDir <feature-directory> -data <path-to-aligned-data>

看到這裡可以發現"Minimal Working Example to Extract Features"就包含了前三步,可以視為一個完整的範例,但是第四步開始就不一樣了。

4. Create the Classification Model

執行第四步開始出現問題

#command
python2 ./demos/classifier.py train ./classify-test/features

#error1
Traceback (most recent call last):
  File "./demos/classifier.py", line 34, in <module>
    import pandas as pd
ImportError: No module named pandas

#error2 (after installing pandas)
Traceback (most recent call last):
  File "./demos/classifier.py", line 38, in <module>
    from sklearn.pipeline import Pipeline
ImportError: No module named sklearn.pipeline

補安裝,缺少的有pandas、Scipy、scikit-learn
https://www.scipy.org/install.html
http://scikit-learn.org/stable/install.html

sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose
sudo pip install -U scikit-learn

安裝完之後第四步也能跑了喔!!會show出下面的東西就是跑成功了。

/usr/local/lib/python2.7/dist-packages/sklearn/lda.py:4: DeprecationWarning: lda.LDA has been moved to discriminant_analysis.LinearDiscriminantAnalysis in 0.17 and will be removed in 0.19
  "in 0.17 and will be removed in 0.19", DeprecationWarning)
Loading embeddings.
Training for 2 classes.
Saving classifier to './classify-test/features/classifier.pkl'

Classifying New Images
上面好了的話接下來也不會有問題

#command
python2 ./demos/classifier.py infer ./models/openface/celeb-classifier.nn4.small2.v1.pkl images/examples/{carell,adams,lennon}*

#output
/usr/local/lib/python2.7/dist-packages/sklearn/lda.py:4: DeprecationWarning: lda.LDA has been moved to discriminant_analysis.LinearDiscriminantAnalysis in 0.17 and will be removed in 0.19
  "in 0.17 and will be removed in 0.19", DeprecationWarning)

=== images/examples/carell.jpg ===
Predict SteveCarell with 0.97 confidence.

=== images/examples/adams.jpg ===
Predict AmyAdams with 0.81 confidence.

=== images/examples/lennon-1.jpg ===
Predict SteveCarell with 0.50 confidence.

=== images/examples/lennon-2.jpg ===
Predict DavidBoreanaz with 0.43 confidence.

Running The LFW Experiment

http://cmusatyalab.github.io/openface/models-and-accuracies/
接著進入最重要的部份,實作LFW的實驗,但是根據官網的流程走就可以了,還是記得自己加上python2和th之類的前標。

for N in {1..8}; do python2 ./util/align-dlib.py data/lfw/raw align outerEyesAndNose data/lfw/dlib-affine-sz:96 --size 96 & done

python2 ./util/align-dlib.py data/lfw/raw align outerEyesAndNose data/lfw/dlib-affine-sz:96 --size 96 --fallbackLfw data/lfw/deepfunneled

How to fix "out of memory" issue?
在執行下一個動作時我們需要注意兩點,
第一點,我們想要用cudnn加速,
第二點,我們想要使用很少的GPU記憶體(因為GTX1070只有8G的RAM),

首先我們到./batch-representation/opts.lua中把cuda的選項改成true
接下來我們改動./batch-representation/batch-representation.lua的code
加上一個require

require 'cutorch'

在repBatch()這個function中改寫如下

function repBatch(paths, inputs, labels, batchSz)
   batchNumber = batchNumber + batchSz
   -- number of threads
   torch.setnumthreads(1)
   --[[
   if opt.cuda then
      inputs = inputs:cuda()
   end
   --]]
   --print(inputs:size())

   if opt.cuda then
         embeddings  = torch.CudaTensor(inputs:size(1),128)
         local embeddingsSplit = embeddings:split(10)
         for j,v in ipairs(inputs:split(10)) do
            v_temp = v:cuda()
            embeddingsSplit[j]:copy(model:forward(v_temp))
         end
         embeddings = embeddings:float()
   else
         embeddings = model:forward(inputs):float()
   end
   
   if opt.cuda then
      cutorch.synchronize()
   end

   if batchSz == 1 then
      embeddings = embeddings:reshape(1, embeddings:size(1))
   end

   for i=1,batchSz do
      labelsCSV:write({labels[i], paths[i]})
      repsCSV:write(embeddings[i]:totable())
   end

   print(('Represent: %d/%d'):format(batchNumber, nImgs))
end

注意為何要如此改寫,因為直接把inputs轉成cuda會需要很多的memory,因此我們不要用inputs:cuda(),
而且我們也不想要直接使用forward,我們把最後的embeddings切成很多份(10份),每份分開作forward,
(這種切法是參考pnnet的evaluation.lua,他的code裡面真的很多東西可以學習)
並且只在每個iteration中把inputs的切塊v進行cuda(),也就是v_temp = v:cuda()
如此一來可以避免需要很多memory的問題

接著我們執行下一步就會又快又需要很少的GPU memory

th ./batch-represent/main.lua -outDir evaluation/lfw.nn4.small2.v1.reps -model models/openface/nn4.small2.v1.t7 -data data/lfw/dlib-affine-sz:96

Evaluation
執行之前發現有錯誤,是因為matplotlib的版本太舊只有1.3.1,然而好像只有1.4以上有支援style這個東西,是故我們先升級一下

sudo pip install --upgrade matplotlib

升級完的確認

#command
python2
import matplotlib
matplotlib.__version__

#output
'1.5.2'

接著我們就能執行後面了。

後來發現他在做evaluation的時候需要pairs.txt,但是他的預設路徑可能跟你放的不太一樣,因為你存放openface-master的地方可能跟他的路徑不同,是故我們用--lfwPairs指定pairs.txt的位置

#command
cd evaluation

python2 ./lfw.py nn4.small2.v1 lfw.nn4.small2.v1.reps --lfwPairs ../data/lfw/pairs.txt

#output
/usr/local/lib/python2.7/dist-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.
  warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')
Loading embeddings.
  + Reading pairs.
  + Computing accuracy.
    + 0.9292
Plotting.

官網提供的數據如下

# https://cmusatyalab.github.io/openface/models-and-accuracies/
Model                     Accuracy          AUC
nn4.small2.v1 (Default) 0.9292 ± 0.0134    0.973
nn4.small1.v1           0.9210 ± 0.0160    0.973
nn4.v2                  0.9157 ± 0.0152    0.966
nn4.v1                  0.7612 ± 0.0189    0.853
FaceNet Paper (Ref)     0.9963 ± 0.009 not provided

可以看出0.9292是符合預期的結果的,注意這裡的AUC是指ROC curve下的面積,和accuracy是不同的。

Training new neural network models

好啦還有些東西沒用完我們再回來,
官網中特別提醒了training DNN來取feature和training classification model是兩件完全不同的事情,這要特別記得一下,因為這裡的DNN只有拿來取feature而已

接著我們來follow官網:https://cmusatyalab.github.io/openface/training-new-models/
然而他有漏掉一些步驟沒有說明清楚

注意,這個地方其實必須要下載caisa dataset和facescrub dataset是兩個不同的dataset,所以如果你直接複製lfw過去當做training就是在training和testing都用一樣的東西,實驗結果是無意義的。(meaningless)

--------------------2017/07/18更新(start)--------------------
Download CASIA (complex): 需要寄信給簽名並等待回覆

1. Go to
http://www.cbsr.ia.ac.cn/english/CASIA-WebFace-Database.html

2. Follow the steps

Download Instructions: 
To apply for the database, please follow the steps below:

(1)Download and print the document Agreement for using CASIA WebFace database
(2)Sign the agreement (The agreement must be signed by the director or the delegate of the deparmart of university. Personal applicant is not acceptable.)
(3)Send the agreement to cbsr-request@authenmetric.com
(4)Check your email to find a login account and a password of our website after one day, if your application has been approved.
(5)Download the CASIA WebFace database from our website with the authorized account within 48 hours.

Download facescrub (simple): 直接下載即可,要花一段時間

1. Download files from
https://github.com/faceteam/facescrub

2. Run the command
python download.py

這時候我感到有點困惑,因為facescrub和CASIA目錄下的命名方式和lfw是很不一樣的,例如說CASIA解壓縮後的資料夾其實都不是人名,而是數字,而facescrub底下人名資料夾的裡面,每張圖的命名幾乎是亂碼而不是按照數字編號,這樣我懷疑是否會影響到標準處理步驟?如果他們沒有直接用到名字的話,估計是可以的......吧。

我們接下來follow標準流程

#Facescrub dataset preprocessing
for N in {1..8}; do python ./util/align-dlib.py data/facescrub/download align outerEyesAndNose data/facescrub/dlib-affine-sz:96 --size 96 & done

#CASIA dataset preprocessing
for N in {1..8}; do python ./util/align-dlib.py data/CASIA/CAISA-WebFace align outerEyesAndNose data/CASIA/dlib-affine-sz:96 --size 96 & done

=====2017/08/08更新=====
上面的cmd雖然沒錯,但是因為CASIA dataset太大了,會導致遍歷全部資料夾的os.walk失效,以下方法似乎可以修正(不過似乎要電腦有SSD讀檔比較快才會開始跑,不然好像很慢甚至無法跑)

cd data/CASIA

for N in {1..8}; do python ../../util/align-dlib.py ./CAISA-WebFace align outerEyesAndNose ./dlib-affine-sz:96 --size 96 & done

此外注意因為有可能下載或是複製錯誤,要記得去除一些空的資料夾,或是圖片數目少於3的,下面一段有指示。
=====2017/08/08更新=====

第一個資料夾是你放下載下來並解壓縮圖檔的資料夾,
第二個資料夾是你想要output結果的地方,
注意我們把他們前處理後的images通通都放到"./data/casia-facescrub/dlib-affine-sz:96"底下
(總覺得很奇怪官網怎麼沒有這方面的說明(=A=)??)
我上面的程式碼是先分別放到自己下面,因為其實兩個都要執行很久,難保不會出現錯誤,
都處理完之後再把裡面的subfolders複製到"./data/casia-facescrub/dlib-affine-sz:96"底下就好。

然後我看到了這個連結https://github.com/cmusatyalab/openface/issues/6
他們說基本上像是Megaface這種沒有label的dataset在openface是無法training的,然而CASIA和facescrub沒有共通的命名方式,換句話說,只要有資料夾名稱,每個資料夾能把不同的人分開,應該就是openface所需要的label了。

接著到./data/casia-facescrub/的目錄看到remove-lfw-names.py,這個檔是為了移除跟lfw相同的名稱的資料夾,以避免training和testing有重複的情形,我們修改裡面的一行,就是對應的資料夾名稱而已

# data/casia-facescrub/remove-lfw-names.py
# line10
names = os.listdir('dlib-affine-sz:96')

你想命名什麼都可以,就是在執行這個檔的時候要記得用一樣的名字才能執行。

cd data/casia-facescrub/
python remove-lfw-names.py

接著來移除檔案夾裡面太少圖片的地方:

python ./util/prune-dataset.py data/casia-facescrub/dlib-affine-sz:96 --numImagesThreshold 3

--------------------2017/07/18更新(end)--------------------

Train the model

原本以為苦難已經過去了,但是沒想到還是持續著
根據官網指示接下來只要先調整 ./training/opt.lua裡面的參數,然後執行th ./training/main.lua即可,然而會發現有些問題

安裝缺少的函式庫

luarocks install graphicsmagick
sudo apt-get install graphicsmagick
sudo apt-get install libgraphicsmagick-dev
sudo apt-get update

由於我用的還是不是預設路徑,所以要自己設定

cd ./training
th ./main.lua -data ../data/casia-facescrub/dlib-affine-sz:55/

上面雖然是正確的指令,但是有些原始的code的小錯誤必須修正後才能跑

2017/07/18更新:training可能會發生錯誤,例如說你想用55x55的input但是改了opts.lua還是得到96x96的,原因是因為training也有cache,要把training/work/trainCache.t7刪掉重跑就可以了

下面在require的時候不知道為什麼一定要用file的方式才能work

# training/train.lua
# line23
local model = require './model.lua'
# line24
local openFaceOptim = require './OpenFaceOptim.lua'

然後記得下載並解壓縮https://github.com/Atcold/torch-TripletEmbedding/tree/742599ce761b2d6cf128068b8f6fd327ad633a31
把東西放到./training/torch-TripletEmbedding下面才可以,直接去openface下載好像不行,一定要去原本作者的github下載再放到這裡才行。

另外,在training/test.lua中的兩個command也是沒有前標的,記得去line50和line57加上去th和python2,並且記得指定pairs.txt的位置。

cmd = 'th '.. cmd .. ' -batchSize ' .. opt.testBatchSize ..
      ' -model ' .. latestModelFile ..
      ' -data ' .. opt.lfwDir ..
      ' -outDir ' .. outDir ..
      ' -imgDim ' .. opt.imgDim
   os.execute(cmd)

   cmd = 'python2 '.. lfwEval .. ' Epoch' .. epoch .. ' ' .. outDir .. ' --lfwPairs /media/tsunyi/0EF057F8F057E50D/codeDemo/openface-master/data/lfw/pairs.txt'
   os.execute(cmd)

「必須!」為了要testing,改變在opts.lua中的lfwDir

cmd:option('-lfwDir', '/media/tsunyi/0EF057F8F057E50D/codeDemo/openface-master/data/lfw/dlib-affine-sz:96', 'LFW aligned image directory for testing.')

由於就算改了這項你的cache還是可能是錯的,所以執行之前我們要到./data/lfw/把裡面的cache.t7刪掉才行(如果你可以正確執行的話就不用了)

另外在./training/test.lua中有蠻多修正的,我就直接把他的function test()貼出來,其中像是不要加上-cuda,因為我們直接在./batch-representation/opts.lua中已經改成true了,還有在command上加上pairs.txt的絕對路徑位置,還有他原始code的cmd並沒有擷取正確的model,要改成latestModelFile,總之下面就是我用的最後版本

function test()
   if opt.cuda then
      model = model:float()
   end
   local latestModelFile = paths.concat(opt.save, 'model_' .. epoch .. '.t7')
   local outDir = paths.concat(opt.save, 'lfw-' .. epoch)
   print(latestModelFile)
   print(outDir)
   local cmd = batchRepresent
   if opt.cuda then
      assert(opt.device ~= nil)
      cmd = cmd .. ' -device ' .. opt.device .. ' '
   end
   cmd = 'th '.. cmd .. ' -batchSize ' .. opt.testBatchSize ..
      ' -model ' .. latestModelFile ..
      ' -data ' .. opt.lfwDir ..
      ' -outDir ' .. outDir ..
      ' -imgDim ' .. opt.imgDim
   print(cmd)
      
   os.execute(cmd)

   cmd = 'python2 '.. lfwEval .. ' ' .. latestModelFile .. ' ' .. outDir .. ' --lfwPairs /media/tsunyi/0EF057F8F057E50D/codeDemo/openface-master/data/lfw/pairs.txt'
   print(cmd)
   --os.exit()
   os.execute(cmd)

   lfwAcc = getLfwAcc(paths.concat(outDir, "accuracies.txt"))
   testLogger:add{
      ['lfwAcc'] = lfwAcc
   }
end

雖然可以跑了(有accuracy出來),但是會發現圖沒有畫出來,是因為evaluation的comparisons路徑沒有給對,我們把它改成絕對路徑,下面幾項是在./evaluation/lfw.py中的路徑,根據你的資料夾路徑而改

# absolute path of the comparisons file folder in ./evaluation/lfw.py

openbrData = pd.read_csv("/media/tsunyi/0EF057F8F057E50D/codeDemo/openface-master/evaluation/comparisons/openbr.v1.1.0.DET.csv")
    
humanData = pd.read_table(
        "/media/tsunyi/0EF057F8F057E50D/codeDemo/openface-master/evaluation/comparisons/kumar_human_crop.txt", header=None, sep=' ')
    
deepfaceData = pd.read_table(
        "/media/tsunyi/0EF057F8F057E50D/codeDemo/openface-master/evaluation/comparisons/deepface_ensemble.txt", header=None, sep=' ')
    
eigData = pd.read_table(
        "/media/tsunyi/0EF057F8F057E50D/codeDemo/openface-master/evaluation/comparisons/eigenfaces-original-roc.txt", header=None, sep=' ')  

此外為了畫出來的圖漂亮,我們也修改一下./evaluation/lfw.py中的畫圖選項,新增一個epoch_tag當做畫圖的label

epoch_tag = tag.split('/')
epoch_tag = epoch_tag[-1] # choose the last element to be the label
ax.legend([humanPlot, dfPlot, brPlot, eigPlot,
           meanPlot, foldPlot],
          ['Human, Cropped [AUC={:.3f}]'.format(humanAUC),
           # 'Baidu [{:.3f}]'.format(baiduAUC),
           'DeepFace Ensemble [{:.3f}]'.format(deepfaceAUC),
           'OpenBR v1.1.0 [{:.3f}]'.format(brAUC),
           'Eigenfaces [{:.3f}]'.format(eigAUC),
           'OpenFace {} [{:.3f}]'.format(epoch_tag, AUC),
           'OpenFace {} folds'.format(epoch_tag)],
          loc='lower right')

我們再執行一次

th ./main.lua -data ../data/casia-facescrub/dlib-affine-sz:96/

發現一切都可以跑了,我的天啊真的是超麻煩。

如果training遇到困難,你可能要check幾個點:
1.有沒有改寫上面的path,將你自己的path填入正確的地方
2.執行錯誤可能跟cache有關,例如說刪除./data/lfw/dlib-affine:96/cache.t7重新執行後說不定就可以了

接下來至少我執行就沒有問題了.......(倒地
如果你發現了其他問題可以寄信或在下面留言補充。

==================2017/07/23更新(start)==================
1.在training過程中發現錯誤,少了某個人的資料夾,執行batch-representation時錯誤

可能是因為dlib無法正確對應到人臉的landmark進行align所以忽略了某個人,這時候要執行

python ./util/align-dlib.py data/lfw/raw align outerEyesAndNose data/lfw/dlib-affine-sz:96 --size 96 --fallbackLfw data/lfw/deepfunneled

其中fallbackLfw的意思是當dlib執行錯誤時,用deepfunneled中的檔案取代。
這錯誤可能就是你當初少執行了這一行這樣。

2.為何儲存下來的model超級大??以前好像不會

這是因為openface的寫法是先轉換model到nn,再進行clearState(),詳情請參考以下:
http://shamangary.logdown.com/posts/2067901

==================2017/07/23更新(end)==================

Comments

comments powered by Disqus