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