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等算法模型来检测物体

引用

相关推荐
高洁011 小时前
大模型-高效优化技术全景解析:微调 量化 剪枝 梯度裁剪与蒸馏 下
人工智能·python·深度学习·神经网络·知识图谱
材料科学研究5 小时前
深度学习物理神经网络(PINN)!
python·深度学习·神经网络·pinn
星际棋手6 小时前
【AI】一文说清楚神经网络、机器学习、专家系统
人工智能·神经网络·机器学习
可触的未来,发芽的智生8 小时前
触摸未来2025-10-18:生成文字的小宇宙矩阵溯源
人工智能·python·神经网络·程序人生·自然语言处理
无风听海12 小时前
神经网络之链式法则
人工智能·深度学习·神经网络
生命是有光的1 天前
【深度学习】神经网络基础
人工智能·深度学习·神经网络
信田君95271 天前
瑞莎星瑞(Radxa Orion O6) 基于 Android OS 使用 NPU的图片模糊查找APP 开发
android·人工智能·深度学习·神经网络
StarPrayers.1 天前
卷积神经网络(CNN)入门实践及Sequential 容器封装
人工智能·pytorch·神经网络·cnn
一水鉴天1 天前
整体设计 逻辑系统程序 之29 拼语言+ CNN 框架核心定位、三阶段程序与三种交换模式配套的方案讨论 之2
人工智能·神经网络·cnn
ReinaXue1 天前
大模型【进阶】(六)QWen2.5-VL视觉语言模型详细解读
图像处理·人工智能·神经网络·目标检测·计算机视觉·语言模型·transformer