Caffe+flask CNN算法服務器搭建

前言

突然發現好久沒有寫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/47276967http://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.htmlhttp://caffe.berkeleyvision.org/installation.html,推薦的anaconda庫可以先不用安裝
- 把caffe download下來,在python文件夾裏有個requirement.txt,cd到該文件夾,執行for req in (catrequirements.txt);sudodopipinstall req; done來獲取依賴庫【建議換源:https://www.douban.com/note/302711300/】【更新:2017年3月13日 15:00:18 如果遇到packging.version的報錯,可以去直接用anaconda,或者去官網下載最新的pip然後安裝。如果用anaconda,貌似官網提示還需要跑一個adjust makefile.config的東西】
- 根據官網把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

配置事項

  1. caffe的路徑我在python的代碼中是專門寫了一個.py來管理的,項目下載後需要修改成你自己的路徑,當然你把caffe的環境路徑配置好也OK
  2. 注意保持項目本身的目錄結構,尤其是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人臉檢測出來以後基本沒有背景了,這也可能是一個比較大的影響因素吧【不準這鍋我不背】

參考資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章