用于智能图像处理的计算机视觉和 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':continueresult = "{}, ".format(item['name'])tags = tags +resultreturn 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.mzph.cn/news/47788.shtml

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

相关文章

MyBaits注解开发

1、注解开发介绍 在过去使用框架开发项目,基本都采用xml作为框架的核心配置文件存在,但是这种方式开发效率还是比较地下、不灵活。 现在企业开发为了能够更快的提高开发效率,必然会使用企业级框架进行项目开发,而现在主流的框架…

docker 安装oracle19c linux命令执行sql

docker安装oracle # 下载镜像 19.3.0.0.0 docker pull registry.cn-hangzhou.aliyuncs.com/laowu/oracle:19c # 创建文件 mkdir -p /home/mymount/oracle19c/oradata # 授权,不授权会导致后面安装失败 chmod 777 /home/mymount/oracle19c/oradatadocker run -d \ …

还不知道怎么提示LLM?ChatGPT提示入门

文章目录 简介:什么是人工智能?什么是提示过程?为什么会出现这样的差异? 为什么需要提示过程?1) 文章摘要2) 数学问题求解 如何进行提示过程?角色提示:多范例提示:无范例提示单范例提…

Redis-设置密码linux服务器

操作步骤 打开Redis的配置文件,通常位于 /etc/redis/redis.conf。在配置文件中找到 #requirepass 或 requirepass 的行,如果存在的话,取消行首的注释符号 #。将密码设置为你想要的值,例如 requirepass YourPassword。确保将 Your…

Gitlab 安装全流程

Version:gitlab-ce:16.2.4-ce.0 简介 Gitlab 是一个开源的 Git 代码仓库系统,可以实现自托管的 Github 项目,即用于构建私有的代码托管平台和项目管理系统。系统基于 Ruby on Rails 开发,速度快、安全稳定。它拥有与 Github 类似…

Android AppCompatActivity标题栏操作

使用 AndroidStudio 新建的工程默认用 AppCompatActivity ,是带标题栏的。 记录下 修改标题栏名称 和 隐藏标题栏 的方法。 修改标题栏名称 Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R…

龙讯旷腾PWmat已部署至曙光智算平台

编者荐语: 近期,龙讯旷腾核心产品PWmat已成功部署至曙光智算AC.sugon.com平台,可为用户提供包括分子建模、第一性原理计算、数据可视化等在内的完备的超级计算云服务,让大家能够轻松上手具有完全自主知识产权的大尺度高性能材料计…

详解Spring的循环依赖问题、三级缓存解决方案源码分析

0、基础:Bean的生命周期 在Spring中,由于IOC的控制反转,创建对象不再是简单的new出来,而是交给Spring去创建,会经历一系列Bean的生命周期才创建出相应的对象。而循环依赖问题也是由Bean的生命周期过程导致的问题&#…

Hyperf 如何做到用两个端口 9501/9502 都能连接 Websocket 服务以及多 Worker 协作实现聊天室功能

为何 Hyperf 能够在两个端口上监听 WebSocket 连接? 源码角度来看,在配置了多个 Servers 时,实际上,只启动了一个 Server 注:我之前接触的代码都是启动一个服务绑定一个端口,之前也看过 swoole 扩展的文档…

SpringBoot 配置优先级

一般而言,SpringBoot支持配置文件进行配置,即在resources下的application.properties或application.yml。 关于配置优先级而言, application.properties>application.yml>application.yaml 另外JAVA程序程序还支持java系统配置和命令行…

PHP实现轻量级WEB服务器接收HTTP提交的RFID刷卡信息并回应驱动读卡器显示播报语音

本示例使用的读卡器&#xff1a;RFID网络WIFI无线TCP/UDP/HTTP可编程二次开发读卡器POE供电语音-淘宝网 (taobao.com) <?php mb_http_output(utf-8); $port88; $socket socket_create(AF_INET, SOCK_STREAM, SOL_TCP); $bool socket_bind($socket, "0.0.0.0",…

html表格中加入斜线,使用css给table表格表头单元格添加斜线

背景&#xff1a;业务给了90张word电子表格&#xff0c;需要用html设计出来。 如图所示&#xff0c;红色区域的下斜线如何实现&#xff1f; 先说结论&#xff1a;html中table没有直接的斜线表头标签&#xff0c;但结合css、svg之类的可以实现。 #lineTd{ background:#FFFFFF u…

卷积神经网络——上篇【深度学习】【PyTorch】【d2l】

文章目录 5、卷积神经网络5.1、卷积5.1.1、理论部分5.1.2、代码实现5.1.3、边缘检测 5.2、填充和步幅5.2.1、理论部分5.2.2、代码实现 5.3、多输入多输出通道5.3.1、理论部分5.3.2、代码实现 5.4、池化层 | 汇聚层5.4.1、理论部分5.4.2、代码实现 5、卷积神经网络 5.1、卷积 …

Elasticsearch学习

1、什么是Elasticsearch? Elaticsearch&#xff0c;简称为 ES&#xff0c; ES 是一个开源的高扩展的分布式全文搜索引擎&#xff0c; 是整个 ElasticStack 技术栈的核心。可以帮助我们从海量数据中快速找到需要的内容。 elasticsearch结合kibana、Logstash、Beats&#xff0…

Hope.money:新兴DeFi项目如何重新定义稳定币生态的未来?

联储加息导致金融市场紧缩&#xff0c;Terra、3AC、FTX等知名中心化机构未能妥善应对而暴雷&#xff0c;并重创了整个加密货币市场&#xff0c;导致参与者损失惨重。这些事件揭示了中心化机构的局限&#xff0c;投资者对其资产掌控权的担忧愈发强烈。 自2018年首个DeFi协议Com…

简单介绍 CPU 的工作原理

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

2023年Java核心技术面试第二篇(篇篇万字精讲)

目录 四. 强引用&#xff0c;软引用&#xff0c;弱引用&#xff0c;幻象引用之间的区别&#xff1f; 1.前言 2.强引用 2.1 强引用赋值为null 2.2 超过了引用的作用域 2.2.1 描述&#xff1a; 2.2.2 作用域内&#xff1a; 2.2.3 不在作用域内: 3. 软引用&#xff08;SoftRefere…

华为云classroom赋能--Toolkit系列插件DevSecOps助力开发者提速

一、前言 DevOps的概念想必大家都不陌生&#xff0c;它是一组过程、方法与系统的统称&#xff0c;通过它可以对交付速率、协作效率、部署频率速率、质量、安全和可靠性等进行提升改善。相比传统的软件开发模式&#xff0c;它是一种工作方式和文化的转变&#xff0c;把开发者和…

C++笔记之注册的含义

C笔记之注册的含义 code review! 文章目录 C笔记之注册的含义1.注册对象到Qt的信号槽系统中2.注册函数到Qt的元对象系统中元对象系统例1例2 3.注册自定义类型到C STL容器中4.将函数指针传递给另一个类&#xff0c;注册回调函数class ICallback存在的意义例1&#xff0c;用于说…

Python Opencv实践 - 图像中值滤波

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) print(img.shape) pixel_count img.shape[0] * img.shape[1] print(pixel_count)#为图像添加椒盐噪声 #参考资料&#xf…