Regalamiunsorriso/decompiled-libs/www/acxent-face-1.0.0/it/acxent/face/Selfie.java

1027 lines
41 KiB
Java

package it.acxent.face;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import it.acxent.common.StatusMsg;
import it.acxent.db.ApplParmFull;
import it.acxent.db.DBAdapter;
import it.acxent.db.ResParm;
import it.acxent.db.WcString;
import it.acxent.face.api.FaceRecognitionApi;
import it.acxent.face.api.FaceRecognitionApiResult;
import it.acxent.face.api.TrainingImage;
import it.acxent.face.scoring.SelfieScoringQueue;
import it.acxent.face.scoring.SmartFaceScoringQueue;
import it.acxent.log.Log;
import it.acxent.util.AsyncExecutor;
import it.acxent.util.StringTokenizer;
import it.acxent.util.Timer;
import it.acxent.util.Vectumerator;
import java.io.File;
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.stream.Collectors;
public class Selfie extends _FaceAdapter implements Serializable, FaceScoreTarget {
private static final long serialVersionUID = 1725875013194L;
public static final long STATUS_DA_ELABORARE_0 = 0L;
public static final long STATUS_IN_ELABORAZIONE = 1L;
public static final long STATUS_ELABORAZIONE_CONCLUSA = 99L;
public static final int FACE_WIDTH = 96;
public static final int FACE_WIDTH_WWW = 192;
private static final int NUM_THREADS_ELABORAZIONE = 5;
private static final Map<Long, Boolean> elaborazioniInCorso = Collections.synchronizedMap(new HashMap<>());
private long id_selfie;
private String labelMd5;
private String fileName;
private long label;
private long flgStatus;
private long id_evento;
private long codGara;
private Evento evento;
private Timestamp tsCreation;
private String fileAlternativo;
private double confidence;
private String md5;
private String md5Face;
private String elencoFoto;
private String elencoFotoExt;
private long rangeExt;
public Selfie(ApplParmFull newApplParmFull) {
super(newApplParmFull);
}
public Selfie() {}
public static void addCodaElaborazioneAsync(Selfie selfie, boolean inviaNotifiche) {
AsyncExecutor.ELABORAZIONE_EXECUTOR.submit(() ->
addCodaElaborazione(selfie, inviaNotifiche));
}
public static void addCodaElaborazione(Selfie selfie, boolean inviaNotifiche) {
boolean debug = false;
DBAdapter.printDebug("addCodaElaborazione1");
if (selfie.getFlgStatus() == 0L) {
DBAdapter.printDebug("addCodaElaborazione2");
boolean debug3 = true;
int priority = 10;
ResParm rp = new ResParm();
Timer timer = new Timer();
timer.start();
Evento evento = selfie.getEvento();
String TAG_THREAD_MSG = "SCORING SELFIE " + selfie.getId_selfie();
SelfieScoringQueue selfieScoringQueue = SelfieScoringQueue.getInstance(selfie.getApFull());
DBAdapter.printDebug("addCodaElaborazione3");
String targetDir = selfie.getParm("PATHFOTO_FACE").getTesto() + selfie.getParm("PATHFOTO_FACE").getTesto();
File targetDirFile = new File(targetDir);
if (!targetDirFile.exists())
targetDirFile.mkdirs();
double confDetectLevel = evento.getDetectFaceConfidentThresold();
long dysType = selfie.getParm("ZOO_YUNET_SCORING_DYS_TYPE").getNumeroLong();
FaceScore fs = new FaceScore(selfie.getApFull());
StatusMsg.updateMsgByTag(evento.getApFull(), TAG_THREAD_MSG, "coda elab: QUERY TARGET X EVENTO......");
Vectumerator<FaceScore> vecFsTarget = fs.findTargetByEvento(evento.getId_evento(), -1L);
JsonObject jsonData = new JsonObject();
jsonData.addProperty("dis_type", Long.valueOf(dysType));
jsonData.addProperty("conf_threshold", Double.valueOf(confDetectLevel));
JsonObject jsonTarget = new JsonObject();
jsonTarget.addProperty("id", Long.valueOf(selfie.getId_selfie()));
jsonTarget.addProperty("path", selfie.getRealSelfieImgPath());
jsonTarget.addProperty("md5", selfie.getMd5());
jsonTarget.addProperty("type", "selfie");
jsonData.add("target", (JsonElement)jsonTarget);
FaceScore currentFs = new FaceScore();
JsonArray jsonQuery = new JsonArray();
while (vecFsTarget.hasMoreElements()) {
currentFs = (FaceScore)vecFsTarget.nextElement();
JsonObject jsonQueryRow = new JsonObject();
jsonQueryRow.addProperty("id", Long.valueOf(currentFs.getId_fotoFace()));
jsonQueryRow.addProperty("path", currentFs.getFotoFace().getFacePath());
jsonQueryRow.addProperty("md5", currentFs.getFotoFace().getMd5());
jsonQueryRow.addProperty("type", "face");
jsonQuery.add((JsonElement)jsonQueryRow);
}
DBAdapter.printDebug(debug, "1.. inizio scoring - " + selfieScoringQueue.getStatus());
SmartFaceScoringQueue smartFaceScoringQueue = SmartFaceScoringQueue.getInstance(evento.getApFull());
smartFaceScoringQueue.setPause(true);
Vectumerator<Future<ResParm>> vecF = selfieScoringQueue.faceScoring(evento, jsonQuery, jsonTarget, confDetectLevel, priority);
DBAdapter.printDebug(debug3, "8. future arrivato");
DBAdapter.printDebug(debug3, "8.1 vecF.getTotNumberOfRecords(): " + vecF.getTotNumberOfRecords());
String eta = "";
Timer timerFuture = new Timer();
int futureError = 0;
timerFuture.start();
for (int fidx = 0; fidx < vecF.getTotNumberOfRecords(); fidx++) {
eta = timerFuture.getEta((long)fidx, (long)vecF.getTotNumberOfRecords());
StatusMsg.updateMsgByTag(evento.getApFull(), TAG_THREAD_MSG, "punto foto:" +
currentFs.getFoto().getPuntoFoto().getDescrizione() + " future: " + fidx + "/" +
vecF.getTotNumberOfRecords() + " futureError:" + futureError + " future eta: " + eta + "\n" +
selfieScoringQueue.getStatus());
Future<ResParm> currentFuture = (Future<ResParm>)vecF.nextElement();
if (currentFuture == null) {
rp.setStatus(false);
rp.setMsg("Errore: Future null per indice " + fidx);
DBAdapter.printDebug(debug3, "addCodaElaborazione4 -> null Errore: Future null per indice " + fidx);
} else {
try {
rp = currentFuture.get(45L, TimeUnit.SECONDS);
} catch (TimeoutException e) {
DBAdapter.printDebug(debug3, "addCodaElaborazione5 -> Errore Timeout su future index " + fidx + ", ignorando.");
} catch (InterruptedException e) {
DBAdapter.printDebug(debug3, "addCodaElaborazione6 -> Errore Interruzione rilevata, terminazione del ciclo.");
Thread.currentThread().interrupt();
} catch (ExecutionException e) {
DBAdapter.printDebug(debug3, "addCodaElaborazione7 -> Errore durante l'esecuzione del task " + fidx + ": " +
e.getMessage());
e.printStackTrace();
} catch (Exception e) {
DBAdapter.printDebug(debug3, "addCodaElaborazione8 -> Errore generico su future index " + fidx + ": " +
e.getMessage());
e.printStackTrace();
}
if (!rp.getStatus()) {
DBAdapter.printDebug(debug3, "addCodaElaborazione9 -> errore future: " + rp.getMsg());
futureError++;
}
}
}
smartFaceScoringQueue.setPause(false);
timerFuture.stop();
selfieScoringQueue.poolShutdown();
timer.stop();
String durata = "" + timer.getDurataMilliSec() / 1000L + " sec.";
DBAdapter.printDebug(debug3, "addCodaElaborazione10 ->. shutdown concluso. Durata elaborazione selfie: " + durata);
DBAdapter.printDebug(debug3, "addCodaElaborazione11 -> SELFIE STATUS_ELABORAZIONE_CONCLUSA SU face per selfie: " +
selfie.getId_selfie());
selfie.updateFlgStatus(99L);
if (inviaNotifiche) {
if (evento.getCodiceEventoCliente().matches("\\d+")) {
DBAdapter.printDebug(debug3, "addCodaElaborazione12 -> INVIO COMANDO NOTIFICHE!!! codiceEventoCliente: " +
evento.getCodiceEventoCliente() + " evento: " + evento.getId_evento() + " durata:" + durata);
Evento.inviaNotificaRemotaWww(selfie.getApFull(), Long.valueOf(evento.getCodiceEventoCliente()).longValue());
} else {
DBAdapter.printDebug(debug3, "addCodaElaborazione13 -> NIENTE NOTIFICHE. evento.getCodiceEventoCliente() NON e' UN NUMERO: " +
evento.getCodiceEventoCliente() + " evento: " + evento.getId_evento() + " DURATA" + durata);
}
} else {
DBAdapter.printDebug(debug3, "addCodaElaborazione14 -> NIENTE NOTIFICHE. FALSE. evento: " +
evento.getId_evento() + " DURATA" + durata);
}
StatusMsg.deleteMsgByTag(evento.getApFull(), TAG_THREAD_MSG);
Log.addAltro(selfie.getApFull(), "127.0.0.1", 1L, " scoringSelfie: FINE!!! \n" + durata + "\nRisultato: " + rp.getMsg());
} else {
DBAdapter.printDebug(debug, "addCodaElaborazione15 ->1 NENTE ADD CODA ELABORAZIONE.... SELFIE IN STATO DIVERSO DA DA ELABORARE_0: ID: " +
selfie.getId_selfie() + " md5:" + selfie.getMd5());
}
}
public void setId_selfie(long newId_selfie) {
this.id_selfie = newId_selfie;
}
public void setMd5(String newMd5) {
this.md5 = newMd5;
}
public void setTsCreation(Timestamp newTsCreation) {
this.tsCreation = newTsCreation;
}
public long getId_selfie() {
return this.id_selfie;
}
public String getMd5() {
return (this.md5 == null) ? "" : this.md5.trim();
}
public Timestamp getTsCreation() {
return this.tsCreation;
}
protected ResParm checkDeleteCascade() {
return new ResParm(true);
}
protected void deleteCascade() {}
public Vectumerator<Selfie> findByCR(SelfieCR CR, int pageNumber, int pageRows) {
String s_Sql_Find = "select A.* from SELFIE AS A";
String s_Sql_Order = "";
WcString wc = new WcString();
if (!CR.getSearchTxt().trim().isEmpty()) {
StringTokenizer st = new StringTokenizer(CR.getSearchTxt().trim(), " ");
StringBuffer txt = new StringBuffer("(");
while (st.hasMoreTokens()) {
String token = st.nextToken();
txt.append("(A.Cognome like '%" + token + "%' or A.Nome like '%" + token + "%')");
if (st.hasMoreTokens())
txt.append(" and ");
}
txt.append(")");
wc.addWc(txt.toString());
}
try {
PreparedStatement stmt = getConn().prepareStatement(s_Sql_Find + s_Sql_Find + wc.toString());
return findRows(stmt, pageNumber, pageRows);
} catch (SQLException e) {
removeCPConnection();
handleDebug(e);
return AB_EMPTY_VECTUMERATOR;
}
}
public String getFileName() {
if (this.fileName == null || this.fileName.isEmpty())
this.fileName = getMd5() + ".jpg";
return (this.fileName == null) ? "" : this.fileName.trim();
}
public String getFullFileNameSelfie() {
return getPathCompletoSelfie() + "/" + getPathCompletoSelfie();
}
public String getFullFileNameSelfieWww() {
return getPathCompletoSelfieWww() + "/" + getPathCompletoSelfieWww();
}
public String getRealSelfieImgPath() {
String currentFileName;
if (getFileAlternativo().isEmpty()) {
currentFileName = getFullFileNameSelfie();
} else {
currentFileName = getFileAlternativo();
}
return currentFileName;
}
public String getRealSelfieImgMd5() {
String currentMd5;
if (getFileAlternativo().isEmpty()) {
if (getMd5Face().isEmpty()) {
currentMd5 = getMd5();
} else {
currentMd5 = getMd5Face();
}
} else {
currentMd5 = getMd5();
}
return currentMd5;
}
public boolean isSelfieImageExist() {
if (getId_selfie() == 0L)
return false;
return new File(getRealSelfieImgPath()).exists();
}
public boolean isSelfieGara(long l_id_gara) {
return (getCodGara() == l_id_gara);
}
public String getPathCompletoSelfie() {
String temp = DBAdapter.convertPathToCurrentFileSystemSeparator(getParm("FULL_PATH_SELFIE").getTesto());
if (!temp.endsWith(DBAdapter.SEPARATOR))
temp = temp + temp;
return temp;
}
public String getPathCompletoSelfieWww() {
String temp = getDocBase() + "_selfie";
if (!temp.endsWith(DBAdapter.SEPARATOR))
temp = temp + temp;
return temp;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public ResParm save() {
if (getTsCreation() == null)
setTsCreation(getTimestamp());
if (getMd5Face().isEmpty())
setMd5Face(DBAdapter.getFileMd5(getFullFileNameFaceWww(192)));
if (getMd5().isEmpty())
setMd5(DBAdapter.getFileMd5(getFullFileNameSelfie()));
return super.save();
}
public String getFullFileNameFaceWww(int w) {
return getPathCompletoSelfieWww() + "/" + getPathCompletoSelfieWww() + getExtraPathFaces(w);
}
public String getExtraPathFaces(int w) {
return "_faces" + w + "/";
}
public void findByMd5(String l_md5) {
String s_Sql_Find = "select A.* from SELFIE AS A";
String s_Sql_Order = "";
WcString wc = new WcString();
wc.addWc("A.md5='" + l_md5 + "'");
try {
PreparedStatement stmt = getConn().prepareStatement(s_Sql_Find + s_Sql_Find + wc.toString());
findFirstRecord(stmt);
} catch (SQLException e) {
removeCPConnection();
handleDebug(e);
}
}
@Deprecated
public void findByMd5CodGara(String l_md5, long l_codGara) {
String s_Sql_Find = "select A.* from SELFIE AS A";
String s_Sql_Order = "";
WcString wc = new WcString();
wc.addWc("A.md5='" + l_md5 + "'");
wc.addWc("A.codGara=" + l_codGara);
try {
PreparedStatement stmt = getConn().prepareStatement(s_Sql_Find + s_Sql_Find + wc.toString());
findFirstRecord(stmt);
} catch (SQLException e) {
removeCPConnection();
handleDebug(e);
}
}
public void findByMd5Evento(String l_md5, long l_id_evento) {
String s_Sql_Find = "select A.* from SELFIE AS A";
String s_Sql_Order = "";
WcString wc = new WcString();
wc.addWc("A.md5='" + l_md5 + "'");
wc.addWc("A.id_evento=" + l_id_evento);
try {
PreparedStatement stmt = getConn().prepareStatement(s_Sql_Find + s_Sql_Find + wc.toString());
findFirstRecord(stmt);
} catch (SQLException e) {
removeCPConnection();
handleDebug(e);
}
}
public long getId_fotoFace() {
return 0L;
}
public String getFacePath() {
return getRealSelfieImgPath();
}
public long getLabel() {
return this.label;
}
public void setLabel(long label) {
this.label = label;
}
public ResParm recognize(FaceRecognizer fr) {
ResParm rp = new ResParm();
boolean debug = false;
DBAdapter.printDebug(debug, " serfie.recognize chiamata _recognize");
if (getId_selfie() > 0L && this.label <= 0L) {
List<TrainingImage> imageFilenames = new ArrayList<>();
imageFilenames.add(new TrainingImage(getFullFileNameSelfie(), getMd5()));
rp = recognizeImages(fr, imageFilenames);
} else {
rp.setStatus(false);
rp.setMsg("Errore! FotoFace nullo!");
}
return rp;
}
public ResParm recognizeImages(FaceRecognizer fr, List<TrainingImage> imageFilenames) {
ResParm rp = new ResParm();
boolean debug = false;
long totImgTrovate = 0L;
StringBuilder errMsg = new StringBuilder();
FaceRecognitionApi frApi = new FaceRecognitionApi(getApFull());
DBAdapter.printDebug(debug, " serfie.recognizeImages chiamata _recognize");
FaceRecognitionApiResult res = frApi.__recognize(fr.getId_faceRecognizer(), imageFilenames, false);
JsonObject jRes = (JsonObject)res.getResult();
DBAdapter.printDebug(debug, " serfie.recognizeImages prima risposta jres: " + res.getMsg());
if (jRes != null)
DBAdapter.printDebug(debug, " serfie.recognizeImages jres prima risposta jres: " + DBAdapter.gsonToString(jRes));
if (jRes != null && jRes.get("success").getAsBoolean() == true) {
Selfie currentSelfie = new Selfie(getApFull());
rp = processRecognizingResponses(currentSelfie, jRes);
totImgTrovate += (Long)rp.getReturnObj();
if (jRes.has("noImg")) {
JsonArray jNoimgA = jRes.get("noImg").getAsJsonArray();
imageFilenames = new ArrayList<>();
for (int k = 0; k < jNoimgA.size(); k++) {
JsonObject jNoImgRow = jNoimgA.get(k).getAsJsonObject();
DBAdapter.printDebug(debug, " serfie.recognizeImages noimg md5: " +
jNoImgRow.get("md5").getAsString());
currentSelfie.findByMd5(jNoImgRow.get("md5").getAsString());
if (currentSelfie.getId_selfie() > 0L)
imageFilenames.add(new TrainingImage(
currentSelfie.getFullFileNameSelfie(), currentSelfie.getLabel(), currentSelfie.getMd5()));
}
DBAdapter.printDebug(" serfie.recognizeImages chiamata con immagini: n. immagini inviate: " + imageFilenames.size());
res = frApi.__recognize(fr.getId_faceRecognizer(), imageFilenames, true);
jRes = (JsonObject)res.getResult();
System.out.println(String.valueOf(DBAdapter.getNowTs()) + " serfie.recognizeImages seconda risposta da _recognize:\n" + String.valueOf(DBAdapter.getNowTs()));
if (jRes.get("success").getAsBoolean() == true) {
rp = processRecognizingResponses(currentSelfie, jRes);
totImgTrovate += (Long)rp.getReturnObj();
DBAdapter.printDebug(debug, " serfie.recognizeImages totimgtrovate: " + totImgTrovate);
}
}
}
rp.setMsg("Trovate " + totImgTrovate + " immagini. ");
rp.setReturnObj(Long.valueOf(totImgTrovate));
if (errMsg.length() > 0) {
rp.setStatus(false);
rp.appendMsg(errMsg.toString());
} else {
rp.setStatus(true);
}
return rp;
}
private ResParm processRecognizingResponses(Selfie currentSelfie, JsonObject jRes) {
ResParm rp = new ResParm();
StringBuilder errMsg = new StringBuilder();
long totImgTrovate = 0L;
if (jRes.has("responses")) {
JsonArray jResponses = jRes.get("responses").getAsJsonArray();
for (int i = 0; i < jResponses.size(); i++) {
JsonObject jResponse = jResponses.get(i).getAsJsonObject();
String md5 = jResponse.get("md5").getAsString();
currentSelfie.findByMd5(md5);
if (currentSelfie.getId_selfie() > 0L) {
JsonArray jLabels = jResponse.get("labels").getAsJsonArray();
JsonObject jLabelRow = jLabels.get(0).getAsJsonObject();
long predictedLabel = jLabelRow.get("label").getAsLong();
String predictedLabelMd5 = jLabelRow.get("labelMd5").getAsString();
double confidence = jLabelRow.get("confidence").getAsDouble();
currentSelfie.setLabel(predictedLabel);
currentSelfie.setConfidence(confidence);
currentSelfie.setLabelMd5(predictedLabelMd5);
rp = currentSelfie.save();
if (rp.getStatus()) {
totImgTrovate++;
} else {
errMsg.append(rp.getErrMsg());
errMsg.append("\n");
}
}
}
}
rp.setMsg("Trovate " + totImgTrovate + " immagini. ");
rp.setReturnObj(Long.valueOf(totImgTrovate));
if (errMsg.length() > 0) {
rp.setStatus(false);
rp.appendMsg(errMsg.toString());
} else {
rp.setStatus(true);
}
return rp;
}
public double getConfidence() {
return this.confidence;
}
public void setConfidence(double confidence) {
this.confidence = confidence;
}
public String getLabelMd5() {
return (this.labelMd5 == null) ? "" : this.labelMd5.trim();
}
public void setLabelMd5(String labelMd5) {
this.labelMd5 = labelMd5;
}
public long getFlgStatus() {
return this.flgStatus;
}
public static final String getStatus(long l_flgStatus) {
if (l_flgStatus == 0L)
return "Da elaborare";
if (l_flgStatus == 1L)
return "In elaborazione";
if (l_flgStatus == 99L)
return "Elaborazione Conclusa";
return "??";
}
public final String getStatus() {
return getStatus(getFlgStatus());
}
public void setFlgStatus(long flgStatus) {
this.flgStatus = flgStatus;
}
public ResParm updateFlgStatus(long flgStatus) {
if (getId_selfie() == 0L)
return new ResParm(false, "Selfie con id a 0");
ResParm rp = update("UPDATE SELFIE SET flgStatus=" + flgStatus + " where id_selfie=" + getId_selfie());
if (rp.getStatus())
setFlgStatus(flgStatus);
return rp;
}
public ResParm resetSelfie() {
if (getId_selfie() == 0L)
return new ResParm(false, "Selfie con id a 0");
ResParm rp = update("UPDATE SELFIE set flgStatus=0 , elencofoto = null where id_selfie=" + getId_selfie());
if (rp.getStatus()) {
setElencoFoto(null);
setFlgStatus(0L);
}
elaborazioniInCorso.remove(Long.valueOf(getId_selfie()));
return rp;
}
public long getId_evento() {
return this.id_evento;
}
public void setId_evento(long id_evento) {
this.id_evento = id_evento;
setEvento(null);
}
public Evento getEvento() {
this.evento = (Evento)getSecondaryObject(this.evento, Evento.class, getId_evento());
return this.evento;
}
public void setEvento(Evento evento) {
this.evento = evento;
}
public JsonObject getJsonResponseByEvento(long l_id_evento) {
boolean debug = true;
if (getId_selfie() == 0L)
return null;
JsonObject response = new JsonObject();
response.addProperty("md5", this.md5);
Evento evento = new Evento(getApFull());
evento.findByPrimaryKey(l_id_evento);
JsonArray labelsArray = new JsonArray();
FaceScore sf = new FaceScore(getApFull());
Vectumerator<FaceScore> vec = sf.findBySelfieEvento(getId_selfie(), l_id_evento);
while (vec.hasMoreElements()) {
FaceScore row = (FaceScore)vec.nextElement();
JsonObject jRow = new JsonObject();
if (evento.getScoreThresoldSelfieSearch2() == 0.0D || (double)row.getScore() >= evento.getScoreThresoldSelfieSearch2()) {
jRow.addProperty("confidence", Float.valueOf(row.getScore()));
jRow.addProperty("fileName", row.getFotoFace2().getFoto().getFileName());
jRow.addProperty("id", Long.valueOf(row.getId_fotoFace2()));
labelsArray.add((JsonElement)jRow);
}
}
if (debug)
DBAdapter.printDebug("elenco target score > di " +
evento.getScoreThresoldSelfieSearch2() + " labelsArray.size(): " + labelsArray.size());
if (labelsArray.size() > 0) {
long nTarget = getEvento().getScoreSelfieNTarget();
if (nTarget <= 0L)
nTarget = 2L;
long percTHreshold = getEvento().getScoreSelfieTargetThresold();
if (percTHreshold <= 0L)
percTHreshold = 10L;
double percentageThreshold = (double)percTHreshold / 100.0D;
DBAdapter.printDebug(debug, "getJsonResponseByEvento " + evento.getScoreThresoldSelfieSearch2() + " labelsArray.size(): " +
labelsArray.size() + "con n. target massimo " + nTarget + " e soglia di scarto massima " + percentageThreshold);
List<JsonObject> labels = new ArrayList<>();
for (JsonElement element : (Iterable<JsonElement>)labelsArray)
labels.add(element.getAsJsonObject());
labels.sort((a, b) -> Double.compare(b.get("confidence").getAsDouble(),
a.get("confidence").getAsDouble()));
double maxConfidence = labels.get(0).get("confidence").getAsDouble();
List<JsonObject> filteredLabels = (List<JsonObject>)labels.stream().filter(label ->
(label.get("confidence").getAsDouble() >= maxConfidence * (1.0D - percentageThreshold)))
.limit(nTarget).collect(Collectors.toList());
JsonArray filteredArray = new JsonArray();
Objects.requireNonNull(filteredArray);
filteredLabels.forEach(filteredArray::add);
Gson gson = new Gson();
DBAdapter.printDebug(debug, "Filtered JSON con n. target massimo " + nTarget + " e soglia di scarto massima " + percentageThreshold + "\n" +
gson.toJson((JsonElement)filteredArray) + "\n");
JsonArray resultArray = new JsonArray();
for (JsonElement element : (Iterable<JsonElement>)filteredArray)
resultArray.add(element);
for (JsonElement element : (Iterable<JsonElement>)filteredArray) {
JsonObject rowJo = element.getAsJsonObject();
long l_id_faceTarget = rowJo.get("id").getAsLong();
double l_confidenceTarget = rowJo.get("confidence").getAsDouble();
vec = sf.findQueryByFace(l_id_faceTarget, 0, 0);
DBAdapter.printDebug(debug, "carico query da : " + l_id_faceTarget + ". tot elementi: " + vec.getTotNumberOfRecords());
while (vec.hasMoreElements()) {
FaceScore row = (FaceScore)vec.nextElement();
JsonObject jRow = new JsonObject();
jRow.addProperty("confidence", Double.valueOf(l_confidenceTarget));
jRow.addProperty("fileName", row.getFotoFace2().getFoto().getFileName());
resultArray.add((JsonElement)jRow);
}
}
response.add("labels", (JsonElement)resultArray);
}
if (debug)
if (response.has("labels") && response.get("labels").isJsonArray()) {
JsonArray labels = response.getAsJsonArray("labels");
DBAdapter.printDebug(debug, "RISULTATO FINALE: Numero foto trovate: " + labels.size());
} else {
DBAdapter.printDebug(debug, "RISULTATO FINALE: Numero foto trovate: 0");
}
return response;
}
public JsonObject getJsonResponseByEventoERRATO(long l_id_evento) {
if (getId_selfie() == 0L)
return null;
JsonObject response = new JsonObject();
response.addProperty("md5", this.md5);
Evento evento = new Evento(getApFull());
evento.findByPrimaryKey(l_id_evento);
JsonArray labels = new JsonArray();
FaceScore sf = new FaceScore(getApFull());
Vectumerator<FaceScore> vec = sf.findBySelfieEvento(getId_selfie(), l_id_evento);
while (vec.hasMoreElements()) {
FaceScore row = (FaceScore)vec.nextElement();
JsonObject jRow = new JsonObject();
if (evento.getScoreThresoldSelfieSearch2() == 0.0D || evento.getScoreThresoldSelfieSearch2() >= (double)row.getScore()) {
jRow.addProperty("confidence", Float.valueOf(row.getScore()));
jRow.addProperty("fileName", row.getFotoFace2().getFoto().getFileName());
labels.add((JsonElement)jRow);
}
}
response.add("labels", (JsonElement)labels);
return response;
}
public String getFileAlternativo() {
return (this.fileAlternativo == null) ? "" : this.fileAlternativo.trim();
}
public void setFileAlternativo(String fileAlternativo) {
this.fileAlternativo = fileAlternativo;
}
public String getMd5Face() {
return (this.md5Face == null) ? "" : this.md5Face.trim();
}
public void setMd5Face(String md5Source) {
this.md5Face = md5Source;
}
public final ResParm detectFaceWww(boolean force) {
boolean debug = true;
ResParm rp = new ResParm();
DBAdapter.printDebug(debug, "0 Selfie.detectFace call api.......");
if (getId_selfie() == 0L || getApFull() == null) {
rp.setStatus(false);
rp.setMsg("Errore! Selfie non valido");
}
double confidenceThresold = 0.85D;
String sourceMd5 = DBAdapter.getFileMd5(getFullFileNameSelfie());
setMd5Face(sourceMd5);
DBAdapter.printDebug(debug, "1-------------------- Selfie.detectFace ** ------------------------foto md5source: " + sourceMd5);
if (!force);
DBAdapter.printDebug(debug, "Selfie.detectFace: " + getId_selfie() + " " + getFullFileNameSelfie());
String userFR = getParm("FACE_RECOGNITION_API_USER").getTesto();
String pwdFR = getParm("FACE_RECOGNITION_API_PWD").getTesto();
FaceRecognitionApi bean = new FaceRecognitionApi(getApFull(), userFR, pwdFR);
DBAdapter.printDebug(debug, "2 Selfie.detectFace call api foto md5source: " + sourceMd5);
FaceRecognitionApiResult resF = bean.__detectFaces(getFullFileNameSelfieWww(), sourceMd5, 20L, false, confidenceThresold, false);
if (resF.isOk()) {
DBAdapter.printDebug("3 Selfie.detectFace ok... chiamo Selfie.createFaceByFaceRecognitionJson foto md5source: " + sourceMd5);
return createFaceByFaceRecognitionJsonWww((JsonObject)resF.getResult());
}
DBAdapter.printDebug(debug, "4 Selfie.detectFace KO foto md5: " + sourceMd5);
rp.setStatus(false);
rp.setMsg(resF.getMsg() + " id_Selfie: " + resF.getMsg());
return rp;
}
protected final ResParm createFaceByFaceRecognitionJsonWww(JsonObject jo) {
ResParm rp = new ResParm();
boolean debug = false;
DBAdapter.printDebug("1-------------------- createFaceByFaceRecognitionJson ------------------------ id_userGara: " +
getId_selfie());
long minDimFoto = 45L;
try {
if (getId_selfie() == 0L || getApFull() == null) {
rp.setStatus(false);
rp.setMsg("Errore! Foto Selfie non valido....");
}
StringBuilder msg = new StringBuilder();
int numOfNUmbers = 0;
int numOfFaces = 0;
int numOfSmallFaces = 0;
long totFaces = 0L;
int faceWidth = 192;
int faceExtraMargin = 10;
JsonArray jaResponses = jo.get("responses").getAsJsonArray();
boolean visiTrovati = false;
if (jaResponses.size() > 0) {
JsonObject joResponse = jaResponses.get(0).getAsJsonObject().getAsJsonObject("response");
String md5Response = joResponse.get("md5").getAsString().trim();
System.out.println("1.1 md5response: " + md5Response + " md5source: " + getMd5Face());
if (md5Response.equals(getMd5Face())) {
DBAdapter.printDebug(debug, "2 foto md5source: " +
getMd5Face() + " joResponse:\n" + DBAdapter.gsonToString(joResponse));
if (joResponse.has("faceAnnotations")) {
visiTrovati = true;
JsonArray jaFaceAnnotations = joResponse.getAsJsonArray("faceAnnotations");
numOfFaces = jaFaceAnnotations.size();
if (numOfFaces > 1) {
rp.setStatus(false);
rp.setMsg("Attenzione! Trovati " + numOfFaces + " visi");
} else {
JsonObject joFaceAnnotation = jaFaceAnnotations.get(0).getAsJsonObject();
JsonObject joFace = new JsonObject();
JsonObject joFdBoundingPoly = joFaceAnnotation.getAsJsonObject("fdBoundingPoly");
joFace.add("fdBoundingPoly", (JsonElement)joFdBoundingPoly);
JsonArray jaVertices = joFdBoundingPoly.getAsJsonArray("vertices");
JsonObject joTopLeft = jaVertices.get(0).getAsJsonObject();
JsonObject joBottomRight = jaVertices.get(2).getAsJsonObject();
boolean noDetect = false;
long faceBottomVx = 0L, faceBottomVy = 0L, faceTopVx = 0L, faceTopVy = 0L;
if (joBottomRight.has("x")) {
faceBottomVx = joBottomRight.get("x").getAsLong();
faceBottomVy = joBottomRight.get("y").getAsLong();
} else {
noDetect = true;
}
if (joTopLeft.has("x")) {
faceTopVx = joTopLeft.get("x").getAsLong();
faceTopVy = joTopLeft.get("y").getAsLong();
} else {
noDetect = true;
}
DBAdapter.printDebug(debug, "3 foto md5source: " + getMd5Face() + " salvo vertici : joface\n" +
DBAdapter.gsonToString(joFace));
long latoX = Math.abs(faceBottomVx - faceBottomVy);
DBAdapter.printDebug(debug, "5 faceBottomVx:" + faceBottomVx + " faceBottomVy:" + faceBottomVy + " faceTopVx:" + faceTopVx + " faceTopVy:" + faceTopVy + "\nlatoX: " + latoX + " dimfoto:" + minDimFoto);
if (latoX >= minDimFoto) {
rp = FaceRecognitionApi.createFace(getFullFileNameSelfieWww(), getFullFileNameFaceWww(faceWidth), faceTopVx, faceTopVy, faceBottomVx, faceBottomVy, faceWidth, faceExtraMargin, true);
rp = save();
} else {
numOfSmallFaces++;
rp.setStatus(false);
rp.setMsg("Attenzione! identificato viso troppo piccolo!");
}
if (!rp.getStatus())
DBAdapter.printDebug(debug, "6 foto md5source: " + getMd5Face() + " errore : " + rp.getMsg());
}
}
} else {
rp.setStatus(false);
rp.setMsg("ERRORE! md5 invio diverso da md5 response. md5source:" + getMd5Face() + " --> " + md5Response);
System.out.println(DBAdapter.getNowTsB() + " 9999 foto md5source: " + DBAdapter.getNowTsB() + " md5 response: " + getMd5Face() + " **************************** createFaceByFaceRecognitionJson **************************");
}
}
if (msg.length() > 0) {
rp.setStatus(false);
rp.setMsg(msg.toString());
}
if (rp.getStatus())
rp.setMsg("Trovati " + numOfFaces + "(" + totFaces + ") visi e " + numOfNUmbers + " numeri foto piccole: " + numOfSmallFaces);
} catch (Exception e) {
e.printStackTrace();
rp.setStatus(false);
rp.setMsg(e);
}
DBAdapter.printDebug(debug, " 8 foto md5source: " + getMd5Face() + " **************************** createFaceByFaceRecognitionJson **************************");
return rp;
}
public String getElencoFoto() {
if (this.elencoFoto == null)
return "";
return DBAdapter.removeDuplicates(this.elencoFoto, ",");
}
public void setElencoFoto(String elencofoto) {
this.elencoFoto = elencofoto;
setElencoFotoExt(null);
}
public synchronized void startThreadUpdateElencoFotoScoring() {
DBAdapter.printDebug(true, "SelfieFE -> startThreadUpdateElencoFotoScoring... inizio");
long id = getId_selfie();
if (elaborazioniInCorso.containsKey(Long.valueOf(id))) {
DBAdapter.printDebug(true, "ELABORAZIONE GIA' IN CORSO PER SELFIE ID: " + id);
return;
}
elaborazioniInCorso.put(Long.valueOf(id), Boolean.valueOf(true));
DBAdapter.printDebug(true, "=====> ELABORAZIONE IN CORSO PER SELFIE ID: " + id);
if (getId_selfie() > 0L && getCodGara() > 0L && getFlgStatus() != 99L)
new Thread(() -> {
try {
boolean debug = false;
long l_flgStatus = 0L;
DBAdapter.printDebug(debug, "SelfieFE -> chiamata scoring. status: " + getFlgStatus());
FaceRecognitionApi frApi = new FaceRecognitionApi(getApFull());
DBAdapter.printDebug(debug, " selfieFE.startThreadUpdateElencoFotoScoring chiamata __scoringSelfie");
FaceRecognitionApiResult res = frApi.__scoringSelfie(getCodGara(), getFullFileNameFaceWww(192), getMd5(), false, false);
if (!res.isOk()) {
JsonObject jsonObject = res.getJsonObjectResult();
DBAdapter.printDebug(debug, "No img:\n" + DBAdapter.gsonToString(jsonObject));
if (jsonObject != null && jsonObject.has("noImg")) {
DBAdapter.printDebug(debug, "No img NUOVA RICHIESTA");
res = frApi.__scoringSelfie(getCodGara(), getFullFileNameFaceWww(192), getMd5(), true, false);
}
}
DBAdapter.printDebug(debug, "selfieFE RES:" + res.isOk());
if (res.isOk()) {
JsonObject jsonObject = res.getJsonObjectResult();
JsonObject response = jsonObject.getAsJsonObject("response");
StringBuilder elencoFotoScoring = new StringBuilder();
JsonArray labels = null;
JsonElement elem = response.get("labels");
if (elem != null && elem.isJsonArray()) {
labels = elem.getAsJsonArray();
DBAdapter.printDebug(debug, "selfieFE Risultato elab:. n. labels: " + labels.size());
} else {
DBAdapter.printDebug(debug, "selfieFE Risultato elab SENZA LABELS:\n" + DBAdapter.gsonToString(response));
}
if (labels != null)
for (int i = 0; i < labels.size(); i++) {
JsonObject labelObject = labels.get(i).getAsJsonObject();
double confidence = labelObject.get("confidence").getAsDouble();
String fileName = labelObject.get("fileName").getAsString();
if (elencoFotoScoring.length() > 0)
elencoFotoScoring.append(",");
elencoFotoScoring.append(fileName);
}
if (!getElencoFoto().equals(elencoFotoScoring.toString())) {
setElencoFoto(elencoFotoScoring.toString());
ResParm rp = super.save();
DBAdapter.printDebug("selfieFE updateElencoFotoScoring rp: " + rp.getMsg() + " adesso su selfie ho elencofoto:\n" +
getElencoFoto());
} else {
DBAdapter.printDebug(debug, "selfieFE updateElencoFotoScoring non ho salvato perché uguali");
}
if (jsonObject.has("status"))
l_flgStatus = jsonObject.get("status").getAsLong();
} else {
l_flgStatus = 0L;
DBAdapter.printDebug(debug, "selfieFE RES IS NOT OK --> save status STATUS_DA_ELABORARE_0 ");
superSave();
}
} finally {
elaborazioniInCorso.remove(Long.valueOf(id));
DBAdapter.printDebug(true, "======> ELABORAZIONE TERMINTATA PER selfie ID: " + id);
}
}).start();
}
public ResParm superSave() {
return super.save();
}
public long getCodGara() {
return this.codGara;
}
public void setCodGara(long codGara) {
this.codGara = codGara;
}
public String getElencoFotoExt() {
if (getEvento().getSelfieRangeExt() == 0L) {
setRangeExt(getEvento().getSelfieRangeExt());
DBAdapter.printDebug("getElencoFotoExt ritorno elenco foto");
calcolaElencoFotoExt(1L);
return getElencoFoto();
}
if (getRangeExt() != getEvento().getSelfieRangeExt() || this.elencoFotoExt == null || this.elencoFotoExt.isEmpty())
calcolaElencoFotoExt(getEvento().getSelfieRangeExt());
DBAdapter.printDebug("RITORNO ELENCOFOTOEXT: " + this.elencoFotoExt);
return this.elencoFotoExt;
}
private void calcolaElencoFotoExt(long range) {
boolean debug = false;
DBAdapter.printDebug(debug, "updateElencoFotoExt");
if (getId_selfie() == 0L || getElencoFoto().isEmpty() || range <= 0L)
return;
String s_sql_find = "SELECT DISTINCT f2.filename FROM foto f1 JOIN foto f2 ON f1.id_evento = f2.id_evento AND f1.id_puntofoto = f2.id_puntofoto AND ABS(TIME_TO_SEC(f1.tempo) - TIME_TO_SEC(f2.tempo)) <=" + range;
String s_sql_order = " order by f2.filename";
WcString wc = new WcString();
wc.addWc("f1.id_evento=" + getId_evento());
wc.addWc("f1.filename IN (" + convertToSqlInList(getElencoFoto()) + ")");
DBAdapter.printDebug(debug, "updateElencoFotoExt: " + s_sql_find + wc.toString() + s_sql_order);
try {
PreparedStatement stmt = getConn().prepareStatement(s_sql_find + s_sql_find + wc.toString());
ResultSet rst = stmt.executeQuery();
StringBuilder sb = new StringBuilder();
while (rst.next()) {
if (sb.length() > 0)
sb.append(",");
String filename = rst.getString("filename");
sb.append(filename);
}
updateElencoFotoExt(sb.toString(), range);
DBAdapter.printDebug(debug, "updateElencoFotoExt salvato: " + sb.toString());
} catch (SQLException e) {
removeCPConnection();
handleDebug(e);
}
}
public ResParm updateElencoFotoExt(String l_elencoFotoExt, long l_rangeExt) {
boolean debug = false;
if (getId_evento() == 0L)
return new ResParm(false, "Evento con id a 0");
DBAdapter.printDebug(debug, "UPDATE SELFIE SET elencoFotoExt='" + l_elencoFotoExt + "', rangeExt=" + l_rangeExt + " where id_selfie=" +
getId_selfie());
ResParm rp = update("UPDATE SELFIE SET elencoFotoExt='" + l_elencoFotoExt + "', rangeExt=" + l_rangeExt + " where id_selfie=" +
getId_selfie());
if (rp.getStatus())
setElencoFotoExt(l_elencoFotoExt);
DBAdapter.printDebug(debug, "SALVATAGGIO rp: " + rp.getMsg());
return rp;
}
public static String convertToSqlInList(String commaSeparatedFilenames) {
return (String)Arrays.<String>stream(commaSeparatedFilenames.split(",")).map(String::trim).map(s -> "'" + s + "'")
.collect(Collectors.joining(", "));
}
public void setElencoFotoExt(String elencoFotoExt) {
this.elencoFotoExt = elencoFotoExt;
}
protected void fillFields(ResultSet rst) {
super.fillFields(rst);
try {
if (isColumnInResultSet(rst, "elencoFotoExt"))
setElencoFotoExt(rst.getString("elencoFotoExt"));
} catch (SQLException e) {
e.printStackTrace();
}
}
public long getRangeExt() {
return this.rangeExt;
}
public void setRangeExt(long rangeExt) {
this.rangeExt = rangeExt;
}
@Deprecated
public ResParm updateElencoFoto(String l_updateElencoFoto) {
if (getId_evento() == 0L)
return new ResParm(false, "Evento con id a 0");
ResParm rp = update("UPDATE SELFIE SET elencoFoto='" + l_updateElencoFoto + "' where id_selfie=" + getId_selfie());
if (rp.getStatus())
setElencoFoto(l_updateElencoFoto);
return rp;
}
}