windows下lmdb文件制作

一   数据准备

下载数据->转换成图片,得到trainImages和testImages两个文件夹->生成train.txt、val.txt、test.txt文件,val.txt是train.txt的子集,test.txt和val.txt相同,只是test.txt不带标签。下面步骤只生成了label.txt,即train.txt,其他两个文件自己制作下。

1、从Kaggle上面下载所需要的数据:

点击这里进入Kaggle官网然后点Competitions: 
windows下lmdb文件制作_第1张图片

点击之后进入到这样的界面:

windows下lmdb文件制作_第2张图片

然后就可以看到练手赛:Digit Recognition:

windows下lmdb文件制作_第3张图片

继续点击进入该比赛:

windows下lmdb文件制作_第4张图片

然后下载数据:

windows下lmdb文件制作_第5张图片

数据处理

从Kaggle上面下载下来的数据是csv格式的数据,需要我们转换成图片格式的数据,我这里用Python代码实现转换,原理就是先生成一个空的图片,然后将下载下来的csv格式数据中的每一张图片像素点一次填入一张图像中,就得到了我们需要的数字图片,注意,官网数据是28*28大小的图片,所以我们转换时最好转换成28*28大小的图片。 
具体代码:(我对于Python还处于陌生阶段,见谅不能更详细的解说):

# -*- coding:utf-8 -*-
# 训练数据提取部分代码

from PIL import Image
import os
import numpy as np
import pandas as pd

train=pd.read_csv('E:\\Kaggle\\DigitRecognition\\train.csv')
trainData=train.values[:, 1:]
trainLabels=train.values[:, 0]

# 写入标签数据,并利用像素点填充的方法讲矩阵中的像素点采用RGB模式填入一张图片中,
# R=G=B代表灰度图片
file = open('E:\\Kaggle\\DigitRecognition\\label.txt', 'w')
img=Image.new('RGB', (28, 28), 0x000000)
img_array=img.load()
for line in range(0, 42000):
    num=0
    for x in range(28):
        for y in range(28):
            #将RGB三个分量取相等就表示灰度图
            img_array[y, x] = (255-trainData[line, num], 255-trainData[line, num], 255-trainData[line, num])
            num = num + 1
    img.save('E:\Kaggle\DigitRecognition\\trainImages\\'+str(line)+'.jpg')
    file.write('E:\Kaggle\DigitRecognition\\trainImages\\'+str(line)+'.jpg' + ' ' +str(trainLabels[line])+'\n')
file.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

测试数据的提取代码:(注意路径,时绝对路径,也可以使用相对路径)

# -*- coding:utf-8 -*-
from PIL import Image
import os
import numpy as np
import pandas as pd

test=pd.read_csv('E:\\Kaggle\\DigitRecognition\\test.csv')
testData=test.values[:, :]

img=Image.new('RGB',(28, 28), 0x000000)
img_array=img.load()
for line in range(0, 28000):
    num = 0
    for x in range(28):
        for y in range(28):
            img_array[y, x] = (255-testData[line, num], 255-testData[line, num], 255-testData[line, num])
            num = num+1
    img.save('E:\\Kaggle\\DigitRecognition\\testImage\\'+str(line)+'.jpg')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

转换之前的数据和转换之后的数据对比: 
train.csv: 
windows下lmdb文件制作_第6张图片

trainImage: 
windows下lmdb文件制作_第7张图片

转换成功之后,就可以用Caffe进行训练了。


二   数据转换


创建一个文件夹叫myself,这里把杂七杂八跟本次活动有关的文件全部放进来,有:训练集train(一个放了所有训练图片的文件夹),测试集val(一个放了所有测试图片的文件夹),train.txt,val.txt,test.txt。其中后两者的文件名完全相同,只不过val.txt带标签,而test.txt不带标签。
将CAFFE_ROOT\examples\imagenet下一个叫create_imagenet.sh的文件拷贝到myself下,然后对里面的路径进行设定。
 
 windows下lmdb文件制作_第8张图片windows下lmdb文件制作_第9张图片这里用到的思想跟之前在《OpenCV玩耍(一)批量resize一个文件夹里的所有图像》中说过的一样,都是字符串拼接。其中DATA、TOOLS皆为路径头,得和后面的文件名组合起来才是完全路径。说白了,就是在GLOG下分别给训练集和测试集填写三个绝对路径+一个将要生成的文件夹名,这三个绝对路径分别为:
(1)convert_imageset.exe的绝对路径;
(2)train.txt/val.txt的绝对路径;
(3)存放着图片的训练集train文件夹/测试集val文件夹的绝对路径。
而上面关于resize的那段代码实际上可以去掉不要了,因为事先我们已经resize过图像了。一个简化版的create_imagenet.sh可按如下来写,其跑出的效果是一模一样的:
windows下lmdb文件制作_第10张图片 
完成路径设定之后,双击该sh文件(需要安装Git),即可在myself文件夹下生成imagenet_train_lmdb与 imagenet_val_lmdb文件夹。
不要创建

imagenet_train_lmdb与 imagenet_val_lmdb文件夹。会自动创建

http://www.cnblogs.com/NanShan2016/p/5487194.html

https://blog.csdn.net/moulei0322/article/details/74394916


你可能感兴趣的:(work->problem)