LMDB数据生成与解析

将图片转换为LMDB

# -*- coding: utf-8 -*-
import pickle
from PIL import Image
import numpy as np
import os
import matplotlib.image as plimg

from mysql import connector

# 定义与样本数据相关的变量

DATA_ALL_PATH = []
DATA_ALL_LABEL = []
DATA_ALL_ARRAY = []

# 定义读取样本数据的函数
def readArtistnameFromMySql():
    global DATA_ALL_PATH
    global DATA_ALL_LABEL

    # 创建一个连接
    conn = connector.connect(host="", user="", password="", database="",
                            charset="utf8", unix_socket='/tmp/mysql.sock')
    # 创建游标
    cur = conn.cursor()

    # 创建一条sql语句
    sql = "SELECT img_path, img_label FROM test_cifar_img"

    # 执行查询SQL
    cur.execute(sql)

    # 获取查询结果
    result_set = cur.fetchall()

    if result_set:
        for row in result_set:
            DATA_ALL_PATH.append(row[0].encode('utf8'))
            DATA_ALL_LABEL.append(row[1])
    else:
        print '没有查到结果'
    # 关闭游标和连接
    cur.close()
    conn.close()

# 这里定义的是读取图片的方法,(并且将图片文件转换为数组表示)
def read_file(filename):
    im = Image.open(filename)  # 打开一个图像

    # 将图像的RGB分离
    r, g, b = im.split()  # 这里返回的可能是元组,还没有测试

    # 将PILLOW图像分量转成数组
    r_arr = plimg.pil_to_array(r)  # 这类还是32*32 只不过图片的维度只有一个维度了 (注意数组的维度还是二维的数组)
    g_arr = plimg.pil_to_array(g)
    b_arr = plimg.pil_to_array(b)

    # 将32*32二维数组转成1024的一维数组(当然这里我们是可以还原的trans)
    r_arr1 = r_arr.reshape(1024)
    g_arr1 = g_arr.reshape(1024)
    b_arr1 = b_arr.reshape(1024)

    # 3个一维数组合并成一个一维数组,大小为3072 (这里是一个大的一维数组,但是数据逻辑上分了三段)
    arr = np.concatenate((r_arr1, g_arr1, b_arr1))
    # 将这个一维度的大数组返回
    return arr


print 'into main function'

# 读取样本集的数据路径
readArtistnameFromMySql()

# 读取样本集数据
for data_path in DATA_ALL_PATH:
    data_path = data_path.replace('.jpg', '.png')
    data_arr = read_file(data_path)

    DATA_ALL_ARRAY.append(data_arr)

# 将我们准备好的数据写入文件
contact = {'data': DATA_ALL_ARRAY, 'labels': DATA_ALL_LABEL}
# 注意这里在linux和windows上是有区别的
f = open('contact/contact', 'wb')
pickle.dump(contact, f)  # 把字典存到文本中去
f.close()

print "存储完毕"

你可能感兴趣的:(Deep,Learning,M_L,python)