线程队列与IO操作(三)

线程队列与IO操作

记录,成为更好的自己

1. 队列和线程

2. 文件读取

3. 图片处理


3. 图片处理

  1. 图像基本知识

    • 如何识别图片?
      • 要把图片的特征值拿出来,机器学习就是靠输入的特征值+目标值来进行分类和回归。一张图片在电脑上显示靠像素,每个图片都是由像素组成的,像素就是图片的特征。
      • 如一张图片的长为200,宽为200,像素为:200*200=40000个像素值(特征)
      • 单通道:黑白的图片,每一个像素点只有一个值,叫灰度值[0~255]
      • 三通道:彩色的图片,每一个像素点有三个值(RGB),红色、绿色、蓝色。彩色图片的特质值为200 * 200 * 3=120000
    • 如何用张量来表达?
      • 图片的特征抽取,三要素:长度,宽度,通道
      • 指定3-D张量:[height,weight,channels]。如:[200,200,3]:200长200宽3通道。
    • 每一个样本必须保持特征值数量一样。
      • 所有的图片要统一特征的数量(像素值一样)
      • 缩小图片的数量,放止增加开销
  2. 图像读取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.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]
图片读取代码
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)

你可能感兴趣的:(线程队列与IO操作(三))