使用 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 有如此強大的科學工具支持? 剩下要做的就是編寫幾行代碼,釋放您的想像力,體驗圖像分析的無限潛力。