图片转tfrecords
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的更多相关文章
- Tensorflow线程和队列
读取数据 小数量数据读取 这仅用于可以完全加载到存储器中的小的数据集有两种方法: 存储在常数中. 存储在变量中,初始化后,永远不要改变它的值. 使用常数更简单一些,但是会使用更多的内存,因为常数会内联 ...
- TensorFlowIO操作(二)----读取数据
读取数据 小数量数据读取 这仅用于可以完全加载到存储器中的小的数据集有两种方法: 存储在常数中. 存储在变量中,初始化后,永远不要改变它的值. 使用常数更简单一些,但是会使用更多的内存,因为常数会内联 ...
- TensorFlow高效读取数据的方法——TFRecord的学习
关于TensorFlow读取数据,官网给出了三种方法: 供给数据(Feeding):在TensorFlow程序运行的每一步,让python代码来供给数据. 从文件读取数据:在TensorFlow图的起 ...
- TensorFlow笔记-文件读取
小数量数据读取 这些只用于可以完全加载到内存中的小型数据集: 1,储存在常数中 2,储存在变量中,初始化后,永远不改变它的值 使用常量 training_data = ... training_lab ...
- [TFRecord格式数据]利用TFRecords存储与读取带标签的图片
利用TFRecords存储与读取带标签的图片 原创文章,转载请注明出处~ 觉得有用的话,欢迎一起讨论相互学习~Follow Me TFRecords其实是一种二进制文件,虽然它不如其他格式好理解,但是 ...
- TFrecords读、写图片文件
参考:https://blog.csdn.net/u014802590/article/details/68495238 参考:https://www.2cto.com/kf/201709/68057 ...
- 记录:将图片数据生成 tfrecords 文件并在训练使用时读取
直接用别人的就行了: https://github.com/myCVs/GenTFRecords
- 【学习笔记】tensorflow图片读取
目录 图像基本概念 图像基本操作 图像基本操作API 图像读取API 狗图片读取 CIFAR-10二进制数据读取 TFRecords TFRecords存储 TFRecords读取方法 图像基本概念 ...
- 图像转化成TFrecords格式并回转
import os import tensorflow as tf from PIL import Image import numpy as np cat_image_path='D:/软件/pyc ...
随机推荐
- NFS存储迁移至GlusterFS
NFS存储迁移至GlusterFS 前提条件 为防止脑裂,建议使用最低3台节点制作3复制集的存储卷: 在进行存储迁移前,GluseterFS存储节点需先成为k8s集群中的node节点: 存储切换时请勿 ...
- eNSP启动设备AR1失败记一次解决步骤
eNSP稳定版本下载: 微信搜索公众号"疯刘小三" 关注后回复ensp即可获得下载链接地址 eNSP V100R002C00B510 Setup.exe 最近在用eNSp的时候 ...
- 小步前进之WCF简介
WCF 前言 什么是WCF? 契约 合约 前言 在 .NET Framework2.0 以及前版本中,微软发展了 Web Service..NET Remoting 等通信支持. 如果要进行通信,对于 ...
- jQuery基础介绍
最近在学习JavaScript,当学习Javascript之后,不得不学习的肯定是jQuery了,所以开始利用网络的便捷浏览各大博客寻找可学习的资源.这篇博客关于jQuery的学习让我有很多收获,也明 ...
- Java面试(解答题一)
1.简述下列问题 List,set,map的区别 解答:List,Set都是继承自Collection接口,Map则不是: List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素 ...
- linux下的ARP攻击(kali)
这是我的学习总结,刚入坑网络安全,写的不好或者有什么错误的希望大佬们指正 首先了解ARP的作用以及原理: ARP(Address Resolution Protocol,地址解析协议)是一个位于TCP ...
- mapreduce编程练习(一)简单的练习 WordCount
入门训练:WordCount 问题描述:对一个或多个输入文件中的单词进行计数统计,比如一个文件的输入文件如下 输出格式: 运行代码实例: package hadoopLearn; import jav ...
- oss-server 小型对象存储系统
oss-server 项目介绍 oss-server是针对项目开发时提供的小型对象存储系统,开发者在针对文件上传时业务剥离,同时方便文件迁移,为满足单个项目,多个系统的情况下,提供统一的oss服务 o ...
- jquery each报 Uncaught TypeError: Cannot use 'in' operator to search for错误
用$.each()来遍历后台传过来的json数据.直接遍历传过来的数据时就发生 Uncaught TypeError: Cannot use 'in' operator to search for 这 ...
- redis分布式锁的这些坑,我怀疑你是假的开发
摘要:用锁遇到过哪些问题? 一.白话分布式 什么是分布式,用最简单的话来说,就是为了较低单个服务器的压力,将功能分布在不同的机器上面:就比如: 本来一个程序员可以完成一个项目:需求->设计-&g ...