Poniższy wpis pana Łukasza Wyporka zapewnił autorowi pierwsze miejsce w naszym czerwcowym konkursie.
MATLAB - Zliczanie twarzy ze zdjęcia tłumu
29 kwietnia 2015 r. na Rynku w Krakowie miał miejsce wiec wyborczy Janusza Korwina-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. I 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: 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.
Minusy
Mnóstwo twarzy spoza zdjęcia nie zostało zliczonych. Również optyczna rozdzielczość zdjęcia początkowo nie pozwalała na wychwycenie twarzy znajdujących się daleko. Późniejsze zdobycie zdjęcia w pełnej rozdzielczości znacząco 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ż nie mam na nie żadnego potwierdzenia.
Odległość od sceny, a gęstość ludności
Dokonując tego rodzaju oszacowań musimy pamiętać o tym, że gęstość ludności nie jest wszędzie taka sama. Różnice są znaczące – od największego zagęszczenia pod sceną, pod dość swobodne rozmieszczenie na krańcach badanego obszaru. Spójrzmy zatem na takie zgromadzenia z lotu ptaka (w tym przypadku drona):
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ń.
Wtedy, na Rynku w Krakowie, 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 zauważyć, ż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, który widać pod sceną.
Kilka dni po wydarzeniu 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 zdjęcie 46MPix nie nadawało się do celów rozpoznawania z powodu zbyt małego kąta (zbyt niska wysokość, z której zostało zrobione zdjęcie), w większości widoczne są połówki twarzy.
Uwzględniają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.
Policzyłem też powierzchnię Rynku zajmowaną przez ludzi (rysunek nr 5, po lewej stronie) oraz sporządziłem 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:
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).
Sprawdzenie – ręczne liczenie
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:
Trzeba przyznać, że po tym fakcie moje oszacowanie nieco zyskało na wiarygodności wśród czytelników nietraktujących go poważnie.
Zakończenie
Biorąc pod uwagę obszar zajęty przez ludzi (ok. 3097m2), znając ilość ludzi na zdjęciu i wiedząc, jaki obszar był na nim widoczny, z proporcji policzyłem, że na krakowskim Rynku 29 kwietnia 2015 r. było około 3000 ludzi.