caffe学习(3):SVHN on caffe

原创 2016年08月30日 16:51:38
这几天因为做实验和学习Tornado的缘故,一直没时间把上次没完成的工作做完,今天补上。今天提供The Street View House Numbers即SVHN数据集在caffe上训练的过程。

一.数据准备

SVHN是一个真实世界的街道门牌号数字识别数据集.The Street View House Numbers (SVHN) Dataset,我们可以从这里下载数据,为方便转换,我们下载train_32x32.mat和test_32x32.mat,.mat文件中包含两个变量,X是一个4D的矩阵,维度是(32,32,3,n),n是数据个数,y是label变量,接下来我们先使用一段script看一下前十张图:

import scipy.io as sio
import matplotlib.pyplot as plt

print 'Loading Matlab data.'
mat=sio.loadmat('train_32x32.mat')
data=mat['X']
label=mat['y']
for i in range(10):
    plt.subplot(2,5,i+1)
    plt.title(label[i][0])
    plt.imshow(data[...,i])
    plt.axis('off')
plt.show()


可以看出,.mat文件中的数字是已经被crop出来的单个数字,接下来使用另一个script将其转换为lmdb数据:

import numpy as np
import caffe
import lmdb
import scipy.io as sio
import random
from caffe.proto import caffe_pb2

def main():
    train=sio.loadmat('train_32x32.mat')
    test=sio.loadmat('test_32x32.mat')

    train_data=train['X']
    train_label=train['y']
    test_data=test['X']
    test_label=test['y']

    train_data = np.swapaxes(train_data, 0, 3)
    train_data = np.swapaxes(train_data, 1, 2)
    train_data = np.swapaxes(train_data, 2, 3)

    test_data = np.swapaxes(test_data, 0, 3)
    test_data = np.swapaxes(test_data, 1, 2)
    test_data = np.swapaxes(test_data, 2, 3)

    N=train_label.shape[0]
    map_size=train_data.nbytes*10
    env=lmdb.open('svhn_train_lmdb',map_size=map_size)
    txn=env.begin(write=True)

#shuffle the training data
    r=list(range(N))
    random.shuffle(r)

    count=0
    for i in r:
datum=caffe_pb2.Datum()
        label=int(train_label[i][0])
if label==10:
            label=0
        datum=caffe.io.array_to_datum(train_data[i],label)
        str_id='{:08}'.format(count)
        txn.put(str_id,datum.SerializeToString())

        count += 1
        if count % 1000 == 0:
print('already handled with {} pictures'.format(count))
            txn.commit()
            txn = env.begin(write=True)

    txn.commit()
    env.close()

    map_size = test_data.nbytes * 10
    env = lmdb.open('svhn_test_lmdb', map_size=map_size)
    txn = env.begin(write=True)
    count = 0
    for i in range(test_label.shape[0]):
datum = caffe_pb2.Datum()
        label = int(test_label[i][0])
if label == 10:
            label = 0
        datum = caffe.io.array_to_datum(test_data[i], label)
        str_id = '{:08}'.format(count)
        txn.put(str_id, datum.SerializeToString())

        count += 1
        if count % 1000 == 0:
print('already handled with {} pictures'.format(count))
            txn.commit()
            txn = env.begin(write=True)

    txn.commit()
    env.close()

if __name__=='__main__':
    main()

这样就可以得到svhn_train_lmdb和svhn_test_lmdb了

二.Data Pre-processing

SVHN比较简单,我们不做任何data augmentation操作,只通过上篇文章的script计算出其图像均值:

import caffe
import lmdb
import numpy as np
from caffe.proto import caffe_pb2
import time

lmdb_env=lmdb.open('svhn_train_lmdb')
lmdb_txn=lmdb_env.begin()
lmdb_cursor=lmdb_txn.cursor()
datum=caffe_pb2.Datum()

N=0
mean = np.zeros((1, 3, 32, 32))
beginTime = time.time()
for key,value in lmdb_cursor:
    datum.ParseFromString(value)
    data=caffe.io.datum_to_array(datum)
    image=data.transpose(1,2,0)
    mean[0,0] += image[:, :, 0]
    mean[0,1] += image[:, :, 1]
    mean[0,2] += image[:, :, 2]
    N+=1
    if N % 1000 == 0:
        elapsed = time.time() - beginTime
print("Processed {} images in {:.2f} seconds. "
              "{:.2f} images/second.".format(N, elapsed,
                                             N / elapsed))
mean[0]/=N
blob = caffe.io.array_to_blobproto(mean)
with open('mean.binaryproto', 'wb') as f:
    f.write(blob.SerializeToString())

lmdb_env.close()

三.实验

这里我们采用caffe自带的cifar_full模型进行训练:


caffe train -solver=solver.prototxt -gpu 0


最后得到的model的准确率为94.03%,效果还是很好的


四.总结

经过这两篇文章,可以看出,对于一般的数据集,如果要在caffe中训练的话,一般有以下几步:

1.data->lmdb:将数据转换为lmdb数据,其实caffe也支持很多其他格式的输入,如IMAGEDATA,HDF5DATA,但经过实验,这些数据消耗的大量io操作会大大加剧训练的时间

2.data augmentation:常见的几种数据加强方式均在上文cifar100中有所阐释

3.data pre-processing:对于图像数据来说,最常见的数据预处理就是减去图像的均值

4.model designing:最后一步自然是设计模型,进行训练了

到这里对caffe训练过程已经是非常熟悉了,下一步让我们深入一点,看一下caffe的源码结构和实现细节,敬请期待!

PS:文中的Script和训练配置文件均在github上:github.com/fish145/unco

人工智能数据集描述——SVHN

SVHN数据集包含train文件接,test文件夹以及extra文件夹。分别包含33402、13068、202353个标记图片。每个文件夹中包含 图片,图片以*.png命名; 一个digitStruc...

SVHN 数据集

一直都是直接把test集直接作为测试集的,结果今天才发现错了。 是 training data without any data augmentation, and a validation set...

svhn数据集处理

https://github.com/hangyao/street_view_house_numbers 这个是SVHN在tensorflow上的实现,是ipython版本的 使用上面链接里...

机器学习数据集(Dataset)汇总

1. CIFAR-10 & CIFAR-100     CIFAR-10包含10个类别,50,000个训练图像,彩色图像大小:32x32,10,000个测试图像。     (类别:airplane,...
  • MyArrow
  • MyArrow
  • 2016年07月05日 09:27
  • 15602

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

写个python脚本下载并解压 MNIST, CIFAR10, SVHN 数据集(2)

本文目的:MNIST之于机器学习&&深度学习,就相当于cout

深度学习数据集Deep Learning Datasets

Datasets These datasets can be used for benchmarking deep learning algorithms: Symbolic Music Data...

数据集汇总

图形图像处理: 1. CIFAR-10 & CIFAR-100     CIFAR-10包含10个类别,50,000个训练图像,彩色图像大小:32x32,10,000个测试图像。 ...

卷积神经网络概念与原理和相关数据集

博文的编写,主要参考网上资料,并结合个人见解,仅供学习、交流使用,如有侵权,请联系博主删除,原创文章转载请注明出处。 前往斯坦福课程官网查看:CS231n视觉识别的卷积神经网络课程Image Dat...

tensorflow读取SVHN数据集转为TFrecords格式

这里默认将python脚本文件和svhn数据集放在同一目录下,FLAGS.directory参数可以指定数据集的目录,由于svhn没有validation数据集,因此将train分割一部分出来作为va...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:caffe学习(3):SVHN on caffe
举报原因:
原因补充:

(最多只允许输入30个字)