近期研究了深度学习caffe框架,正当准备快乐使用时,发现网上教程过于零散,在mac/m2 silicon支持略差,在搭建这个框架的时候入了很多坑,遂准备整理一版方便后续学习和使用,以下enjoy~
Caffe介绍
Caffe(全称Convolutional Architecture for Fast Feature Embedding)是一个兼具表达性、速度和思维模块化的深度学习框架,由伯克利人工智能研究小组和伯克利视觉和学习中心开发。 虽然其内核是用C++编写的,但Caffe有Python和Matlab相关接口。
Caffe的优势
- 上手快:模型与相应优化都是以文本形式而非代码形式给出。
Caffe给出了模型的定义、最优化设置以及预训练的权重,方便立即上手。 - 速度快:能够运行最棒的模型与海量的数据。
Caffe与cuDNN结合使用,测试AlexNet模型,在K40上处理每张图片只需要1.17ms. - 模块化:方便扩展到新的任务和设置上。
可以使用Caffe提供的各层类型来定义自己的模型。 - 开放性:公开的代码和参考模型用于再现。
- 社区好:可以通过BSD-2参与开发与讨论。
准备工作
尝试过mac下部署caffe,但是一直出错,最终放弃选择了虚拟机
安装vmware
虚拟机也存在很多坑,首先m1/m2 silicon是arm架构,已经部署在电脑上的virtualbox只支持x86所以已经打不开了:{,遂尝试使用vmware fusion
- vmware fusion install
- ubuntu desktop environment install
安装caffe及依赖库
需要注意的是要在Make.config
做如下修改
- 由于是arm架构需要更新下连接地址,并且需要include opencv4
shell
# 查看opencv版本
pkg-config --modversion opencv4
shell
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial /usr/include/opencv4
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/aarch64-linux-gnu /usr/lib/aarch64-linux-gnu/hdf5/serial
- 需要指定python的lib和include
shell
PYTHON_LIBRARIES := boost_python38 python3.8
PYTHON_INCLUDE := /usr/include/python3.8 \
/usr/lib/python3/dist-packages/numpy/core/include
需要注意的是要在Makefile
做如下修改
shell
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5 opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs opencv_videoio
另外可以使用Anaconda来进行python版本管理,Anaconda附带了250个开源数据包,并且可以从Anaconda存储库中安装超过7500个其他包
部署问题
执行
css
make all -j16
问题1
kotlin
error: 'CV_LOAD_IMAGE_COLOR' was not declared in this scope
error: 'CV_LOAD_IMAGE_GRAYSCALE' was not declared in this scope
解决方案:
在 include/caffe/common.hpp
中新增如下代码(大概 70 行前后):
C++
// Supporting OpenCV4
#if (CV_MAJOR_VERSION == 4)
#define CV_LOAD_IMAGE_COLOR cv::IMREAD_COLOR
#define CV_LOAD_IMAGE_GRAYSCALE cv::IMREAD_GRAYSCALE
#endif
// See PR #1236
namespace cv { class Mat; }
如果还存在其他没有declare的话一般按照这个规律
ini
CV_FILLED => cv::FILLED
CV_ADAPTIVE_THRESH_GAUSSIAN_C => cv::ADAPTIVE_THRESH_GAUSSIAN_C
CV_* => cv::*
问题2
shell
# /lib/aarch64-linux-gnu/libgomp.so.1: cannot allocate memory in static TLS block
解决方案:
bash
find / -name libgomp.so.1
export LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libgomp.so.1
source ~/.bashrc
如果一切顺利,依次执行下面命令
go
make all
make test -j16
make runtest
make pycaffe
make pytest
进入python3环境,import caffe
如果没有报错,证明caffe这个包已经顺利安装好了~
Demo
caffe程序自带有一张小猫图片,存放路径为caffe根目录下的examples/images/cat.jpg, 可以用训练好的caffemodel来对其进行分类;
caffemodel(bvlc_reference_caffenet.caffemodel)
可以直接在浏览器里输入地址下载,也可以运行脚本文件下载。下载地址为:dl.caffe.berkeleyvision.org/bvlc_refere...
bash
python3 ./scripts/download_model_binary.py models/bvlc_reference_caffenet
准备均值文件和synset_words.txt文件
有了caffemodel文件,就需要对应的均值文件,在测试阶段,需要把测试数据减去均值 在调用脚本文件下载均值的时候,synset_words.txt文件,里面放的是1000个类的名称
bash
sudo sh ./data/ilsvrc12/get_ilsvrc_aux.sh
执行
- C++
bash
sudo ./build/examples/cpp_classification/classification.bin \
models/bvlc_reference_caffenet/deploy.prototxt \
models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel \
data/ilsvrc12/imagenet_mean.binaryproto \
data/ilsvrc12/synset_words.txt \
examples/images/cat.jpg
- python
bash
cd python
sudo python3 classify.py ../examples/images/cat.jpg result.npy
存在问题
-
在调用的时候会出现这个问题
scss_open() got an unexpected keyword argument 'as_grey'
解决方案: 定位到 caffe/python/caffe/io.py
-
用python方式会出现这个问题,并且结果没有打印
pythonMean shape incompatible with input shape
2.1.修改均值计算
ini# 定位到这一行 mean =np.load(args.mean_file) mean =mean.mean(1).mean(1)
2.2.修改文件,使得结果显示在命令行下
python# 定位到这一行 start = time.time() predictions = classifier.predict(inputs, not args.center_only) print("Done in %.2f s." % (time.time() - start)) imagenet_labels_filename = '../data/ilsvrc12/synset_words.txt' labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\t') top_k = predictions.flatten().argsort()[-1:-6:-1] for i in np.arange(top_k.size): print top_k[i], labels[top_k[i]]
分类结果
后续
借助caffe,结合例如ssd,RCNN,Faster R-CNN,yolo等算法模型来检测物体