概述

有些算法基于老旧的caffe框架进行开发,对于算力有限的场景仍然有应用空间。caffe框架基于C/C++开发,源码逻辑清晰,便于验证和移植到嵌入式平台。一些老旧的嵌入式处理器的模型转换工具仅支持输入caffe模型文件。以上这些都是caffe框架的常见使用场景。

由于caffe框架过于老旧,依赖的库大都也比较老旧,库之间的依赖关系经常缺失导致安装失败,直接在主机上安装caffe环境常常会引起依赖库之间的版本冲突。这里用docker安装caffe环境,可以很方便地迁移。

安装docker环境

docker环境安装过程可以参考史上最全Docker环境安装指南

个人使用的docker容器与虚拟机没有本质的区别,按照下面docker镜像生成过程创建虚拟机效果是一样的。

创建docker镜像

caffe环境的docker镜像基于ubuntu 20.04 docker镜像创建,如果用虚拟机,相当于在虚拟机内安装ubuntu 20.04 server系统。

创建好的caffe环境的docker镜像下载地址见文章末尾。ubuntu和python镜像源上的软件包版本可能会随着时间推移发生变化或者缺失,因此以下创建步骤不能保证一直是有效的。

这里参考了很多网上的文章,大都不可行或者需要进行修改,相信都是软件包版本变化所导致。无法一一列出原始链接,这里对原作者表示感谢和歉意。

创建镜像时使用的文件

创建docker镜像时,创建脚本Dockerfile指定了从当前目录拷贝三个文件到镜像中:

文件名说明
sources.listubuntu 20.04的中国区更新源
pip.confpython包中国区更新源
requirements.txtCaffe环境依赖的python包

ubuntu 20.04的中国区更新源

文件名:sources.list

deb http://cn.archive.ubuntu.com/ubuntu/ focal main restricted
deb http://cn.archive.ubuntu.com/ubuntu/ focal-updates main restricted
deb http://cn.archive.ubuntu.com/ubuntu/ focal universe
deb http://cn.archive.ubuntu.com/ubuntu/ focal-updates universe
deb http://cn.archive.ubuntu.com/ubuntu/ focal multiverse
deb http://cn.archive.ubuntu.com/ubuntu/ focal-updates multiverse
deb http://cn.archive.ubuntu.com/ubuntu/ focal-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu focal-security universe
deb http://security.ubuntu.com/ubuntu focal-security multiverse

python包中国区更新源

文件名:pip.conf

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

Caffe环境依赖的python包

文件名:requirements.txt

Cython>=0.19.2
numpy>=1.7.1
scipy>=0.13.2
scikit-image>=0.9.3
matplotlib>=1.3.1
ipython>=3.0.0
h5py>=2.2.0
leveldb>=0.191
networkx>=1.8.1
nose>=1.3.0
pandas>=0.12.0
python-dateutil>=1.4,<2
protobuf>=2.5.0
python-gflags>=2.0
pyyaml>=3.10
Pillow>=2.3.0
six>=1.1.0

Dockerfile

# 从ubuntu 20.04创建镜像(相应地,如果用虚拟机安装开发环境,需要安装ubuntu 20.04 server)
FROM ubuntu:20.04
# 更换中国区软件源
COPY sources.list /etc/apt/sources.list
########################################################
# 虚拟机上安装ubuntu时已经自动设置好了语言和帐号,不用执行 START
########################################################
RUN \
  # 更新apt软件包列表
  apt update -y && \
  # 支持中文本地化
  apt install -y language-pack-zh-hans && locale-gen zh_CN.UTF-8 && update-locale && \
  # tzdata软件包, 安装过程默认有交互, 导致docker镜像创建过程停止
  DEBIAN_FRONTEND="noninteractive" apt install -y tzdata && \
  # 支持sudo
  apt install -y sudo && \
  # 清理apt
  apt clean all && apt autoremove -y && apt purge

ARG USER=admin
ARG PASSWORD

RUN \
  # 创建用户
  if [ -z "${PASSWORD}" ]; then PASSWORD=$(cut -d- -f1 /proc/sys/kernel/random/uuid); fi && \
  groupadd -g 1000 user && \
  useradd -d  "/home/${USER}" -m -s "/bin/bash" ${USER} -u 1000 -g user && \
  echo "${USER}:${PASSWORD}" | chpasswd && \
  echo "${USER}\n${PASSWORD}" > /home/${USER}/.user && \
  echo "==== USER:PASSWORD [${USER}:${PASSWORD}]" && \
  # 加入sudo组
  (echo "%sudo ALL=(ALL:ALL) ALL" \
        && echo "%sudo ALL=(ALL) NOPASSWD:ALL" \
        && echo "${USER} ALL=(ALL:ALL) ALL") >> /etc/sudoers && \
  # 自动加载环境变量
  (echo "if [ -f /tool/env.sh ]; then source /tool/env.sh; fi" \
   && echo "if [ -f /work/env.sh ]; then source /work/env.sh; fi") >> /home/${USER}/.bashrc && \
  # 修改缺省shell为bash
  cd /bin && rm sh && ln -s bash sh && \
  echo

ENV TZ=Asia/Shanghai
ENV LC_ALL=zh_CN.utf-8
USER root:root
########################################################
# 虚拟机上安装ubuntu时已经自动设置好了语言和帐号,不用执行 END
########################################################

# 安装python环境
RUN  apt install -y python3-pip
USER ${USER}:user
COPY pip.conf /home/${USER}/.pip/
RUN \
  # 基于python的应用程序默认安装目录
  echo export PATH=${PATH}:/home/${USER}/.local/bin >> ~/.bashrc && \
  # 避免pip3 install警告
  export PATH=${PATH}:/home/${USER}/.local/bin && \
  pip3 install --user --upgrade pip && \
  python3 -m pip cache purge

# 安装依赖库
USER root:root
RUN  \
  apt update -y && \
  apt install -y libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler && \
  apt install -y --no-install-recommends libboost-all-dev && \
  apt install -y python-dev python-numpy && \
  apt install -y libatlas-base-dev && \
  apt install -y libgflags-dev libgoogle-glog-dev liblmdb-dev && \
  # 清理apt
  apt clean all && apt autoremove -y && apt purge

RUN \
  # opencv4.x头文件目录多了opencv4导致caffe编译失败
  ln -s /usr/include/opencv4/opencv2/ /usr/include/ && \
  echo

USER ${USER}:user

# 用requirements安装caffe的运行环境
COPY requirements.txt /home/${USER}
RUN  \
  export PATH=${PATH}:/home/${USER}/.local/bin && \
  pip3 install -r /home/${USER}/requirements.txt && \
  pip3 install protobuf==3.20.2 && \
  pip3 install onnx opencv-python && \
  python3 -m pip cache purge

创建docker镜像

进入Dockerfile所在的目录,创建一个名为onnx2caffe的docker镜像。创建时间比较长,个别库可能会下载或安装失败,如果失败重新执行创建命令即可。

docker build -t onnx2caffe

创建docker容器

  1. compose.yaml
  • onnx2caffe容器没有网络访问需要,所以没有配置网络接口
  • opencv可能会调用图形接口显示图片或视频,因此使能docker访问图形界面
  onnx2caffe:
    tty: true # 使能控制台
    stdin_open: true # 使能标准输入
    restart: always # 总是重启容器(容器因为出错或者docker服务重启等原因退出后,docker服务会立即重启容器)
    command: /bin/bash # 容器启动后的缺省命令,这里是打开shell
    image: onnx2caffe # 从docker镜像onnx2caffe创建docker容器
    container_name: onnx2caffe # docker容器名称
    hostname: onnx2caffe # docker容器使用的hostname
    volumes:
     - /tmp/.X11-unix:/tmp/.X11-unix # 使能图形界面
     - /work/onnx2caffe/:/work # 映射主机的路径/work/onnx2caffe到docker容器内的路径/work
    environment:
     - DISPLAY=unix:0.0 # 使能图形界面
  1. 创建并启动docker容器

用docker-compose创建并启动容器

docker-compose -f compose.yaml --project-name onnx2caffe up -d

编译Caffe

docker容器内只有caffe的编译和运行环境,没有GIT和编辑工具。因此GIT操作和代码编辑在主机环境下执行,通过VSCode的docker扩展也能完成代码编辑和运行。

下载Caffe

在主机环境下执行(主机环境的/work/onnx2caffe对应Docker容器onnx2caffe的/work目录)

cd /work/onnx2caffe/
git clone https://github.com/BVLC/caffe.git

修改代码

caffe默认的python和opencv版本比较老,做些修改以便支持新版本。

1 支持opencv4

include/caffe/common.hpp中添加宏定义

#if (CV_MAJOR_VERSION == 4)
#define CV_LOAD_IMAGE_COLOR cv::IMREAD_COLOR
#define CV_LOAD_IMAGE_GRAYSCALE cv::IMREAD_GRAYSCALE
#endif

修改Makefile


LIBRARIES += opencv_core opencv_highgui opencv_imgproc
修改为
LIBRARIES += opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs

2 支持python3.8

修改Makefile


PYTHON_LIBRARIES ?= boost_python python2.7
修改为
PYTHON_LIBRARIES ?= boost_python38 python3.8

编译caffe

进入Caffe的Docker环境

docker attach onnx2caffe

编译

admin@onnx2caffe:/$ cd /work/caffe
admin@onnx2caffe:/work/caffe$ make all

支持python

admin@onnx2caffe:/work/caffe$ make pycaffe

验证

admin@onnx2caffe:/work/caffe$ python3
Python 3.8.10 (default, Nov 22 2023, 10:22:35) 
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import caffe
>>> quit()

小节

通过以上步骤,caffe开发环境已经完整建立起来,可以通过python调用caffe框架,依赖于cafee python接口的库能够正常运行,也可以通过C/C++代码调用caffe框架运行特定的模型

下载地址

  1. caffe环境的docker镜像在这里下载。
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐