线程队列与IO操作
记录,成为更好的自己
1. 队列和线程
2. 文件读取
3. 图片处理
3. 图片处理
-
图像基本知识
-
如何识别图片?
- 要把图片的特征值拿出来,机器学习就是靠输入的特征值+目标值来进行分类和回归。一张图片在电脑上显示靠像素,每个图片都是由像素组成的,像素就是图片的特征。
- 如一张图片的长为200,宽为200,像素为:200*200=40000个像素值(特征)
- 单通道:黑白的图片,每一个像素点只有一个值,叫灰度值[0~255]
- 三通道:彩色的图片,每一个像素点有三个值(RGB),红色、绿色、蓝色。彩色图片的特质值为200 * 200 * 3=120000
- 如何用张量来表达?
- 图片的特征抽取,三要素:长度,宽度,通道
- 指定3-D张量:[height,weight,channels]。如:[200,200,3]:200长200宽3通道。
- 每一个样本必须保持特征值数量一样。
- 所有的图片要统一特征的数量(像素值一样)
- 缩小图片的数量,放止增加开销
-
如何识别图片?
-
图像读取API
- 缩小图片:tf.image.resize_images(images, size)
- imgages:4-D形状[batch,height,width,channels]OR3-D形状张量[height,width,channels]的图片数据
- size:1-Dint32张量:new_height,new_width,图像的新尺寸
- 返回4-D格式或者3-D格式图片
- 图像读取器
- tf.WholeFileReader
- 将文件的全部内容作为值输出的读取器
- return:读取器实例
- read(file_queue):输出将是一个文件名(key)和该文件内容(value)
- tf.WholeFileReader
- 图像解码器
- tf.image.decode_jpeg(contents)
- 将JPEG编码的图像解码为uint8张量
- return:uint8张量,3-D形状[height,width,channels]
-tf.image.decode_png(contents) - 将PNG编码的图像解码为uint8或者unit16张量
- return:张量类型,3-D形状[height,width,channels]
- tf.image.decode_jpeg(contents)
- 缩小图片:tf.image.resize_images(images, size)
图片读取代码
def picread(filelist):
"""
读取狗图片并转换成张量
:param filelist: 文件路径+名字的列表
:return:每张图片的张量
"""
# 1. 构造文件队列
file_queue = tf.train.string_input_producer(filelist)
# 2. 构造图片阅读器
reader = tf.WholeFileReader()
key, value = reader.read(file_queue)
print(value)
# 3. 构造解码器,对读取的图片进行解码
image = tf.image.decode_jpeg(value)
print(image)
# 4. 处理图片的大小(统一大小)
image_resize = tf.image.resize_images(image,[200,200])
print(image_resize)
# 注意:一定要把样本的形状固定,在批处理的时候要求所有数据形状必须定义
image_resize.set_shape([200,200,3])
print(image_resize)
# 5. 进行批处理
image_batch = tf.train.batch([image_resize], batch_size=10,num_threads=1, capacity=10)
print(image_batch)
return image_batch
# 读取图片
if __name__=="__main__":
# 1. 找到文件,放入列表
file_name = os.listdir("./data/dog")
filelist = [os.path.join("./data/dog",file) for file in file_name]
# print(file_name)
image_batch = picread(filelist)
# 开启会话
with tf.Session() as sess:
# 开启线程协调器
coord = tf.train.Coordinator()
# 开启读取文件的线程
threads = tf.train.start_queue_runners(sess, coord=coord)
# 打印读取内容
print(sess.run([image_batch]))
# 回收子线程
coord.request_stop()
coord.join(threads)
网友评论