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.
Rozpoznawanie obiektów to jedno. Cały obraz również zostaje zaklasyfikowany. Jak widać w przykładzie, główne etykiety to City i Urban.
Wideo
Jeszcze ciekawiej robi się, kiedy analizujemy wideo. Dla rozpoznanych etykiet zostają zdefiniowane dokładne przedziały czasu, w których są one widoczne.
Zastosowanie:
- tworzenie wyszukiwarek filmów i nagrań,
- automatyzacja zadań takich jak kalkulacja natężenia ruchu drogowego,
- 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:
- płeć osoby,
- przybliżony wiek,
- pozycja, czyli orientacja twarzy (informacja podawana jako kąt odchylenia od każdej z trzech osi),
- 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),
- emocje (dostępnych 8 różnych rodzajów uczuć)
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.
Tak z kolei wygląda przykład negatywny dla pary: Andrzej Grabowski i Cezary Pazura.
Zastosowanie
W połączeniu z poprzednimi funkcjonalnością analizy twarzy możemy zbudować cały system weryfikacji tożsamości. Przykładowy przebieg walidacji:
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.
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.
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 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.
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.
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.