Mac m2部署caffe

近期研究了深度学习caffe框架,正当准备快乐使用时,发现网上教程过于零散,在mac/m2 silicon支持略差,在搭建这个框架的时候入了很多坑,遂准备整理一版方便后续学习和使用,以下enjoy~

Caffe介绍

Caffe(全称Convolutional Architecture for Fast Feature Embedding)是一个兼具表达性、速度和思维模块化的深度学习框架,由伯克利人工智能研究小组和伯克利视觉和学习中心开发。 虽然其内核是用C++编写的,但Caffe有Python和Matlab相关接口。

Caffe的优势

  1. 上手快:模型与相应优化都是以文本形式而非代码形式给出。
    Caffe给出了模型的定义、最优化设置以及预训练的权重,方便立即上手。
  2. 速度快:能够运行最棒的模型与海量的数据。
    Caffe与cuDNN结合使用,测试AlexNet模型,在K40上处理每张图片只需要1.17ms.
  3. 模块化:方便扩展到新的任务和设置上。
    可以使用Caffe提供的各层类型来定义自己的模型。
  4. 开放性:公开的代码和参考模型用于再现。
  5. 社区好:可以通过BSD-2参与开发与讨论。

准备工作

尝试过mac下部署caffe,但是一直出错,最终放弃选择了虚拟机

安装vmware

虚拟机也存在很多坑,首先m1/m2 silicon是arm架构,已经部署在电脑上的virtualbox只支持x86所以已经打不开了:{,遂尝试使用vmware fusion

  1. vmware fusion install
  2. ubuntu desktop environment install

安装caffe及依赖库

需要注意的是要在Make.config做如下修改

  1. 由于是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
  1. 需要指定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

存在问题

  1. 在调用的时候会出现这个问题

    scss 复制代码
    _open() got an unexpected keyword argument 'as_grey'

    解决方案: 定位到 caffe/python/caffe/io.py

  2. 用python方式会出现这个问题,并且结果没有打印

    python 复制代码
    Mean 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等算法模型来检测物体

引用

相关推荐
#include<菜鸡>4 小时前
动手学深度学习(pytorch土堆)-05-1神经网络
pytorch·深度学习·神经网络
985小水博一枚呀8 小时前
【梯度消失|梯度爆炸】Vanishing Gradient|Exploding Gradient——为什么我的卷积神经网络会不好呢?
人工智能·python·深度学习·神经网络·计算机视觉·cnn·numpy
wei_shuo1 天前
神经网络的公式推导与代码实现(论文复现)
人工智能·深度学习·神经网络
红米煮粥1 天前
神经网络-MNIST数据集训练
人工智能·深度学习·神经网络
水花花花花花1 天前
卷积神经网络
人工智能·神经网络·cnn
985小水博一枚呀2 天前
【梯度下降|链式法则】卷积神经网络中的参数是如何传输和更新的?
人工智能·python·深度学习·神经网络·机器学习·计算机视觉·cnn
Colddd_d2 天前
动手学深度学习(四)卷积神经网络-下
人工智能·神经网络·cnn
拓端研究室TRL2 天前
深度神经网络DNN、RNN、RCNN及多种机器学习金融交易策略研究|附数据代码
人工智能·rnn·神经网络·机器学习·dnn
沅_Yuan2 天前
Transformer-Adaboost多输入单输出回归预测神经网络【MATLAB】
神经网络·回归·transformer
水花花花花花2 天前
感知器神经网络
人工智能·深度学习·神经网络