用于智能图像处理的计算机视觉和 NLP

莫斯科,神秘之城...(这张照片由伊戈尔·沙巴林提供)

一、说明

        如今,每个拥有智能手机的人都可能成为摄影师。因此,每天都有大量新照片出现在社交媒体、网站、博客和个人照片库中。尽管拍照的过程可能非常令人兴奋,但将它们整理出来并在之后手动为每个进行描述可能会非常无聊且耗时。

        本文讨论如何结合使用计算机视觉 (CV) 和自然语言处理 (NLP) 技术来获取照片的一组描述性标签,然后基于这些标签生成有意义的描述,从而节省宝贵的时间。

二、照片里面有什么?

        我们人类可以在一瞬间回答这个问题,一旦照片在我们手中。机器也可以回答这个问题,只要它们熟悉CV和NLP。请看下面的照片:

您的应用程序如何知道上图中的内容?使用像Clarifai的Predict API这样的工具,这可能是一件轻而易举的事情。下面是一组描述性标签,这个 API 在处理完上面的照片后给你:

‘straw’, ‘hay’, ‘pasture’, ‘wheat’, ‘cereal’, ‘rural’, ‘bale’, …

        如您所见,这些标签为您提供有关图片中可以看到的内容的适当信息。如果您所需要的只是自动对视觉内容进行分类,那么拥有这些标签就足以完成您的工作。但是,对于图像描述生成的任务,您需要更进一步并利用一些NLP技术。

        在本文中,您将看到一个简化的示例,说明如何实现这一点,向您展示如何将生成的标签列表中的某些单词编织成简单的短语。有关此主题的概念性讨论,您可能还想查看我在 Clarifai 博客上的文章:使用自然语言处理生成图像描述。

三、准备

        若要遵循本文中讨论的脚本,需要具有以下软件组件:

Python 2.7+∕3.4+

spaCy v2.0+

A pretrained English model for spaCy

Clarifai API Python client

Clarifai API key

        您可以在相应的站点上找到安装说明。除此之外,您还需要一个Python库,允许您从维基百科获取和解析数据。

四、自动标记照片

        首先,让我们看一下可用于自动标记照片的代码。在下面的实现中,我们使用 Clarifai 的通用图像识别模型来获取提交照片的描述性标签。

from clarifai.rest import ClarifaiApp, client, Image
def what_is_photo(photofilename):
  app = ClarifaiApp(api_key='Your Clarifai API key here')
  model = app.models.get("general-v1.3")
  image = Image(file_obj=open(photofilename, 'rb'))
  result = model.predict([image])
  tags = ''
  items = result['outputs'][0]['data']['concepts']
  for item in items:
    if item['name'] == 'no person':
      continue
    result = "{}, ".format(item['name'])
    tags = tags +result
  return tags 

        要测试上述函数,您可以将以下主块附加到脚本中:

if __name__ == "__main__":
  tag_list = list(what_is_photo("country.jpg").split(", "))
  print(tag_list[:7]) 

        在这个特定示例中,我们选取为提交的照片生成的前七个描述性标签。因此,对于照片中提供的照片 照片里面有什么?前面的部分,此脚本生成以下描述性标记列表:

['straw', 'hay', 'pasture', 'wheat', 'cereal', 'rural', 'bale'] 

        这对于分类的目的来说已经足够了,并且可以用作NLP的源数据,以生成有意义的描述,如下一节所述。

五、使用 NLP 将描述性标签转换为描述

        他们在学校告诉我们,为了掌握语言,你需要大量阅读。换句话说,你必须训练使用这种语言的最佳示例。回到我们的讨论,我们需要一些使用标签列表中单词的文本。当然,您可以获得一个巨大的语料库,例如维基百科数据库转储,其中包含大量不同的文章。但是,在人工智能驱动的搜索时代,您只能将语料库缩小到与您拥有的标签列表中的单词最相关的文本。以下代码说明了如何从维基百科获取单个条目的内容,其中包含与标签列表相关的信息(您需要将其附加到上一节的 main 函数中的代码中):

import wikipedia
tags = ""
tags = tags.join(tag_list[:7])
wiki_resp = wikipedia.page(tags)
print("Article url: ", wiki_resp.url) 

        现在您已经有一些文本数据需要处理,是时候让 NLP 发挥作用了。下面是初始化 spaCy 的文本处理管道的初始步骤,然后将其应用于文本(将其附加到前面的代码片段)。

nlp = spacy.load('en')
doc = nlp(wiki_resp.content)
print(len(list(doc.sents))) 

        在下面的代码中,你将循环访问提交文本中的句子,分析每个句子中的语法依赖关系。特别是,您查找短语,其中包含提交的标记列表中的单词。在一个短语中,列表中的两个单词应该在语法上与头/子关系相关。如果您对此处使用的术语感到困惑,我建议您查看使用Python的自然语言处理,它详细解释了NLP概念,并包含许多易于遵循的示例。您可以立即开始阅读:第 2 章和第 12 章是免费的。此外,在我最近为 Oracle 杂志撰写的 Oracle 数字助理技能的生成意图和实体文章中可以找到在实践中可能使用句法依赖关系分析的示例。

        回到下面的代码,请注意这是一种简化 - 当然,现实世界的代码会有点复杂。(将下面的代码附加到主脚本中的上一个代码中)

x = []
for sent in doc.sents:
  if bool([t for t in sent if t.lemma_ in tag_list[:7] and t.head.lemma_ in tag_list[:7] and t.head.lemma_ != t.lemma_]):
     t = [t for t in sent if t.lemma_ in tag_list[:7] and t.head.lemma_ in tag_list[:7] and t.head.lemma_ != t.lemma_][0]
     y = [(t.i, t), (t.head.i, t.head)]
     y.sort(key=lambda tup: tup[0])
     x.append((y[0][1].text + ' ' + y[1][1].text, 2))
  if bool([t for t in sent if t.lemma_ in tag_list[:7] and t.head.head.lemma_ in tag_list[:7] and t.head.lemma_ != t.lemma_ and t.head.head.lemma_ != t.head.lemma_]):
    t = [t for t in sent if t.lemma_ in tag_list[:7] and t.head.head.lemma_ in tag_list[:7] and t.head.lemma_ != t.lemma_ and t.head.head.lemma_ != t.head.lemma_][0]
    if t.i > t.head.i > t.head.head.i:
      y = [(t.head.head.i, t.head.head), (t.head.i, t.head), (t.i, t)]
      x.append((y[0][1].text + ' ' + y[1][1].text + ' ' + y[2][1].text, 3))
x.sort(key=lambda tup: tup[1], reverse= True)
if len(x) != 0:
  print(x[0][0]) 

        此代码为我提供了以下短语,用于照片中提供的照片?本文前面的部分:

Hay in bales 

        这看起来像是该照片的相关描述。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/84795.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity解决:3D开发模式第三人称视角 WASD控制角色移动旋转 使用InputSystem

Unity版本:2019.2.3f1 目录 安装InputSystem 1:创建InputHander.cs脚本 挂载到Player物体上 获取键盘输入WADS 2.创建PlayerLocomotion.cs挂载到Player物体上,控制物体移动转向 安装InputSystem 菜单栏/Window/Package Manager/Input Syst…

CentOS中Oracle11g进程有哪些

最近遇到Oracle数据库运行过程实例进程由于某种原因导致中止的问题,专门看了下正常Oracle数据库启动后的进程有哪些,查阅资料了解了下各进程的作用,记录如下。 oracle 3032 1 0 07:36 ? 00:00:00 ora_pmon_orcl oracle …

Linux:安全技术与防火墙

目录 一、安全技术 1.安全技术 2.防火墙的分类 3.防水墙 4.netfilter/iptables关系 二、防火墙 1、iptables四表五链 2、黑白名单 3.iptables命令 3.1查看filter表所有链 iptables -L ​编辑3.2用数字形式(fliter)表所有链 查看输出结果 iptables -nL 3.3 清空所有链…

计算机竞赛 垃圾邮件(短信)分类算法实现 机器学习 深度学习

文章目录 0 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 垃圾邮件(短信)分类算…

UE4/UE5 “无法双击打开.uproject 点击无反应“解决

一、方法一:运行UnrealVersionSelector.exe 1.找到Epic Game Lancher的安装目录, 在lancher->Engine->Binaries->Win64->UnrealVersionSelector.exe 2.把UnrealVersionSelector.exe 分别拷贝到UE4 不同版本引擎的 Engine->Binaries->…

「UG/NX」Block UI 体收集器BodyCollector

✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#

创建型(二) - 单例模式

一、概念 单例设计模式(Singleton Design Pattern):一个类只允许创建一个对象(或者实例),那这个类就是一个单例类。 优点:在内存里只有一个实例,减少了内存的开销,避免…

.NET应用UI组件DevExpress XAF v23.1 - 全新的日程模块

DevExpress XAF是一款强大的现代应用程序框架,允许同时开发ASP.NET和WinForms。DevExpress XAF采用模块化设计,开发人员可以选择内建模块,也可以自行创建,从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。 在新版中…

chatGPT-对话柏拉图

引言: 古希腊哲学家柏拉图,在他的众多著作中,尤以《理想国》为人所熟知。在这部杰作中,他勾勒了一个理想的政治制度,提出了各种政体,并阐述了他对于公正、智慧以及政治稳定的哲学观点。然而,其…

使用Jetpack Compose的镜像效果

使用Jetpack Compose的镜像效果 您是否曾想过在列表或一般情况下为图像创建镜像效果?有了强大的Jetpack Compose UI工具包,这变得简单而容易。 正如您所看到的,此效果包括以下内容 反转图像反转图像的50%可见性模糊的反转图像与…

5、css学习5(链接、列表)

1、css可以设置链接的四种状态样式。 a:link - 正常,未访问过的链接a:visited - 用户已访问过的链接a:hover - 当用户鼠标放在链接上时a:active - 链接被点击的那一刻 2、 a:hover 必须在 a:link 和 a:visited 之后, a:active 必须在 a:hover 之后&…

ElasticSearch7.x + kibana7.x使用记录

目录 查询所有索引 查询索引的mapping信息 添加索引的同时添加mapping 在原有基础上新增字段 旧的索引迁移到新的索引(使用场景:数据迁移、索引优化、数据转换) 查询索引下的文档总数 场景1:某一个字段的值是数组&#xff0…

回归预测 | MATLAB实现WOA-SVM鲸鱼算法优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现WOA-SVM鲸鱼算法优化支持向量机多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现WOA-SVM鲸鱼算法优化支持向量机多输入单输出回归预测(多指标,多图)效果一览基本介绍程…

【操作系统】寄存器

概念 寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。寄存器的存储电路是由锁存器或触发器构成的,因为一个锁存器或触发器…

作为一名8年测试工程师,因为偷偷接私活被····

接私活 对程序员这个圈子来说是一个既公开又隐私的话题,不说全部,应该大多数程序员都有过想要接私活的想法,当然,也有部分得道成仙的不主张接私活。但是很少有人在公开场合讨论私活的问题,似乎都在避嫌。就跟有人下班后…

2023河南萌新联赛第(五)场:郑州轻工业大学

A.买爱心气球 原题链接 : 登录—专业IT笔试面试备考平台_牛客网 博弈论 : #include <iostream> using namespace std; int t,n,m; string s1 "Alice",s2 "Bob"; int main() {cin>>t;while(t--){cin>>n>>m;if (n % 3 0) {cou…

简单介绍 CPU 的工作原理

内部架构 CPU 的根本任务就是执行指令&#xff0c;对计算机来说最终都是一串由 0 和 1 组成的序列。CPU 从逻辑上可以划分成 3 个模块&#xff0c;分别是控制单元、运算单元和存储单元 。其内部架构如下&#xff1a; 【1】控制单元 控制单元是整个CPU的指挥控制中心&#xff…

[ubuntu]ubuntu安装vncserver后,windows连接灰屏解决方法

修改配置文件~/.vnc/xstartup为如下内容&#xff1a; #!/bin/bash export $(dbus-launch) export XKL_XMODMAP_DISABLE1 unset SESSION_MANAGERgnome-panel & gnome-settings-daemon & metacity & nautilus & gnome-terminal &# [ -x /etc/vnc/xstartup…

将ChatGPT集成整合到业务中时,3个要做和3个不要做的事项

​关于ChatGPT的讨论甚多&#xff0c;毫无疑问的是&#xff0c;几乎每个人都应该使用它&#xff0c;无论用于个人生活问题的解答还是工作中简化日常任务。越来越多的行业也正在探索这项技术的应用场景&#xff0c;从优化客户服务体验、简化旅行计划到便捷的内容创作等&#xff…

负载均衡下的webshell

文章目录 1.场景描述2.在蚁剑里添加 Shell3.因为负载均衡而出现的问题4.问题解决方案4.1 方案14.2 方案24.3 方案3 1.场景描述 当前手里有一个以docker部署的Tomcat负载均衡环境。主机对外ip和端口为192.168.100.130:18080 我们假设其为一个真实的业务系统&#xff0c;存在一…