Add Face Recognition executables and scripts for Windows and Unix
All checks were successful
Publish FaceAI Container / publish (push) Successful in 11m44s

This commit is contained in:
MaddoScientisto 2026-04-19 11:05:30 +02:00
commit 5df2185c1d
11 changed files with 337 additions and 1 deletions

1
.gitignore vendored
View file

@ -7,7 +7,6 @@
/build/
/out/
/dist/
/bin/
# Webapp build artifacts and generated classes
/WEB-INF/classes/

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -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.
----- <DESCRIZIONE> -------------------------------------------------------------------------------------------
--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.
----- <LEGENDA> -----------------------------------------------------------------------------------------------
[ ] 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]
----- <DESCRIZIONE> -------------------------------------------------------------------------------------------
--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".
----- <LEGENDA> -----------------------------------------------------------------------------------------------
[ ] 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

Binary file not shown.

View file

@ -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.
----- <DESCRIZIONE> -------------------------------------------------------------------------------------------
--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.
----- <LEGENDA> -----------------------------------------------------------------------------------------------
[ ] 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]
----- <DESCRIZIONE> -------------------------------------------------------------------------------------------
--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".
----- <LEGENDA> -----------------------------------------------------------------------------------------------
[ ] 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

View file

@ -0,0 +1,3 @@
@echo off
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "%~dp0run_face_encoder.ps1"
pause

View file

@ -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