Daten sind das Leben des maschinellen Lernens, insbesondere des tiefen Lernens. Hier wird IMDB-WIKI-Datensatz verwendet, mit dem die Aufgabe der Schätzung von Alter und Geschlecht anhand von Gesichtsbildern erlernt werden kann. vorstellen. In diesem Artikel werden sogar die Daten für das Lernen gestaltet. Das nächste Mal möchte ich die Alters- / Geschlechtsschätzung CNN mit CNN untersuchen.
Der Code ist unten. https://github.com/yu4u/age-gender-estimation
Dieser Datensatz ist eine Datenbank, die durch Crawlen der Internet Movie Database (IMDb; Online-Datenbank von Akteuren in Filmen und Fernsehprogrammen) und Wikipedia erstellt wurde. Besteht aus. IMDb enthält 460.723 Gesichtsbilder und Wikipedia enthält 62.328 Gesichtsbilder. Dieser Datensatz wurde vom Gewinnerteam des Wettbewerbs als Pre-Learning-Datensatz verwendet, um das Alter anhand des Bildes ChaLearn scheinbare Herausforderung zur Altersschätzung zu schätzen. Feinabstimmung mit Wettkampftrainingsdaten)
Das Originalbild ist sehr groß. Laden Sie daher ein Archiv mit Bildern und Metadaten mit extrahierten Gesichtsbereichen herunter.
#IMDb-Daten
wget https://data.vision.ee.ethz.ch/cvl/rrothe/imdb-wiki/static/imdb_crop.tar
#Wikipedia-Daten
wget https://data.vision.ee.ethz.ch/cvl/rrothe/imdb-wiki/static/wiki_crop.tar
Alle Metadaten werden in der Datei ".mat" ("wiki.mat" für Wikipedia) im obigen Archiv gespeichert. Obwohl es sich um Matlab-Daten handelt, können sie mit "scipy" wie folgt gelesen werden.
meta = scipy.io.loadmat("wiki.mat")
Die enthaltenen Daten sind wie folgt.
--dob
: Geburtsdatum
--photo_taken
: Das Jahr, in dem das Foto aufgenommen wurde
--full_path
: Bildpfad
--gender
: Geschlecht
--name
: Name
--face_location
: Rechteckige Information des Gesichtsbereichs
--face_score
: Gesichtserkennungswert
--second_face_score
: Zweitgrößter Gesichtserkennungswert
Diese können wie folgt erhalten werden.
full_path = meta[db][0, 0]["full_path"][0]
dob = meta[db][0, 0]["dob"][0]
Das Alter der Person im Bild ist nicht direkt in den Metadaten enthalten und muss berechnet werden. In der Regel sollte das Geburtsdatum (dob
) vom Aufnahmedatum und der Aufnahmezeit ( photo_taken
) abgezogen werden. Die folgenden detaillierten Maßnahmen sind jedoch erforderlich.
Erstens ist "dob" ein Wert, der mit "Matlab serial date number" formatiert ist und nur verwendet werden kann, wenn er in Zeitinformationen konvertiert wird. Python kann ähnliche Formate verarbeiten und kann konvertiert werden. Matlab ist jedoch definiert als die Anzahl der Tage seit dem 1. Januar ** 0 **, während Python ** 1 ** [Es gibt eine Falle], definiert als die Anzahl der Tage ab dem 1. Januar 2011 (http://sociograph.blogspot.jp/2011/04/how-to-avoid-gotcha-when-converting.html) (What Korrekt). Daher muss wie folgt umgerechnet werden (0 n. Chr. Ist ein lukratives Jahr!)
python_datetime = datetime.fromordinal(matlab_serial_date_numer - 366)
Da photo_taken
nur Informationen über das Jahr enthält, wird das Alter wie folgt berechnet, wenn Datum und Uhrzeit in der Mitte des Jahres als erwarteter Wert verwendet werden.
def calc_age(taken, dob):
birth = datetime.fromordinal(max(int(dob) - 366, 1))
# assume the photo was taken in the middle (Jul. 1) of the year
if birth.month < 7:
return taken - birth.year
else:
return taken - birth.year - 1
Da es sich bei den bereitgestellten Daten im Wesentlichen um Crawling-Daten handelt, enthalten sie viele Rauschdaten und müssen entfernt werden. Im Fall einer Wikipedia-Datenbank sind beispielsweise die folgenden Daten enthalten.
Daher müssen nur diejenigen extrahiert werden, deren "face_score" über einem bestimmten Niveau liegt, deren "second_face" "nan" ist und deren Alter im Bereich von 0 bis 100 liegt.
Schauen wir uns zum Schluss den Inhalt des Datensatzes auf Wikipedia an. Details sind unten. https://github.com/yu4u/age-gender-estimation/blob/master/check_dataset.ipynb
Verteilung von face_score
. Ohne -inf
.
Verteilung von second_face_score
. Ohne "nan".
Beispielbild mit face_score
größer als 5
Beispiel eines Bildes mit face_score
von 0 bis 1
Ein Beispiel für ein Bild, bei dem face_score`` -inf
ist
Beispiel eines Bildes mit einem berechneten Alter von mehr als 100 Jahren
Beispiel eines Bildes mit einem negativ berechneten Alter