s121js/ ├── bin/ │ └── face_scan ├── lib/ │ └── librknnrt.so ├── models/ │ ├── SCRFD_500M_KPS_640.rknn │ └── face_recognition_sface_2021dec.rknn ├── api_v1/ │ └── scanner/ │ └── faceScanner.js ├── db/ ├── tools/ │ └── scanPhotoFaces.js └── public/ cd /home/nvme/dockerdata/prove/s122js node tools/scanPhotoFaces.js \ e30a1427708cfc8d63a66d369781b15ac6a07b43e13550b1a7625003914503ed node tools/scanPhotoFaces.js \ 2454c04dd9067d2b5288dcca99c5c3eac85660779a97d6165a08ca7c37481070 sqlite3 -header -column \ api_v1/database.sqlite \ " SELECT photo_id, COUNT(*) AS face_count, COUNT(DISTINCT face_index) AS unique_face_indexes, MIN(length(embedding)) AS min_embedding_bytes, MAX(length(embedding)) AS max_embedding_bytes FROM faces WHERE photo_id = 'e30a1427708cfc8d63a66d369781b15ac6a07b43e13550b1a7625003914503ed' GROUP BY photo_id; " [✓] FaceEngine riutilizzabile [✓] face_scan JSON [✓] eseguibile relocabile [✓] runtime RKNN relativo [✓] modelli relativi [✓] root server calcolata automaticamente [✓] conversione embedding in BLOB [✓] inserimento transazionale [✓] idempotenza [✓] rotazione 0/90/180/270 [✓] validazione rotazione server/motore [✓] test positivo con due volti [✓] gestione corretta di zero volti photos.rotation ↓ validazione Node.js ↓ face_scan --rotation 0|90|180|270 ↓ rotazione RGB ↓ SCRFD + SFace ↓ validazione JSON e rotazione applicata ↓ transazione SQLite ↓ faces.embedding = BLOB float32[128]