PyTorch中使用深度学习(CNN和LSTM)的自动图像标题-程序员宅基地

技术标签: python  git  人工智能  

介绍

深度学习现在是一个非常猖獗的领域 - 有如此多的应用程序日复一日地出现。深入了解深度学习的最佳方法是亲自动手。尽可能多地参与项目,并尝试自己完成。这将帮助您更深入地掌握主题,并帮助您成为更好的深度学习实践者。

在本文中,我们将看一个有趣的多模态主题,我们将结合图像和文本处理来构建一个有用的深度学习应用程序,即图像字幕。图像字幕是指从图像生成文本描述的过程 - 基于图像中的对象和动作。例如:

这个过程在现实生活中有很多潜在的应用。值得注意的是保存图像的标题,以便仅在此描述的基础上可以在稍后阶段轻松检索。

让我们继续吧!

注意:本文假设您了解深度学习的基础知识,并且之前使用过CNN处理图像处理问题。如果您想了解这些概念,可以先阅读这些文章:

 

目录

 

图像字幕问题需要什么?

假设你看到这张照片 -

你想到的第一件事是什么?(PS:请在下面的评论中告诉我们!)。

以下是人们可以提出的几句话:

一个男人和一个女孩坐在地上吃。
一个男人和一个小女孩正坐在人行道上附近一个蓝色的袋子吃。
一个男人穿着一件黑色的衬衫和一个穿着橙色礼服的小女孩分享一种享受。

快速浏览一下就足以让您理解并描述图片中正在发生的事情。从人工系统自动生成此文本描述是图像字幕的任务。

任务很简单 - 生成的输出应该在单个句子中描述图像中显示的内容 - 存在的对象,它们的属性,正在执行的动作以及对象之间的交互等。但是要复制此行为。与任何其他图像处理问题一样,人工系统是一项艰巨的任务,因此使用复杂和先进的技术(如深度学习)来解决任务。

在继续之前,我要特别感谢Andrej Kartpathy等。al,他用他 富有洞察力的课程 帮助我理解了这个主题 - CS231n

 

解决任务的方法论

图像字幕的任务可以逻辑地分为两个模块 - 一个是基于图像的模型 - 从图像中提取特征和细微差别,另一个是基于语言的模型 - 它翻译我们的图像给出的特征和对象基于模型的自然句子。

对于我们的基于图像的模型(即编码器) - 我们通常依赖于卷积神经网络模型。对于我们基于语言的模型(即解码器) - 我们依赖于递归神经网络。下图总结了上面给出的方法。

通常,预训练的CNN从输入图像中提取特征。线性变换特征向量以具有与RNN / LSTM网络的输入维度相同的维度。该网络在我们的特征向量上被训练为语言模型。

为了训练我们的LSTM模型,我们预定义了标签和目标文本。例如,如果标题是“一个男人和一个女孩坐在地上吃饭”,我们的标签和目标将如下 -

标签 - [<开始>,A,男人,和,女孩,坐,上,地,和,吃,。]  
目标 - [A,男人,和女孩,坐,上,地,和,吃,。,<结束>]

这样做是为了使我们的模型能够理解标记序列的开始和结束。

 

 

 

实施演练

让我们看一下Pytorch中图像字幕的简单实现。我们将图像作为输入,并使用深度学习模型预测其描述。

可以在GitHub上找到此示例的代码  。此代码的原作者是Yunjey Choi。在Pytorch中为他的优秀例子致敬!

在本演练中,预训练的  resnet-152模型用作编码器,解码器是LSTM网络。

要运行此示例中给出的代码,您必须安装先决条件。确保你有一个工作的python环境,最好安装anaconda。然后运行以下命令以安装其余所需的库。

git clone https://github.com/pdollar/coco.git

cd coco / PythonAPI /

cd ../../

git clone https://github.com/yunjey/pytorch-tutorial.git
cd pytorch-tutorial / tutorials / 03-advanced / image_captioning /

pip install -r requirements.txt

设置好系统后,应下载训练模型所需的数据集。这里我们将使用MS-COCO数据集。要自动下载数据集,可以运行以下命令:

chmod + x download.sh
./download.sh

现在,您可以继续开始模型构建过程。首先 - 您必须处理输入:

#搜索数据集中的所有可能单词 
#建立一个词汇表
python build_vocab.py   

#调整所有图像的大小以使其形状为224x224
python resize.py

现在,您可以通过运行以下命令开始训练模型:

python train.py --num_epochs 10 --learning_rate 0.01

只是为了窥视引擎并查看我们如何定义模型,您可以参考model.py文件中编写的代码  。

class EncoderCNN(nn.Module):
    def __init __(self,embed_size):
        msgstr“”“加载预先训练的ResNet-152并替换顶部的fc层。”“
        super(EncoderCNN,self).__ init __()
        resnet = models.resnet152(pretrained = True)
        modules = list(resnet.children())[: -  1]#删除最后一个fc图层。
        self.resnet = nn.Sequential(* modules)
        self.linear = nn.Linear(resnet.fc.in_features,embed_size)
        self.bn = nn.BatchNorm1d(embed_size,momentum = 0.01)
        self.init_weights()
        
    def init_weights(self):
        msgstr“”“初始化权重。”“
        self.linear.weight.data.normal_(0.0,0.02)
        self.linear.bias.data.fill_(0)
        
    def(self,figure):
        msgstr“”“提取图像特征向量。”“
        features = self.resnet(图片)
        features = Variable(features.data)
        features = features.view(features.size(0), -  1)
        features = self.bn(self.linear(features))
        return
    
    
class DecoderRNN(nn.Module):
    def __init __(self,embed_size,hidden_​​size,vocab_size,num_layers):
        msgstr“”“设置超参数并构建图层。”“
        super(DecoderRNN,self).__ init __()
        self.embed = nn.Embedding(vocab_size,embed_size)
        self.lstm = nn.LSTM(embed_size,hidden_​​size,num_layers,batch_first = True)
        self.linear = nn.Linear(hidden_​​size,vocab_size)
        self.init_weights()
    
    def init_weights(self):
        msgstr“”“初始化重量。”“
        self.embed.weight.data.uniform _( -  0.1,0.1)
        self.linear.weight.data.uniform _( -  0.1,0.1)
        self.linear.bias.data.fill_(0)
        
    向前(自我,特征,标题,长度):
        msgstr“”“解码图像特征向量并生成标题。”“
        embeddings = self.embed(captions)
        embeddings = torch.cat((features.unsqueeze(1),embeddings),1)
        packed = pack_padded_sequence(embeddings,lengths,batch_first = True) 
        hiddens,_ = self.lstm(打包)
        outputs = self.linear(hiddens [0])
        返回输出
    
    def sample(self,features,states = None):
        “”给定图像特征的样本标题(贪婪搜索)。“”“
        sampled_ids = []
        inputs = features.unsqueeze(1)
        对于范围内的i(20):#最大采样长度
            hiddens,states = self.lstm(输入,状态)#(batch_size,1,hidden_​​size), 
            outputs = self.linear(hiddens.squeeze(1))#(batch_size,vocab_size)
            预测=输出.max(1)[1]
            sampled_ids.append(预测)
            inputs = self.embed(预测)
            inputs = inputs.unsqueeze(1)#(batch_size,1,embed_size)
        sampled_ids = torch.cat(sampled_ids,1)#(batch_size,20)
        return sampled_ids.squeeze()

现在我们可以测试我们的模型:

python sample.py --image = ' png / example.png '

对于我们的示例图像,我们的模型为我们提供了此输出

<开始>一群站在草地上的长颈鹿。<END>

这就是你为图像字幕构建深度学习模型的方法!

 

然后去哪儿?

我们上面看到的模型只是冰山一角。关于这个主题已经做了很多研究。目前,图像字幕中最先进的模型是微软的CaptionBot。您可以在他们的官方网站上查看该系统的演示(链接:www.captionbot.ai)。

我将列出一些您可以用来构建更好的图像字幕模型的想法。

 

结束说明

在本文中,我介绍了Image Captioning,这是一个多模式任务,它构成了对自然语句中的图像进行解密和描述。然后我解释了解决任务的方法,并详细介绍了它的实现。对于好奇,我还列出了可用于改善模型性能的方法列表。

我希望本文能激励您发现更多可以使用深度学习解决的任务,以便在行业中实现越来越多的突破和创新。如果您有任何建议/反馈,请在下面的评论中告诉我们!

转载于:https://www.cnblogs.com/ylHe/p/11417763.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/anyi6536/article/details/102253485

智能推荐

2021 年中国程序员薪资和生活现状调查报告-程序员宅基地

文章浏览阅读1.4k次,点赞2次,收藏4次。根据中国互联网络信息中心(CNNIC)近日发布第 47 次《中国互联网络发展状况统计报告》。截至 2020年12月,我国网民规模达9.89亿,较2020年3月增长8540万,互联网普及率达70.4%。截至2020年12月,我国在线教育、在线医疗用户规模分别为3.42亿、2.15亿,占网民整体的34.6%、21.7%。我国网上零售额达11.76万亿元,较2019年增长10.9%。其中,实物商品网上零售额9.76万亿元,占社会消费品零售总额的24.9%。截至2020年12月,我国网络购物用户规模达7.82亿,_中国程序员薪资和生活现状调查报告

Linux驱动中completion接口浅析_init_completion linux 驱动-程序员宅基地

文章浏览阅读844次。 completion是一种轻量级的机制,它允许一个线程告诉另一个线程工作已经完成。可以利用下面的宏静态创建completion: DECLARE_COMPLETION(my_completion); 如果运行时创建completion,则必须采用以下方法动态创建和初始化: _init_completion linux 驱动

超定方程 最小二乘解 奇异值分解(SVD)_svd求超定方程-程序员宅基地

文章浏览阅读2.2w次,点赞13次,收藏62次。1. SVD任意矩阵A (mxn), 都能被奇异值分解为:其中, U是mxm的正交矩阵, V是nxn的正交矩阵, Σr是由r个沿对角线从大到小排列的奇异值组成的方阵. r就是矩阵A的秩.2. Moore-Pseudo逆任意矩阵A, 若存在矩阵X, 使得:则称X是A的Moore-Pseudo逆, 简称广义逆, 记为A+.矩阵A的广义逆是_svd求超定方程

UML-状态图与活动图_状态图收付款-程序员宅基地

文章浏览阅读3.4k次,点赞6次,收藏39次。实验目的(1) 理解状态图的基本概念;(2) 理解活动图的基本概念;(3) 掌握在Rational Rose中绘制状态图和活动图的操作方法。实验内容一 、用状态图描述一个银行贷记卡(对象)在激活期的部分行为细节。激活期两种基本状态:借记(InCredit)和透支(Overdrawn),可进行存款(deposit)和取款(withdraw)等操作。根据操作交易中涉及的交易金额(amt)和..._状态图收付款

Clarke and number_一行一个整数,表示最少操作数。若无论如何都不能将所有的 ai 变成非负整数,输出 --程序员宅基地

文章浏览阅读233次。克拉克是一名人格分裂患者.某一天克拉克变成了一名数论研究者,在研究数字.他想到了一个题:给定非负整数 x 和正整数 k ,可以做若干操作,每次操作是以下两种方法之一:1. x=x−k 2. x=⌊x√⌋2 现在克拉克想知道,这个整数最少经过多少次操作可以变成 0 . Input 第一行是一个正整数T(1≤T≤100),表示数据组数. 每组数据只有一行两个..._一行一个整数,表示最少操作数。若无论如何都不能将所有的 ai 变成非负整数,输出 -

附源码】计算机毕业设计JAVA宠物领养管理系统_java实现宠物认领-程序员宅基地

文章浏览阅读60次。5 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。若包含,则为maven项目,否则为非maven项目。JAVA + mybatis + Maven + Vue 等等组成,B/S模式 + Maven管理等等。1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件;4.开发环境为Eclipse/idea,数据库为mysql 使用java语言开发。_java实现宠物认领

随便推点

找亲密数_求2000以内的全部亲密数。所谓亲密数是指:如果整数a的全部因子(包括1但不包括a本-程序员宅基地

文章浏览阅读738次,点赞2次,收藏2次。找亲密数如果整数A的全部因子(包括1,但不包括A本身)之和等于B;而且整数B的全部因子(包括1,但不包括B本身)之和等于A,则称整数A和B为亲密数。由键盘接收5个正整数,请判断这5个正整数是否有亲密数,如果有亲密数,则输出该整数和亲密数,否则输出该整数和0。该整数和亲密数或0之间使用逗号分隔,每个整数一行,共输出5行。例如:输入5个整数:105 220 2000 500 2680由于只有220有亲密数,所以输出5行为:105,0220,2842000,0500,02680,0#_求2000以内的全部亲密数。所谓亲密数是指:如果整数a的全部因子(包括1但不包括a本

Android 开发 OCR Tesseract4Android图片文字识别 巨详细全部代码教程_安卓开发ocr文字识别库-程序员宅基地

文章浏览阅读436次,点赞5次,收藏8次。是Optical Character Recognition(光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程。1、 Android 4.1 (API 16) 或更高版本。2、JDK版本是Java 17。_安卓开发ocr文字识别库

解决方案:调用接口获取IAM用户的Token和使用(解决Incorrect IAM authentication information: x-auth-token not found)-程序员宅基地

文章浏览阅读1.8k次,点赞6次,收藏7次。在使用华为云在线服务Api、在线推理时经常会遇到认证鉴权的问题。而在认证鉴权的时候,往往需要通过Token认证通用请求。这种提示多半是因为发送的请求没有携带Token或者是Token过期或错误。Token是系统颁发给IAM用户的访问令牌,承载用户的身份、权限等信息。调用IAM以及其他云服务的接口时,可以使用本接口获取的IAM用户Token进行鉴权。Token可通过调用获取用户Token接口获取。本文记录通过接口服务调用获取用户的Token的解决方案,记录时以华为云为例,其他的平台原理方案类似。_incorrect iam authentication information: x-auth-token not found

手机服务器密码在什么位置,手机远程云服务器登录密码是什么-程序员宅基地

文章浏览阅读714次。手机远程云服务器登录密码是什么 内容精选换一换只有运行中的云服务器云主机才允许用户登录。Windows操作系统用户名“Administrator”。首次登录云耀云服务器,请先通过“重置密码”功能设置登录密码。重置密码:选中待重置密码的云耀云服务器,并选择“操作”列下的“ 重置密码”。重置密码:选中待重置密码的云耀云服务器,并选择“操作”列下的“ 重置密码”。请根据需要选择登录方式,登只有运行中的云..._手机服务器地址用户名密码

el-dialog遮罩层覆盖弹框(z-index值大的图层在z-index值小的图层下面)_el-dialog z-index-程序员宅基地

文章浏览阅读1.6w次,点赞10次,收藏8次。一、问题 如下图所示,本应该出现在遮罩层上面的弹框,出现在了遮罩层下面。 审查元素时看到,遮罩层的z-index为2042。 将遮罩层隐藏,查看弹框的z-index为2043。二、原因 z-index的设置没有问题,但z-index值大的图层反而显示在了下面。从上面两个截图可以看出,遮罩层是插入到body元素上的,而弹框却是在..._el-dialog z-index

能上QQ不能上网-程序员宅基地

文章浏览阅读480次。 笔者所在学校校园网通过光纤上网,用一台浪潮NP50做Internet连接共享服务器,服务器内网卡的IP地址作为其他计算机的网关。由于最近对病毒的查杀不及时,电子备课室中有几台微机感染了病毒,上网升级杀毒软件,进行杀毒,发现感染的都是同一种病毒。 杀毒完毕,发生了一个奇怪的现象,就是杀过毒的这几台微机都不能上网了。这种现象可是笔者第一次遇到,查看网卡的IP地址、网关、DNS地址都正确。_能上qq不能上网

推荐文章

热门文章

相关标签