美文网首页
线程队列与IO操作(三)

线程队列与IO操作(三)

作者: Daily_Note | 来源:发表于2018-11-21 21:14 被阅读0次

    线程队列与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操作(三)

          本文链接:https://www.haomeiwen.com/subject/cuehqqtx.html