Zaawansowana analiza obrazu z Google Cloud Vision i Pythonem

Opublikowany: 2022-03-10
Szybkie podsumowanie ↬ Zakres możliwości zastosowania usługi Google Cloud Vision jest praktycznie nieskończony. Dostępna biblioteka Pythona z pewnością może pomóc w zwiększeniu zainteresowania technologiami uczenia maszynowego.

Całkiem niedawno zbudowałem aplikację internetową do zarządzania osobistymi wydatkami użytkownika. Jego główne funkcje to skanowanie paragonów zakupowych i wyodrębnianie danych do dalszego przetwarzania. Google Vision API okazał się świetnym narzędziem do pobierania tekstu ze zdjęcia. W tym artykule przeprowadzę Cię przez proces rozwoju w Pythonie w przykładowym projekcie.

Jeśli jesteś nowicjuszem, nie martw się. Będziesz potrzebować tylko bardzo podstawowej znajomości tego języka programowania — bez żadnych innych wymaganych umiejętności.

Zacznijmy, dobrze?

Nigdy nie słyszałeś o Google Cloud Vision?

Jest to interfejs API, który pozwala programistom analizować zawartość obrazu za pomocą wyodrębnionych danych. W tym celu Google wykorzystuje modele uczenia maszynowego wytrenowane na dużym zbiorze danych obrazów. Wszystko to jest dostępne za pomocą jednego żądania API. Silnik odpowiedzialny za API klasyfikuje obrazy, wykrywa obiekty, twarze ludzi i rozpoznaje słowa drukowane w obrazach.

Aby dać ci przykład, przywołajmy lubianego Giphy. Przyjęli API do wyodrębniania danych podpisów z GIF-ów, co zaowocowało znaczną poprawą wrażenia użytkownika. Innym przykładem jest strona realtor.com, która wykorzystuje funkcję OCR interfejsu API Vision do wyodrębniania tekstu z obrazów znaków na sprzedaż wykonanych w aplikacji mobilnej, aby dostarczyć więcej szczegółów na temat nieruchomości.

Uczenie maszynowe w skrócie

Zacznijmy od odpowiedzi na pytanie, które wielu z Was prawdopodobnie słyszało wcześniej — czym jest uczenie maszynowe?

Ogólną ideą jest opracowanie programowalnego modelu, który znajduje wzorce w danych, które są mu przekazywane. Im lepszej jakości dane dostarczysz i im lepszy projekt modelu, z którego korzystasz, tym lepszy wynik. Dzięki „przyjaznemu uczeniu maszynowemu” (jak Google nazywa swoje uczenie maszynowe za pośrednictwem usług API) możesz łatwo włączyć do swoich aplikacji część sztucznej inteligencji.

Zalecana literatura : Pierwsze kroki z uczeniem maszynowym

Więcej po skoku! Kontynuuj czytanie poniżej ↓

Jak zacząć korzystać z Google Cloud

Zacznijmy od rejestracji do Google Cloud. Google wymaga uwierzytelniania, ale jest to proste i bezbolesne — wystarczy przechowywać plik JSON zawierający klucz API, który można uzyskać bezpośrednio z Google Cloud Platform.

Pobierz plik i dodaj jego ścieżkę do zmiennych środowiskowych:

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

Alternatywnie, w fazie rozwoju, możesz wesprzeć się metodą from_serivce_account_json() , którą opiszę w dalszej części tego artykułu. Aby dowiedzieć się więcej o uwierzytelnianiu, zapoznaj się z oficjalną dokumentacją Cloud.

Google dostarcza pakiet Pythona do obsługi API. Dodajmy najnowszą wersję google-cloud-vision==0.33 do Twojej aplikacji. Czas na kodowanie!

Jak połączyć Google Cloud Vision z Pythonem?

Najpierw zaimportujmy klasy z biblioteki.

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

Kiedy już się o to zatroszczysz, teraz będziesz potrzebować instancji klienta. W tym celu użyjesz funkcji rozpoznawania tekstu.

 client = vision.ImageAnnotatorClient()

Jeśli nie będziesz przechowywać swoich poświadczeń w zmiennych środowiskowych, na tym etapie możesz dodać je bezpośrednio do klienta.

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

Zakładając, że przechowujesz obrazy do przetworzenia w folderze „images” w katalogu projektu, otwórzmy jeden z nich.

Obraz paragonu, który może zostać przetworzony przez Google Cloud Vision
Przykład prostego paragonu, który mógłby zostać przetworzony przez Google Cloud Vision. (duży podgląd)
 image_to_open = 'images/receipt.jpg' with open(image_to_open, 'rb') as image_file: content = image_file.read()

Następnym krokiem jest utworzenie obiektu Vision, który umożliwi wysłanie prośby o kontynuowanie rozpoznawania tekstu.

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

Odpowiedź składa się z wykrytych słów przechowywanych jako klucze opisu, ich lokalizacji na obrazie oraz przewidywania języka. Na przykład przyjrzyjmy się bliżej pierwszemu słowu:

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

Jak widać, aby filtrować tylko tekst, trzeba uzyskać opis „na wszystkich elementach”. Na szczęście z pomocą przychodzi potężne rozumienie list w Pythonie.

 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']

Jeśli przyjrzysz się uważnie, zauważysz, że pierwszy element listy zawiera cały tekst wykryty w obrazie przechowywany jako ciąg znaków, podczas gdy pozostałe są oddzielnymi słowami. Wydrukujmy to.

 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

Całkiem dokładne, prawda? I oczywiście całkiem przydatne, więc zagrajmy więcej.

Co można uzyskać dzięki Google Cloud Vision?

Jak wspomniałem powyżej, Google Cloud Vision to nie tylko rozpoznawanie tekstu, ale także pozwala odkrywać twarze, punkty orientacyjne, właściwości obrazu i połączenia internetowe. Mając to na uwadze, dowiedzmy się, co może Ci powiedzieć o internetowych skojarzeniach obrazu.

 web_response = client.web_detection(image=image)

Dobra Google, czy naprawdę wiesz, co widać na obrazie, który otrzymałeś?

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

Dobra robota, Google! To rzeczywiście paragon. Ale zróbmy trochę więcej ćwiczeń — czy widzisz coś jeszcze? Co powiesz na więcej prognoz wyrażonych w procentach?

 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%')]

Mnóstwo cennych spostrzeżeń, dobra robota, mój wszechmogący przyjacielu! Czy możesz również dowiedzieć się, skąd pochodzi obraz i czy ma jakieś kopie?

 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" ]

Jestem pod wrażeniem. Dzięki, Google! Ale jedno nie wystarczy, czy możesz podać mi trzy przykłady podobnych obrazów?

 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" ]

Słodki! Dobrze zrobiony.

Czy naprawdę istnieje sztuczna inteligencja w Google Cloud Vision?

Jak widać na poniższym obrazku, zajmowanie się paragonami może być nieco emocjonalne.

Mężczyzna krzyczy i wygląda na zestresowanego, trzymając długi paragon
Przykład stresu, którego możesz doświadczyć podczas odbierania paragonu. (duży podgląd)

Zobaczmy, co Vision API może powiedzieć o tym zdjęciu.

 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

Nieźle, algorytm ma ponad 50% pewność, że na zdjęciu jest twarz. Ale czy możesz dowiedzieć się czegoś o emocjach, które się za tym kryją?

 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 ... ]

Co zaskakujące, za pomocą prostego polecenia możesz sprawdzić prawdopodobieństwo niektórych podstawowych emocji, a także właściwości nakrycia głowy lub zdjęcia.

Jeśli chodzi o wykrywanie twarzy, muszę zwrócić uwagę na niektóre potencjalne problemy, które możesz napotkać. Musisz pamiętać, że przekazujesz zdjęcie do maszyny i chociaż API Google wykorzystuje modele wytrenowane na ogromnych zbiorach danych, możliwe jest, że zwróci nieoczekiwane i mylące wyniki. W sieci można znaleźć zdjęcia pokazujące, jak łatwo można oszukać sztuczną inteligencję przy analizie obrazu. Niektóre z nich można uznać za śmieszne, ale istnieje cienka granica między niewinnymi a obraźliwymi błędami, zwłaszcza gdy błąd dotyczy ludzkiej twarzy.

Bez wątpienia Google Cloud Vision to solidne narzędzie. Co więcej, fajnie się z nim pracuje. Architektura REST API i szeroko dostępny pakiet Python sprawiają, że jest on jeszcze bardziej dostępny dla każdego, niezależnie od tego, jak zaawansowany jesteś w programowaniu Pythona. Wyobraź sobie, jak bardzo możesz ulepszyć swoją aplikację, wykorzystując jej możliwości!

Zalecana literatura : Zastosowania uczenia maszynowego dla projektantów

Jak możesz poszerzyć swoją wiedzę na temat Google Cloud Vision?

Zakres możliwości zastosowania usługi Google Cloud Vision jest praktycznie nieograniczony. Dzięki dostępnej bibliotece Python można ją wykorzystać w dowolnym projekcie opartym na języku, niezależnie od tego, czy jest to aplikacja internetowa, czy projekt naukowy. Z pewnością może pomóc w zwiększeniu zainteresowania technologiami uczenia maszynowego.

Dokumentacja Google zawiera kilka świetnych pomysłów na zastosowanie funkcji Vision API w praktyce, a także daje możliwość dowiedzenia się więcej o uczeniu maszynowym. Szczególnie polecam zapoznać się z poradnikiem, jak zbudować zaawansowaną wyszukiwarkę grafiki.

Można powiedzieć, że to, co widziałeś w tym artykule, jest jak magia. W końcu kto by pomyślał, że proste i łatwo dostępne API jest wspierane przez tak potężne, naukowe narzędzie? Wystarczy napisać kilka linijek kodu, rozwinąć wyobraźnię i doświadczyć nieograniczonego potencjału analizy obrazu.