Regalamiunsorriso/bin/Face_Recognition_Windows/run_face_encoder.ps1
MaddoScientisto 0926c52a00
All checks were successful
Publish FaceAI Container / publish (push) Successful in 3m53s
feat: Refactor multicore selection and enhance output handling in face encoder script
2026-04-19 17:24:33 +02:00

149 lines
5.8 KiB
PowerShell

# --- 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 ""
$multicoreChoice = Read-Host "Inserisci il livello (1-5) oppure premi Invio per usare il predefinito (3)"
if ($multicoreChoice -match '^[1-5]$') {
$multicore = [int]$multicoreChoice
} 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
}
$inputFolder = Get-Item -LiteralPath $inputPath -ErrorAction Stop
$raceName = $inputFolder.Name
$safeRaceName = ($raceName -replace '[<>:"/\\|?*]', ' ').Trim()
$safeRaceName = $safeRaceName -replace '\s+', '_'
if (-not $safeRaceName) {
$safeRaceName = 'race'
}
$timestamp = Get-Date -Format 'yyyyMMdd_HHmmss'
$encoderDir = Join-Path $PSScriptRoot "face_encoder_cpu"
$outputDir = Join-Path $encoderDir "output"
$outputFile = Join-Path $outputDir ("face_encodings_{0}_{1}.pkl" -f $timestamp, $safeRaceName)
$logFile = Join-Path $outputDir ("encoder_log_{0}_{1}.txt" -f $timestamp, $safeRaceName)
New-Item -ItemType Directory -Path $outputDir -Force | Out-Null
# --- Build argument list ---
$encoderExe = Join-Path $encoderDir "face_encoder_cpu.exe"
$encoderArgs = [System.Collections.Generic.List[string]]::new()
$encoderArgs.Add("-i")
$encoderArgs.Add($inputFolder.FullName)
$encoderArgs.Add("-r")
$encoderArgs.Add("-o")
$encoderArgs.Add($outputFile)
$encoderArgs.Add("-l")
$encoderArgs.Add($logFile)
if ($multicore -ge 0) {
$encoderArgs.Add("-m")
$encoderArgs.Add([string]$multicore)
}
# --- Run encoder ---
Write-Host "Input folder : $($inputFolder.FullName)"
Write-Host "Race name : $raceName"
Write-Host "Multicore : $(if ($multicore -ge 0) { $multicore } else { 'default (3)' })"
Write-Host "Output file : $outputFile"
Write-Host "Log file : $logFile"
Write-Host "Command : $encoderExe $encoderArgs"
Write-Host ""
& $encoderExe @encoderArgs
$encoderExitCode = $LASTEXITCODE
if ($encoderExitCode -eq 0 -and (Test-Path -LiteralPath $outputFile)) {
Start-Process explorer.exe "/select,`"$outputFile`""
} elseif ($encoderExitCode -eq 0) {
Write-Warning "Encoding completed, but the expected output file was not found: $outputFile"
}
exit $encoderExitCode