Personen im Bild
Hast Du auch ein großes Bilderalbum mit vielen Erinnerungen an längst vergangene Tage?
Ordentliche Fotografen beschlagworten ihre Bilder nach jedem Fotoshooting und haben es dann später leichter, Bilder wiederzufinden. Aber das Beschlagworten selbst ist keine Kleinigkeit. Die gewählten Begriffe wollen wohl überlegt sein. Jeder Begriff, der fehlt, muss in Nachhinein für alle anderen Bilder nachgetragen werden, wenn man wirklich ultimative Ordnung anstrebt.
Zentral in einem solchen Familienalbum sind die Personen. Die händische Zuordnung von Namen zu den Bildern ist eine mühsame Angelegenheit, und es wird immer schlimmer, je länger man sich damit Zeit lässt.
Mein Lieblingsprogramm für das Arbeiten mit Bildern ist Google Picasa. Es ist zwar schon ein Methusalem, doch in der Disziplin „Gesichtserkennung“ ist es bisher unschlagbar. Ferdinand hat mir einmal Adobe Lightroom geborgt und ich habe dessen Gesichtserkennung ausprobiert. Es zeigte sich, dass das kostenlose Picasa trotz seines Alters dem kostenpflichtigen Adobe-Programm in dieser Disziplin überlegen ist. Während man bei Picasa den Vorgang der Erkennung wärend der Arbeit mit dem Programm nicht wahrnimmt, friert bei Lightroom der Rechner geradezu ein, wenn es mehr als nur ein paar Gesichter zu erkennen gibt. Daher habe ich damals von der weiteren Verwendung von Adobe Lightroom abgesehen und konzentrierte mich auf Google Picasa.
Metadaten
Metadaten dienen zur weitergehenden Bildbeschreibung. Sie sind die Grundlage zum Wiederfinden von Bildern im Rahmen von Bildverwaltungsprogrammen. Die Metadaten helfen bei Fragestellungen der Art: „Zeige mir alle Bilder, die mit der Kamera XY aufgenommen wurden und auf denen die Tante Mitzi zu sehen ist.“
Ein Bild wird mit Metadaten in mehreren Eigenschaftengruppen beschrieben wie zum Beispiel
- Ort (Adresse, GPS)
- Datum (Jahrzehnt, Jahr, Datum)
- Autor (Name, Adresse, Copyrightvermerk…)
- Technische Details (Kamera, Aufnahmedaten…)
- Anlass (Urlaub, Hochzeit, Fußballspiel…)
- Gegenstände (Was ist auf dem Bild zu sehen)
- Personen
Diese Metadaten sind quer über die die EXIF-Daten verteilt (GPS, Personen, Kamera, Autor…).
Bildverwaltungsprogramme
Wenn man sich in einem Bildverwaltungsprogramm bewegt wie etwa Google Picasa, Adobe Bridge oder Adobe Lightroom, kann man nach vielen der obigen Daten filtern. Alle Bilder aus „1976“, alle Bilder in „Scheibbs“ usw., wobei eben „1976“ und „Scheibbs“ vordefinierte Schlagworte sind.
Bildpublikation
Die Publikation von Bildern erfolgt über Galerie-Plugins in CMS-Systemen und orientiert sich an Schlagworten. Wir verwenden praktisch ausschließlich WordPress. Der Platzhirsch bei den Bildpublikations-Plugins ist NextGen.
NextGen verwaltet Galerien. Eine Galerie entspricht einem Ordner. Es kann beliebig viele Ordner geben, aber sie können nicht verschachtelt sein. NextGen kann also nicht die Ordnerstruktur eines PCs nachbilden. NextGen erlaubt die Definition von Alben. Ein Album fasst mehrere Galerien zusammen. Aber NextGen kann auch Bilder aufgrund ihrer Stichworte zu einem Album zusammenfassen und das quer durch alle Galerien. Damit das aber gut funktioniert, müssen die Bilder gut beschlagwortet sein.
Das Problem sind aber Personen, denn sie werden zwar von Google Picasa nahezu perfekt erkannt – und daher erspart man sich eine Menge händischer Zuordnung – aber diese Namen stehen nicht als Schlagworte zur Verfügung wie man an dem Beispiel weiter unten sieht.
Innerhalb von Google Picasa kann man nach einzelnen Personen filtern, außerhalb von Google Picasa ist aber Endstation. Auch das höchst professionelle Programm Adobe Bridge zeigt die Namen der abgebildeten Personen in den Metadaten nicht, obwohl der Eintrag besteht.
Gesichtserkennung in Picasa
Picasa erkennt automatisch Gesichter in allen Bildern und stapelt gleiche Bilder zuerst in einem Album „unbekannt“. Kennt man ein solches Gesicht, schreibt man den Namen unter das Bild. Mit dieser Eintragung werden auch alle anderen Bilder dieser Person benannt. Wenn ein Gesicht nicht erkannt wird, kann man es manuell kennzeichnen.
Picasa hat daher zwei Beschreibungsgruppen:
- Personen
- Stichworte
Innerhalb von Picasa kann man über das Suchfeld sowohl nach Stichworten als auch nach Personen suchen. Zusätzlich wird auch in den Ordnernamen und Dateinamen und Dateititeln gesucht.
Wenn man nun die so beschlagworteten Bilder publiziert, stellt man fest, dass in den diversen Galerien zwar die Stichworte erkannt, angezeigt werden und auch als Auswahlkriterium dienen können, nicht aber die Namen der Personen.
Sogar das weit verbreitete WordPress-Galerie-Programm NextGen arbeitet nur mit Schlagworten aber mit sonst keinen anderen EXIF-Daten. Es kann zwar einige der Metadaten anzeigen, nicht aber danach filtern.
Damit man also für die Publikation auf einer Webseite Bilder mit bestimmten Personen auswählen kann, müssen die Namen als Schlagwort im Bild eingetragen sein. Die Fragen in diesem Zusammenhang sind daher:
- Wo und wie werden die Personendaten in einem Bild gespeichert?
- Wie kann man die Personennamen in die Liste der Schlagworte kopieren?
Metadaten anzeigen und bearbeiten
Nicht einmal das professionelle Programm Adobe Bridge findet die von Picasa markierten Personennamen. Der Grund wird wohl sein, dass das Kennzeichnen von Bereichen/Personen auf einem Bild auch die Funktionalität der Gesichtserkennung voraussetzt und das können nur sehr wenige Programme.
Mit dem Tool ExifToolGUI, das seinerseits das Kommandozeilenprogramm ExifTool benutzt kann man aber alle Winkel der Bildbeschreibung ausspionieren.
Hinweis: Jeder Bearbeitungsvorgang durch EXIFTOOL legt eine Kopie der ursprünglichen Datei an, indem an den Namen der Text „_original“ angehängt wird.
Metadaten im ExifToolGUI
Nach einigem Stöbern in den diversen Metadatengruppen fand ich die Namen der Personen im Feld -XMP-mwg-rs:RegionName
. Die XY-Koordinaten und Höhe und Breite des Gesichtsbereichs befinden sich in den Tags Region Area X, Y, W, H
der Typ "face" im Tag Region Type
. Weitere Hinweise zum Programm findet man im Beitrag „ExifToolGUI“.
Auf diese Personennamen im Feld -XMP-mwg-rs:RegionName
können Programme zur Publikation von Bildern nicht zugreifen. Um dennoch nach diesen Namen filtern zu können, wäre es praktisch, diese Namen durch ein Programm zu den Schlagworten hinzuzufügen.
PowerShell kopiert Namen
Nachdem also alle Personen in allen Bildern namentlich gekennzeichnet sind, kann man mit einem PowerShell-Programm die Namen der Personen zu den Schlagworten hinzuzufügen. Die Grundlagen zu den folgenden Kommandozeilen findet man im Beitrag „Bildattribute“. Zur Entwicklung benötigt man das im Beitrag „Bildattribute“ beschriebene Programm EXIFTOOL und die Windows PowerShell ISE.
Namen auslesen
EXIFTOOL kann alle Metadaten mit einem einfachen Kommandozeilenbefehl auslesen. Die Beschriftung der Personenbilder durch Namen erfolgte also in Google Picasa. Im folgenden Beispiel werden die Namen der abgebildeten Personen ausgegeben.
PS S:\desktop> exiftool -XMP-mwg-rs:RegionName 1976-2-001.jpg Region Name : Raimund Rammel, Josef Fiala, Johanna Rammel, Silvia Fiala, Martha Fiala
Schlagworte auslesen
Die Schlagworte sind in zwei Feldern zu finden: -XMP-dc:Subject
und -IFD0:XPKeywords
.
PS S:\onedrive\desktop> exiftool -IFD0:XPKeywords 1976-2-001.jpg XP Keywords : 1976;Scheibbs PS S:\onedrive\desktop> exiftool -XMP-dc:Subject 1976-2-001.jpg Subject : 1976, Im Burgfried 50, Scheibbs
Die Bildergalerien nutzen das Feld -XMP-dc:Subject
. Das Trennzeichen ist der Beistrich.
Schlagworte ergänzen
Die folgenden Aufrufzeilen speichern die Schlagworte in der Variablen $tags
und die Personennamen in der Variablen $persons
. Die $persons
werden an die $tags
mit einem Trennzeichen angehängt und danach ausgegeben. Schließlich werden die früheren Stichworte durch mit den durch die Personennamen erweiterten Stichworte überschrieben.
PS S:\desktop> $tags = exiftool -s -s -s -XMP-dc:Subject 1976-2-001.jpg PS S:\desktop> $tags 1976, Im Burgfried 50, Scheibbs PS S:\desktop> $persons = exiftool -s -s -s -XMP-mwg-rs:RegionName 1976-2-001.jpg PS S:\desktop> $persons Raimund Rammel, Josef Fiala, Johanna Rammel, Silvia Fiala, Martha Fiala PS S:\desktop> $tags = $tags + ", " + $persons PS S:\desktop> $tags 1976, Im Burgfried 50, Scheibbs, Raimund Rammel, Josef Fiala, Johanna Rammel, Silvia Fiala, Martha Fiala PS S:\onedrive> exiftool -XMP-dc:Subject=$tags 1976-2-001.jpg Warning: [minor] Fixed incorrect URI for xmlns:MicrosoftPhoto - 1976-2-001.jpg 1 image files updated PS S:\onedrive> $tags = exiftool -s -s -s -XMP-dc:Subject 1976-2-001.jpg PS S:\onedrive> $tags 1976, Im Burgfried 50, Scheibbs, Raimund Rammel, Josef Fiala, Johanna Rammel, Silvia Fiala, Martha Fiala
Normalerweise liefert das ExifTool eine formatierte Zeile bestehend aus dem Namen, einem Doppelpunkt und den eigentlichen Daten. Die Optionen -s -s -s
bewirken, dass die Formatierung entfernt wird und nur die Daten zurück geliefert werden. Mit der Zuweisung $tags=
werden die Daten nicht angezeigt, sondern der Variablen $tags
zugewiesen. In der letzten Zeile sieht man, dass die Schlagworte um die Namen der angezeigten Personen erweitert wurden.
Fertiges Skript
Wenn man mit diesen Anweisungen Personennamen hinzufügt, die eventuell schon in den Schlagworten enthalten waren, kommt es zu einem Doppeleintrag.
Mit dem ExifTool und mit ExifToolGUI sind diese fehlerhaften Doppeleinträge auch zu sehen. Die Bildbearbeitungsprogramme Adobe Bridge, IrfanView und Google Picasa eliminieren diese doppelten Stichworte und zeigen sie nicht an, löschen sie aber auch nicht.
Damit es nicht zu solchen Mehrfacheintragungen kommt, darf man die Personennamen (und auch andere Stichworte) nicht einfach zu den bestehenden hinzufügen. sondern man muss prüfen, ob sie nicht vielleicht schon in der bereits eingetragenen Liste vorhanden sind.
Schließlich kann es gewünscht sein, dass man die Stichworte überhaupt erst einstellt und das nicht nur für eine Datei sondern für alle Bilder in einem Ordner und das auch rekursiv für alle untergeordneten Ordner.
Schließlich soll man mit den Metadaten experimentieren können, ohne dass gleich eine Bilddatei verändert wird.
Das alles leistet das PowerShell-Programm tags.ps1. Hier ein Blick auf die Entiwcklungsoberfläche von WIndows PowerShell GUI:
tags.ps1
tags.ps1 -?
Setzen oder Hinzufügen von Stichworten -? -h Hilfe (dieser Text) -D Debug -P "<Verzeichnis>" Pfad zur Bilddatei (erforderlich, "!) -T "<Stichworte>" Stichworte ("!) -O Stichworte überschreiben -A Personen hinzufügen -R Rekursiv -X Ausführen
- tags.ps1 bearbeitet die Stichworte in Bilddateien des Typs .jpg oder .jpeg oder Dokumenten des Typs .pdf. Stichworte können gelöscht, gesetzt oder ergänzt werden. Optional kann man die Namen aus der Gesichtserkennung zu den Stichworten hinzufügen.
- Der Pfad -P kann auf eine einzelne Datei verweisen oder auf ein Verzeichnis. Die Anführungszeichen beim Pfad sind nötigt, wenn es Leerzeichen im Namen gibt.
- Die Stichwortliste -T (Beistrich als Trennzeichen) ist optional. Fehlt die Option -T, werden die bestehenden Stichworte nicht verändert. Die Anführungszeichen bei den Stichworten müssen unbedingt angegeben werden.
- Wenn die Option -O angegeben ist, werden die bestehenden Stichworte gelöscht und durch die aus -T (oder auch -A) ersetzt. Fehlt die Option -O werden die Optionen aus -T (oder auch -A) zu den bestehenden Stichworte hinzugefügt.
- Die Option -A bewirkt, dass Namen aus der Gesichtserkennung als Stichworte an die Stichwortliste angehängt werden.
- Die Option -R bewirkt, dass bei Angabe eines Verzeichnisses auch alle darunterliegenden Verzeichnisse nach Bildern durchsucht werden.
- Solange die Option -X nicht angegeben ist, kann man die Wirkung des Programms an Hand der Ausgaben studieren ohne dass dabei Änderungen an den Bildern vorgenommen werden.
Beispiele
Keines der folgenden Beispiele führt an den Bildern eine Änderung durch. Damit eine Änderung erfolgt, muss man in jeder Kommandozeile noch die Option -x (-Execute) ergänzen.
Anzeige der Hilfe
PS S:\> .\exif_write.ps1 -Help
Arbeiten mit einer Demo-Datei und Kommentieren des Editiervorgangs
Die Option -D (oder -Debug) fügt ein Testbild an die Stelle der Pfadoption ein und bietet Testausgaben, mit denen man die Wirkung des Bearbeitungsvorgangs kontrollieren kann.
Anzeige der Stichworte und Personen
PS S:\> .\exif_write.ps1 -Debug S:\1976-2-001.jpg Pers+:nein Tags ersetzen:nein Ausführen:nein Tags : 1976 Im Burgfried 50 Scheibbs Tags +/-: Pers : Johanna Rammel Josef Fiala Martha Fiala Raimund Rammel Silvia Fiala Tags Neu: 1976 Im Burgfried 50 Scheibbs
Hinzufügen weiterer Stichworte
PS S:> .\tags.ps1 -Debug -Tags "123,abc" S:\1976-2-001.jpg Pers+:nein Tags ersetzen:nein Ausführen:nein Tags : 1976 Im Burgfried 50 Scheibbs Tags +/-: 123 abc Pers : Johanna Rammel Josef Fiala Martha Fiala Raimund Rammel Silvia Fiala Tags Neu: 123, 1976, abc, Im Burgfried 50, Scheibbs
Ersetzen der bestehenden Stichworte
Achtung, die Stichworte müssen durch Beistriche getrennt sein und die ganze Gruppe muss durch Anführungszeichen begrenzt sein.
PS S:> .\tags.ps1 -Debug -Tags "123,abc" -Overwrite S:\1976-2-001.jpg Pers+:nein Tags ersetzen:ja Ausführen:nein Tags : 1976 Im Burgfried 50 Scheibbs Tags +/-: 123 abc Pers : Johanna Rammel Josef Fiala Martha Fiala Raimund Rammel Silvia Fiala Tags Neu: 123, abc
Löschen der alten, Hinzufügen neuer Stichworte sowie der Namen der abgebildeten Personen
PS S:> .\tags.ps1 -Debug -Tags "123,abc" -Overwrite -AddPersons S:\1976-2-001.jpg Pers+:ja Tags ersetzen:ja Ausführen:nein Tags : 1976 Im Burgfried 50 Scheibbs Tags +/-: 123 abc Pers : Johanna Rammel Josef Fiala Martha Fiala Raimund Rammel Silvia Fiala Tags Neu: 123, abc, Johanna Rammel, Josef Fiala, Martha Fiala, Raimund Rammel, Silvia Fiala
Löschen der eingetragenen Stichworte
PS S:> .\tags.ps1 -Debug -Tags "" -Overwrite S:\1976-2-001.jpg Pers+:nein Tags ersetzen:ja Ausführen:nein Tags : 1976 Im Burgfried 50 Scheibbs Tags +/-: Pers : Johanna Rammel Josef Fiala Martha Fiala Raimund Rammel Silvia Fiala Tags Neu:
Verzeichnis bearbeiten
Wenn statt dem Pfad einer Bilddatei, ein Pfad zu einem Verzeichnis angegeben wird, bearbeitet das Programm alle Bilder in diesem Verzeichnis.
PS S:> .\tags.ps1 -Path ".\test\" S:\test\1976-2-001.jpg S:\test\1976-2-002.jpg
Verzeichnis rekursiv bearbeiten
Mit der Option -R (oder -Recursive) werden auch alle Bilder in den Unterverzeichnissen bearbeitet.
PS S:> .\tags.ps1 -Path ".\test\" -Recursive S:\test\test1\test1\1976-2-001.jpg S:\test\test1\1976-2-001.jpg S:\test\test2\1976-2-001.jpg S:\test\1976-2-001.jpg S:\test\1976-2-002.jpg
Programmcode
Param( [switch][alias("?")][alias("h")]$Help=$false, [switch][alias("D")]$Debug=$false, [string][alias("P")]$Path = "", [string][alias("T")]$Tags = "", [switch][alias("O")]$Overwrite=$false, [switch][alias("A")]$AddPersons=$false, [switch][alias("R")]$Recursive=$false, [switch][alias("X")]$Execute=$false ) function Help { $Text = "" $Text += $nl+"Setzen oder Hinzufügen von Stichworten" $Text += $nl+"======================================" $Text += $nl+"-? -h Hilfe" $Text += $nl+"-D Debug" $Text += $nl+"-P `"`" Pfad zu; erforderlich, `"(!)" $Text += $nl+"-T `" `" Stichworte `"(!)" $Text += $nl+"-O Stichworte überschreiben" $Text += $nl+"-A Personen hinzufügen" $Text += $nl+"-R Rekursiv" $Text += $nl+"-X Ausführen" $Text += $nl Write-Host $Text } $nl = [Environment]::NewLine $indent = " " #Clear-Host #$sysvars = get-variable | select -ExpandProperty name #$sysvars += 'sysvar' #Remove-Variable * -ErrorAction SilentlyContinue function MyWrite { param([string]$Text, [string]$Fore, [string]$Back ) if ($Fore-eq"") { $Fore="White" } if ($Back-eq"") { $Back="Black" } Write-Host $Text -foregroundcolor $Fore -backgroundcolor $Back -NoNewline } function Debug-Print { param([string]$Text, [string]$Value) MyWrite $Text "White" "Black" $Fore = "Red"; $Text = $Value switch ($Value) { "True" { $Fore = "Green"; $Text = "ja" } "False" { $Fore = "Red"; $Text = "nein" } default { $Fore = "Gray" } } MyWrite $Text $Fore "Black" } if ($Debug) { if ($Path -eq "") { $Path="s:\onedrive\desktop\1976-2-001.jpg" #(Get-Item -Path ".\").FullName } } else { if ($Path -eq "?") { $Help=true; $Path="-?" } if ($Help) { Help; Exit } if ($Path -eq "") { WriteLn "-Pfad oder -Debug ist erforderlich" "Red" "DarkBlue"; Help; exit } if (-not (Test-Path $Path)) { "Pfad $Path existiert nicht"; exit } } $Path = Resolve-Path $Path function Add-Array { Param ([System.Collections.ArrayList]$a, [System.Collections.ArrayList]$b) $c = New-Object System.Collections.ArrayList for ($i=0; $i -lt $a.Count; $i++) { $tag = $a[$i] if ($c.Contains($tag)) { continue } else { $c.Add($tag) > $null } } for ($i=0; $i -lt $b.Count; $i++) { $tag = $b[$i] if ($c.Contains($tag)) { continue } else { $c.Add($tag) > $null } } if ($c.Count -gt 1) { $c.Sort() } return $c } function Get-Array { Param ([string]$b) $arr = $b.Split(",") $a = New-Object System.Collections.ArrayList for ($i=0; $i -lt $arr.Length; $i++) { $tag = $arr[$i].Trim() if ($a.Contains($tag)) { continue } else { $a.Add($tag) > $null } } $a.Sort() return [System.Collections.ArrayList]$a } function List_Array { Param ([System.Collections.ArrayList]$a) $s = "" for ($i=0; $i -lt $a.Count; $i++) { $s += $a[$i] + " " } return $s.Trim() } function Metadata_File { param ( [string]$Path) if (-not ( $Path.ToLower().EndsWith(".jpg") -or $Path.ToLower().EndsWith(".jpeg") -or $Path.ToLower().EndsWith(".pdf") ) ) { return } Debug-Print $nl($Path.Replace("\onedrive\desktop","")) if ($Debug) { Debug-Print $nl$indent"Pers+:" $AddPersons Debug-Print " Tags-:" $Overwrite Debug-Print " Ausführen:" $Execute } $String_Tags_Existing = exiftool -s -s -s -q -q -XMP-dc:Subject "$Path" $List_Tags_Existing = Get-Array $String_Tags_Existing if ($Debug) { Debug-Print $nl$indent"Tags exist : " (List_Array $List_Tags_Existing) } $List_Tags_New = Get-Array $Tags if ($Debug) { Debug-Print $nl$indent"Tags neu : " (List_Array $List_Tags_New)} $String_Persons = exiftool -s -s -s -q -q -XMP-mwg-rs:RegionName $Path $List_Persons = Get-Array $String_Persons if ($Debug) { Debug-Print $nl$indent"Personen : " (List_Array $List_Persons) } if ($AddPersons) { $List_Tags_New = Add-Array $List_Tags_New $List_Persons if ($Debug) { Debug-Print $nl$indent"Tags & Pers : " (List_Array $List_Tags_New) } } if (-not $Overwrite) { $List_Tags_New = Add-Array $List_Tags_New $List_Tags_Existing } if ($Debug) { Debug-Print $nl$indent"Tags neu : " (List_Array $List_Tags_New)$nl } if ($Execute) { exiftool -q -q -XMP-dc:Subject= $Path for ($i=0; $i -lt $List_Tags_New.Length; $i++) { $NewTag = $List_Tags_New[$i].Trim() if ($NewTag -eq "") { continue } exiftool -q -q -XMP-dc:Subject+="$NewTag" "$Path" }
$Path_original = $Path+"_original"
Remove-Item -Path $Path_original
} } function Metadata_Directory { param ( [string]$Path) foreach ($File in Get-ChildItem $Path) # | Where-Object {$_.mode -notlike "d*"}) { if ($File.mode -like "d*") { if ($Recursive) { Metadata_Directory $File.FullName } } else { Metadata_File $File.FullName } } } Metadata_Directory $Path
Erstellt: 2021-05-17; Modifiziert: 2021-05-19, 2021-05-20
Beilagen
- Zahnrad (SVG-Datei)
Franz war pensionierter HTL Lehrer (TGM), Präsident von ClubComputer, Herausgeber der Clubzeitung PCNEWS und betreute unser Clubtelefon und Internet Support. Er war leidenschaftlicher Rapid Wien Fan. Er ist leider Anfang Jänner 2024 nach langer schwerer Krankheit verstorben.
Neueste Kommentare