diff --git a/.gitignore b/.gitignore index a34f43a7..45f81bdd 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,6 @@ /build/ /out/ /dist/ -/bin/ # Webapp build artifacts and generated classes /WEB-INF/classes/ diff --git a/bin/Face_Recognition_Unix/face_encoder_cpu b/bin/Face_Recognition_Unix/face_encoder_cpu new file mode 100644 index 00000000..7d7ad4de Binary files /dev/null and b/bin/Face_Recognition_Unix/face_encoder_cpu differ diff --git a/bin/Face_Recognition_Unix/face_encoder_gpu b/bin/Face_Recognition_Unix/face_encoder_gpu new file mode 100644 index 00000000..11e03964 Binary files /dev/null and b/bin/Face_Recognition_Unix/face_encoder_gpu differ diff --git a/bin/Face_Recognition_Unix/face_matcher b/bin/Face_Recognition_Unix/face_matcher new file mode 100644 index 00000000..fead62e3 Binary files /dev/null and b/bin/Face_Recognition_Unix/face_matcher differ diff --git a/bin/Face_Recognition_Unix/istruzioni.txt b/bin/Face_Recognition_Unix/istruzioni.txt new file mode 100644 index 00000000..32ae1cae --- /dev/null +++ b/bin/Face_Recognition_Unix/istruzioni.txt @@ -0,0 +1,107 @@ + ######################################### + # # + # Face Recognition - UNIX # + # # + ######################################### + + + +===== [CONTENUTO] ============================================================================================= + +# face_encoder_cpu versione Unix della prima parte del programma che utilizza il processore + +La versione CPU è universale ed è abilitata al multicore. + +# face_encoder_gpu versione Unix della prima parte del programma che utilizza la scheda grafica + +La versione GPU funziona solamente in un ambiente che dispone di una scheda grafica, +altrimenti il programma segnala l'errore e termina. Utilizza le librerie CUDA per maggiore precisione. + +# face_matcher versione Unix della seconda parte del programma + + + +===== [ESEGUIRE FACE_ENCODER] ================================================================================= + +Avvia il terminale nella cartella del programma e lancia il comando + +face_encoder_cpu [-h/--help] -i IMAGES/--images IMAGES [-o OUT/--out OUT] [-l LOG/--log LOG] [-r/--recursive] [-t/--include-tn] [-m/--multicore] +face_encoder_gpu [-h/--help] -i IMAGES/--images IMAGES [-o OUT/--out OUT] [-l LOG/--log LOG] [-r/--recursive] [-t/--include-tn] + +rispettivamente per la versione CPU o GPU. + +----- ------------------------------------------------------------------------------------------- +--help mostra la guida del programma + +--images imposta il percorso da cui leggere le immagini da codificare + +--out imposta il percorso in cui generare il file di encodings .pkl + +Il programma accetta sia il percorso di un file da creare (es. "./output/gara2/face_encodings_gara2.pkl"), +sia quello di una cartella (es. "./output/gara2/") in cui verrà generato un file default "face_encodings_DATETIME.pkl". +Tutte le sottocartelle presenti nel percorso, se non esistenti, verranno create. +Se non impostato, di default il programma genererà il file al percorso "./output/face_encodings_DATETIME.pkl". + +--log imposta il percorso in cui generare il file di log .txt + +Il programma accetta sia il percorso di un file da creare (es. "./output/gara2/encoder_log_gara2.txt"), +sia quello di una cartella (es. "./output/gara2/") in cui verrà generato un file default "encoder_log_DATETIME.txt". +Tutte le sottocartelle presenti nel percorso, se non esistenti, verranno create. +Se non impostato, di default il programma genererà il file al percorso "./output/encoder_log_DATETIME.txt". + +--recursive abilita la ricerca ricorsiva in tutte le sotto cartelle all'interno di "IMAGES" + +Se non impostato, di default il programma ignorerà tutte le sottocartelle nel percorso indicato. + +--include-tn disabilita il filtro-tn, includendo nell'elaborazione anche le immagini thumbnail + +Se non impostato, di default il programma abilita il filtro e ignora ciascuna immagine che inizia per "tn_". + +--multicore [!SOLO PER CPU!] imposta il livello di parallelismo con cui avviare l'elaborazione + +Accetta valori {1, 2, 3, 4, 5} che corrispondono all'utilizzo di {1/8, 1/4, 1/2, 3/4, n-2} dei core. +Se non impostato, di default il programma imposterà il livello di multicore a 3 e utilizzerà dunque 1/2 dei core. + +----- ----------------------------------------------------------------------------------------------- +[ ] indica che il parametro è opzionale +/ indica che per impostare quel parametro puoi usare una delle due scritture +IMAGES è il percorso della cartella contenente le immagini da elaborare e da codificare +OUT è il percorso della cartella o del file di output contenente gli encodings in formato .pkl +DATETIME è la data nel formato "yyyymmdd_hhmmss" in cui è stato generato il file + + + +===== [ESEGUIRE FACE_MATCHER] ================================================================================= + +Avvia il terminale nella cartella del programma e lancia il comando + +face_matcher [-h/--help] -i IMAGE/--image IMAGE -e ENCODINGS/--encodings ENCODINGS [-o OUT/--out OUT] [-l LOG/--log LOG] + +----- ------------------------------------------------------------------------------------------- +--help mostra la guida del programma + +--image imposta il percorso da cui leggere il volto di cui fare il match + +--encodings imposta il percorso da cui leggere gli encodings con cui eseguire il match + +--out imposta il percorso in cui generare il file dei risultati .csv + +Il programma accetta sia il percorso di un file da creare (es. "./output/gara2/result_gara2.csv"), +sia quello di una cartella (es. "./output/gara2/") in cui verrà generato un file default "result_DATETIME.csv". +Tutte le sottocartelle presenti nel percorso, se non esistenti, verranno create. +Se non impostato, di default il programma genererà il file al percorso "./output/result_DATETIME.csv". + +--log imposta il percorso in cui generare il file di log .txt + +Il programma accetta sia il percorso di un file da creare (es. "./output/gara2/matcher_log_gara2.txt"), +sia quello di una cartella (es. "./output/gara2/") in cui verrà generato un file default "matcher_log_DATETIME.txt". +Tutte le sottocartelle presenti nel percorso, se non esistenti, verranno create. +Se non impostato, di default il programma genererà il file al percorso "./output/matcher_log_DATETIME.txt". + +----- ----------------------------------------------------------------------------------------------- +[ ] indica che il parametro è opzionale +/ indica che per impostare quel parametro puoi usare una delle due scritture +IMAGE è il percorso dell'immagine contenente il volto di cui fare il match +ENCODINGS è il percorso del file .pkl che contiene gli encodings delle foto con cui eseguire il match +OUT è il percorso della cartella o del file di output contenente il risultato in formato .csv +DATATIME è la data nel formato "yyyymmdd_hhmmss" in cui è stato generato il file diff --git a/bin/Face_Recognition_Windows/face_encoder_cpu/face_encoder_cpu.exe b/bin/Face_Recognition_Windows/face_encoder_cpu/face_encoder_cpu.exe new file mode 100644 index 00000000..dd8350d2 Binary files /dev/null and b/bin/Face_Recognition_Windows/face_encoder_cpu/face_encoder_cpu.exe differ diff --git a/bin/Face_Recognition_Windows/face_encoder_gpu/face_encoder_gpu.exe b/bin/Face_Recognition_Windows/face_encoder_gpu/face_encoder_gpu.exe new file mode 100644 index 00000000..3efcaf76 Binary files /dev/null and b/bin/Face_Recognition_Windows/face_encoder_gpu/face_encoder_gpu.exe differ diff --git a/bin/Face_Recognition_Windows/face_matcher.exe b/bin/Face_Recognition_Windows/face_matcher.exe new file mode 100644 index 00000000..23fce198 Binary files /dev/null and b/bin/Face_Recognition_Windows/face_matcher.exe differ diff --git a/bin/Face_Recognition_Windows/istruzioni.txt b/bin/Face_Recognition_Windows/istruzioni.txt new file mode 100644 index 00000000..e8a84d2e --- /dev/null +++ b/bin/Face_Recognition_Windows/istruzioni.txt @@ -0,0 +1,111 @@ + ######################################### + # # + # Face Recognition - WINDOWS # + # # + ######################################### + + + +===== [CONTENUTO] ============================================================================================= + +# face_encoder_cpu cartella contenente la versione CPU della prima parte del programma + +La versione CPU è universale ed è abilitata al multicore. +Contiene anche una cartella nascosta _internal con dentro le librerie che servono all'eseguibile. +Per spostare il programma è quindi necessario spostare l'intera cartella e non solo l'eseguibile al suo interno. + +# face_encoder_gpu cartella contenente la versione GPU della prima parte del programma + +La versione GPU funziona solamente in un ambiente che dispone di una scheda grafica, +altrimenti il programma segnala l'errore e termina. Utilizza le librerie CUDA per maggiore precisione. +Contiene anche una cartella nascosta _internal con dentro le librerie che servono all'eseguibile. +Per spostare il programma è quindi necessario spostare l'intera cartella e non solo l'eseguibile al suo interno. + +# face_matcher.exe versione Windows della seconda parte del programma + + + +===== [ESEGUIRE FACE_ENCODER] ================================================================================= + +Avvia il terminale nella cartella del programma e lancia il comando + +face_encoder_cpu.exe [-h/--help] -i IMAGES/--images IMAGES [-o OUT/--out OUT] [-l LOG/--log LOG] [-r/--recursive] [-t/--include-tn] [-m/--multicore] +face_encoder_gpu.exe [-h/--help] -i IMAGES/--images IMAGES [-o OUT/--out OUT] [-l LOG/--log LOG] [-r/--recursive] [-t/--include-tn] + +rispettivamente per la versione CPU o GPU. + +----- ------------------------------------------------------------------------------------------- +--help mostra la guida del programma + +--images imposta il percorso da cui leggere le immagini da codificare + +--out imposta il percorso in cui generare il file di encodings .pkl + +Accetta sia il percorso di un file da creare (es. "./output/gara2/face_encodings_gara2.pkl"), +sia quello di una cartella (es. "./output/gara2/") in cui verrà generato un file default "face_encodings_DATETIME.pkl". +Tutte le sottocartelle presenti nel percorso, se non esistenti, verranno create. +Se non impostato, di default il programma genererà il file al percorso "./output/face_encodings_DATETIME.pkl". + +--log imposta il percorso in cui generare il file di log .txt + +Accetta sia il percorso di un file da creare (es. "./output/gara2/encoder_log_gara2.txt"), +sia quello di una cartella (es. "./output/gara2/") in cui verrà generato un file default "encoder_log_DATETIME.txt". +Tutte le sottocartelle presenti nel percorso, se non esistenti, verranno create. +Se non impostato, di default il programma genererà il file al percorso "./output/encoder_log_DATETIME.txt". + +--recursive abilita la ricerca ricorsiva in tutte le sotto cartelle all'interno di "IMAGES" + +Se non impostato, di default il programma ignorerà tutte le sottocartelle nel percorso indicato. + +--include-tn disabilita il filtro-tn, includendo nell'elaborazione anche le immagini thumbnail + +Se non impostato, di default il programma abilita il filtro e ignora ciascuna immagine che inizia per "tn_". + +--multicore [!SOLO PER CPU!] imposta il livello di parallelismo con cui avviare l'elaborazione + +Accetta valori {1, 2, 3, 4, 5} che corrispondono all'utilizzo di {1/8, 1/4, 1/2, 3/4, n-2} dei core. +Se non impostato, di default il programma imposterà il livello di multicore a 3 e utilizzerà dunque 1/2 dei core. + +----- ----------------------------------------------------------------------------------------------- +[ ] indica che il parametro è opzionale +/ indica che per impostare quel parametro puoi usare una delle due scritture +IMAGES è il percorso della cartella contenente le immagini da elaborare e da codificare +OUT è il percorso della cartella o del file di output contenente gli encodings in formato .pkl +DATETIME è la data nel formato "yyyymmdd_hhmmss" in cui è stato generato il file + + + +===== [ESEGUIRE FACE_MATCHER] ================================================================================= + +Avvia il terminale nella cartella del programma e lancia il comando + +face_matcher.exe [-h/--help] -i IMAGE/--image IMAGE -e ENCODINGS/--encodings ENCODINGS [-o OUT/--out OUT] [-l LOG/--log LOG] + +----- ------------------------------------------------------------------------------------------- +--help mostra la guida del programma + +--image imposta il percorso da cui leggere il volto di cui fare il match + +--encodings imposta il percorso da cui leggere gli encodings con cui eseguire il match + +--out imposta il percorso in cui generare il file dei risultati .csv + +Il programma accetta sia il percorso di un file da creare (es. "./output/gara2/result_gara2.csv"), +sia quello di una cartella (es. "./output/gara2/") in cui verrà generato un file default "result_DATETIME.csv". +Tutte le sottocartelle presenti nel percorso, se non esistenti, verranno create. +Se non impostato, di default il programma genererà il file al percorso "./output/result_DATETIME.csv". + +--log imposta il percorso in cui generare il file di log .txt + +Il programma accetta sia il percorso di un file da creare (es. "./output/gara2/matcher_log_gara2.txt"), +sia quello di una cartella (es. "./output/gara2/") in cui verrà generato un file default "matcher_log_DATETIME.txt". +Tutte le sottocartelle presenti nel percorso, se non esistenti, verranno create. +Se non impostato, di default il programma genererà il file al percorso "./output/matcher_log_DATETIME.txt". + +----- ----------------------------------------------------------------------------------------------- +[ ] indica che il parametro è opzionale +/ indica che per impostare quel parametro puoi usare una delle due scritture +IMAGE è il percorso dell'immagine contenente il volto di cui fare il match +ENCODINGS è il percorso del file .pkl che contiene gli encodings delle foto con cui eseguire il match +OUT è il percorso della cartella o del file di output contenente il risultato in formato .csv +DATATIME è la data nel formato "yyyymmdd_hhmmss" in cui è stato generato il file diff --git a/bin/Face_Recognition_Windows/run_face_encoder.bat b/bin/Face_Recognition_Windows/run_face_encoder.bat new file mode 100644 index 00000000..445975e8 --- /dev/null +++ b/bin/Face_Recognition_Windows/run_face_encoder.bat @@ -0,0 +1,3 @@ +@echo off +powershell.exe -NoProfile -ExecutionPolicy Bypass -File "%~dp0run_face_encoder.ps1" +pause diff --git a/bin/Face_Recognition_Windows/run_face_encoder.ps1 b/bin/Face_Recognition_Windows/run_face_encoder.ps1 new file mode 100644 index 00000000..3dab9662 --- /dev/null +++ b/bin/Face_Recognition_Windows/run_face_encoder.ps1 @@ -0,0 +1,116 @@ +# --- Selezione livello multicore --- +Write-Host "" +Write-Host "Seleziona il livello di multicore per l'elaborazione CPU:" +Write-Host " 1 = 1/8 dei core" +Write-Host " 2 = 1/4 dei core" +Write-Host " 3 = 1/2 dei core (predefinito)" +Write-Host " 4 = 3/4 dei core" +Write-Host " 5 = n-2 core" +Write-Host "" +$input = Read-Host "Inserisci il livello (1-5) oppure premi Invio per usare il predefinito (3)" + +if ($input -match '^[1-5]$') { + $multicore = [int]$input +} else { + $multicore = -1 +} + +# --- Modern folder picker (IFileOpenDialog, Vista+) --- +Add-Type -TypeDefinition @' +using System; +using System.Runtime.InteropServices; + +public class ModernFolderPicker { + private const uint FOS_PICKFOLDERS = 0x00000020; + private const int SIGDN_FILESYSPATH = unchecked((int)0x80028000); + + public static string Show(string title = "Select Folder") { + var dialog = (IFileOpenDialog)new FileOpenDialogClass(); + try { + uint options; + dialog.GetOptions(out options); + dialog.SetOptions(options | FOS_PICKFOLDERS); + dialog.SetTitle(title); + if (dialog.Show(IntPtr.Zero) != 0) return null; // cancelled + IShellItem item; + dialog.GetResult(out item); + string path; + item.GetDisplayName(SIGDN_FILESYSPATH, out path); + Marshal.ReleaseComObject(item); + return path; + } finally { + Marshal.ReleaseComObject(dialog); + } + } + + [ComImport, ClassInterface(ClassInterfaceType.None), Guid("DC1C5A9C-E88A-4dde-A5A1-60F82A20AEF7")] + private class FileOpenDialogClass {} + + [ComImport, Guid("D57C7288-D4AD-4768-BE02-9D969532D960"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + private interface IFileOpenDialog { + [PreserveSig] int Show(IntPtr hwndOwner); + void SetFileTypes(uint cFileTypes, IntPtr rgFilterSpec); + void SetFileTypeIndex(uint iFileType); + void GetFileTypeIndex(out uint piFileType); + void Advise(IntPtr pfde, out uint pdwCookie); + void Unadvise(uint dwCookie); + void SetOptions(uint fos); + void GetOptions(out uint pfos); + void SetDefaultFolder([In, MarshalAs(UnmanagedType.Interface)] IShellItem psi); + void SetFolder([In, MarshalAs(UnmanagedType.Interface)] IShellItem psi); + void GetFolder([MarshalAs(UnmanagedType.Interface)] out IShellItem ppsi); + void GetCurrentSelection([MarshalAs(UnmanagedType.Interface)] out IShellItem ppsi); + void SetFileName([MarshalAs(UnmanagedType.LPWStr)] string pszName); + void GetFileName([MarshalAs(UnmanagedType.LPWStr)] out string pszName); + void SetTitle([MarshalAs(UnmanagedType.LPWStr)] string pszTitle); + void SetOkButtonLabel([MarshalAs(UnmanagedType.LPWStr)] string pszText); + void SetFileNameLabel([MarshalAs(UnmanagedType.LPWStr)] string pszLabel); + void GetResult([MarshalAs(UnmanagedType.Interface)] out IShellItem ppsi); + void AddPlace([In, MarshalAs(UnmanagedType.Interface)] IShellItem psi, int fdap); + void SetDefaultExtension([MarshalAs(UnmanagedType.LPWStr)] string pszDefaultExtension); + void Close(int hr); + void SetClientGuid([In] ref Guid guid); + void ClearClientData(); + void SetFilter(IntPtr pFilter); + void GetResults(out IntPtr ppenum); + void GetSelectedItems(out IntPtr ppenum); + } + + [ComImport, Guid("43826D1E-E718-42EE-BC55-A1E261C37BFE"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + private interface IShellItem { + void BindToHandler(IntPtr pbc, [In] ref Guid bhid, [In] ref Guid riid, out IntPtr ppv); + void GetParent(out IShellItem ppsi); + void GetDisplayName(int sigdnName, [MarshalAs(UnmanagedType.LPWStr)] out string ppszName); + void GetAttributes(uint sfgaoMask, out uint psfgaoAttribs); + void Compare(IShellItem psi, uint hint, out int piOrder); + } +} +'@ + +$inputPath = [ModernFolderPicker]::Show("Select the folder containing images to encode") + +if (-not $inputPath) { + Write-Host "No folder selected. Exiting." + exit 0 +} + +# --- Build argument list --- +$encoderExe = Join-Path $PSScriptRoot "face_encoder_cpu\face_encoder_cpu.exe" + +$encoderArgs = [System.Collections.Generic.List[string]]::new() +$encoderArgs.Add("-i") +$encoderArgs.Add($inputPath) +$encoderArgs.Add("-r") + +if ($multicore -ge 0) { + $encoderArgs.Add("-m") + $encoderArgs.Add([string]$multicore) +} + +# --- Run encoder --- +Write-Host "Input folder : $inputPath" +Write-Host "Multicore : $(if ($multicore -ge 0) { $multicore } else { 'default (3)' })" +Write-Host "Command : $encoderExe $encoderArgs" +Write-Host "" + +& $encoderExe @encoderArgs