安装caffe环境
有些算法基于老旧的caffe框架进行开发,对于算力有限的场景仍然有应用空间。caffe框架基于C/C++开发,源码逻辑清晰,便于验证和移植到嵌入式平台。一些老旧的嵌入式处理器的模型转换工具仅支持输入caffe模型文件。以上这些都是caffe框架的常见使用场景。由于caffe框架过于老旧,依赖的库大都也比较老旧,库之间的依赖关系经常缺失导致安装失败,直接在主机上安装caffe环境常常会引起依赖库之间
安装caffe环境
概述
有些算法基于老旧的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.list | ubuntu 20.04的中国区更新源 |
pip.conf | python包中国区更新源 |
requirements.txt | Caffe环境依赖的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容器
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 # 使能图形界面
- 创建并启动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框架运行特定的模型
下载地址
- caffe环境的docker镜像在这里下载。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)