Detectron概述
Detectron是Facebook FAIR開源了的一個目標檢測(Object Detection)平台。
用一幅圖簡單說明下Object Detection。如Mask R-CNN已經能夠做到多目標的Instance Segmentation。

圖片來源: Fei-Fei Li, Andrej Karpathy & Justin Johnson (2016) cs231n, Lecture 8 - Slide 8, Spatial Localization and Detection (01/02/2016). Available: http://cs231n.stanford.edu/slides/2016/winter1516_lecture8.pdf
Detectron項目項目自 2016 年 下半年啟動,基於Caffe2 ,目前支持大量機器學習算法和已經訓練好的模型。項目地址:https://github.com/facebookresearch/Detectron
其中目標檢測算法的實現包括:
Mask R-CNN (https://arxiv.org/abs/1703.06870)—Marr Prize at ICCV 2017
RetinaNet (https://arxiv.org/abs/1708.02002)—Best Student Paper Award at ICCV 2017
Faster R-CNN (https://arxiv.org/abs/1506.01497)
RPN (https://arxiv.org/abs/1506.01497)
Fast R-CNN (https://arxiv.org/abs/1504.08083)
R-FCN (https://arxiv.org/abs/1605.06409)
這些目標檢測算法主要使用以下卷積網絡架構:
ResNeXt{50,101,152} (https://arxiv.org/abs/1611.05431)
ResNet{50,101,152} (https://arxiv.org/abs/1512.03385)
Feature Pyramid Networks (https://arxiv.org/abs/1612.03144) (with ResNet/ResNeXt)
VGG16 (https://arxiv.org/abs/1409.1556)
Detectron配置
想要使用和理解其中各個方法,最基礎的一步就是能夠先配置好環境,將示例跑通,接下去也接着配置Detectron的機會,把GPU相關的配置再梳理一下。
1、GPU驅動
以往在linux下安裝顯卡驅動是一段非常東痛苦的經歷,搞得不好,一重啟就黑屏。如果是多顯卡的機器,也會遇到無法切換,或者各種版本不兼容的問題。
這兩年在ubuntu社區和NVIDIA官方的努力下,社區的PPA專有驅動基本已經相對穩定。
a)在安裝之前,首先確認你的電腦是否在BIOS上有secure boot,如果有進入BIOS,把secure boot 設置成disable。 (這設置十分重要,不然會出現無法安裝CUDA的情況)
b)如果之前已經自帶的NVIDIA驅動,需要刪除老的驅動
sudo apt-get –purge remove nvidia-glx nvidia-glx-new
sudo apt-get –purge remove nvidia-settings nvidia-kernel-common
c)確保萬無一失,在原有驅動刪除之后,需要將Ubuntu集成的開源驅動加入黑名單,即修改/etc/modprobe.d/blacklist.conf文件:
sudo gedit /etc/modprobe.d/blacklist.conf
d)在該文件中增加如下兩行:
blacklist nouveau
options nouveau modeset=0
e)然后需要確定你的顯卡對應的驅動版本,知道自己的顯卡型號后,可以利用官方提供的驅動下載查詢界面: NVIDIA 驅動查詢
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
f)接着在軟件中心的 software & updates中的Additional Drivers的標簽,找到和之前查到GPU驅動版本一致的條目,點擊apply changes
重啟之后應該就安裝好了。
Tips:在16.04中有遇到過,在Additional Drivers那個界面選擇了GPU驅動后,點擊apply changes無法更改的尷尬情況。
解決方法是直接使用命令行
sudo apt-get install nvidia-××× nvidia-prime (XXX為對應的驅動型號)
測試驅動是否安裝成功
nvidia-smi
如果出現了你的GPU列表,則說明驅動安裝成功了。
2、Cuda
cuda的安裝根據自己的系統選擇合適的版本,為了避免一系列可能會出現的問題,在安裝CUDA之前,可以進行一下安裝前的自檢,自檢可以參照官方給的文檔(CUDA安裝前自檢)
官網下載 cudnn 需要注冊帳號並登錄。官方下載網址
下載完成后,在文件所在的文件夾
sudo dpkg -i cuda-repo-ubuntu1604-×××××_amd64.deb (××××為官方版本號)
sudo apt-get update
sudo apt-get install cuda
如果是CUDA8.0可能會遇到gcc版本的不兼容問題,可以給GCC降級。
安裝完之后,配置cuda的環境變量,在文件~/.bashrc之后加上
gedit ~/.bashrc
export PATH=/usr/local/cuda-××/bin:$PATH (××是版本號)
export LD_LIBRARY_PATH=/usr/local/cuda-××/lib64:$LD_LIBRARY_PATH (××是版本號)
然后設置環境變量和動態鏈接庫,在命令行輸入
sudo gedit /etc/profile
在打開的文件里面加上(注意等號兩邊不能有空格)
export PATH=/usr/local/cuda/bin:$PATH
保存之后,創建鏈接文件
sudo gedit /etc/ld.so.conf.d/cuda.conf
在打開的文件中添加如下語句:
/usr/local/cuda/lib64
保存退出執行命令行:
sudo ldconfig
使鏈接立即生效。
Tips:之前在配置ZED雙目相機的,如果是 下載Local版的CUDA,都會在安裝ZED SKD時出現找不到CUDA8的提示。
在試了很多次之后,偶爾一次使用了CUDA下載頁面中的 deb(network)版本,然后就成功了。 所以建議采用deb的方式安裝。
測試Cuda是否安裝成功:
cd /usr/local/cuda-××/samples/1_Utilities/deviceQuery (××為版本號)
sudo make
sudo ./deviceQuery
3、CuDNN
CuDNN是NVIDIA推出的針對深度學習的Cuda優化庫,可以幫助提升算法效率
ubuntu下使用deb比較方便,不需要自己設置環境變量
先安裝runtime庫,這里以cuda9.0為例。
sudo dpkg -i libcudnn7_7.0.3.11-1+cuda9.0_amd64.deb
再安裝dev庫
sudo dpkg -i libcudnn7-dev_7.0.3.11-1+cuda9.0_amd64.deb
4、配置Caffee2
Caffe2的安裝相比於caffe的安裝要簡單很多,不需要自己去配置Makefile.config,可以在make的時候,自動檢測GPU以各種庫,例如OpenCV。如果沒有就自動選擇不使用。
官方的安裝說明永遠是最好的說明
https://caffe2.ai/docs/getting-started.html?platform=linux&configuration=compile
這里也簡單梳理下流程。
首先確定系統和安裝方式,這里采用直接編譯源碼的方式。
安裝需要的庫
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential \
cmake \
git \
libgoogle-glog-dev \
libgtest-dev \
libiomp-dev \
libleveldb-dev \
liblmdb-dev \
libopencv-dev \
libopenmpi-dev \
libsnappy-dev \
libprotobuf-dev \
openmpi-bin \
openmpi-doc \
protobuf-compiler \
python-dev \
python-pip
sudo pip install \
future \
numpy \
protobuf
libgflags2根據系統選擇
# 對於 Ubuntu 14.04
sudo apt-get install -y --no-install-recommends libgflags2
# 對於 Ubuntu 16.04
sudo apt-get install -y --no-install-recommends libgflags-dev
對於GPU的相關依賴我們已經在上面完成配置了,caffe2也給了官方GPU配置的說明,也可以作為一種參考。
另外如opencv庫也可以根據自己的需要進行安裝
完成准備工作后就可以下載源碼進行編譯。
git clone --recursive https://github.com/caffe2/caffe2.git && cd caffe2
make && cd build && sudo make install
測試caffe2是否安裝成功
cd ~ && python -c 'from caffe2.python import core' 2>/dev/null && echo "Success" || echo "Failure"
如果是failure,試着cd到caffe2/build的文件夾里,然后執行
python -c 'from caffe2.python import core' 2>/dev/null
如果successful,說明是環境變量的設置問題,如果還是失敗,則會有具體的提示。
配置環境變量,編輯~/.bashrc
export PYTHONPATH=/usr/local:$PYTHONPATH
export PYTHONPATH=$PYTHONPATH:/home/**/devapp/caffe2/build (**為計算機名)
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
5、Detectron配置
還是那句話,最好的教程是官方的文檔。
https://github.com/facebookresearch/Detectron/blob/master/INSTALL.md
找個合適的文件位置進行clone
git clone https://github.com/facebookresearch/detectron
編譯python庫
cd DETECTRON/lib && make (DETECTRON表示你clone下來的文件夾)
測試是否編譯成功
python2 $DETECTRON/tests/test_spatial_narrow_as_op.py (DETECTRON表示你clone下來的文件夾)
如果遇到缺少庫的問題,可以根據報錯的信息把庫加上
另外的問題可以參見官方的Troubleshooting
6、Detectron簡單使用
參考
https://github.com/facebookresearch/Detectron/blob/master/GETTING_STARTED.md
訓練相關的我們放到之后去說,這里先說下利用已經訓練好的模型和算法框架來進行目標的檢測。
根據不同的需求,對象檢測可以分為幾種,1)Bounding box,2)Mask,3)KeyPoints
這里給出兩個例子,用mask和
python2 tools/infer_simple.py \
--cfg configs/12_2017_baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml \
--output-dir /tmp/detectron-visualizations \
--image-ext jpg \
--wts https://s3-us-west-2.amazonaws.com/detectron/35861858/12_2017_baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml.02_32_51.SgT4y1cO/output/train/coco_2014_train:coco_2014_valminusminival/generalized_rcnn/model_final.pkl \
demo
python2 tools/infer_simple.py \
--cfg configs/12_2017_baselines/e2e_keypoint_rcnn_R-101-FPN_s1x.yaml \
--output-dir /tmp/detectron-visualizations \
--image-ext jpg \
--wts https://s3-us-west-2.amazonaws.com/detectron/37698009/12_2017_baselines/e2e_keypoint_rcnn_R-101-FPN_s1x.yaml.08_45_57.YkrJgP6O/output/train/keypoints_coco_2014_train%3Akeypoints_coco_2014_valminusminival/generalized_rcnn/model_final.pkl \
demo
下面第一和第二個圖是Bounding box和Mask的效果,第三和第四個圖是Bounding box和人體骨骼keypoints的效果。


