相关文章推荐
玩足球的莴苣  ·  ServiceActivationExcep ...·  11 月前    · 
满身肌肉的风衣  ·  linux - How do I ...·  11 月前    · 
冷静的口罩  ·  Gitlab-Runner注册 - 简书·  1 年前    · 
英勇无比的爆米花  ·  在Android ...·  1 年前    · 
  • 图像读取
  • 图像缩放
  • 图像数据纬度变换
  • 自然语言处理
    • 文字清洗
    • 文字嵌入(Embedding)
  • CNN卷积神经网络
    • 图像特征提取
    • 迁移学习(Transfer Learning)
  • LSTM递归神经网络
    • 文字串(sequence)特征提取
  • DNN深度神经网络
    • 从图像特征和文字串(sequence)的特征预测下一个单词
  • 使用数据集

    Framing Image Description as a Ranking Task:Data, Models, and Evaluation Metrics,2013.

    • Flickr8K
    • 8000个图像,每幅图5个标题,描述图像里面的事物和事件
    • 不包含著名人物和地点
    • 分为3个集合:6000个训练图像,1000个开发图像,1000个测试图像
    • A child in a pink dress is climbing up a set of stairs in an entry way.
    • A girl going into a wooden building .
    • A little girl climbing into a wooden playhouse.
    • A little girl climbing the stairs to her playhouse.
    • A little girl in a pink dress going into a wooden cabin

    自动生成英文标题,与人类生成的标题越相似越好。 衡量两个句子的==相似度(BLEU)==,一个句子与其他几个句子的相似度==(Corpus BLEU)==

    • BLEU:Bilingual Evaluation Understudy(双语评估替换)。
    • BLEU是一个比较候选文本翻译与其他一个或多个参考翻译的评价分数。尽管他是为翻译工作而开发的,但是仍然可以用于评估自动生成的文本质量

    VGG16网络模型

    Very Deep Convplutional Networks For Large-Scale Visual Recognition

    • Pre-trained model:Oxford Visual Geometry Group赢得2014ImageNet竞赛

    • 用于图像分类,讲输入图像分为1000个类别 截屏2020-02-23上午8.57.39

    绿色标注为VGG网络。可以看出,该网络有16个权值层,5个池化层 截屏2020-02-23上午11.57.53

    编写代码实现网络(练习)

    from keras.models import Sequential
    from keras.layers import Dense, Flatten
    from keras.layers import Conv2D
    from keras.layers import MaxPooling2D
    def generate_vgg16():
        搭建VGG16神经网络
        :return:VGG16神经网络
    if __name__ =='__main__':
        model = generate_vgg16()
        model.summary()
    

    VGG16输入为(224,224,RGB)的图像

    input_shape = (224, 224, 3)
    

    部分网络结构

    Maxpooling层和全连接层之间要使用Flatten。 总代码为:

    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense, Flatten
    from tensorflow.keras.layers import Conv2D, MaxPooling2D
    def generate_vgg16():
        搭建VGG16神经网络
        :return:VGG16神经网络
        input_shape = (224, 224, 3)
        model = Sequential([ # 第一层
            Conv2D(64, (3, 3), input_shape=input_shape, padding='same', activation='relu'),  # output:(None, 224, 224, 64)
            Conv2D(64, (3, 3), padding='same', activation='relu'),# output:(None, 224, 224, 64)
            MaxPooling2D(pool_size=(2, 2), strides=(2, 2)), # ∵strides,∴output减半:(None, 112, 112, 64)
            # 中间层省略了 —— ljy实现
            Conv2D(128, (3, 3), padding='same', activation='relu'), # (None, 112, 112, 128)
            Conv2D(128, (3, 3), padding='same', activation='relu'), # (None, 112, 112, 128)
            MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),  #  (None, 56, 56, 128)
            Conv2D(256, (3, 3), padding='same', activation='relu'),  # (None, 56, 56, 256)
            Conv2D(256, (3, 3), padding='same', activation='relu'),  # (None, 56, 56, 256)
            MaxPooling2D(pool_size=(2, 2), strides=(2, 2)), # (None, 28, 28, 256)
            Conv2D(512, (3, 3), padding='same', activation='relu'),  # (None, 28, 28, 512)
            Conv2D(512, (3, 3), padding='same', activation='relu'),  # (None, 28, 28, 512)
            MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),  # (None, 14, 14, 512)
            Conv2D(512, (3, 3), padding='same', activation='relu'),  # (None, 14, 14, 512)
            Conv2D(512, (3, 3), padding='same', activation='relu'),  # (None, 14, 14, 512)
            MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),  # (None, 7, 7, 512)
            # 中间层省略部分 -- 结束
            MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),  # (None, 3, 3, 512)
            Flatten(), # Maxpool连接全连接层Dense时,别忘先Flatten();  # output:(None, 4608)
            Dense(4096, activation='relu'),  # (None, 4096)
            Dense(4096, activation='relu'),  # (None, 4096)
            Dense(1000, activation='softmax'), # 最后一层:分类问题,故选用softmax,output:(None, 1000)
        return model
    if __name__ == '__main__':
        model = generate_vgg16()
        model.summary()
    

    运行可见输出: 截屏2020-02-23上午11.52.01

    看图说话项目

    本项目所需的所有数据集和网络如下: 链接:https://pan.baidu.com/s/1nP856AdlTmcRSPez2—u5A 密码:vs7b

    图像特征提取

    将flicker8K的图像文件转为图像特征,保存为字典pickle文件

    • 从给定的VGG16网络结构文件(JS文件)和网络权值文件,创建VGG16网络
    • 修改网络结构(去除最后一层)
    • 利用修改的网络结构,提取flicker8K数据集中所有的图像特征,利用字典保存,key为文件名(不带.jpg后缀),value为一个网络的输出
    • 将字典保存为features.pkl文件(使用pickle库)

    理想网络模型

    简化网络模型

    从图像到特征

    迁移学习(transfer learning)

    • VGG16 CNN原本的目标是分类,基于ImageNet数据集进行训练,训练所需的时间比较大,需要4个GPU训练3星期左右
    • 可以调整VGG16的网络结构为图像标题生成服务
    • VGG16最后一层是将倒数第二层4096纬的输出转为1000纬的输出作为1000类别的分类概率
    • 我们可以通过去除最后一层,将倒数第二层的4096纬的输出作为图像标题生成模型的图像特征
    import os
    from tensorflow.keras.models import model_from_json
    from tensorflow.keras import backend as K
    from tensorflow.keras.models import Model
    from PIL import Image as pil_image
    import numpy as np
    from pickle import dump
    from os import listdir
    from tqdm import tqdm
    def load_vgg16_model():
        """从当前目录下面的 vgg16_exported.json 和 vgg16_exported.h5 两个文件中导入 VGG16 网络并返回创建的网络模型
        # Returns
            创建的网络模型 model
        json_file = open("vgg16_exported.json", 'r')
        loaded_model_json = json_file.read()
        json_file.close()
        model = model_from_json(loaded_model_json)
        model.load_weights("vgg16_exported.h5")
        return model
    def preprocess_input(x):
        """预处理图像用于网络输入, 将图像由RGB格式转为BGR格式.
            将图像的每一个图像通道减去其均值
            均值BGR三个通道的均值分别为 103.939, 116.779, 123.68
         # Arguments
             x: numpy 数组, 4维.
             data_format: Data format of the image array.
         # Returns
             Preprocessed Numpy array.
        # 'RGB'->'BGR'(Matplotlib image to OpenCV):
        # https://www.scivision.co/numpy-image-bgr-to-rgb/
        x = x[..., ::-1]  # x == x[...], x为np.array()->shape:4维
        mean = [103.939, 116.779, 123.68]
        x[..., 0] -= mean[0]
        x[..., 1] -= mean[1]
        x[..., 2] -= mean[2]
        return x
    def load_img_as_np_array(path, target_size):
        """从给定文件加载图像,转换图像大小为给定target_size,返回32位浮点数numpy数组.
        # Arguments
            path: 图像文件路径
            target_size: 元组(图像高度, 图像宽度).
        # Returns
            A PIL Image instance.
        img = pil_image.open(path)
        img = img.resize(target_size, pil_image.NEAREST)
        return np.asarray(img, dtype=K.floatx())
    def extract_features(directory):
        """提取给定文件夹中所有图像的特征, 将提取的特征保存在文件features.pkl中,
           提取的特征保存在一个dict中, key为文件名(不带.jpg后缀), value为特征值[np.array]
        Args:
            directory: 包含jpg文件的文件夹
        Returns:
        model = load_vgg16_model()
        model.layers.pop() # 去除模型最后一层            # 注意此处不加s ↓
        model = Model(inputs=model.inputs, outputs=model.layers[-1].output)
        print("Extracting...")
        features = dict()
        pbar = tqdm(total=len(listdir(directory)), desc="进度", ncols=100)
        for fn in listdir(directory): # fn: filename
            print("\tRead file: ", fn)
            fn_path = directory + '/' + fn
            # 返回长、宽、通道的三维张量
            arr = load_img_as_np_array(fn_path, target_size=(224,224))
            # 改变数组的形态,增加一个维度(批处理输入的维度[0])—— 4维
            arr = arr.reshape((1, arr.shape[0], arr.shape[1], arr.shape[2]))
            # 预处理图像为VGG模型的输入(RGB -> BGR)
            arr = preprocess_input(arr)
            # 计算特征
            feature = model.predict(arr, verbose=0)
            print("\tprocessed...", end='')
            id = os.path.splitext(fn)[0] # 特征属性名
            features[id] = feature
            print("Saved. ", id)
            pbar.update(1)
        print("Complete extracting.")
        return features
    if __name__ == '__main__':
        # 提取所有图像的特征,保存在一个文件中, 大约一小时的时间,最后的文件大小为127M
        # 下载zip文件,解压缩到当前目录的子文件夹Flicker8k_Dataset, 注意上传完成的作业时不要上传这个数据集文件
        directory = './Flicker8k_Dataset'
        features = extract_features(directory)
        print('提取特征的文件个数:%d' % len(features))
        print(K.image_data_format())
        #保存特征到文件
        dump(features, open('features.pkl', 'wb'))
                        Background分别使用CNN和LSTM对图像和文字进行处理:   将两个神经网络结合: 应用领域图像搜索安全鉴黄涉猎知识数字图像处理图像读取图像缩放图像数据纬度变换自然语言处理文字清洗文字嵌入(Embedding)CNN卷积神经网络图像特征提取迁移学习(Transfer Learning)LSTM递归神经网络文字串(sequence)特征提取DNN深度神经网络从图像特征和文字串(sequence)的特征预测下一个单词使用数据集Framing 
    				
    图片字幕 :man::laptop: 基于CNN和LSTM概念以及Flicker_8k和GUI数据集的图像标题深度学习模型 :mechanical_leg: 来自tkinter。 Convolutional Neural Network是一种深度学习算法,可以吸收输入图像,为图像中的各个方面/对象分配重要性,并能够区分彼此。 这种方法的流程结构就像 在分类的最后一部分中,我们使用了RNN的扩展版本,即LSTM ,它使用了存储的内存和结构看起来像 表格中的数据集 一个穿着粉红色裙子的孩子正在以入门方式爬上楼梯。 一个走进一幢木制建筑物的女孩。 一个小女孩爬进一个木制剧场。 一个小女孩爬上楼梯到她的游戏室。 一个小女孩穿着粉红色的连衣裙走进一个小木屋。 数据集和。 以下图像标签上的步骤 取材和清洁的标准方法 如果您没有强大的GPU,则从大型数据集中提取特征将花费大量时间。 我的机器大约需要6-7分钟。 您可以使用GPU机器在
    图像理解一、文本处理1.1 生成图像的描述文件2.2 单词嵌⼊(Word Embedding)2.3 生成输入数据结构二、模型处理2.1 创建用于图片理解的模型2.2 模型评价三、 总结 一、文本处理 1.1 生成图像的描述文件 根据数据集中的Flickr8k.token.txt文件生成含有图片对应的描述的文件 def create_descriptions(filename): with open(filename, 'r') as file_read: with open("
    该文内容主要是针对图像描绘从最基础的baseline:NIC模型开始到引出Attention,并且与Transformer模型进行性能比对,在源内容上进行拓展以及更新。主要针对学期大作业内容进行讲解。 任务定义: 图像描述是结合了计算机视觉和自然语言处理两个研究..
    0.入门二《Deep Visual-Semantic Alignments for Generating Image Descriptions》 1.Show and Tell:神经图像字幕生成器 2015 利用了机器翻译的思想,将图像提取出抽象的特征,再将特征作为输入来生成自然语言,如下图: 模型优化目标: 其中,I代表图像,S代表对应的描述,θ代表模型的参数。在给定图像和参数时使生成描述S的概率最大,从而得到参数,以此来训练模型。 论文链接:https://arxiv.org/pdf/141
    参考:https://www.cnblogs.com/by-dream/p/7679284.html BLEU 采用一种N-gram的匹配规则+召回率+惩罚因子组合方式。 N-gram 当N=1时,一般用来判断文字生成的准确性,234用来判断生成文本的流畅性。 原文:今天天气不错 机器译文:It is a nice day today 人工译文:Today is a nice day
    ### 回答1: 自我批评序列训练是一种用于图像字幕生成的技术。它通过在训练期间对生成的字幕进行自我批评,以改进模型的性能。该方法使用了一种称为“自我注意力”的技术,它允许模型在生成字幕时关注先前生成的单词,从而提高生成的质量。自我批评序列训练已被证明是一种有效的技术,可以在各种图像字幕生成任务中提高模型的性能。 ### 回答2: Self-critical sequence training(SCST)是一种图像标注模型的训练方法,它通过对模型输出的错误进行自我评估来提高图像标注的精度。SCST是一种监督式学习方法,它通过与基础模型进行有针对性的反馈,来提高模型的输出结果。 在SCST中,模型首先生成一个单词序列,然后通过自我评估方法计算序列的损失函数。模型会将自己生成的序列与参考答案进行比较,并根据两者之间的差异来调整自己的参数。如果模型生成的序列与参考答案相似度高,则可以认为模型输出的结果是正确的,模型会将该序列的损失函数作为最终的目标值进行优化。 SCST的另一个优点是它可以生成更加准确的图像标注。在传统的图像标注方法中,模型在标注一张图片时会依靠之前标注的其他图片的信息,但是这种方法的精度往往会受到前一个标注结果的影响。而SCST在每个输入图像上独立进行标注,每一步只考虑当前序列的损失函数,从而减少标注过程中的误差。 总的来说,SCST是一种有效的图像标注训练方法,它能够通过自我评估来优化模型,同时生成更加准确的图像标注。 ### 回答3: “自我批评顺序训练”是一种用于图像描述的深度学习技术。该技术的主要目的是提高用计算机生成图像描述的质量和准确性。 在传统的图像描述方法中,计算机通过“编码-解码”系统生成描述。首先将图像输入编码器,然后将编码结果传入解码器,最后给出相应的描述。但是这种方法很难准确地给出正确的图像描述,特别是对于长句描述来说。 为了解决这个问题,研究人员提出了自我批评顺序训练技术,该技术的基本思想是通过与人工生成描述的对比来训练模型。具体来说,这个技术包括三个关键步骤: 1. 生成描述。计算机将图像输入到编码器,然后用解码器生成一个最初的描述并提交给人工审核。 2. 人工批评。人工将计算机生成的描述与自己生成的描述进行比较,然后给出分数。 3. 重新训练。计算机接收到人工评分后,采取相应的操作来调整自己的模型。然后再进行描述生成,直到达到最终的分数为止。 通过这种方法训练的计算机模型,可以显著提高图像描述的准确度和质量。在使用这种技术进行研究时,研究人员还发现,自我批评顺序训练能减少过拟合现象的发生。因为它强制计算机与人类对比,从而避免了学习到过多的训练数据和模型参数。