artykuły

MatLab - Zliczanie twarzy ze zdjęcia tłumu

0:04
czw, 30 kwiecień 2015
Artykuł opisuje metodę wykorzystania środowiska MatLab do policzenia ludzi stojących w tłumie.

Ostatnio, na Rynku w Krakowie, miał miejsce wiec wyborczy Janusza Korwin-Mikkego. Byłem bardzo ciekawy ile osób przyszło na spotkanie - niestety - liczyć głów na zdjęciu mi się nie chciało. Postanowiłem więc wykorzystać do tego celu środowisko MatLab pisząc krótki program zliczający głowy na zdjęciu za mnie.

Całość zajęła (uwaga!) 9 linii kodu. To jest właśnie fajne w bibliotekach dołączonych do MatLaba - wystarczy z nich skorzystać, a cała brudna robota wykonywana jest za nas.

% Create a cascade detector object. faceDetector = vision.CascadeObjectDetector(); faceDetector.MinSize = [20 22]; faceDetector.MergeThreshold = 3; I = imread('.\zdjecie_tlumu.jpg'); bboxes = step(faceDetector, I); IFaces = insertObjectAnnotation(I, 'rectangle', bboxes, 'Twarz', 'LineWidth', 10); count = size(bboxes) figure, imshow(IFaces), title(['Ilość wykrytych twarzy kuców: pomiędzy ' int2str(count(1)*1.2) ' a ' int2str(count(1)*1.8) ]); Wynik działania? Ilość zliczonych twarzy: od 462 do 693 twarzy widocznych na zdjęciu. Rozdzielczość posiadanego zdjęcia nie była duża, stąd początkowo, bardzo wiele twarzy zostało nieoznaczonych/niezliczonych. Pomogła sztuczna interpolacja rozdzielczości do 8192x4608. Dodatkowo przemnożyłem wynik przez współczynnik 1.2 i 1.8 (ustalone empirycznie na podstawie ilorazu wszystkich twarzy do twarzy rozpoznanych, w ścisłym środkowym, obszarze zdjęcia) uzyskując w ten sposób dolny i górny pułap.

Zliczone twarze tłumu

Wykryte twarze

Minusy

Mnóstwo twarzy spoza zdjęcia nie zostało zliczonych. Również optyczna rozdzielczość zdjęcia nie pozwalała na wychwycenie twarzy znajdujących się daleko. Zdobycie zdjęcia w pełnej rozdzielczości znacząco by pomogło.
Należy również zwrócić uwagę, że wiele osób stojących po bokach (pewnie drugie tyle) nie zostało ujętych na tym zdjęciu. Część osób była również zasłonięta przez inne osoby lub stała odwrócona.
Najpóźniejsze zdjęcia które posiadam pochodzą z godziny 18:35 (a więc sprzed wystąpienia JKM). Prawdopodobnie do momentu przemówienia głównej persony tłum wzrósł jeszcze od 6% do 12%. Ale nie uwzględniam tych danych ponieważ na nie żadnego potwierdzenia.

Zakończenie

Biorąc pod uwagę obszar zajęty przez ludzi (ok. 3700m2 [patrz: aktualizacja] - zmierzone pole powierzchni w SketchUp), znając ilość ludzi na zdjęciu i wiedząc jaki obszar rynku był na nim widoczny, z proporcji policzyłem, że na krakowskim Rynku, 29 kwietnia 2015 r. było około 3000 ludzi.
Zajęta przez ludzi powierzchnia Rynku

Kontrowersje

Kilka godzin po publikacji artykułu, czytelnik zarzucił zbyt dużo niewykrytych twarzy:

Ja doliczyłem się 23 nieoznaczonych twarzy na wyciętym zbliżeniu. ~Haren
Jednak mieści się to w przyjętym wcześniej pułapie ilości wszystkich twarzy do ilości wykrytych twarzy: 1.2-1.8.

Następnie, niecały dzień po publikacji artykułu, napisał do mnie czytelnik ~Nick kwestionując (i bardzo dobrze! - szkoda tylko, że nie obyło się bez inwektyw) przyjętą metodologię obliczeń:
Skoro obszar zajety przez ludzi byl 3700 m2 a wedlug Twoich madrych wyliczen bylo 3000 ludzi nawet po bokach. To stojaca osoba na jednym metrze kwadratowym nie mogla by dosiegnac drugiej osoby wyciagnieta przed siebie dlonia. Tak wiec Twoje lenistwo i ograniczone myslenie wziely gore nad zdrowym rozsadkiem. Jest to przerost formy nad trescia. Zeby uzywac tak skomplikowanego programu do tak prostego szacunku. Jezeli powierzchnia dajmy byla mniejsza 3000m2 a 3-4 ludzi bez scisku zmiesci sie na 1m2 to wychodzi od 9000-12000 tysiecy ludzi. ~Nick
Czytelnik całkiem rozsądnie argumentuje, jednak wpada w prostą pułapkę myślową błędnie zakładając, że gęstość tłumu była wszędzie jednakowa i tak duża jak pod sceną. Tym czasem, moje "ograniczone myślenie" i "lenistwo" wygrzebało trochę chęci aby sprawdzić jak wyglądają takie zgromadzenia z lotu ptaka:
Dwa różne ujęcia
Jak widzimy na pierwszym, górnym, ujęciu, ilość zgromadzonych osób wydaje się olbrzymia. Wystarczy jednak spojrzeć na drugie zdjęcie, aby zauważyć, że ilość osób tylko pozornie jest wielka, dodatkowo gęstość tłumu zmniejsza się bardzo (nawet kwadratowo) wraz z odległością od centrum wydarzeń.
Byłem na wiecu, zaraz pod sceną. Nie było tłoku. Ogniskowa z jaką zostało zrobione zdjęcie mocno zniekształca obraz. Wydaje się, że ludzie są "upakowani" a wcale tak nie było (wystarczy spojrzeć, że osoby nie cieniują się wzajemnie). Przy scenie, gęstość rozmieszczenia ludzi na oko wynosiła ok. 2-3, może nawet 4 osoby na m^2. Właśnie dlatego metoda ze zliczaniem twarzy (jeśli byłaby dokładna) jest bardziej miarodajna niż metoda sumowania oparta na gęstości tłumu jaką widać pod sceną. Mimo wszystko, zgadzam się z rozumowaniem - to oczywiste, że gdyby wszędzie gęstość była taka jak pod sceną byłoby tak jak twierdzi czytelnik. Niestety, mimo, że intuicyjnie również wydawało mi się, że było więcej ludzi (i bardzo się zdziwiłem wynikiem), nie będę fałszował wyników zwróconych przez program (umieszczam tylko stosowną notkę w artykule).

Ciągle staram się o zdjęcie w pełnej rozdzielczości, aby przedstawić dokładniejsze oszacowania.

Nowe zdjęcia - aktualizacja

3 i 4 maja 2015 r. otrzymałem niemodyfikowane zdjęcia w pełnej rozdzielczości (serdecznie dziękuję użytkownikowi ~Bunch oraz fotografowi, p. Tomaszowi Kochmańskiemu, który przysłał 46MPix panoramę). Wynik nieco wzrósł, lecz powierzchnia tłumu zmalała - 735 wykrytych twarzy na poniższym zdjęciu. Dla ludzi stojących w tyle, optyczna rozdzielczość zdjęcia nadal okazała się niewystarczająca (jak widać nie są zliczeni). Z kolei 46MPix zdjęcie nie nadało do celów rozpoznawania (zbyt mały kąt [zbyt niska wysokość z której zostało zrobione zdjęcie], widoczne w większości połówki twarzy).
Nowe zdjęcia - nieco więcej osób
Przyjmując pewne błędy skutkujące nierozpoznaniem twarzy (ludzie schowani za innymi ludźmi, ludzie patrzący w dół itp.) można spokojnie ten wynik (jak poprzednio) przemnożyć przez współczynnik od 1.2 do 1.8. Nawet gdyby pomnożyć przez 2 (czyli przyjąć, że na każdą oznaczoną twarz przypada jedna nieoznaczona we fragmencie w którym występują rozpoznane twarze) to mamy wynik max. 1470 osób na fragmencie zdjęcia z rozpoznanymi twarzami.
Sporządziłem też przybliżony model oświetlenia dla godziny 18:35 (godzina wykonania zdjęcia) aby ustalić dokładnie dokąd sięgał tłum (na samym końcu rzadko rozmieszczeni ludzie są oświetleni Słońcem). Symulując wysokość kamienic tak aby cień przez nie rzucany odpowiadał temu widocznemu na zdjęciu sukiennic z godziny 18:35 możemy dostrzec faktyczną powierzchnię zbiorowiska ludzi - 3097m2:
Dokładniejsze pomiary - nieco mniejsza powierzchnia
I teraz szacuję, że takich fragmentów jak ten z rozpoznanymi twarzami było na Rynku ze 3 - może 4. Wychodzi 4410-5880 osób (max). Nieźle więc.

Mówię "Sprawdzam" - ciekawostka

Jeden z użytkowników serwisu Wykop poświęcił swój wolny czas i policzył ludzi do pierwszego tysiąca - tak to wygląda:
Tysiąc osób
Trzeba przyznać, że moje oszacowanie nieco tym faktem zyskało na wiarygodności wśród czytelników nie traktujących go poważnie.

12345
MatLab - Zliczanie twarzy ze zdjęcia tłumu Autor opinii: Czytelnicy, data przesłania: 5

Podobne artykuly:

Skomentuj

Aby zamieścić komentarz, proszę włączyć JavaScript - niestety roboty spamujące dają mi niezmiernie popalić.






Komentarze czytelników

    • Nick
    • pią, 1 maj 2015, 15:40
    • Skoro obszar zajety przez ludzi byl 3700 m2 a wedlug Twoich madrych wyliczen bylo 3000 ludzi nawet po bokach. To stojaca osoba na jednym metrze kwadratowym nie mogla by dosiegnac drugiej osoby wyciagnieta przed siebie dlonia.
      Tak wiec Twoje lenistwo i ograniczone myslenie wziely gore nad zdrowym rozsadkiem. Jest to przerost formy nad trescia. Zeby uzywac tak skomplikowanego programu do tak prostego szacunku. Jezeli powierzchnia dajmy byla mniejsza 3000m2 a 3-4 ludzi bez scisku zmiesci sie na 1m2 to wychodzi od 9000-12000 tysiecy ludzi.


      Odp: Byłem na wiecu, zaraz pod sceną. Nie było tłoku. Ogniskowa z jaką zostało zrobione zdjęcie mocno zniekształca obraz. Wydaje się, że ludzie są "upakowani" a wcale tak nie było (wystarczy spojrzeć, że osoby nie cieniują się wzajemnie). Przy scenie, gęstość rozmieszczenia ludzi na oko wynosiła ok. 2-3 osoby na m^2. Niepewność Twojego rozumowania polega na tym, że zakładasz, że gęstość tłumu była wszędzie taka sama jak pod sceną. A wcale tak nie było. Mówimy tutaj o średniej gęstości. Właśnie dlatego metoda ze zliczaniem twarzy (jeśli byłaby dokładna) jest bardziej miarodajna niż metoda sumowania oparta na gęstości tłumu jaką widać pod sceną. Mimo wszystko, zgadzam się z Twoim rozumowaniem - to oczywiste, że gdyby wszędzie gęstość była taka jak pod sceną byłoby tak jak mówisz. Niestety, mimo, że intuicyjnie również wydawało mi się, że było więcej ludzi (i bardzo się zdziwiłem wynikiem), nie będę fałszował wyników zwróconych przez program (umieszczę tylko stosowną notkę i przeliczę jeszcze raz stosunek twarzy wykrytych do niewykrytych). Myślę, że odpowiednie i rozsądne będzie umieszczenie stosownych uwag w artykule na podstawie tego komentarza.
    • Haren
    • czw, 30 kwiecień 2015, 14:52
    • Ja doliczyłem się 23 nieoznaczonych twarzy na wyciętym zbliżeniu.


      Odp: Co mieści się w założonym współczynniku 1.2-1.8 ilości wszystkich twarzy do twarzy rozpoznanych.
    • plainivew
    • czw, 30 kwiecień 2015, 14:47
    • Trochę to mało wiarygodne, skoro tylko na wklejonym fragmencie zdjęcia naliczyłem co najmniej 14 twarzy lub ich fragmentów (np. częściowo zasłoniętych), które nie zostały zaznaczone kwadratami (co rozumiem, że jest równoznaczne z nie policzeniem ich)


      Odp: W artykule opisałem metodologię. Policzyłem współczynnik wszystkich twarzy do niewykrytych ze środkowego fragmentu zdjęcia i wykorzystałem go do przemnożenia wyniku dla całego zdjęcia.
Dexter