前言
突然發現好久沒有寫blog,github也很久沒有更新了,可能是因爲做的東西比較散很難有整套的東西share,而且也涉及到lab這邊的工作內容有些東西也不能我私人名義開源,這套東西姑且確認過是沒關係,所以就上傳一些姑且填充一下github和csdn的內容吧【笑】
項目地址
https://github.com/hirorogithub/CaffeWebApi
效果
簡介
- 用flask提供restful接口,來提供調用caffe的web api接口。
- 目前載入的有Caffe Model Zoo裏提供的一個age and gender classification 以及一個cascade的人臉檢測 一共三個model,提供人臉檢測,年齡識別和性別識別。
- 爲了簡單地展示效果,隨便寫了一個web界面
服務器環境搭建
Caffe環境本身挺好搭的,主要是CUDA的ubuntu環境一直是個大坑
不過其實如果運算量少不需要跑什麼訓練的話,用cpu mode和gpu mode沒有什麼區別,甚至可能gpu更慢,畢竟涉及到數據在內存和顯存之間的兩次copy。
我的機器環境:
Ubuntu 14.04(64bit) +GTX980
1.CUDA【需要g++】
- 去NVIDA下載CUDA,注意是否支持當前顯卡https://developer.nvidia.com/cuda-downloads
- ctrl+alt+f1進入本地控制檯,輸入帳號密碼登錄,鍵入:sudo service lightdm stop關閉圖形界面,
- sudo sh ./+解壓出來的run文件,接下來根據命令行提示輸入,基本按照默認值來就行。
- 可能需要重啓,再一次啓動後重覆上訴兩步即可安裝完成,如果怕不記得可以記錄下來log輸出的關於默認路徑之類的設置。
- 配置cuda的環境變量,在etc/profile裏,http://blog.csdn.net/qq632544991p/article/details/47276967,http://www.cnblogs.com/platero/p/3993877.html
- 可以在 /HOME/NVIDIA******SAMPLES/1_Utilities/deviceQuery/裏make一下試試看能不能運行,可以的話就沒啥問題了
2.cuDNN
- 去NVIDA下載cuDNN,解壓後把include裏的頭文件放到cuda路徑下的include裏,把lib64裏的文件放到cuda路徑下的lib64裏
- 接下來參考這裏http://www.cnblogs.com/platero/p/4118139.html
3.Caffe
- 參考caffe官網先把一堆依賴安裝上http://caffe.berkeleyvision.org/install_apt.html,http://caffe.berkeleyvision.org/installation.html,推薦的anaconda庫可以先不用安裝
- 把caffe download下來,在python文件夾裏有個requirement.txt,cd到該文件夾,執行for req in
- 根據官網把Makefile.config文件修改好(一般就是把 USE_CUDNN := 1給取消註釋,其他的根據實際需要來修改),
- 然後就可以make all make test make runtest 願上帝保佑【加上 -j效果更加 比如make all -j8】
- 別忘記編譯成功後編譯pycaffe 在caffe目錄下make pycaffe 可能需要numpy,sudo apt-get install python-numpy
4.flask
- flask用來做服務器的py框架,參考官網安裝http://docs.jinkan.org/docs/flask/installation.html#installation
配置事項
- caffe的路徑我在python的代碼中是專門寫了一個.py來管理的,項目下載後需要修改成你自己的路徑,當然你把caffe的環境路徑配置好也OK
- 注意保持項目本身的目錄結構,尤其是server文件裏面,flask指定了資源相關的東西的擺放位置
目錄說明
- img/:圖片上傳後的保存路徑
- imgout0/:運行cascade 人臉檢測後的中間輸出
- model/:caffe不同算法用到的pretrained model
- server/:主要源碼
- server/static:flask指定的資源放的位置,這裏我放了一些boostrap的資源
- server/templates:頁面模版,用來被flask渲染然後返回
源碼說明
- server.py :用flask提供restful接口,調用algrithm.py裏封裝好的相關算法,返回相應結果
- algrithm.py封裝caffe算法的接口,提供返回json 和python dict兩個版本的返回值的接口,以及提供參數是文件路徑或者圖片數據(numpy array)兩種接口,一共四種接口:
#gender api
#api that return json
def gender_japi_face(face):
return json.dumps(gender_api_face(face),indent=4)
def gender_japi_path(path):
return json.dumps(gender_api_path(path),indent=4)
#apt that return dict
def gender_api_face(face):
return gender_estimation.judge_gender_by_face(face)
def gender_api_path(path):
return gender_estimation.judge_gender_by_path(path)
- age_estimation.py/gender_estimation.py 提供調用caffe的接口,相應地封裝的兩個model,其實代碼幾乎一樣,只是一些細微差別,對於直接套model就能用的算法都可以用這套代碼擴展
- cascade_cnn_detect.py:cascade人臉檢測對外的接口,輸入img,返回rectangle
- load_model_functions.py:輔助cascade人臉檢測載入model
- face_detection_functions.py:cascader人臉檢測實際運行的代碼
- import_caffe.py :提供統一的導入cafffe的路徑
- templates/index.html:flask用的渲染模版,運算後的json結果會直接套到這個模版裏(當然這種實現方式有爭議),然後返回整個index.html給客戶端看
- 其餘的部分感覺沒有什麼地方可講,是一些輔助性的代碼
一些後話
- 接下來如果有空整理的話,會把在android端調用這個api的demo也上傳到github
- 從上圖其實可以看到age和gender的分類效果比較差,但是我這邊沒有資源去訓練,準確度依賴於model本身以及我輸入的圖,但是訓練的數據集大概是臉以外的背景相對比較多,cascade人臉檢測出來以後基本沒有背景了,這也可能是一個比較大的影響因素吧【不準這鍋我不背】
參考資料
- age and gender 的模型來源:
http://www.openu.ac.il/home/hassner/projects/cnn_agegender/ - cascade 人臉檢測paper以及來源參考:
《A Convolutional Neural Network Cascade for Face Detection》 - flask編寫參考:
https://zhuanlan.zhihu.com/p/23731819?refer=flask