Menschenmengenzählung | Erstellen eines Crowd-Counting-Modells mit Python

Inhalt

Einführung

Künstliche Intelligenz und maschinelles Lernen werden unser größter Helfer im nächsten Jahrzehnt sein!!

Heute Morgen, Ich habe einen Artikel gelesen, in dem berichtet wurde, dass ein System der künstlichen Intelligenz gegen . gewonnen hat 20 Anwälte und Anwälte waren sehr froh, dass künstliche Intelligenz einen sich wiederholenden Teil ihrer Rollen übernehmen und ihnen helfen kann, an komplexen Themen zu arbeiten. Diese Anwälte waren erfreut, dass sie mit künstlicher Intelligenz zufriedenstellendere Funktionen ausführen können.

Heute, Ich werde ein ähnliches Beispiel teilen: wie man die Anzahl der Personen in einer Menschenmenge mit zählt Deep Learning und Computer Vision? Aber, bevor du das tust, Lassen Sie uns ein Gefühl dafür entwickeln, wie einfach das Leben für einen Wissenschaftler ist, der die Menge zählt.

Benehmen Sie sich wie ein Wissenschaftler, der die Menge zählt

Lasst uns beginnen!

Kannst du mir beim Zählen helfen? / Schätzen Sie die Anzahl der Personen in diesem Bild, die an dieser Veranstaltung teilnehmen werden?

menschenmenge-in-einem-stadion-in-johannesburg-südafrika-für-rugby-2741194

Okay, was ist mit diesem?

img_2-2634912

Quelle: ShanghaiTech-Datensatz

Du hast den Dreh raus. Am Ende dieses Tutorials, Wir werden einen Algorithmus für das Zählen von Menschenmengen mit erstaunlicher Präzision erstellen (im Vergleich zu Menschen wie dir und mir). Werden Sie einen solchen Assistenten verwenden??

PD In diesem Artikel wird davon ausgegangen, dass Sie über ein grundlegendes Verständnis der Funktionsweise von Convolutional Neural Networks verfügen. (CNN). Weitere Informationen zu diesem Thema finden Sie im folgenden Beitrag, bevor Sie fortfahren.:

Inhaltsverzeichnis

  1. Was ist Crowd-Counting??
  2. Warum ist Crowd-Counting erforderlich??
  3. Verständnis verschiedener Computer-Vision-Techniken zum Zählen von Menschenmengen
  4. CSRNet-Architektur und Trainingsmethoden
  5. Erstellen Sie Ihr eigenes Crowd-Counting-Modell in Python

Dieser Artikel ist sehr inspiriert von dem Artikel: CSRNet: Dilatierte neuronale Faltungsnetze zum Verständnis stark überlasteter Szenen.

Was ist Crowd-Counting??

Crowd Counting ist eine Technik zum Zählen oder Schätzen der Anzahl der Personen in einem Bild. Nehmen Sie sich einen Moment Zeit, um das folgende Bild zu analysieren:

img_2-2634912

Quelle: ShanghaiTech-Datensatz

Können Sie mir ungefähr sagen, wie viele Personen sich in der Box befinden?? Jawohl, einschließlich der im Hintergrund anwesenden. Die direkteste Methode besteht darin, jede Person manuell zu zählen, aber macht das praktisch sinn? Es ist fast unmöglich, wenn der Andrang so groß ist!

Die Crowd Scientists (Jawohl, Das ist eine echte Berufsbezeichnung!) Sie zählen die Anzahl der Personen in bestimmten Teilen eines Bildes und extrapolieren dann, um eine Schätzung zu erhalten. Häufiger, Wir mussten uns seit Jahrzehnten auf Rohmetriken verlassen, um diese Zahl zu schätzen.

Sicherlich muss es einen besseren und genaueren Ansatz geben.

Ja gibt es!

Obwohl wir immer noch keine Algorithmen haben, die uns die GENAUE Zahl liefern können, die Mehrheit Computer Vision Techniken können beeindruckend genaue Schätzungen erzeugen. Lassen Sie uns zuerst verstehen, warum das Zählen von Menschenmengen wichtig ist, bevor wir in den Algorithmus dahinter eintauchen..

Warum ist Crowd-Counting sinnvoll??

Lassen Sie uns die Nützlichkeit von Crowd-Counting anhand eines Beispiels verstehen. Stell dir das vor: Ihr Unternehmen hat gerade eine Big Data Science-Konferenz veranstaltet. Während der Veranstaltung wurden viele verschiedene Sitzungen abgehalten.

Sie werden gebeten, die Anzahl der Personen zu analysieren und zu schätzen, die an jeder Sitzung teilgenommen haben. Dies wird Ihrem Team helfen zu verstehen, welche Arten von Sitzungen die meisten Menschen angezogen haben. (und welche sind in diesem Sinne gescheitert). Das wird die Konferenz im nächsten Jahr prägen, Es ist also eine wichtige Aufgabe!

linux_conference_2013_opening-1090863

Es waren Hunderte von Menschen bei der Veranstaltung, Das manuelle Zählen dauert Tage! Hier kommen Ihre Fähigkeiten als Data Scientist ins Spiel.. Er schaffte es, bei jedem Shooting Fotos von der Menge zu machen und ein Computer-Vision-Modell zu erstellen, um den Rest zu erledigen!!

Es gibt viele andere Szenarien, in denen Crowd-Counting-Algorithmen die Arbeitsweise von Branchen verändern.:

  • Zählen der Personen, die an einer Sportveranstaltung teilnehmen
  • Schätzen Sie, wie viele Personen an einer Einweihung oder einem Marsch teilgenommen haben (politische Demonstrationen, womöglich)
  • Überwachung von stark frequentierten Bereichen
  • Unterstützung bei der Personal- und Ressourcenzuweisung.

Können Sie sich andere Anwendungsfälle vorstellen?? Lass es mich im Kommentarbereich unten wissen!! Wir können uns verbinden und versuchen herauszufinden, wie wir Crowd-Counting-Techniken auf Ihrer Bühne einsetzen können..

Verständnis verschiedener Computer-Vision-Techniken zum Zählen von Menschenmengen

Allgemein gesagt, Es gibt derzeit vier Methoden, mit denen wir die Anzahl der Personen in einer Menschenmenge zählen können:

1. Erkennungsbasierte Methoden

Hier, Wir verwenden einen sich bewegenden fensterartigen Detektor, um Personen in einem Bild zu identifizieren und zu zählen, wie viele es sind. Die zur Detektion verwendeten Methoden erfordern gut trainierte Klassifikatoren, die Low-Level-Merkmale extrahieren können. Obwohl diese Methoden gut funktionieren, um Gesichter zu erkennen, funktionieren nicht gut in überfüllten Bildern, da die meisten Zielobjekte nicht deutlich sichtbar sind.

2. Regressionsbasierte Methoden

Mit dem obigen Ansatz konnten wir keine Low-Level-Features extrahieren. Regressionsbasierte Methoden triumphieren hier. Zuerst schneiden wir die Patches aus dem Bild aus und dann, für jeden Patch, Wir extrahieren die Low-Level-Eigenschaften.

3. Methoden basierend auf Dichteschätzung

Zuerst erstellen wir eine Dichtekarte für die Objekte. Später, der Algorithmus lernt eine lineare Abbildung zwischen den extrahierten Merkmalen und ihren Objektdichtekarten. Wir können auch die Random-Forest-Regression verwenden, um nichtlineare Kartierungen zu lernen.

4. CNN-basierte Methoden

Ah, gute und zuverlässige neuronale Faltungsnetze (CNN). Anstatt sich die Flecken eines Bildes anzusehen, Wir erstellen eine End-to-End-Regressionsmethode mit CNN. Dies nimmt das gesamte Bild als Eingabe und gibt direkt die Personenzahl aus. CNNs eignen sich hervorragend für Regressions- oder Klassifizierungsaufgaben, und sie haben sich auch bei der Erstellung von Dichtekarten bewährt.

CSRNet, eine Technik, die wir in diesem Artikel implementieren werden, implementiert tieferes CNN, um High-Level-Features zu erfassen und hochwertige Dichtekarten zu generieren, ohne die Netzwerkkomplexität zu erhöhen. Lassen Sie uns verstehen, was CSRNet ist, bevor wir zum Abschnitt zur Codierung übergehen.

Verständnis der CSRNet-Architektur und Trainingsmethode

CSRNet verwendet VGG-16 als Schnittstelle aufgrund seiner hohen Transfer-Lernfähigkeiten. Die VGG-Ausgabegröße beträgt ein Fünftel der ursprünglichen Eingabegröße. CSRNet verwendet auch erweiterte Faltungsschichten auf der Rückseite.

Aber, Was zum Teufel sind erweiterte Windungen? Es ist eine berechtigte Frage. Betrachten Sie das folgende Bild:

screenshot-from-2019-02-01-16-49-21-2729482

Das Grundkonzept der Verwendung von erweiterten Faltungen besteht darin, den Kernel zu vergrößern, ohne die Parameter zu erhöhen. Dann, wenn die Dilatationsrate 1, wir nehmen den Kernel und wandeln ihn in das ganze Image um. Während, wenn wir die Dilatationsrate auf erhöhen 2, der Kern erstreckt sich wie im Bild oben gezeigt (Folgen Sie den Etiketten unter jedem Bild). Kann eine Alternative zur Ebenengruppierung sein.

Grundlegende Mathematik (empfohlen, aber optional)

Ich werde mir einen Moment Zeit nehmen, um zu erklären, wie Mathematik funktioniert. Beachten Sie, dass dies nicht zwingend erforderlich ist, um den Algorithmus in Python zu implementieren, aber ich empfehle dir, die zugrunde liegende Idee zu lernen. Dies ist praktisch, wenn Sie Ihr Modell anpassen oder ändern müssen..

Angenommen, wir haben eine Eingabe x (m, n), ein Filter w (ich, J) und die Dilatationsrate r. Die Ausgabe und (m, n) es wird sein:

screenshot-from-2019-02-01-16-56-14-3239944

Wir können diese Gleichung mit einem Kernel verallgemeinern (k * k) mit einer Dilatationsrate r. Der Kern vergrößert sich zu:

([k + (k-1)*(r-1)] * [k + (k-1)*(r-1)])

So wurde die grundlegende Wahrheit für jedes Bild generiert. Der Kopf jeder Person in einem bestimmten Bild wird mit einem Gaußschen Kernel verwischt. Alle Bilder sind beschnitten bei 9 Patches und die Größe jedes Patches beträgt ein Viertel der ursprünglichen Bildgröße. Bis jetzt bei mir?

Der erste 4 Patches sind unterteilt in 4 Zimmer und die anderen 5 Patches werden zufällig ausgeschnitten. Schließlich, der Spiegel jedes Patches wird verwendet, um den Trainingssatz zu duplizieren.

Dass, in einer Nussschale, sind die Details der Architektur hinter CSRNet. Dann, wir sehen deine Trainingsdetails, einschließlich verwendeter Bewertungsmetrik.

Stochastischer Gradientenabstieg wird verwendet, um CSRNet als End-to-End-Struktur zu trainieren. Während der Ausbildung, die feste Lernrate ist eingestellt auf 1e-6. Die Verlustfunktion wird als euklidischer Abstand verwendet, um die Differenz zwischen der Ground Truth und der geschätzten Dichtekarte zu messen. Dies wird dargestellt als:

screenshot-from-2019-02-01-18-02-14-1319367

wobei N die Größe des Trainingsstapels ist. Die in CSRNet verwendete Bewertungsmetrik ist MAE und MSE, nämlich, mittlerer absoluter Fehler und mittlerer quadratischer Fehler. Diese werden gegeben von:

screenshot-from-2019-02-01-18-03-40-8146105

Hier, Ci ist die geschätzte Anzahl:

screenshot-from-2019-02-01-18-05-22-3405494

L und W sind die Breite der vorhergesagten Dichtekarte.

Unser Modell wird zuerst die Dichtekarte für ein gegebenes Bild vorhersagen. Der Pixelwert wird 0 wenn keine Person anwesend ist. Ein bestimmter voreingestellter Wert wird zugewiesen, wenn dieser Pixel einer Person entspricht. Dann, Wenn wir die Gesamtpixelwerte einer Person berechnen, erhalten wir die Anzahl der Personen in diesem Bild. Beeindruckend, Wahrheit?

Und nun, meine Damen und Herren, Es ist an der Zeit, endlich unser eigenes Crowd-Counting-Modell zu bauen!!

Erstellen Sie Ihr eigenes Crowd-Counting-Modell

Bereit mit eingeschaltetem Laptop?

Wir werden CSRNet im ShanghaiTech-Datensatz implementieren. Das beinhaltet 1198 kommentierte Bilder aus insgesamt 330,165 Menschen. Sie können den Datensatz herunterladen von hier.

Verwenden Sie den folgenden Codeblock, um das CSRNet-pytorch-Repository zu klonen. Enthält den gesamten Code zum Erstellen des Datensatzes, Trainieren Sie das Modell und validieren Sie die Ergebnisse:

Git-Klon https://github.com/leeyeehoo/CSRNet-pytorch.git

Bitte installiere WUNDER Ja PyTorch vor dem Fortfahren. Dies sind das Rückgrat hinter dem Code, den wir als nächstes verwenden werden.

Jetzt, Verschieben Sie das Dataset in das zuvor geklonte Repository und entpacken Sie es.. Später, wir müssen die grundlegenden Wahrheitswerte erstellen. das make_dataset.ipynb Datei ist unser Retter. Wir müssen nur geringfügige Änderungen an diesem Notebook vornehmen:

#Setzen Sie den Stamm auf den Shanghai-Datensatz, den Sie heruntergeladen haben
# Ändern Sie den Root-Pfad gemäß Ihrem Standort des Datensatzes
Wurzel="/home/pulkit/CSRNet-pytorch/"

Jetzt, Lassen Sie uns die grundlegenden Realwerte für die Bilder in Teil_A und Teil_B generieren:

Das Generieren der Dichtekarte für jedes Bild ist ein Zeitschritt. Also mach dir eine Tasse Kaffee, während der Code läuft.

Bis jetzt, wir haben die grundlegenden Wahrheitswerte für die Bilder in Teil_A generiert. Das gleiche machen wir mit den Bildern part_B. Aber vorher, Schauen wir uns ein Beispielbild an und zeichnen Ihre tatsächliche Heatmap des Bodens.:

plt.imshow(Bild.öffnen(img_paths[0]))

screenshot-from-2019-02-01-19-00-11-6759532

Es wird interessant!

gt_file = h5py.Datei(img_paths[0].ersetzen('.jpg','.h5').ersetzen('Bilder','Grundwahrheit'),'R')
Groundtruth = np.asarray(gt_datei['Dichte'])
plt.imshow(Bodenwahrheit,cmap=CM.jet)

screenshot-from-2019-02-01-19-00-37-9563568

Zählen wir, wie viele Personen in diesem Bild vorhanden sind:

np.sum(Bodenwahrheit)

270.32568

Auf die gleiche Weise, wir generieren Werte für part_B:

Jetzt, wir haben die bilder, sowie ihre entsprechenden fundamentalen Wahrheitswerte. Zeit unser Modell zu trainieren!

Wir werden die .json-Dateien verwenden, die im geklonten Verzeichnis verfügbar sind. Wir müssen nur den Speicherort der Bilder in den JSON-Dateien ändern. Um dies zu tun, öffne die .json-Datei und ersetze den aktuellen Speicherort durch den Speicherort, an dem sich deine Bilder befinden.

Bitte beachten Sie, dass der gesamte Code in Python geschrieben ist 2. Nehmen Sie die folgenden Änderungen vor, wenn Sie eine andere Version von Python verwenden:

  1. In model.py, Xrange auf der Linie ändern 18 eine Reihe
  2. Ändere die Zeile 19 in model.py mit: aufführen (self.frontend.state_dict (). Produkte ())[ich][1].Daten[:] = Liste (mod.state_dict (). Produkte ())[ich][1].Daten[:]
  3. In image.py, reemplace ground_truth con ground-truth

Hast du die Änderungen vorgenommen? Jetzt, Öffnen Sie ein neues Terminalfenster und geben Sie die folgenden Befehle ein:

cd CSRNet-pytorch
python train.py part_A_train.json part_A_val.json 0 0

Nochmal, setz dich hin, denn das wird einige Zeit dauern. Sie können die Anzahl der Epochen im train.py Datei, um den Prozess zu beschleunigen. Eine gute Alternative ist das Herunterladen der vortrainierten Gewichte. von hier wenn du keine Lust hast zu warten.

Schließlich, Lassen Sie uns die Leistung unseres Modells mit unsichtbaren Daten überprüfen. Wir werden die verwenden val.ipynb Datei, um die Ergebnisse zu validieren. Denken Sie daran, den Pfad zu den zuvor trainierten Gewichten und Bildern zu ändern.

#den Bildpfad definieren
img_paths = []
für Pfad in path_sets:
    für img_path in glob.glob(os.path.join(Weg, '*.jpg')):
       img_paths.append(img_path)

Modell = CSRNet()

#das Modell definieren
model = model.cuda()

#Laden der trainierten Gewichte
checkpoint = brenner.load('part_A/0model_best.pth.tar')
model.load_state_dict(Kontrollpunkt['state_dict'])

Überprüfen Sie die MAE (mittlerer absoluter Fehler) in den Testbildern zur Bewertung unseres Modells:

Wir haben einen MAE-Wert von 75,69, das ist ziemlich gut. Sehen wir uns nun die Vorhersagen in einem einzigen Bild an:

screenshot-from-2019-02-05-19-01-15-1985138Beeindruckend, die ursprüngliche zählung war 382 und unser Modell schätzte, dass es 384 Leute auf dem Bild. Das ist eine sehr beeindruckende Leistung!!

Herzlichen Glückwunsch zum Aufbau Ihres eigenen Crowd-Counting-Modells!!

Abschließende Anmerkungen

Ich ermutige Sie, diesen Ansatz an verschiedenen Bildern auszuprobieren und Ihre Ergebnisse im Kommentarbereich unten zu teilen.. Crowd Counting hat viele verschiedene Anwendungen und wird bereits von Organisationen und Regierungsbehörden übernommen..

Es ist eine nützliche Fähigkeit, die Sie Ihrem Portfolio hinzufügen können. Viele Branchen werden nach Data Scientists suchen, die mit Crowd-Counting-Algorithmen arbeiten können. Lernen, experimentiere damit und gib dir selbst das Geschenk von Deep Learning!

Fanden Sie diesen Artikel nützlich?? Fühlen Sie sich frei, mir Ihre Vorschläge und Kommentare unten zu hinterlassen, und ich kommuniziere gerne mit dir.

Sie sollten sich auch die folgenden Ressourcen ansehen, um die wunderbare Welt der Computer Vision kennenzulernen und zu erkunden.:

Abonniere unseren Newsletter

Wir senden Ihnen keine SPAM-Mail. Wir hassen es genauso wie du.