使用 Google Cloud Vision 和 Python 进行强大的图像分析

已发表: 2022-03-10
快速总结↬应用 Google Cloud Vision 服务的可能性范围实际上是无穷无尽的。 有了 Python 库,它当然可以帮助您对机器学习技术产生更深的兴趣。

最近,我构建了一个网络应用程序来管理用户的个人开支。 它的主要功能是扫描购物收据并提取数据以进行进一步处理。 事实证明,Google Vision API 是从照片中获取文本的绝佳工具。 在本文中,我将在示例项目中指导您完成使用 Python 的开发过程。

如果您是新手,请不要担心。 您只需要对这种编程语言有非常基本的了解——不需要其他技能。

让我们开始吧,好吗?

从未听说过 Google Cloud Vision?

它是一个 API,允许开发人员通过提取的数据分析图像的内容。 为此,谷歌利用在大型图像数据集上训练的机器学习模型。 所有这些都可以通过一个 API 请求获得。 API 背后的引擎对图像进行分类、检测物体、人脸,并识别图像中的印刷文字。

举个例子,让我们举出广受欢迎的 Giphy。 他们采用 API 从 GIF 中提取字幕数据,从而显着改善了用户体验。 另一个例子是 realtor.com,它使用 Vision API 的 OCR 从移动应用程序上拍摄的待售标志图像中提取文本,以提供有关房产的更多详细信息。

机器学习概览

让我们从回答你们中许多人之前可能听说过的问题开始——什么是机器学习?

广义的想法是开发一个可编程模型,在给定的数据中找到模式。 您提供的数据质量越高,使用的模型设计越好,就会产生更智能的结果。 通过“友好的机器学习”(谷歌称他们的机器学习通过 API 服务),您可以轻松地将大量人工智能整合到您的应用程序中。

推荐阅读机器学习入门

跳跃后更多! 继续往下看↓

如何开始使用 Google Cloud

让我们从注册到 Google Cloud 开始。 Google 需要身份验证,但它非常简单且轻松——您只需存储一个包含 API 密钥的 JSON 文件,您可以直接从 Google Cloud Platform 获取该文件。

下载文件并将其路径添加到环境变量中:

 export GOOGLE_APPLICATION_CREDENTIALS=/path/to/your/apikey.json

或者,在开发中,您可以使用from_serivce_account_json()方法来支持自己,我将在本文中进一步描述。 要了解有关身份验证的更多信息,请查看 Cloud 的官方文档。

Google 提供了一个 Python 包来处理 API。 让我们将最新版本的google-cloud-vision==0.33添加到您的应用中。 是时候编码了!

如何将 Google Cloud Vision 与 Python 相结合

首先,让我们从库中导入类。

 from google.cloud import vision from google.cloud.vision import types

处理完这些后,现在您将需要一个客户端实例。 为此,您将使用文本识别功能。

 client = vision.ImageAnnotatorClient()

如果您不将凭据存储在环境变量中,则在此阶段您可以将其直接添加到客户端。

 client = vision.ImageAnnotatorClient.from_service_account_file( '/path/to/apikey.json' )

假设您将要处理的图像存储在项目目录内的文件夹“图像”中,让我们打开其中一个。

可由 Google Cloud Vision 处理的收据图片
Google Cloud Vision 可以处理的简单收据示例。 (大预览)
 image_to_open = 'images/receipt.jpg' with open(image_to_open, 'rb') as image_file: content = image_file.read()

下一步是创建一个 Vision 对象,它允许您发送请求以继续进行文本识别。

 image = vision.types.Image(content=content) text_response = client.text_detection(image=image)

响应由存储为描述键的检测到的单词、它们在图像上的位置和语言预测组成。 例如,让我们仔细看看第一个词:

 [ ... description: "SHOPPING" bounding_poly { vertices { x: 1327 y: 1513 } vertices { x: 1789 y: 1345 } vertices { x: 1821 y: 1432 } vertices { x: 1359 y: 1600 } } ... ]

如您所见,要仅过滤文本,您需要获取“关于所有元素”的描述。 幸运的是,有了 Python 强大的列表理解功能的帮助。

 texts = [text.description for text in text_response.text_annotations] ['SHOPPING STORE\nREG 12-21\n03:22 PM\nCLERK 2\n618\n1 MISC\n1 STUFF\n$0.49\n$7.99\n$8.48\n$0.74\nSUBTOTAL\nTAX\nTOTAL\nCASH\n6\n$9. 22\n$10.00\nCHANGE\n$0.78\nNO REFUNDS\nNO EXCHANGES\nNO RETURNS\n', 'SHOPPING', 'STORE', 'REG', '12-21', '03:22', 'PM', 'CLERK', '2', '618', '1', 'MISC', '1', 'STUFF', '$0.49', '$7.99', '$8.48', '$0.74', 'SUBTOTAL', 'TAX', 'TOTAL', 'CASH', '6', '$9.', '22', '$10.00', 'CHANGE', '$0.78', 'NO', 'REFUNDS', 'NO', 'EXCHANGES', 'NO', 'RETURNS']

如果仔细观察,您会注意到列表的第一个元素包含图像中检测到的所有文本,并以字符串的形式存储,而其他元素则是单独的单词。 让我们打印出来。

 print(texts[0]) SHOPPING STORE REG 12-21 03:22 PM CLERK 2 618 1 MISC 1 STUFF $0.49 $7.99 $8.48 $0.74 SUBTOTAL TAX TOTAL CASH 6 $9. 22 $10.00 CHANGE $0.78 NO REFUNDS NO EXCHANGES NO RETURNS

相当准确,对吧? 而且显然很有用,所以让我们玩得更多。

您可以从 Google Cloud Vision 中获得什么?

正如我上面提到的,Google Cloud Vision 不仅可以识别文本,还可以让您发现人脸、地标、图像属性和网络连接。 考虑到这一点,让我们找出它可以告诉您有关图像的网络关联的信息。

 web_response = client.web_detection(image=image)

好的谷歌,你真的知道你收到的图片上显示的是什么吗?

 web_content = web_response.web_detection web_content.best_guess_labels >>> [label: "Receipt"]

干得好,谷歌! 确实是收据。 但是让我们再多做一些练习——你还能看到别的什么吗? 以百分比表示的更多预测如何?

 predictions = [ (entity.description, '{:.2%}'.format(entity.score))) for entity in web_content.web_entities ] >>> [('Receipt', '70.26%'), ('Product design', '64.24%'), ('Money', '56.54%'), ('Shopping', '55.86%'), ('Design', '54.62%'), ('Brand', '54.01%'), ('Font', '53.20%'), ('Product', '51.55%'), ('Image', '38.82%')]

很多宝贵的见解,干得好,我的全能朋友! 您是否还可以找出图像的来源以及是否有任何副本?

 web_content.full_matching_images >>> [ url: "https://www.rcapitalassociates.com/wp-content/uploads/2018/03/receipts.jpg", url:"https://media.istockphoto.com/photos/shopping-receipt-picture-id901964616?k=6&m=901964616&s=612x612&w=0&h=RmFpYy9uDazil1H9aXkkrAOlCb0lQ-bHaFpdpl76o9A=", url: "https://www.pakstat.com.au/site/assets/files/1172/shutterstock_573065707.500x500.jpg" ]

我印象深刻。 谢谢,谷歌! 但是一个还不够,你能给我三个类似图像的例子吗?

 web_content.visually_similar_images[:3] >>>[ url: "https://thumbs.dreamstime.com/z/shopping-receipt-paper-sales-isolated-white-background-85651861.jpg", url: "https://thumbs.dreamstime.com/b/grocery-receipt-23403878.jpg", url:"https://image.shutterstock.com/image-photo/closeup-grocery-shopping-receipt-260nw-95237158.jpg" ]

甜的! 做得好。

Google Cloud Vision 中真的有人工智能吗?

如下图所示,处理收据会让人有些情绪化。

拿着长收据的男人尖叫着看起来很紧张
您在收到收据时可能会遇到的压力示例。 (大预览)

让我们看看 Vision API 可以告诉您有关这张照片的信息。

 image_to_open = 'images/face.jpg' with open(image_to_open, 'rb') as image_file: content = image_file.read() image = vision.types.Image(content=content) face_response = client.face_detection(image=image) face_content = face_response.face_annotations face_content[0].detection_confidence >>> 0.5153166651725769

还不错,算法50%以上确定图片中有人脸。 但是你能了解它背后的情绪吗?

 face_content[0] >>> [ ... joy_likelihood: VERY_UNLIKELY sorrow_likelihood: VERY_UNLIKELY anger_likelihood: UNLIKELY surprise_likelihood: POSSIBLE under_exposed_likelihood: VERY_UNLIKELY blurred_likelihood: VERY_UNLIKELY headwear_likelihood: VERY_UNLIKELY ... ]

令人惊讶的是,通过一个简单的命令,您可以检查一些基本情绪以及头饰或照片属性的可能性。

在人脸检测方面,我需要将您的注意力引向您可能遇到的一些潜在问题。 您需要记住,您正在将照片交给机器,尽管 Google 的 API 使用了在大型数据集上训练的模型,但它可能会返回一些意想不到的误导性结果。 在网上,你可以找到一些照片,这些照片展示了人工智能在图像分析方面是多么容易被欺骗。 其中一些看起来很有趣,但在无辜和冒犯性错误之间有一条细线,尤其是当错误涉及人脸时。

毫无疑问,Google Cloud Vision 是一个强大的工具。 此外,与它一起工作很有趣。 API 的 REST 架构和广泛可用的 Python 包使每个人都可以更轻松地访问它,无论您在 Python 开发方面有多先进。 试想一下,您可以通过利用其功能来显着改进您的应用程序!

推荐阅读设计师的机器学习应用

如何拓宽您对 Google Cloud Vision 的了解

应用 Google Cloud Vision 服务的可能性范围实际上是无穷无尽的。 有了 Python 库,您可以在任何基于该语言的项目中使用它,无论是 Web 应用程序还是科学项目。 它当然可以帮助您对机器学习技术产生更深的兴趣。

Google 文档提供了一些关于如何在实践中应用 Vision API 功能的好主意,并让您有可能了解更多关于机器学习的信息。 我特别建议查看有关如何构建高级图像搜索应用程序的指南。

可以说您在本文中看到的内容就像魔术一样。 毕竟,谁会想到一个简单且易于访问的 API 有如此强大的科学工具支持? 剩下要做的就是编写几行代码,释放您的想象力,体验图像分析的无限潜力。