一、caffe 和 docker的安裝編譯
- docker pull caffe鏡像(注意使用docker安裝省去安裝CUDA和cudnn的安裝。)
- 安裝相關依賴包
- 安裝opencv3(使用源碼安裝)
下載opencv源碼到 /opt 目錄下,解壓並進入opencv-3.1.0目錄;
mkdir build # 創建編譯的文件目錄
cd build cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j8 #編譯
sudo make install #安裝
//////////////////////////////////////////////////////////////////////////////////////////////
linux知識補充:
pkg-config --modversion opencv
pkg-config --libs --cflags opencv #查看gcc或g++編譯的CFLAGS,即頭文件路徑和動態庫路徑
注意的是靜態庫使用ar命令對 .o 文件操作創建的,文件以 .a 結束命名; 使用時在靜態庫名前加 --lib,如gcc -o hello main.c -L. -lmyhello
同理動態庫使用 gcc -shared -fPCI -o libmyhello.so hello.o 命令創建,文件以 .so 命名;
1、使用時記得把 libmyhello.so 復制到目錄 /usr/lib 中再跑 gcc -o hello main.c -L. -lmyhello; 因為一般Linux系統把/lib和/usr/lib兩個目錄作為默認的庫搜索路徑
2、或者添加linux的搜索路徑,在 /etc/ld.so.conf 文件中添加庫的搜索路徑;當靜態庫和動態庫同名時, gcc命令將優先使用動態庫。
如果 pkg-config --modversion查找不到版本,則手動添加opencv源碼的opencv4.pc文件到/usr/lib/pkconfig/;
opencv4.pc的目錄在 ~/Desktop/opencv-4.0.0-alpha/build/unix-install,可以使用 find ./ -name opencv4.pc 來在當前目錄往下查找
或者使用 export PKG_CONFIG_PATH=~/Desktop/opencv-4.0.0-alpha/build/unix-install:$PKG_CONFIG_PATH //opencv4.pc在源碼的路徑
然后使用$echo$PKG_CONFIG_PATH 來查看 PKG_CONFIG_PATH的路徑設置是什么。
//////////////////////////////////////////////////////////////////////////////////////////////////
4、安裝caffe和編譯
git clone https://github.com/BVLC/caffe.git
sudo cp Makefile.config.example Makefile.config
sudo gedit Makefile.config #開啟選項和設置路徑(cudnn,opencv 版本,python 接口層,python 路徑)
然后修改 caffe 目錄下的 Makefile 文件(NVCCFLAGS,LIBRARIES)
make all -j8 #編譯
sudo make runtest -j8 #跑自帶的測試
###編譯pycaffe
cd caffe
sudo make pycaffe -j8
5、下載模型VGG16預訓練模型:
sh data/scripts/fetch_faster_rcnn_models.sh
此腳本會下載好faster-rcnn的訓練好的模型,接着運行demo.py就可以運行示例程序了。具體過程看另外一篇關於demo源碼解析的博客.
///////////////////////////////////////////////////////////////////////////////////////////////////////////
caffe安裝編譯成功后,跑fast-cnn代碼時(Python tools/demo.py),會出現cudnn6不兼容該項目的錯誤,此時有兩種方法:
cd caffe-fast-rcnn
git remote add caffe https://github.com/BVLC/caffe.git
git fetch caffe
git merge caffe/master
最后注釋掉 self_.attr(“phase”) = static_cast(this->phase_); from include/caffe/layers/python_layer.hpp after merging.
這種方法有時候會成功,有時候則不會
手動修改文件
1. 用最新caffe源碼的以下文件替換掉faster rcnn 的對應文件
include/caffe/layers/cudnn_relu_layer.hpp, src/caffe/layers/cudnn_relu_layer.cpp, src/caffe/layers/cudnn_relu_layer.cu
include/caffe/layers/cudnn_sigmoid_layer.hpp, src/caffe/layers/cudnn_sigmoid_layer.cpp, src/caffe/layers/cudnn_sigmoid_layer.cu
include/caffe/layers/cudnn_tanh_layer.hpp, src/caffe/layers/cudnn_tanh_layer.cpp, src/caffe/layers/cudnn_tanh_layer.cu
2 用caffe源碼中的這個文件替換掉faster rcnn 對應文件
include/caffe/util/cudnn.hpp
至此可以使用訓練好的模型VGG16來檢測識別物體了。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
二、所用到的docker命令
docker rename 原容器名 新容器名 docker tag 41b730702607 opmaster/basic_server:devel //鏡像id ,改新鏡像名字和標簽
////////////////////////////////////////////////////////////
#使docker映射到本機host的GUI口來顯示,使用nvidia的GPU來創建容器,並提供交互(-it)的bash,設置數據卷來掛載共享數據,並命名容器名
sudo nvidia-docker run -it \
> -v /tmp/.X11-unix:/tmp/.X11-unix \
> -e DISPLAY=unix$DISPLAY \
> -e GDK_SCALE \
> -e GDK_DPI_SCALE \
> -v /home/csj/Desktop/caffe_docker_mnt/:/home/caffe_docker_mnt \
> --name shijie_caffe_container1 \
> 1febdeef0276 \
> /bin/bash
jupyter notebook --allow-root #使用jupyter notebook
//////////////////////////////////////////////////////////////////////////////////////////////////////////
sudo nvidia-docker start 2806cb9d9633
sudo nvidia-docker exec -it 2806cb9d9633 /bin/bash
sudo nvidia-docker commit 2806cb9d9633 shijie_image:v1 //保存改動的容器到鏡像
docker commit -m="First Image" -a="786389209" 7a15f99695c0 786389209/unbantu:17.10.0 #
* -m 提交的描述信息
* -a 指定鏡像作者
sudo nvidia-docker save shijie_image:v1 /home/shijie_docker/shijie_image.tar //保存鏡像為 .tar 文件到host本地目錄
sudo nvidia-docker load -i file-path
#注意load和import命令不同,前者導入鏡像到本地鏡像倉庫,后者只是導入一個快照,退出會回滾原始版本。
rm #刪除一個或多個容器
rmi #刪除一個或多個鏡像
#登錄docker並上傳鏡像
docker login
docker push 786389209/unbantu-test:lastest
三、cmake 的介紹
CMake是一個比make更高級的編譯配置工具,它可以根據不同平台、不同的編譯器,生成相應的Makefile或者vcproj項目。通過編寫CMakeLists.txt,可以控制生成的Makefile,從而控制編譯過程。CMake自動生成的Makefile不僅可以通過make命令構建項目生成目標文件,還支持安裝(make install)、測試安裝的程序是否能正確執行(make test,或者ctest)、生成當前平台的安裝包(make package)、生成源碼包(make package_source)、產生Dashboard顯示數據並上傳等高級功能,只要在CMakeLists.txt中簡單配置,就可以完成很多復雜的功能,包括寫測試用例。如果有嵌套目錄,子目錄下可以有自己的CMakeLists.txt。總之很強大!
比如Kdevelop中opencv的文件簡單的CMakeLists.txt:
cmake_minimum_required(VERSION 2.8) project(opencv) #工程名字 find_package(OpenCV REQUIRED) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") #opencv4必須添加對C++11的支持 add_executable(opencv main.cpp) target_link_libraries(opencv ${OpenCV_LIBS})