import numpy as np
import tensorflow as tf
import time
import os
import cv2
from sklearn.utils import shuffle # 图片存放位置
PATH_DES = [
r'data_tfrecords/integers_tfrecords/',
r'data_tfrecords/alphabets_tfrecords/',
r'data_tfrecords/Chinese_letters_tfrecords/'
]
PATH_RES = [r'data/integers/',
r'data/alphabets/',
r'data/Chinese_letters/'] PATH = list(zip(PATH_RES, PATH_DES))
# transformation between integer <-> string
# 用于车牌识别时--数字+字母+32省份
integers = {
'0': 0,
'1': 1,
'2': 2,
'3': 3,
'4': 4,
'5': 5,
'6': 6,
'7': 7,
'8': 8,
'9': 9
}
alphabets = {
'A': 10,
'B': 11,
'C': 12,
'D': 13,
'E': 14,
'F': 15,
'G': 16,
'H': 17,
'I': 18,
'J': 19,
'K': 20,
'L': 21,
'M': 22,
'N': 23,
'O': 24,
'P': 25,
'Q': 26,
'R': 27,
'S': 28,
'T': 29,
'U': 30,
'V': 31,
'W': 32,
'X': 33,
'Y': 34,
'Z': 35
}
provinces = {
'藏': 36,
'川': 37,
'鄂': 38,
'甘': 39,
'赣': 40,
'广': 41,
'桂': 42,
'贵': 43,
'黑': 44,
'沪': 45,
'吉': 46,
'冀': 47,
'津': 48,
'晋': 49,
'京': 50,
'辽': 51,
'鲁': 52,
'蒙': 53,
'闽': 54,
'宁': 55,
'青': 56,
'琼': 57,
'陕': 58,
'苏': 59,
'皖': 60,
'湘': 61,
'新': 62,
'渝': 63,
'豫': 64,
'粤': 65,
'云': 66,
'浙': 67
}
label_ref = [
integers,
alphabets,
provinces
] # 图片信息
IMG_HEIGHT = 28
IMG_WIDTH = 16
IMG_CHANNELS = 1
# NUM_TRAIN = 7000
NUM_VALIDARION = [sum([len(os.listdir(r + i))
for i in os.listdir(r)]) // 5 for r in PATH_RES] # 读取图片
def read_images(path_res, label_ref, num_validation):
imgs = []
labels = []
path_res_dirs = sorted(os.listdir(path_res))
for i in path_res_dirs:
paths_images = os.listdir(path_res + i) # 本想排序的, 但是字符串排序效果不尽人意.
t_lst = [''.join((path_res, i, '/', t)) for t in paths_images]
paths_images = t_lst.copy()
del t_lst
for j in range(len(paths_images)):
c = 0
img = cv2.imread(paths_images[j], 0)
img_blur = cv2.bilateralFilter(img, 3, 45, 45)
img_current = cv2.resize(img_blur, (28, 28))
ret, img_current_threshed = cv2.threshold(img_current,
127, 255,
cv2.THRESH_OTSU)
h, w = img_current_threshed.shape
t_c = np.array([[img_current_threshed[0][0],
img_current_threshed[0, w-1]],
[img_current_threshed[h-1, 0],
img_current_threshed[h-1, w-1]]])
c = sum([(t_c[0, 0]//255), (t_c[1, 1]//255),
(t_c[0, 1]//255), (t_c[1, 0]//255)])
if_reverse = sum([sum(img_current_threshed[0, :] // 255),
sum(img_current_threshed[:, w-1] // 255),
sum(img_current_threshed[h-1, :] // 255),
sum(img_current_threshed[:, 0] // 255)])\
/ ((h + w) * 2 + 4) > 0.5
# if c >= 1:
# img_current_threshed = 255 - img_current_threshed
if c > 2 or (c > 1 and if_reverse):
img_current_threshed = 255 - img_current_threshed
# img_current_threshed = img_current
label_current = paths_images[j].split("/")[-2]
# if i == '2':
# fig, ax = plt.subplots(1, 2, figsize=(16, 8))
# ax0, ax1 = ax.ravel()
# ax0.imshow(img_current, cmap="gray")
# ax1.imshow(img_current_threshed, cmap="gray")
# plt.title(c)
# # print([img_current_threshed[0][0],
# # img_current_threshed[0, w-1],
# # img_current_threshed[h-1, 0],
# # img_current_threshed[h-1, w-1]])
# plt.show()
imgs.append((img_current_threshed // 255).astype(np.uint8))
labels.append(np.uint8(label_ref[label_current]))
imgs = np.array(imgs)
imgs = imgs.reshape(imgs.shape[0], -1)
labels = np.array(labels)
labels = labels.reshape(labels.shape[0], -1)
data = np.hstack((labels, imgs))
data = shuffle(data)
test_labels = data[:num_validation, 0]
test_images = data[:num_validation, 1:]
train_labels = data[num_validation:, 0]
train_images = data[num_validation:, 1:]
return train_labels, train_images, test_labels, test_images # 生成整数型的属性
def _int64_feature(value):
return tf.train.Feature(int64_list=tf.train.Int64List(value=[value])) # 生成字符串型的属性
def _bytes_feature(value):
return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value])) def convert(images, labels, filename):
# 获取要转换为TFRecord文件的图片数目
num = images.shape[0]
print("num:", num)
print("images.shape:", images.shape)
# 输出TFRecord文件的文件名
print('Writting', filename)
# 创建一个writer来写TFRecord文件
writer = tf.python_io.TFRecordWriter(filename)
for i in range(num):
# 将图像矩阵转化为一个字符串
img_raw = images[i].tostring()
# 将一个样例转化为Example Protocol Buffer,并将所有需要的信息写入数据结构
example = tf.train.Example(features=tf.train.Features(feature={
'label': _int64_feature(int(labels[i])),
'image_raw': _bytes_feature(img_raw)}))
# 将example写入TFRecord文件
writer.write(example.SerializeToString())
writer.close()
print('Writting End') def main():
start_time = time.time()
for i in range(len(PATH)):
print('reading images from {} begin'.format(PATH_RES[i]))
data = read_images(PATH_RES[i], label_ref[i], NUM_VALIDARION[i])
train_labels, train_images, test_labels, test_images = data
# Slice data here.
print('convert to tfrecords into {} begin'.format(PATH_DES[i]))
convert(train_images, train_labels, PATH_DES[i]+"train.tfrecords")
convert(test_images, test_labels, PATH_DES[i]+"test.tfrecords")
duration = time.time() - start_time
print('Converting end , total cost = %d sec' % duration) if __name__ == '__main__':
main()

图片转tfrecords的更多相关文章

  1. Tensorflow线程和队列

    读取数据 小数量数据读取 这仅用于可以完全加载到存储器中的小的数据集有两种方法: 存储在常数中. 存储在变量中,初始化后,永远不要改变它的值. 使用常数更简单一些,但是会使用更多的内存,因为常数会内联 ...

  2. TensorFlowIO操作(二)----读取数据

    读取数据 小数量数据读取 这仅用于可以完全加载到存储器中的小的数据集有两种方法: 存储在常数中. 存储在变量中,初始化后,永远不要改变它的值. 使用常数更简单一些,但是会使用更多的内存,因为常数会内联 ...

  3. TensorFlow高效读取数据的方法——TFRecord的学习

    关于TensorFlow读取数据,官网给出了三种方法: 供给数据(Feeding):在TensorFlow程序运行的每一步,让python代码来供给数据. 从文件读取数据:在TensorFlow图的起 ...

  4. TensorFlow笔记-文件读取

    小数量数据读取 这些只用于可以完全加载到内存中的小型数据集: 1,储存在常数中 2,储存在变量中,初始化后,永远不改变它的值 使用常量 training_data = ... training_lab ...

  5. [TFRecord格式数据]利用TFRecords存储与读取带标签的图片

    利用TFRecords存储与读取带标签的图片 原创文章,转载请注明出处~ 觉得有用的话,欢迎一起讨论相互学习~Follow Me TFRecords其实是一种二进制文件,虽然它不如其他格式好理解,但是 ...

  6. TFrecords读、写图片文件

    参考:https://blog.csdn.net/u014802590/article/details/68495238 参考:https://www.2cto.com/kf/201709/68057 ...

  7. 记录:将图片数据生成 tfrecords 文件并在训练使用时读取

    直接用别人的就行了: https://github.com/myCVs/GenTFRecords

  8. 【学习笔记】tensorflow图片读取

    目录 图像基本概念 图像基本操作 图像基本操作API 图像读取API 狗图片读取 CIFAR-10二进制数据读取 TFRecords TFRecords存储 TFRecords读取方法 图像基本概念 ...

  9. 图像转化成TFrecords格式并回转

    import os import tensorflow as tf from PIL import Image import numpy as np cat_image_path='D:/软件/pyc ...

随机推荐

  1. nginx.service: control process exited, code=exited status=1

    安装linux的宝塔面板,结果面板显示nginx和php已经运行了,但是机器系统上并没有运行.记录一次nginx报错,操作步骤看下代码: [root@localhost nginx]# systemc ...

  2. jmeter进行分布式压测过程与 注意事项

    jmeter命令行运行但是是单节点下的, jmeter底层用java开发,耗内存.cpu,如果项目要求大并发去压测服务端的话,jmeter单节点难以完成大并发的请求,这时就需要对jmeter进行分布式 ...

  3. java-数据类型复习

    java中共有8种基本的数据类型,分别为 字节型byte(8字节,32位),短整型short(16字节),整型int(32字节),长整型long(64字节), 字符型char(16字节),浮点型flo ...

  4. URL 重定向机制

    由于存在上述三种 URL 重定向机制,那么在多种方法同时设定的情况下,哪种方法会首先起作用呢?优先级顺序如下: HTTP 协议的重定向机制永远最先触发,即便是在没有传送任何页面--也就没有页面被(客户 ...

  5. springboot2.2.2集成6.5 Elasticsearch

    1.0POM文件 <!-- spring-boot --> <dependency> <groupId>org.springframework.boot</g ...

  6. 十六:SpringBoot-自定义启动页,项目打包和指定运行环境

    SpringBoot-自定义启动页,项目打包和指定运行环境 1.自定义启动页 2.打包配置 2.1 打包pom配置 2.2 多环境配置 3.环境测试接口 4.打包执行 4.1 指定模块打包 4.2 运 ...

  7. Mysql 基本操作命令

    1.添加用户 1.1 登录MYSQL: @>mysql -u root -p @>密码 1.2 创建用户: 格式:grant select on 数据库.* to 用户名@登录主机 ide ...

  8. 思维导图整理Java并发基础

    话不多说,先上图. 1.基本概念 欲说线程,必先说进程. 进程:进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位. 线程:线程是进程的一个执行路径,一个进程中至少有一个线程,进 ...

  9. JVM探究——转载

    JVM探究 请你谈谈你对JVM的理解 Java8虚拟机和之前的变化更新 什么式OOM,什么是栈溢出StackOverFlowError?怎么分析 JVM的常用调优参数有哪些? 内存快照如何抓取,怎么分 ...

  10. NodeMCU获取并解析心知天气信息

    NodeMCU获取并解析心知天气信息 1 注册心知天气并获取私钥 打开心知天气网站,点击注册按钮 填写基本信息注册心知天气账号,登录注册所填写的邮箱点击链接进行账号激活,随后出现如下界面 点击登录按钮 ...