Caffe学习笔记(二):使用Python生成caffe所需的lmdb文件和txt列表清单文件

Python版本:Python2.7 运行平台:Ubuntu14.04 最后修改时间:2017.4.20

    在上个笔记中,已经学会了如何使用Caffe利用作者给的脚本训练CIFAR-10数据集,得到训练好的CNN模型。但是在上个笔记中,使用的都是作者提供好的脚本文件,完全就是按照教程跑了一下提供的demo。对于自己手里的一些图片数据集,如何转换图片格式、如何计算图片数据的均值、如何编写prototxt配置文件是接下来笔记的主要内容。本篇笔记主要记录如何将图片数据转换成db文件,图片均值的计算、prototxt配置文件的编写会后续进行讲解。

一、Caffe训练学习步骤回顾

    1.准备数据集(训练集和测试集)

    2.图片数据转换成db(leveldb/lmdb)文件

    3.计算图片数据的均值

    4.prototxt配置文件

    5.训练模型

注意:还有一种不需要db文件和计算图片数据的均值的训练方法,而是只需要一个txt列表清单,另一种训练步骤在讲完此种学习方法后进行讲解。

二、图片数据转换成db(leveldb/lmdb)文件

1.概述

    在深度学习的实际应用中,我们经常用到的原始数据是图片文件,如jpg,jpeg,png,tif等格式的,而且有可能图片的大小还不一致。而在caffe中经常使用的数据类型是lmdb或leveldb,因此就产生了这样的一个问题:如何从原始图片文件转换成caffe中能够运行的db(leveldb/lmdb)文件?

    在caffe中,作者为我们提供了这样一个文件:convert_imageset.cpp,存放在caffe根目录下的tools目录下。编译好caffe之后,会生成对应的可执行文件放在 build/tools/目录下,这个可执行文件convert_imageset的作用就是用于将图片文件转换成caffe框架中能直接使用的db文件。

    该文件的使用格式如下所示:

convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME

    需要带四个参数: - FLAGS: 图片参数组,后面详细介绍 - ROOTFOLDER/: 图片存放的绝对路径,从linux系统根目录开始 - LISTFILE: 图片文件列表清单,一般为一个txt文件,一行一张图片 - DB_NAME: 最终生成的db文件存放目录

    因此如果想使用convert_imageset这个工具生成我们需要的db文件,就需要先得到图片文件列表清单txt文件。

    在caffe根目录的/examples/image目录下,有两张共我们测试的图片,它们是cat.jpg和fish-bike.jpg。我们可以使用eog命令在终端查看这两个图片(远程登录ssh不行,vnc可以,当然不是远程登录是可以使用的),它们分别如下:

    我们可以使用这两图片学习如何制作图片文件列表清单txt文件。这个图片列表清单txt文件 格式如下:

图片文件名 标签

    以cat.jpg和fish-bike.jpg为例,那么这两个图片的列表清单txt文件即为:

cat.jpg 1 fish-bike.jpg 2

    依此类推,一行一张图片标签。我们定义1标签是猫的标签,2标签是自行车的标签。很显然,如果就这么两个图片我们手写一个图片列表清单txt文件即可,但是如果是很多图片,我们又该如何处理呢?

    显然,我们可以使用脚本,有很多方法可供选择shell脚本,python脚本等。而我采用的方式是使用python脚本处理这些文件,生成最终的图片列表清单txt文件。

2.利用python脚本编写图片列表清单txt文件

(1)在caffe根目录下创建一个我们的工程目录my-caffe-project,使用如下指令:

cd /home/Jack-Cui/caffe-master && mkdir my-caffe-project

(2)创建并编辑create_db.py文件,使用如下指令:

vim create_db.py

文件编辑内容如下:

# -*- coding: UTF-8 -*-
import os
import re

"""
函数说明:生成图片列表清单txt文件

Parameters:
    images_path - 图片存放目录
    txt_save_path - 图片列表清单txt文件的保存目录
Returns:
    无
Author:
    Jack Cui
Modify:
    2017-03-29
"""
def createFileList(images_path, txt_save_path):
    #打开图片列表清单txt文件
    fw = open(txt_save_path,"w")
    #查看图片目录下的文件,相当于shell指令ls
    images_name = os.listdir(images_path)
    #遍历所有文件名
    for eachname in images_name:
        #正则表达式这里可以根据情况进行更改
        #正则表达式规则:找以cat开头,紧跟0到10个数字,并以jpg结尾的图片文件
        pattern_cat = r'(^cat\d{0,10}.jpg$)'
        #正则表达式规则:找以fish-bike开头,紧跟0到10个数字,以jpg结尾的图片文件
        pattern_bike = r'(^fish-bike\d{0,10}.jpg$)'
        #正则表达式匹配
        cat_name = re.search(pattern_cat, eachname)
        bike_name = re.search(pattern_bike, eachname)
        #按照规则将内容写入txt文件中
        if cat_name != None:
            fw.write(cat_name.group(0) + ' 1\n')
        if bike_name != None:
            fw.write(bike_name.group(0) + ' 2\n')
    #打印成功信息
    print "生成txt文件成功"
    #关闭fw
    fw.close()

if __name__ == '__main__':
    #caffe_root目录
    caffe_root = '/home/Jack-Cui/caffe-master/'
    #my-caffe-project目录
    my_caffe_project = caffe_root + 'my-caffe-project/'
    #图片存放目录
    images_path = caffe_root + 'examples/images/'
    #生成的图片列表清单txt文件名
    txt_name = 'filelist.txt'
    #生成的图片列表清单txt文件的保存目录
    txt_save_path = my_caffe_project + txt_name
    #生成txt文件
    createFileList(images_path, txt_save_path)

(3)运行create_db.py脚本文件,使用如下指令:

python create_db.py

(4)使用指令cat create_filelist.py,查看结果如下:

!=

3.利用python脚本执行convert_imageset文件生成db文件

    生成的这个filelist.txt文件,就可以作为第三个参数,直接使用了。

    接下来,我们来了解一下FLAGS这个参数组,有些什么内容:

  • gray: 是否以灰度图的方式打开图片。程序调用opencv库中的imread()函数来打开图片,默认为false
  • backend:需要转换成的db文件格式,可选为leveldb或lmdb,默认为lmdb
  • resize_width/resize_height: 改变图片的大小。在运行中,要求所有图片的尺寸一致,因此需要改变图片大小。 程序调用opencv库的resize()函数来对图片放大缩小,默认为0,不改变
  • check_size: 检查所有的数据是否有相同的尺寸。默认为false,不检查
  • encoded: 是否将原图片编码放入最终的数据中,默认为false
  • encode_type: 与前一个参数对应,将图片编码为哪一个格式:‘png’,’jpg’……

    好了,知道这些参数后,我们就可以调用命令来生成最终的lmdb格式数据了。

(1)继续编写create_db.py文件,使用如下指令:

vim create_db.py

文件添加内容如下:

# -*- coding: UTF-8 -*-
import commands
import os
import re

"""
函数说明:生成图片列表清单txt文件

Parameters:
    images_path - 图片存放目录
    txt_save_path - 图片列表清单txt文件的保存目录
Returns:
    无
Author:
    Jack Cui
Modify:
    2017-03-29
"""
def createFileList(images_path, txt_save_path):
    #打开图片列表清单txt文件
    fw = open(txt_save_path,"w")
    #查看图片目录下的文件,相当于shell指令ls
    images_name = os.listdir(images_path)
    #遍历所有文件名
    for eachname in images_name:
        #正则表达式这里可以根据情况进行更改
        #正则表达式规则:找以cat开头,紧跟0到10个数字,并以jpg结尾的图片文件
        pattern_cat = r'(^cat\d{0,10}.jpg$)'
        #正则表达式规则:找以fish-bike开头,紧跟0到10个数字,以jpg结尾的图片文件
        pattern_bike = r'(^fish-bike\d{0,10}.jpg$)'
        #正则表达式匹配
        cat_name = re.search(pattern_cat, eachname)
        bike_name = re.search(pattern_bike, eachname)
        #按照规则将内容写入txt文件中
        if cat_name != None:
            fw.write(cat_name.group(0) + ' 1\n')
        if bike_name != None:
            fw.write(bike_name.group(0) + ' 2\n')
    #打印成功信息
    print "生成txt文件成功"
    #关闭fw
    fw.close()

"""
函数说明:生成lmdb文件

Parameters:
    caffe_root - caffe根目录
    images_path - 图片存放目录
    txt_save_path - 图片列表清单txt文件的保存目录
Returns:
    无
Author:
    Jack Cui
Modify:
    2017-03-29
"""
def create_db(caffe_root, images_path, txt_save_path):
    #lmdb文件名字
    lmdb_name = 'img_train.lmdb'
    #生成的db文件的保存目录
    lmdb_save_path = caffe_root + 'my-caffe-project/' + lmdb_name
    #convert_imageset工具路径
    convert_imageset_path = caffe_root + 'build/tools/convert_imageset'
    cmd = """%s --shuffle --resize_height=256 --resize_width=256 %s %s %s"""
    status, output = commands.getstatusoutput(cmd % (convert_imageset_path, images_path, 
        txt_save_path, lmdb_save_path))
    print output
    if(status == 0):
        print "lmbd文件生成成功"


if __name__ == '__main__':
    #caffe_root目录
    caffe_root = '/home/Jack-Cui/caffe-master/'
    #my-caffe-project目录
    my_caffe_project = caffe_root + 'my-caffe-project/'
    #图片存放目录
    images_path = caffe_root + 'examples/images/'
    #生成的图片列表清单txt文件名
    txt_name = 'filelist.txt'
    #生成的图片列表清单txt文件的保存目录
    txt_save_path = my_caffe_project + txt_name
    #生成txt文件
    createFileList(images_path, txt_save_path)
    #生成lmdb文件
    create_db(caffe_root, images_path, txt_save_path)

    设置参数-shuffle,打乱图片顺序。设置参数-resize_height和-resize_width将所有图片尺寸都变为256*256。

    ./home/xxx/caffe-master/examples/images/ 为图片保存的绝对路径,我的caffe放在了/home/Jack-Cui目录下。

    最终结果运行如下,大功告成!

参考博客:http://www.cnblogs.com/denny402/

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏木子昭的博客

Python3读写base64格式base64使用场景

? base64转换过程 这几天写web,需要将用户上传的图片,实时显示到前端页面,然后通过Jcrop裁剪,并将裁剪后的图片通过canvas...

3808
来自专栏简书专栏

目标检测第1步-运行tensorflow官方示例

在进行本文操作之前,需要先安装好tensorflow的gpu版本。 本文作者的环境:python3.6、Windows10、tensorflow_gpu1.1...

9753
来自专栏PPV课数据科学社区

R语言18讲(三)

? 我们在做数据分析工作的前提,当然是得有数据,巧妇难为无米之炊,所以数据的获取和产生是非常重要和基础的,然而,在当前互联网时代,信息非常的膨胀,我们获取...

3736
来自专栏debugeeker的专栏

《coredump问题原理探究》windows版5.1节基本数据类型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/detai...

853
来自专栏cloudskyme

JRuby——Java和Ruby的强强联合

什么是JRuby JRuby是一个纯Java实现的Ruby解释器。通过JRuby,你可以在JVM上直接运行Ruby程序,调用Java的类库。很多Java编写的...

4524
来自专栏Java帮帮-微信公众号-技术文章全总结

Mysql批量插入分析【面试+工作】

最近发现几个项目中都有批次插入数据库的功能,每个项目中批次插入的写法有一些差别,所以本文打算对Mysql的批次插入做一个详细的分析。

3122
来自专栏胡恒威的专栏

如何在 Linux 系统通过命令行生成随机文件

是否会有这样的场景:在有需要测试数据的时候,你不知如何生成一些已包含测试数据的文件,或者你是临时需要一个小的程序,可以让你生成不同大小的文件(比如大于1Mb少于...

4.2K0
来自专栏云计算教程系列

如何在Ubuntu 16.04上使用Cassandra和ElasticSearch设置Titan Graph数据库

Titan是一个高度可扩展的开源图形数据库。图形数据库是一种NoSQL数据库,其中所有数据都存储为节点(nodes)和边(edges)。图形数据库适用于高度连接...

1492
来自专栏北京马哥教育

用Linux命令行生成随机密码的十种方法

Linux操作系统的一大优点是对于同样一件事情,你可以使用高达数百种方法来实现它。例如,你可以通过数十种方法来生成随机密码。本文将介绍生成随机密码的十种方法。 ...

3336
来自专栏人工智能

分布式TensorFlow入坑指南:从实例到代码带你玩转多机器深度学习

通过多 GPU 并行的方式可以有很好的加速效果,然而一台机器上所支持的 GPU 是有限的,因此本文介绍了分布式 TensorFlow。分布式 TensorFlo...

2557

扫码关注云+社区

领取腾讯云代金券