使用 Google Cloud Vision 和 Python 进行强大的图像分析
已发表: 2022-03-10最近,我构建了一个网络应用程序来管理用户的个人开支。 它的主要功能是扫描购物收据并提取数据以进行进一步处理。 事实证明,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' )
假设您将要处理的图像存储在项目目录内的文件夹“图像”中,让我们打开其中一个。
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 有如此强大的科学工具支持? 剩下要做的就是编写几行代码,释放您的想象力,体验图像分析的无限潜力。