Gesichter in einem Bild automatisch erkennen

1444
abel

An meinem Arbeitsplatz werden Passfotos zusammen gescannt, in Einzelbilder zerlegt und mit eindeutigen Dateinummern gespeichert. Derzeit verwenden wir Paint.net, um die Bilder manuell auszuwählen, auszuschneiden und zu speichern.

Ich habe gesehen, dass die Cybershot-Kamera von Sony eine Gesichtserkennung hat. Google gibt mir auch etwas über iphoto bei der Suche nach Gesichtserkennung. Picasa hat auch Gesichtserkennung. Gibt es Möglichkeiten, die Gesichter in einem Dokument automatisch zu erkennen, was die Produktivität an meinem Arbeitsplatz verbessern würde, indem der Zeitaufwand für das Schneiden einzelner Bilder verringert wird.

Beispiel für ein gescanntes Dokument (ein echtes Dokument besteht aus 5 Reihen mit je 4 Bildern = 20 Bilder): (aus: http://www.memorykeeperphoto.com/images/passport_photo.jpg, fairuse)

Beispielbild

Für zB Wenn Sie in Picasa 3.8 auf Ansicht> Personen klicken, werden alle Gesichter angezeigt, und ich werde aufgefordert, sie zu benennen. Kann ich diese einzelnen Bilder automatisch mit den Namen als unterschiedliche Bilder speichern.

1
Ist die Gesichtserkennung wirklich notwendig (Sie müssen sich nur das Gesicht schnappen) oder das ganze Bild aufteilen, was Sie wirklich tun müssen ... Die meisten Scanner unterstützen dies sofort, und ein einfaches Skript könnte auf KONSISTENTE-Koordinaten aufgeteilt werden ein Gedanke. Übrigens wäre das auf Linux. Bei Fenstern nicht zu 100% RobotHumans vor 14 Jahren 0
Gesichtserkennung ist nicht notwendig, aber das Aufteilen von ihnen ist. Das Problem ist, dass die Fotos nicht wie im obigen Bild gleichmäßig platziert werden. Durch die manuelle Platzierung in Scannern werden zufällige Arrangements erstellt. Außerdem sind die Passbilder in verschiedenen Größen (4x4, 5x4, 4x3 usw.) erhältlich abel vor 14 Jahren 0
@ aking1012 was meinst du mit den meisten scannern, die dies aus der box unterstützen, ich habe einen hp scanjet 2400 und einen panasonic scanner abel vor 14 Jahren 0
Wenn sich die Bilder nicht überlappen, verfügen die meisten Scanner, die ich verwendet habe, über eine Software, die sich auf dem "perfekten weißen" Hintergrund aufteilt RobotHumans vor 14 Jahren 0
Ich habe keinen dieser Scanner zur Hand, aber ich würde mir die mitgelieferte Software ansehen - ich habe dies auf einem anderen HP-Flachbett gemacht. RobotHumans vor 14 Jahren 0
Die 4000er-Serie unterstützt dies: Prüfen Sie, ob die Bearbeitungssoftware für Ihre Hardware geeignet ist - oder ob die Installation einfach verweigert wird. RobotHumans vor 14 Jahren 0
@ aking1012 die Frage zu SO hat einige Details http://stackoverflow.com/questions/3872112/automatic-face-detection-using-api abel vor 14 Jahren 0

1 Antwort auf die Frage

1
tardis

Das Zuschneiden von Passbildern klingt automatisch machbar. Feste Lichtverhältnisse, immer nach vorne gerichtet, konsistentes Bildformat ... Ich glaube nicht, dass man nach günstigeren Bedingungen für die Gesichtserkennung fragen könnte.

Ich habe versucht, Facedetect zu verwenden, um die Ergebnisse auf Ihrem Beispielbild zu sehen:

rohe Facedetect-Ausgabe

Reisepässe gibt es in verschiedenen Formaten und Größen, daher werden sie unregelmäßig auf dem Flachbett des Scanners verpackt. Ich gehe jedoch davon aus, dass Sie die Bilder immer aufrecht stellen. facedetectwird uns die Zentren und Größe aller Gesichter geben. Insbesondere können wir die Größe des Gesichts verwenden und den Bereich um ihn herum proportional beschneiden. Da Passbilder dazu neigen, einen festen Bereich des Fotos abzudecken, scheint dies eine relativ sichere Annahme zu sein.

Das Beschneiden von Unterbereichen eines Bildes ist mit ImageMagick sehr einfach . Ich habe ein kleines (und grobes) Shell-Skript geschrieben, um den Prozess zu automatisieren:

#!/bin/sh pc=60 files="P1Xb8.jpg"  fileno=1 for file in $files; do n=1 facedetect $file | while read x y w h; do border=$(($w * $pc / 100)) x=$(($x - $border)) y=$(($y - $border)) w=$(($w + $border * 2)) h=$(($h + $border * 2)) echo $x $y $w $h convert "$file" -gravity NorthWest -crop "$x$+$x+$y" "$_$n.jpg" n=$(($n + 1)) done fileno=$(($fileno + 1)) done 

Ich habe empirisch einen Randbereich von 60% (in der zweiten Zeile des Skripts) der Breite des erkannten Gesichts definiert. Das sind die vier Bilder, die ich bekomme:

1_1 1_2 1_3 1_4

das ist schon ziemlich gut. Es gibt immer etwas Leerzeichen an der Spitze, das ich entfernen konnte, indem Sie einfach "-fuzz 10% -trim" beim convertAufruf hinzufügen . Hier ist das Ergebnis des ersten Bildes danach:

1_1 getrimmt

Nicht zu schäbig für ein schnelles Skript, und es gibt viel Raum für Verbesserungen. Zum Beispiel verwenden die meisten Pässe eine Hochformatausrichtung, dh sie haben einen anderen vertikalen / horizontalen Faktor (normalerweise 1,3). Gesichter neigen dazu, leicht nach oben verschoben zu werden (wahrscheinlich um 1,3). Wenn Sie diese korrigieren, wird ein besserer Ausschnitt erzielt, sodass der weiße Bereich oben nicht vollständig abgeschnitten werden muss.

Es wäre schön, wenn Sie (auch privat) einen Beispiel-Flachbettscan posten könnten, um dieses Skript mit einer echten Ausgabe zu testen.

Dieser Vorschlag erfordert natürlich eine Linux-Installation. Wenn ich es richtig verstanden habe, ist es nicht völlig unvernünftig, eine dedizierte Installation oder sogar eine virtuelle Maschine einzurichten, um diese langwierige Aufgabe zu automatisieren.

Wenn Datenschutz kein Thema ist (bezweifle ich jedoch), wäre ich tatsächlich daran interessiert, eine vernünftige Lösung zu schreiben, die gegen die abgeschnittenen Gesichter ausgetauscht wird, die ich zur Verbesserung des Gesichtserkennungsmodells verwenden würde.