图片转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 ...
随机推荐
- CentOS7 通过snat进行上网
需求: 有两台服务器,一台绑定了弹性公网IP,另外一台没有,需要内网服务器通过有弹性ip的机器代理进行上网. 环境: centos7 操作系统 服务器A: 192.168.0.18 (可以上网,有弹性 ...
- SpringCloud zuul 网关限流分析
最近项目中 spring cloud zuul 运用到限流功能,打算配置一下就直接使用,不过在压测与调优过程中遇到一些没有预测到的问题,附上排查与解析结果 yml.pom配置 强烈推荐,按最新gith ...
- C#高级编程第11版 - 第二章 索引
[1]2.1.1 Hello,World! 1. using static System.Console; // ... WriteLine("Hello World!"); 提前 ...
- leaving sockets open which can trigger a ResourceWarning in some # cases, and look like a memory leak in others
# -*- coding: utf-8 -*- """ requests.api ~~~~~~~~~~~~ This module implements the Requ ...
- C++ Primer Plus读书笔记(三)复合类型
这节主要是介绍数组.结构体.类等概念,以及new delete内存管理. 1.数组 首先普及一下C++中字符串的概念,只有在结尾有 \0 的才叫字符串, cout 输出字符串也以空字符为标记进行结束输 ...
- CF401C
扯在前面 本题的英文翻译很有意思,很符合CF大多题的故事风格,但是luogu的翻译更过于直白易懂 如果让我看英文故事做题我怕我都不知道该怎么下手 正文 题意: 构造一个01序列,包含n个0,m个1要求 ...
- 【Redis 分布式锁】(1)一把简单的“锁”
原文链接:https://www.changxuan.top/?p=1230 在单体架构向分布式集群架构演进的过程中,项目中必不可少的一个功能组件就是分布式锁.在开发团队有技术积累的情况下,做为团队的 ...
- php中一种单引号逃逸造成的注入
demo如下: $post = $_POST; $sql=''; $array['name'] = $post['name']; $array['age'] = 18; $array['addr'] ...
- H5 的直播协议和视频监控方案
H5 的直播协议和视频监控方案 一.流媒体主要实现方式 二.流媒体技术 2.1 流媒体 2.2 直播 2.3 流协议 2.3.1 HLS 协议 2.3.2 RTMP 协议 2.3.3 RTSP 协议 ...
- 压缩文件 .zip.001 .zip.002合并
可以把名字特别长的命名为1 这样简单些 copy /B 1.zip.001+1.zip.002 1.zip