package it.acxent.face; import it.acxent.common.Parm; import it.acxent.common.StatusMsg; import it.acxent.db.ApplParmFull; import it.acxent.db.WcString; import it.acxent.face.api.FaceRecognitionApi; import it.acxent.util.StringTokenizer; import it.acxent.util.Vectumerator; import java.sql.PreparedStatement; public class Users extends it.acxent.anag.Users { public Users() {} public Users(ApplParmFull newApplParmFull) { super(newApplParmFull); } public void initApplicationParms(ApplParmFull ap) { if (ap != null) { String l_tipoParm = ""; Parm bean = new Parm(ap); l_tipoParm = "FACE"; StatusMsg.updateMsgByTag(ap, "INIT", l_tipoParm); bean.findByCodice("MAX_CONCURRENT_THREAD"); bean.delete(); bean.findByCodice("PATHFOTO_FACE"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("PATHFOTO_FACE"); bean.setDescrizione("PATHFOTO_FACE"); bean.setFlgTipo(0L); if (bean.getTesto().isEmpty()) bean.setTesto("/Users/acolzi/Downloads/_RUS/"); bean.setNota("PER FACE:Percorso dove risiedono tutte le foto sorgenti
PER FOTOEVENTI: PERCORSO DOVE RISIEDONO I SORGENTI DI FACE (NFS)
ATTENZIONE!! Percorso ASSOLUTO.
TUTTI I PERCORSI DEVONO FINIRE PER /
Produzione: /home/sites/regalamiunsorriso/RUS/
Test: /Users/acolzi/Downloads/_RUS/"); bean.save(); bean.findByCodice("PATHFACES"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("PATHFACES"); bean.setDescrizione("PATHFACES"); bean.setFlgTipo(0L); if (bean.getTesto().isEmpty()) bean.setTesto("/Users/acolzi/Downloads/_RUS/"); bean.setNota("Percorso dove risiedono tutti i visi delle foto
ATTENZIONE!! Percorso ASSOLUTO.
TUTTI I PERCORSI DEVONO FINIRE PER /
Produzione: tbd/
Test: /Users/acolzi/Downloads/_RUS/"); bean.save(); bean.findByCodice("PATHFACES_REMOTO"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("PATHFACES_REMOTO"); bean.setDescrizione("PATHFACES_REMOTO"); bean.setFlgTipo(0L); if (bean.getTesto().isEmpty()) bean.setTesto("/Users/acolzi/Downloads/_RUS/_REMOTOFACES/"); bean.setNota("Percorso dove risiedono tutti i visi delle foto che mi prendo da fr remoto, per evitare tutte le volte di fare la chiamata al servizio
ATTENZIONE!! Percorso ASSOLUTO.
TUTTI I PERCORSI DEVONO FINIRE PER /
Produzione: tbd/
Test: /Users/acolzi/Downloads/_RUS/_REMOTOFACES/"); bean.save(); bean.findByCodice("SERVER_CHIAMETE_REMOTO_WWW"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("SERVER_CHIAMETE_REMOTO_WWW"); bean.setDescrizione("SERVER_CHIAMETE_REMOTO_WWW"); bean.setFlgTipo(0L); if (bean.getTesto().isEmpty()) bean.setTesto("https://www.fotoeventi.com/RemoteCmd.abl"); bean.setNota("Server remoto www. Serve per inviare i comandi da ovunque a chiunque. In pratica per le notifiche su ricerca per selfie...."); bean.save(); bean.findByCodice("PREVIEW_W"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("PREVIEW_W"); bean.setDescrizione("PREVIEW_W"); bean.setFlgTipo(1L); bean.setNota("Larghezza preview su ricerca e indicizza. L'altezza ha la precedenza, ovvero se altezza>0, questo parametro viene ignorato."); bean.save(); bean.findByCodice("PREVIEW_H"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("PREVIEW_H"); bean.setDescrizione("PREVIEW_H"); bean.setFlgTipo(1L); if (bean.getNumero() <= 0.0D) bean.setNumero(400.0D); bean.setNota("Altezza preview su ricerca e indicizza. Ha la precedenza sulla larghezza."); bean.save(); bean.findByCodice("MAX_NUMBER_OF_THREAD_PF_SCORING_LVL_1"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("MAX_NUMBER_OF_THREAD_PF_SCORING_LVL_1"); bean.setDescrizione("MAX_NUMBER_OF_THREAD_PF_SCORING_LVL_1"); bean.setFlgTipo(1L); if (bean.getNumero() < 0.0D) bean.setNumero(1.0D); bean.setNota("Numero thread (punti foto) contemporanei per il processo di scoring lvl1. Se==0 --> numero di punti foto"); bean.save(); bean.findByCodice("MAX_NUMBER_OF_THREAD_SCORING_LVL_1"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("MAX_NUMBER_OF_THREAD_SCORING_LVL_1"); bean.setDescrizione("MAX_NUMBER_OF_THREAD_SCORING_LVL_1"); bean.setFlgTipo(1L); if (bean.getNumeroInt() <= 0) bean.setNumero(300.0D); bean.setNota("Numero di thread per fase di scoring livello1. Non dipende dalla potenza della macchina ma da quanto i servizi di scoring riescono a assorbire. Per 2 macchine scoring con rtx proviamo con 20. Fare qualche test"); bean.save(); bean.findByCodice("NUM_QUERY_CALLABLE_LVL_1"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("NUM_QUERY_CALLABLE_LVL_1"); bean.setDescrizione("NUM_QUERY_CALLABLE_LVL_1"); bean.setFlgTipo(1L); if (bean.getNumeroInt() <= 0) bean.setNumero(98.0D); bean.setNota("Numero di query face da inviare a zoo per fase di scoring livello 1. In genere da 80 a 95 con 5 servizi. Utile se Num. Foto No Score ==0 (confronto tutte le face dell'evento...)"); bean.save(); bean.findByCodice("STEP_STATUS_MSG_SCORING"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("STEP_STATUS_MSG_SCORING"); bean.setDescrizione("STEP_STATUS_MSG_SCORING"); bean.setFlgTipo(1L); if (bean.getNumeroInt() <= 0) bean.setNumero(300.0D); bean.setNota("Numero di cicli senza status msg durante lo scoring. NUmero basso rallenta parecchio. In genere 300"); bean.save(); bean.findByCodice("MAX_NUMBER_OF_THREAD_SCORING_LVL_2"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("MAX_NUMBER_OF_THREAD_SCORING_LVL_2"); bean.setDescrizione("MAX_NUMBER_OF_THREAD_SCORING_LVL_2"); bean.setFlgTipo(1L); if (bean.getNumeroInt() <= 0) bean.setNumero(300.0D); bean.setNota("Numero di thread per fase di scoring livello 2 o 7(face to face). Non dipende dalla potenza della macchina ma da quanto i servizi di scoring riescono a assorbire. Per 2 macchine scoring con rtx proviamo con 20"); bean.save(); bean.findByCodice("NUM_QUERY_CALLABLE_LVL_2"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("NUM_QUERY_CALLABLE_LVL_2"); bean.setDescrizione("NUM_QUERY_CALLABLE_LVL_2"); bean.setFlgTipo(1L); if (bean.getNumeroInt() <= 0) bean.setNumero(98.0D); bean.setNota("Numero di query face da inviare a zoo per fase di scoring livello 2 (face to face). In genere da 80 a 95 con 5 servizi, dipende da NUM_QUERY_CALLABLE_LVL_2 e dal numero di servizi disponibili. Su scoring 7 รจ dinamico"); bean.save(); bean.findByCodice("MAX_NUMBER_OF_THREAD_INDEXING_SCALING"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("MAX_NUMBER_OF_THREAD_INDEXING_SCALING"); bean.setDescrizione("MAX_NUMBER_OF_THREAD_INDEXING_SCALING"); bean.setFlgTipo(1L); if (bean.getNumeroInt() <= 0) bean.setNumero(30.0D); bean.setNota("Numero Tthread per la fase di indexing e scaling. Di solito 30 con un servizio..."); bean.save(); l_tipoParm = "FACE SCORING"; StatusMsg.updateMsgByTag(ap, "INIT", l_tipoParm); bean.findByCodice("NUM_PROCESSORI_CUDA_EFFETTIVI"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("NUM_PROCESSORI_CUDA_EFFETTIVI"); bean.setDescrizione("NUM_PROCESSORI_CUDA_EFFETTIVI"); bean.setFlgTipo(1L); if (bean.getNumero() <= 0.0D) bean.setNumero(4.0D); bean.setNota("NUMERO PROCESSORI CUDA DI PARTENZA. VEDI P_NUM_THREAD_X_PROCESSORE_CUDA X NUMERO THREAD MASSIMO PER SCORING CENTRALIZZATO "); bean.save(); bean.findByCodice("NUM_THREAD_X_PROCESSORE_CUDA"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("NUM_THREAD_X_PROCESSORE_CUDA"); bean.setDescrizione("NUM_THREAD_X_PROCESSORE_CUDA"); bean.setFlgTipo(1L); if (bean.getNumero() < 0.0D) bean.setNumero(0.0D); bean.setNota("NUMERO THREAD PER SCORING CENTRALIZZATO. IN PRATICA DETERMINO QUANTI THREAD MASSIMO PER PROCESSORI CUDA.
QUESTO DETERMINA IL NUMERO DEI THREAD MASSIMO, OVVERO NUM_PROCESSORI_CUDA_EFFETTIVI * NUM_THREAD_X_PROCESSORE_CUDA
VIENE UTILIZZATO SE VOGLIO FORZARE IL VALORE NONOSTANTE LA TABELLA SCORING_VELOX. VIENE AZZERATO UNA VOLTA LETTO."); bean.save(); bean.findByCodice("NUM_QYERY_CALLABLE"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("NUM_QYERY_CALLABLE"); bean.setDescrizione("NUM_QYERY_CALLABLE"); bean.setFlgTipo(1L); if (bean.getNumero() < 0.0D) bean.setNumero(0.0D); bean.setNota("NUMERO ELEMENTI NELLA QUERY CALLABLE (PACCHETTO DA INVIARE AI PROCESSORI CUDA).
VIENE UTILIZZATO SE VOGLIO FORZARE IL VALORE NONOSTANTE LA TABELLA SCORING_VELOX. VIENE AZZERATO UNA VOLTA LETTO."); bean.save(); bean.findByCodice("NUM_QUERY_CALLABLE_MIN"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("NUM_QUERY_CALLABLE_MIN"); bean.setDescrizione("NUM_QUERY_CALLABLE_MIN"); bean.setFlgTipo(1L); if (bean.getNumero() <= 0.0D) bean.setNumero(150.0D); bean.setNota("VALORE MINIMO PER SINGOLA CALLABLE. VALORI TROPPO BASSI O TROPPO ALTI SONO INEFFICIENTI.
IL VALORE EFFETTIVO DEL NUMERO QUERY CALLABLE VIENE MODIFICATO DINAMICAMENTE MA MAI SOTTO QUESTO VALORE"); bean.save(); l_tipoParm = "FACE BUILDER"; StatusMsg.updateMsgByTag(ap, "INIT", l_tipoParm); bean.findByCodice("CONFIDENCE_FOTO_FACE_SEC_DISTANCE_MAX"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("CONFIDENCE_FOTO_FACE_SEC_DISTANCE_MAX"); bean.setDescrizione("CONFIDENCE_FOTO_FACE_SEC_DISTANCE_MAX"); bean.setFlgTipo(1L); if (bean.getNumero() <= 0.0D) bean.setNumero(1.0D); bean.setNota("VALORE SECONDI TRA FOTO PER CONFIDENCE NEAR (1)"); bean.save(); bean.findByCodice("CONFIDENCE_NO_LEVEL_1"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("CONFIDENCE_NO_LEVEL_1"); bean.setDescrizione("CONFIDENCE_NO_LEVEL_1"); bean.setFlgTipo(1L); if (bean.getNumero() <= 0.0D) bean.setNumero(40.0D); bean.setNota("CONFIDENCE SOTTO LA QUALE CONSIDERE LE FOTO SICURAMENTE NON APPARTENTENENTI ALLA STESSA CLASSE"); bean.save(); bean.findByCodice("CONFIDENCE_OK_LEVEL_1"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("CONFIDENCE_OK_LEVEL_1"); bean.setDescrizione("CONFIDENCE_OK_LEVEL_1"); bean.setFlgTipo(1L); if (bean.getNumero() <= 0.0D) bean.setNumero(65.0D); bean.setNota("VALORE CONFIDENCE 1 (65) < DI CONFIDENCE 2"); bean.save(); bean.findByCodice("CONFIDENCE_OK_LEVEL_2"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("CONFIDENCE_OK_LEVEL_2"); bean.setDescrizione("CONFIDENCE_OK_LEVEL_2"); bean.setFlgTipo(1L); if (bean.getNumero() <= 0.0D) bean.setNumero(75.0D); bean.setNota("VALORE CONFIDENCE 2 (75) > DI CONFIDENCE 1"); bean.save(); bean.findByCodice("CONFIDENCE_OK_NEAR"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("CONFIDENCE_OK_NEAR"); bean.setDescrizione("CONFIDENCE_OK_NEAR"); bean.setFlgTipo(1L); if (bean.getNumero() <= 0.0D) bean.setNumero(60.0D); bean.setNota("VALORE CONFIDENCE (60) CHE UTILIZZO SE LE FOTO SONO VICINE TRA LORO"); bean.save(); bean.findByCodice("CONFIDENCE_MAX_LABEL_X_EVENTO"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("CONFIDENCE_MAX_LABEL_X_EVENTO"); bean.setDescrizione("CONFIDENCE_MAX_LABEL_X_EVENTO"); bean.setFlgTipo(1L); if (bean.getNumero() <= 0.0D) bean.setNumero(50.0D); bean.setNota("NUMERO MASSIMO LABEL PER EVENTO (50)"); bean.save(); bean.findByCodice("FULL_PATH_SELFIE"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("FULL_PATH_SELFIE"); bean.setDescrizione("FULL_PATH_SELFIE"); bean.setFlgTipo(0L); if (bean.getTesto().isEmpty()) bean.setTesto("/Users/acolzi/Downloads/_FE/_selfie/"); bean.setNota("Percorso completo dove vengono memorizzati i selfie
/Users/acolzi/Downloads/_FE/_selfie/"); bean.save(); bean.findByCodice("FACE_DETECTION_USE_PATH"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("FACE_DETECTION_USE_PATH"); bean.setDescrizione("FACE_DETECTION_USE_PATH"); bean.setFlgTipo(5L); bean.setNota("Se true su richeieste face detection YUNET ZOO mando il path.
I percorsi devono essere condivisi tra i container.
Dovrei attivarlo anche per gli altri"); bean.save(); bean.findByCodice("ZOO_YUNET_SCORING_DYS_TYPE"); bean.setFlgAdmin(1L); bean.setTipoParm(l_tipoParm); bean.setCodice("ZOO_YUNET_SCORING_DYS_TYPE"); bean.setDescrizione("ZOO_YUNET_SCORING_DYS_TYPE"); bean.setFlgTipo(1L); bean.setNota("Distance type.
0: cosine
1: norm_l1.
Defaults to 0"); bean.save(); StatusMsg.deleteMsgByTag(ap, "INIT"); super.initApplicationParms(ap); FaceRecognitionApi.initApplicationParms(ap); } } public Vectumerator findByCR(UsersCR CR, int pageNumber, int pageRows) { String s_Sql_Find = "select A.* from USERS AS A"; WcString wc = new WcString(); wc.addWc("dataFineVld is null"); wc = managePolicyFind(CR, wc); if (!CR.isCode1()) wc.addWc("A.id_users <>1"); if (!CR.getFlgValido().isEmpty()) wc.addWc("A.flgValido='" + CR.getFlgValido() + "'"); if (!CR.getSearchTxt().trim().isEmpty()) { String temp = CR.getSearchTxt().trim().replace("*", "%"); StringTokenizer st = new StringTokenizer(temp, " "); StringBuffer txt = new StringBuffer("("); int countToken = 0; while (st.hasMoreTokens()) { String token = prepareSqlString(st.nextToken()); countToken++; if (countToken > 1) token = "%" + token; txt.append("(A.nome like'%" + token + "%' or A.cognome like'%" + token + "%' or A.eMail like'%" + token + "%' or A.codFisc like'%" + token + "%' or A.login like'%" + token + "%')"); if (st.hasMoreTokens()) txt.append(" and "); } txt.append(")"); wc.addWc(txt.toString()); } if (!CR.getEMail().isEmpty()) wc.addWc("A.eMail like'%" + CR.getEMail() + "%'"); if (CR.getFlgMl() == 0L) { wc.addWc("(A.flgMl is null or A.flgMl=0)"); } else if (CR.getFlgMl() > 0L) { wc.addWc("A.flgMl =" + CR.getFlgMl()); } try { PreparedStatement stmt = getConn().prepareStatement(s_Sql_Find + s_Sql_Find); return findRows(stmt, pageNumber, pageRows); } catch (Exception e) { handleDebug(e); return AB_EMPTY_VECTUMERATOR; } } }