Rozpoznawanie obrazu i wideo w AWS: AI w chmurze, czyli co powinien wiedzieć każdy developer

W tym artykule pokażę Ci, jak szeroką ofertę narzędzi do rozpoznawania i analizy obrazów i wideo przygotował AWS oraz omówię ich zastosowanie. Prawdopodobnie będziesz zaskoczony, jak rozbudowane są te możliwości.

Rekognition to jedna z ponad 200 usług na AWS i jedna z 20 usług w kategorii AI. Te ostatnie nie wymagają żadnej wiedzy związanej z uczeniem maszynowym. 

Są to gotowe API napędzane przez wytrenowany wcześniej model. Płacimy tylko za liczbę wykonanych zapytań. W związku z tym każdy programista może realizować typowe zadania związane z AI, takie jak konwersja mowy na tekst w czasie rzeczywistym czy analiza sentymentu. 

Z kronikarskiego obowiązku dodam, że wszystkie demonstracje przeprowadziłem z wykorzystaniem zdjęć i wideo, które sam wybrałem. 

Rozpoznawanie obiektów i scen

Zdjęcia

Rekognition rozpoznaje ponad 2500 etykiet. Są to unikatowe kategorie, które po identyfikacji zaznaczane są w ramce (bounding box). Dodatkowo przy każdym rozpoznanym obiekcie dostajemy informację o pewności predykcji (prediction confidence). Ta informacja pozwala uznać predykcję modelu za wiarygodną bądź nie w zależności od progu, który sami ustalimy.

Demonstracja rozpoznawania obiektów i scen web AWS

Rozpoznawanie obiektów to jedno. Cały obraz również zostaje zaklasyfikowany. Jak widać w przykładzie, główne etykiety to City i Urban.

json reponse from object detection
Szczegóły rozpoznanego obiektu w JSON

Wideo

Jeszcze ciekawiej robi się, kiedy analizujemy wideo. Dla rozpoznanych etykiet zostają zdefiniowane dokładne przedziały czasu, w których są one widoczne.

Demonstracja rozpoznawania obiektów i scen w konsoli web AWS.  Pomarańczowe zakresy na osi czasu odpowiadają momentom, w których wybrana etykieta jest widoczna.

Zastosowanie:

  1. tworzenie wyszukiwarek filmów i nagrań,
  2. automatyzacja zadań takich jak kalkulacja natężenia ruchu drogowego,
  3. systemy powiadomień reagujące na daną etykietę z wideo w czasie rzeczywistym

Rozpoznawanie i analiza twarzy

Analiza twarzy polega na wyodrębnianiu z jej rysów odpowiednich atrybutów. Są to między innymi:

  1. płeć osoby,
  2. przybliżony wiek,
  3. pozycja, czyli orientacja twarzy (informacja podawana jako kąt odchylenia od każdej z trzech osi),
  4. punkty orientacyjne (umiejscowienie każdego z 32 elementów twarzy, takich jak m.in. prawy kącik ust, środek nosa czy prawy róg lewego oka),
  5. emocje (dostępnych 8 różnych rodzajów uczuć)
Demonstracja rozpoznawania i analizy twarzy w konsoli web AWS

Zobacz, ile szczegółów można przypisać jednej rozpoznanej twarzy.

{
  "BoundingBox": {
    "Width": 0.066957026720047,
    "Height": 0.16323527693748474,
    "Left": 0.4519437253475189,
    "Top": 0.38598427176475525
  },
  "AgeRange": {
    "Low": 44,
    "High": 62
  },
  "Smile": {
    "Value": false,
    "Confidence": 99.41268157958984
  },
  "Eyeglasses": {
    "Value": false,
    "Confidence": 97.00235748291016
  },
  "Sunglasses": {
    "Value": false,
    "Confidence": 99.17359161376953
  },
  "Gender": {
    "Value": "Male",
    "Confidence": 99.48360443115234
  },
  "Beard": {
    "Value": true,
    "Confidence": 53.67255401611328
  },
  "Mustache": {
    "Value": false,
    "Confidence": 84.93054962158203
  },
  "EyesOpen": {
    "Value": true,
    "Confidence": 98.37866973876953
  },
  "MouthOpen": {
    "Value": false,
    "Confidence": 94.83352661132812
  },
  "Emotions": [
    {
      "Type": "CALM",
      "Confidence": 46.49129867553711
    },
    {
      "Type": "CONFUSED",
      "Confidence": 28.088716506958008
    },
    {
      "Type": "SURPRISED",
      "Confidence": 18.31591796875
    },
    {
      "Type": "ANGRY",
      "Confidence": 3.7190146446228027
    },
    {
      "Type": "SAD",
      "Confidence": 2.0088257789611816
    },
    {
      "Type": "FEAR",
      "Confidence": 0.9378522634506226
    },
    {
      "Type": "DISGUSTED",
      "Confidence": 0.2733963429927826
    },
    {
      "Type": "HAPPY",
      "Confidence": 0.16497045755386353
    }
  ],
  "Landmarks": [
    {
      "Type": "eyeLeft",
      "X": 0.48116356134414673,
      "Y": 0.4533582925796509
    },
    {
      "Type": "eyeRight",
      "X": 0.5078441500663757,
      "Y": 0.4548220634460449
    },
    {
      "Type": "mouthLeft",
      "X": 0.48208311200141907,
      "Y": 0.5116446018218994
    },
    {
      "Type": "mouthRight",
      "X": 0.5042969584465027,
      "Y": 0.5126384496688843
    },
    {
      "Type": "nose",
      "X": 0.50047767162323,
      "Y": 0.4854586720466614
    },
    {
      "Type": "leftEyeBrowLeft",
      "X": 0.4687861502170563,
      "Y": 0.43961238861083984
    },
    {
      "Type": "leftEyeBrowRight",
      "X": 0.4802559018135071,
      "Y": 0.4333999454975128
    },
    {
      "Type": "leftEyeBrowUp",
      "X": 0.4892558455467224,
      "Y": 0.43694236874580383
    },
    {
      "Type": "rightEyeBrowLeft",
      "X": 0.5047080516815186,
      "Y": 0.4379810690879822
    },
    {
      "Type": "rightEyeBrowRight",
      "X": 0.5113765001296997,
      "Y": 0.4353857934474945
    },
    {
      "Type": "rightEyeBrowUp",
      "X": 0.5155256390571594,
      "Y": 0.44227197766304016
    },
    {
      "Type": "leftEyeLeft",
      "X": 0.4754110276699066,
      "Y": 0.4528338313102722
    },
    {
      "Type": "leftEyeRight",
      "X": 0.4863017499446869,
      "Y": 0.45421579480171204
    },
    {
      "Type": "leftEyeUp",
      "X": 0.48141804337501526,
      "Y": 0.4505022466182709
    },
    {
      "Type": "leftEyeDown",
      "X": 0.48113366961479187,
      "Y": 0.45595866441726685
    },
    {
      "Type": "rightEyeLeft",
      "X": 0.5024406313896179,
      "Y": 0.4551401138305664
    },
    {
      "Type": "rightEyeRight",
      "X": 0.5117218494415283,
      "Y": 0.4547899663448334
    },
    {
      "Type": "rightEyeUp",
      "X": 0.5082865953445435,
      "Y": 0.4520116150379181
    },
    {
      "Type": "rightEyeDown",
      "X": 0.5076396465301514,
      "Y": 0.457364022731781
    },
    {
      "Type": "noseLeft",
      "X": 0.49091920256614685,
      "Y": 0.4909525513648987
    },
    {
      "Type": "noseRight",
      "X": 0.5009651780128479,
      "Y": 0.4914744794368744
    },
    {
      "Type": "mouthUp",
      "X": 0.49621590971946716,
      "Y": 0.5048847794532776
    },
    {
      "Type": "mouthDown",
      "X": 0.4948192238807678,
      "Y": 0.5220130085945129
    },
    {
      "Type": "leftPupil",
      "X": 0.48116356134414673,
      "Y": 0.4533582925796509
    },
    {
      "Type": "rightPupil",
      "X": 0.5078441500663757,
      "Y": 0.4548220634460449
    },
    {
      "Type": "upperJawlineLeft",
      "X": 0.4542137384414673,
      "Y": 0.4529658854007721
    },
    {
      "Type": "midJawlineLeft",
      "X": 0.4594198167324066,
      "Y": 0.5147507190704346
    },
    {
      "Type": "chinBottom",
      "X": 0.49111947417259216,
      "Y": 0.5510269403457642
    },
    {
      "Type": "midJawlineRight",
      "X": 0.5075818300247192,
      "Y": 0.5173647403717041
    },
    {
      "Type": "upperJawlineRight",
      "X": 0.513190507888794,
      "Y": 0.4564695656299591
    }
  ],
  "Pose": {
    "Roll": 2.8419814109802246,
    "Yaw": 19.12984848022461,
    "Pitch": -0.19896724820137024
  },
  "Quality": {
    "Brightness": 77.97090148925781,
    "Sharpness": 53.330047607421875
  },
  "Confidence": 99.9878158569336
}

Porównywanie twarzy

Dzięki tej funkcjonalności możemy obliczyć prawdopodobieństwo występowania tej samej osoby na dwóch wskazanych przez nas zdjęciach. Kiedy analizujemy fotografię, na której znajduje się wiele postaci, informacja o prawdopodobieństwie występowania zwracana jest dla każdej z nich.

Pierwszy przykład to Andrzej Grabowski w 1999 i w 2019 roku. Minęło 20 lat, a model nie ma wątpliwości, że to ta sama osoba.

porownywanie-twarzy-aws-rekognition
Demonstracja porównywania twarzy w konsoli web AWS. Przykład z wysokim podobieństwem Źródło zdjęć: https://kiepscy.org.pl/ferdek-wczoraj-i-dzis/

Tak z kolei wygląda przykład negatywny dla pary: Andrzej Grabowski i Cezary Pazura.

Demonstracja porównywania twarzy w konsoli web AWS. Przykład z niskim podobieństwem

Zastosowanie

W połączeniu z poprzednimi funkcjonalnością analizy twarzy możemy zbudować cały system weryfikacji tożsamości. Przykładowy przebieg walidacji:

weryfikacja-tożsamowsci-aws-rekognition
https://aws.amazon.com/rekognition/identity-verification/

Rozpoznawanie celebrytów

Kontynuując wątek twarzy, warto dodać, że ostatnią funkcjonalnością w tym zakresie jest identyfikacja znanych osób. W odpowiedzi z serwera otrzymujemy link do wikidata.org z informacjami o danej osobie.

Według oficjalnej dokumentacji, jeśli celebryta nie chce widnieć w bazie Rekognition może napisać maila o wykreślenie — tak wygląda ochrona danych w wykonaniu AWS.

Demonstracja rozpoznawania celebrytów konsoli web AWS

Moderacja treści

Narzędzie to służy do rozpoznawania szeroko rozumianych szkodliwych treści, takich jak: alkohol, narkotyki, broń czy pornografia. Naturalnie nasuwa się na myśl zastosowanie filtrowania tych materiałów tak, aby nie zostały dodane, np. na stronie przeznaczonej dla dzieci. Jest to po prostu kolejna porcja metadanych naszych zasobów.

Demonstracja moderacji treści konsoli web AWS

Rozpoznawanie tekstu na zdjęciach

Model, który jest wykorzystany do rozpoznawania tekstu w usłudze Rekognition, był trenowany na zdjęciach i wideo ze świata rzeczywistego. Funkcjonalność ta jest przeznaczona do lokalizowania i identyfikowania napisów w witrynach sklepów, na etykietach produktów, znakach drogowych czy rejestracjach samochodowych.

rozpoznawanie-tekstu-aws-rekognition
Demonstracja rozpoznawania tekstu na zdjęciach w konsoli web AWS
rozpoznawanie-tekstu-aws-rekognition

Demonstracja rozpoznawania tekstu na zdjęciach w konsoli web AWS

Rozpoznawanie tekstu w dokumentach

Aby natomiast rozpoznać tekst w zeskanowanych dokumentach i wyodrębnić tabele oraz formularze, należy wykorzystać Textract. Model, który napędza tę usługę, był trenowany na innym zbiorze danych niż ten, który rozpoznaje obrazy na zdjęciach w Rekognition.

Demonstracja rozpoznawania tekstu na zdjęciach w konsoli web AWS w usłudze Textract

Poniżej analiza tego samego dokumentu, zrealizowana przez Rekognition. Jak widać, analiza jest dużo mniej złożona i mniej atrakcyjna niż w przypadku Textract.

rozpoznawanie-tekstu-aws-rekognition
Demonstracja rozpoznawania tekstu na zdjęciach w konsoli web AWS w usłudze Rekognition

Dostarczanie danych

Obraz:

Z obrazami jest prosto: albo wysyłamy w zapytaniu sieciowym, albo podajemy ścieżkę pliku na S3.

Wideo:

Inaczej jest z wideo, ponieważ żeby korzystać z tych wszystkich dobrodziejstw w czasie rzeczywistym, strumień wideo musi być najpierw przekazany na usługę Kinesis Video Streams, a następnie przekierowany do Rekognition. Jeśli nie chcemy analizować wideo na żywo, wystarczy umieścić plik na S3. Jeśli masz AWS CLI, sam możesz wykonać kilka testów:

aws rekognition detect-labels --image-bytes fileb://<local-file-path>

Ile to kosztuje?

AWS nalicza płatność za każdą funkcjonalność, czyli za każde zapytanie do API.

Każdy region ma swój cennik, a w obrębie niego ceny również mogą się zmieniać, dlatego dalsze obliczenia są orientacyjne. Aktualna tabela cen: https://aws.amazon.com/rekognition/pricing/ 

Dla obrazów cena to 0,0012 $ za każde zdjęcie, czyli niecałe 5 zł za 1000 zdjęć.

Wideo natomiast kosztuje 0,12 $/min. Dla przykładu koszt zidentyfikowania wszystkich twarzy we „Władcy Pierścieni: Drużynie Pierścienia”, który trwa 178 minut, to 21 $, czyli nieco ponad 80 zł.

Ponadto przetwarzanie wideo w czasie rzeczywistym wiąże się z dodatkowymi opłatami za Kinesis Wideo Streams.

Podsumowanie 

Zero serwerów, zero utrzymania, a jednocześnie jakość usługi z miesiąca na miesiąc jest coraz lepsza, ponieważ modele kryjące się za API są ciągle udoskonalane.

Artykuł ten powstał w dwóch celach. Po pierwsze, chcę skrócić dystans pomiędzy wyrafinowanymi zadaniami, które realizuje sztuczna inteligencja, a łatwością ich wdrożenia. Znając wachlarz możliwości, jakie dają nam najwięksi dostawcy chmur (analogiczne usługi są dostępne w GCP i Azure), możemy wdrażać nowe pomysły na rozwój naszych aplikacji. 

Po drugie, chcę za pomocą tego tekstu budować społeczną świadomość o precyzji i wysokiej jakości rozwiązań za parę groszy. Ze wszystkimi ich pozytywnymi i negatywnymi konsekwencjami. 

Mam nadzieję, że choć jeden z tych celów udało mi się osiągnąć.

Udostępnij ten wpis


Dobrnąłeś do końca. Jeśli ten artykuł był dla Ciebie wartościowy i chcesz otrzymywać informacje o kolejnych, to zapraszam Cię do zapisania się do listy mailingowej. Gwarantuję zero spamu.

Radek.

Inne artykuły

Partycjonowanie bazy danych okładka

Partycjonowanie bazy danych

Partycjonowanie pozwala podzielić tabelę na mniejsze części, gdzie każda z nich może się znajdować na innym serwerze. Zobacz, jak to działa oraz dlaczego jest to …