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

news2024/12/23 14:05:02

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

一、说明

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

        本文讨论如何结合使用计算机视觉 (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 

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在ubuntu+cpolar+rabbitMQ环境下,实现mq服务端远程访问

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…

零信任架构演进与实践:探讨零信任安全模型在不断发展的背景下的最新趋势和实际应用案例

随着信息技术的迅猛发展,企业的网络安全面临着日益复杂的挑战。传统的网络安全模型已经不再适用于如今的威胁环境,因此,零信任架构应运而生。零信任安全模型基于"从内部出发,不信任网络,不信任用户"的理念&a…

FirmAE 工具安装(解决克隆失败 网络问题解决)

FirmAE官方推荐使用Ubuntu 18.04系统进行安装部署,FirmAE工具的安装部署十分简单,只需要拉取工具仓库后执行安装脚本即可。 首先运行git clone --recursive https://kgithub.com/pr0v3rbs/FirmAE命令 拉取FirmAE工具仓库,因为网络的问题&…

非常详细的 Ceph 介绍、原理、架构

1. Ceph架构简介及使用场景介绍 1.1 Ceph简介 Ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。 Ceph项目最早起源于Sage就读博士期间的工作(最早的成果于2004年发表),并随后贡献给开源社区。在经过…

排序链表00

题目链接 排序链表 题目描述 注意点 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序 解答思路 使用归并排序对链表进行排序,保证时间复杂度为 O(n log n)相对于数组的归并排序,链表的中间节点需要遍历才能找到&#xff0…

idea快速生成Serializable序列化UID的方法

①在idea的File–>Settings–>Editor–>Inspections里搜索 Serializable class without serialVersionUID 记得点Apply和OK

opencv进阶08-K 均值聚类cv2.kmeans()介绍及示例

K均值聚类是一种常用的无监督学习算法,用于将一组数据点分成不同的簇(clusters),以便数据点在同一簇内更相似,而不同簇之间差异较大。K均值聚类的目标是通过最小化数据点与所属簇中心之间的距离来形成簇。 当我们要预测…

re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序)

参考文章: re学习笔记(27)攻防世界-re-csaw2013reversing2_Forgo7ten的博客-CSDN博客攻防世界逆向入门题之csaw2013reversing2_沐一 林的博客-CSDN博客 三种做法 1、ida静态分析修改指令 main函数反编译的代码 由于运行之后的是乱码&…

【C++ 记忆站】缺省参数

文章目录 缺省参数的概念缺省参数的分类1、全缺省参数2、半缺省参数 缺省参数实际应用场景 缺省参数的概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参 正常调用一…

MySQL 安装 audit 日志审计插件

下载 我的MySQL版本是 5.7.37的,用的是日志审计插件(audit-plugin)是1.1.10的,大家可以对应自己版本去下载。 https://github.com/trellix-enterprise/mysql-audit/releases 配置 1、进入到/opt目录下载 audit,可以…

《Zookeeper》源码分析(十三)之 投票管理器

目录 QuorumVerifier数据结构构造函数containsQuorum() SyncedLearnerTracker功能 QuorumVerifier QuorumVerifier用于保存集群选举服务器信息以及选举期间判断投票是否过半,它的创建过程如下: 默认创建的是它的实现类QuorumMaj 数据结构 构造函数 从…

ElasticSearch的客户端操作

ElasticSearch的客户端操作 1、客户端介绍 官方文档地址: https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html 实际开发中,有多种方式操作Elasticsearch: 客户端工具:发送http请求(RESTful风格)操作…

C语言入门_Day 6布尔数与比较运算

目录 前言 1.布尔数 2.比较运算 3.易错点 4.思维导图 前言 除了算术计算以外,编程语言中还会大量使用比较运算,并会根据比较运算的结果是“真”还是“假”,来执行不同的代码。 当你想买一杯奶茶,准备支付的时候,支…

Reis过期删除策略

介绍 在Redis中,我们可以为键值对设置有效期,现在面临一个问题,如果一个键值对过期了,那么我们应该怎么删除呢? 我们目前有三种方案: 定时删除:在设置键的过期时间的同时,为此键设…

特殊链表(循环单链表,循环双链表,静态链表)

目录 1.循环单链表的初始化 2.循环双链表 3. 静态链表 (1)静态链表的初始化 (2)静态链表的插入 1.循环单链表的初始化 typedef int ElemType; typedef struct LNode{ElemType data;struct LNode *next;}LNode,*LinkList;bool InitList(LinkList &L) {L(LNode*)malloc(…

【兔子王赠书第1期】数据结构与算法有必要区分嘛?

文章目录 数据结构与算法有必要区分嘛好书推荐《数据结构与算法(Python语言实现)》粉丝福利 | 评论免费送书 数据结构与算法有必要区分嘛 数据结构与算法,是计算机科学的基础课程,对于初学者来说,常常会有些困惑&…

企业微信电脑端开启chrome调试

首先: Mac端调试开启的快捷键:control shift command d Window端调试开启的快捷键: control shift alt d 这边以Mac为例,我们可以在电脑顶部看到调试的入口: 然后我们点击 『浏览器、webView相关』菜单,勾选上…

【Vue】Vue 使用 Print.js 打印选中区域的html,用到的是Element ui table表格,解决页面样式不出现或者table表格样式错乱问题!!!

步骤 1. 下载 Print.js 插件 npm install print-js --save2.main.js文件中导入 Print.js 插件 import print from print-js页面使用 需求:打击打印按钮,文字内容以及表格中的内容 vue Print.js打印页面样式不出现 解决方案 加上这句就好了&#xff…

“代码驭宠而行“:探索Python的魔法世界,开启编程奇幻之旅!

文章目录 🍀引言🍀第一步:安装Python和开发环境🍀第二步:掌握基本语法🍀第三步:使用Python库和模块🍀第四步:实践项目和练习🍀第五步:学习进阶主题…

vue使用jsplumb 流程图

安装jsPlumb库&#xff1a;在Vue项目中使用npm或yarn安装jsPlumb库。 npm install jsplumb 创建一个Vue组件&#xff1a;创建一个Vue组件来容纳jsPlumb的功能和呈现。 <template><div style"margin: 20px"><div style"margin: 20px">&l…