专栏首页CSDN博客在Ubuntu上安装CPU版本的Caffe

在Ubuntu上安装CPU版本的Caffe

前言

Caffe是目前比较常用的深度学习框架,这个框架安装没有其他一下主流框架那么简单,直接使用pip命令安装,它更常用的是使用编译的方式安装。所以写下这个文章记录一下。

在Ubuntu上安装Caffe

如果Ubuntu版本是>= 17.04的,就可以使用以下的方式安装Caffe,注意安装的是Python 3的版本。

apt install caffe-cpu

如果是低于这版本,就要使用源码编译了,笔者的系统是64位的Ubuntu 16.04,下面就介绍安装步骤,使用的Python 2。

安装依赖环境

首先我们要安装依赖环境,依赖环境有点多,需要保证都安装了,以免在编译的时候出错。如果之前安装过了,重复执行命令也没有问题的。

apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
apt-get install --no-install-recommends libboost-all-dev  
apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
apt-get install libatlas-base-dev
apt-get install python-numpy
apt-get install libhdf5-serial-dev
apt-get install python-dev
apt install python-pip
pip install scikit-image

修改编译文件

我们使用的是源码编译,所以要先克隆源码,然后拷贝官方提供的编译配置例子。

# 切换到opt目录下
cd /opt
# 克隆caffe源码
git clone git://github.com/BVLC/caffe.git
# 切入到源码根目录
cd caffe/
# 复制官方提供的编译配置文件例子
cp Makefile.config.example Makefile.config
# 开始编写配置信息
vim Makefile.config

修改这个配置文件如下:

  • 把第8行的注释取消,编译CPU版本的Caffe,即如下:
CPU_ONLY := 1
  • 然后版96、97、98行,改成如下:
# Whatever else you find you need goes here.
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial

开始编译

现在就可以开始编译了,前面两条是编译源码,后面两条是编译测试,-j4是表示使用4个线程并行编译,加快编译速度。

make -j4 pycaffe
make -j4 all
make -j4 test
make -j4 runtest

添加环境变量

使用命令vim /etc/profile,在该文件的最后加上下面的这行代码。

export PYTHONPATH=/opt/caffe/python:$PYTHONPATH

我们可以简单测试一下是否安装成功了,正常的话是可以输出caffe的版本信息的。

# python
Python 2.7.12 (default, Dec  4 2017, 14:50:18)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import caffe
>>> caffe.__version__

会输出如下信息:

'1.0.0'

使用模型预测图片

安装完成caffe之后,我们可以使用模型来预测一下图片。笔者在这里下载caffe模型,下面的代码中我们使用的是modelnet V2的模型。

# coding=utf-8
from __future__ import print_function
import numpy as np
import caffe

# 修改图片大小
def get_img(img_path, nh, nw):
    im = caffe.io.load_image(img_path)
    h, w, _ = im.shape
    if h < w:
        off = (w - h) / 2
        im = im[:, off:off + h]
    else:
        off = (h - w) / 2
        im = im[off:off + h, :]
    im = caffe.io.resize_image(im, [nh, nw])
    return im

def eval(image_path, nh, nw):
    caffe.set_mode_cpu()
    # 加载模型
    net = caffe.Net("mobilenet_v2_deploy.prototxt", "mobilenet_v2.caffemodel", caffe.TEST)

    # 设置对图片预处理的方式
    transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
    transformer.set_transpose('data', (2, 0, 1))  # row to col
    transformer.set_channel_swap('data', (2, 1, 0))  # RGB to BGR
    transformer.set_raw_scale('data', 255)  # [0,1] to [0,255]
    # 减去图片的均值
    img_mean = np.array([103.94, 116.78, 123.68], dtype=np.float32)
    transformer.set_mean('data', img_mean)
    # 乘上一个比例
    transformer.set_input_scale('data', 0.017)
    # 改变图片维度
    net.blobs['data'].reshape(1, 3, nh, nw)

    im = get_img(image_path, nh, nw)
    net.blobs['data'].data[...] = transformer.preprocess('data', im)
    out = net.forward()
    # 得到预测结果
    prob = out['prob']
    prob = np.squeeze(prob)
    idx = np.argsort(-prob)
    # 获取最大概率的label
    label = idx[0]
    # 读取label文件内容
    label_names = np.loadtxt('synset.txt', str, delimiter='\t')
    print('%.5f - %s' % (prob[label], label_names[label]))

if __name__ == '__main__':
    image_path = "cat.jpg"
    nh, nw = 224, 224
    eval(image_path, nh, nw)

以下这函数是改变图片的大小,使它满足模型的需求,注意如果是Python 3的话,除法要使用//,而不是/,这是Python 3的一个改变。

def get_img(img_path, nh, nw):
    im = caffe.io.load_image(img_path)
    h, w, _ = im.shape
    if h < w:
        off = (w - h) / 2
        im = im[:, off:off + h]
    else:
        off = (h - w) / 2
        im = im[off:off + h, :]
    im = caffe.io.resize_image(im, [nh, nw])
    return im

以下代码是指定CPU和加载模型的定义文件和权重文件,这个两个文件就是我们从GitHub那里下载的。

    caffe.set_mode_cpu()
    net = caffe.Net("mobilenet_v2_deploy.prototxt", "mobilenet_v2.caffemodel", caffe.TEST)

下面代码片段是定义图片的预处理方式,如改变通道顺序,每个像素减去均值,每个像素乘上一个比例。

    transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
    transformer.set_transpose('data', (2, 0, 1))  # row to col
    transformer.set_channel_swap('data', (2, 1, 0))  # RGB to BGR
    transformer.set_raw_scale('data', 255)  # [0,1] to [0,255]
    img_mean = np.array([103.94, 116.78, 123.68], dtype=np.float32)
    transformer.set_mean('data', img_mean)
    transformer.set_input_scale('data', 0.017)
    net.blobs['data'].reshape(1, 3, nh, nw)

以下代码片段是加载图片得到预测结果的,out['prob']输出的是每个label的概率,使用到的synset.txt也是刚才那个GitHub上的文件,这个文件的内容是每个label对应的名称。最后输出的是概率最大的label对应的概率和这个label对应的名字。

    im = get_img(image_path, nh, nw)
    net.blobs['data'].data[...] = transformer.preprocess('data', im)
    out = net.forward()
    prob = out['prob']
    prob = np.squeeze(prob)
    idx = np.argsort(-prob)
    label = idx[0]
    label_names = np.loadtxt('synset.txt', str, delimiter='\t')
    print('%.5f - %s' % (prob[label], label_names[label]))

输出的结果如下:

0.25784 - 'n02123159 tiger cat'

参考资料

  1. http://caffe.berkeleyvision.org/installation.html
  2. https://blog.csdn.net/qq_25737169/article/details/77773884
  3. https://github.com/shicai/MobileNet-Caffe

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 技术| Python的从零开始系列连载(三十)

    为了解答大家学习Python时遇到各种常见问题,小灯塔特地整理了一系列从零开始的入门到熟练的系列连载,每周五准时推出,欢迎大家学积极学习转载~

    灯塔大数据
  • 你是Python萌新吗?从遇见IDE开始吧

    你是Python萌新吗?你在学习Python吗?不管你是学一门课程还是自己学习,Thonny都是最适合初学者的IDE之一,它内置一些工具可以使你的开发过程更容易...

    三哥
  • python两种简洁的条件判断语句写法

    了Python返回真假值(True or False)小技巧,本文探讨的是最简洁的条件判断语句写法,本文给出了两种简洁写法,需要的朋友可以参考下

    一墨编程学习
  • Python实现BT种子转化为磁力链接【实战】

    经常看电影的朋友肯定对BT种子并不陌生,但是BT种子文件相对磁力链来说存储不方便,而且在网站上存放BT文件容易引起版权纠纷,而磁力链相对来说则风险小一些。

    一墨编程学习
  • 一看就懂,Python 日志模块详解及应用

    Windows网络操作系统都设计有各种各样的日志文件,如应用程序日志,安全日志、系统日志、Scheduler服务日志、FTP日志、WWW日志、DNS服务器日志等...

    崔庆才
  • 10 款最好的 Python 开发编辑器

    Python 非常易学,强大的编程语言。Python 包括高效高级的数据结构,提供简单且高效的面向对象编程。

    一墨编程学习
  • 如何用 Python 和循环神经网络(RNN)做中文文本分类?

    本文为你展示,如何使用 fasttext 词嵌入预训练模型和循环神经网络(RNN), 在 Keras 深度学习框架上对中文评论信息进行情感分类。

    用户2930930
  • 前辈经历告诉你Python新手好找工作吗?初级岗位多不多

    这么多人推荐学 Python 入IT 行的,如果学完 Python这一套找不到工作怎么办?

    一墨编程学习
  • 爬虫杀手锏-PhantomJS(附案列网站模拟登录豆瓣网)

    Selenium: 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。Selenium 自己不带浏览器,不...

    一墨编程学习
  • Python数据可视化:2018年北上广深空气质量分析

    92.5是年均AQI值,从上面科普知识里可以知道,2017年天津整体空气质量只能是「良」中的下下等水平,与轻度污染近在咫尺。

    用户2769421

扫码关注云+社区

领取腾讯云代金券