|
|
@@ -177,7 +177,7 @@ int ClassFlowCNNGeneral::ZeigerEvalHybridNeu(float zahl, float zahl_vorgaenger,
|
|
|
result = (ergebnis_vorkomma + 1) % 10;
|
|
|
else
|
|
|
// Akt. digit und Vorgänger haben Nulldurchgang
|
|
|
- result = ergebnis_vorkomma;
|
|
|
+ result = ergebnis_vorkomma % 10;
|
|
|
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "ZeigerEvalHybridNeu - KEIN Analoger Vorgänger, Nulldurchgang hat stattgefunden = " + std::to_string(result) +
|
|
|
" zahl: " + std::to_string(zahl) + " zahl_vorgaenger = " + std::to_string(zahl_vorgaenger)+ " eval_vorgaenger = " + std::to_string(eval_vorgaenger) + " DigitalUnschaerfe = " + std::to_string(DigitalUnschaerfe));
|
|
|
return result;
|
|
|
@@ -191,7 +191,7 @@ int ClassFlowCNNGeneral::ZeigerEvalHybridNeu(float zahl, float zahl_vorgaenger,
|
|
|
// Vorlauf (else - Zweig) passiert nicht bereits ab 9.
|
|
|
if (DigitalUebergangsbereichVorlauf>=zahl_vorgaenger || ergebnis_nachkomma >= 4)
|
|
|
// aktuelles digit hat genauso wie das Vorgängerdigit noch keinen Nulldurchgang.
|
|
|
- result = ergebnis_vorkomma;
|
|
|
+ result = ergebnis_vorkomma % 10;
|
|
|
else
|
|
|
// aktuelles digit läuft dem kleineren digit (9.x) vor. Also schon >=x.0 während das vorherige Digit noch
|
|
|
// keinen Nulldurchgang hat. Daher wird um 1 reduziert.
|
|
|
@@ -211,7 +211,8 @@ int ClassFlowCNNGeneral::ZeigerEvalAnalogToDigitNeu(float zahl, float ziffer_vor
|
|
|
bool roundedUp = false;
|
|
|
|
|
|
// Innerhalb der digitalen Unschaefe
|
|
|
- if (ergebnis_nachkomma >= (10-DigitalUnschaerfe * 10)) { // Band um die Ziffer --> Runden, da Ziffer im Rahmen Ungenauigkeit erreicht
|
|
|
+ if ((ergebnis_nachkomma >= (10-DigitalUnschaerfe * 10)) // Band um die Ziffer --> Runden, da Ziffer im Rahmen Ungenauigkeit erreicht
|
|
|
+ || (eval_vorgaenger <= 4 && ergebnis_nachkomma>=6)) { // oder digit läuft nach (analog =0..4, digit >=6)
|
|
|
result = (int) (round(zahl) + 10) % 10;
|
|
|
roundedUp = true;
|
|
|
// vor/nachkomma neu berechnen, da wir anhand der Unschaefe die Zahl anpassen.
|
|
|
@@ -230,11 +231,7 @@ int ClassFlowCNNGeneral::ZeigerEvalAnalogToDigitNeu(float zahl, float ziffer_vor
|
|
|
// Kein Nulldurchgang hat stattgefunden.
|
|
|
// Nur eval_vorgaenger verwendet, da ziffer_vorgaenger hier falsch sein könnte.
|
|
|
// ziffer_vorgaenger<=0.1 & eval_vorgaenger=9 entspricht analog wurde zurückgesetzt wegen vorhergehender analog, die noch nicht auf 0 sind.
|
|
|
- if ((eval_vorgaenger>=6 && (ziffer_vorgaenger>analogDigitalTransitionStart || ziffer_vorgaenger<=0.2) && roundedUp)
|
|
|
- // digit läuft dem Analog vor. Darf aber erst passieren, wenn
|
|
|
- // digit wirklich schnon los läuft, deshalb 9
|
|
|
- || (eval_vorgaenger>9 && ziffer_vorgaenger>analogDigitalTransitionStart && ergebnis_nachkomma<=1))
|
|
|
-
|
|
|
+ if ((eval_vorgaenger>=6 && (ziffer_vorgaenger>analogDigitalTransitionStart || ziffer_vorgaenger<=0.2) && roundedUp))
|
|
|
{
|
|
|
result = ((ergebnis_vorkomma+10) - 1) % 10;
|
|
|
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "ZeigerEvalAnalogToDigitNeu - Nulldurchgang noch nicht stattgefunden = " + std::to_string(result) +
|
|
|
@@ -623,19 +620,22 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(string time)
|
|
|
}
|
|
|
tflite->MakeAllocate();
|
|
|
|
|
|
- for (int _ana = 0; _ana < GENERAL.size(); ++_ana)
|
|
|
+ for (int n = 0; n < GENERAL.size(); ++n) // For each NUMBER
|
|
|
{
|
|
|
- for (int i = 0; i < GENERAL[_ana]->ROI.size(); ++i)
|
|
|
+ LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "Processing Number '" + GENERAL[n]->name + "'");
|
|
|
+ for (int roi = 0; roi < GENERAL[n]->ROI.size(); ++roi) // For each ROI
|
|
|
{
|
|
|
- ESP_LOGD(TAG, "General %d - TfLite", i);
|
|
|
+ LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "ROI #" + std::to_string(roi) + " - TfLite");
|
|
|
+ //ESP_LOGD(TAG, "General %d - TfLite", i);
|
|
|
|
|
|
switch (CNNType) {
|
|
|
case Analogue:
|
|
|
+ LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "CNN Type: Analogue");
|
|
|
{
|
|
|
float f1, f2;
|
|
|
f1 = 0; f2 = 0;
|
|
|
|
|
|
- tflite->LoadInputImageBasis(GENERAL[_ana]->ROI[i]->image);
|
|
|
+ tflite->LoadInputImageBasis(GENERAL[n]->ROI[roi]->image);
|
|
|
tflite->Invoke();
|
|
|
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "Nach Invoke");
|
|
|
|
|
|
@@ -643,39 +643,41 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(string time)
|
|
|
f2 = tflite->GetOutputValue(1);
|
|
|
float result = fmod(atan2(f1, f2) / (M_PI * 2) + 2, 1);
|
|
|
|
|
|
- if(GENERAL[_ana]->ROI[i]->CCW)
|
|
|
- GENERAL[_ana]->ROI[i]->result_float = 10 - (result * 10);
|
|
|
+ if(GENERAL[n]->ROI[roi]->CCW)
|
|
|
+ GENERAL[n]->ROI[roi]->result_float = 10 - (result * 10);
|
|
|
else
|
|
|
- GENERAL[_ana]->ROI[i]->result_float = result * 10;
|
|
|
+ GENERAL[n]->ROI[roi]->result_float = result * 10;
|
|
|
|
|
|
- ESP_LOGD(TAG, "Result General(Analog)%i - CCW: %d - %f", i, GENERAL[_ana]->ROI[i]->CCW, GENERAL[_ana]->ROI[i]->result_float);
|
|
|
+ ESP_LOGD(TAG, "Result General(Analog)%i - CCW: %d - %f", roi, GENERAL[n]->ROI[roi]->CCW, GENERAL[n]->ROI[roi]->result_float);
|
|
|
if (isLogImage)
|
|
|
- LogImage(logPath, GENERAL[_ana]->ROI[i]->name, &GENERAL[_ana]->ROI[i]->result_float, NULL, time, GENERAL[_ana]->ROI[i]->image_org);
|
|
|
+ LogImage(logPath, GENERAL[n]->ROI[roi]->name, &GENERAL[n]->ROI[roi]->result_float, NULL, time, GENERAL[n]->ROI[roi]->image_org);
|
|
|
} break;
|
|
|
|
|
|
case Digital:
|
|
|
+ LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "CNN Type: Digital");
|
|
|
{
|
|
|
- GENERAL[_ana]->ROI[i]->result_klasse = 0;
|
|
|
- GENERAL[_ana]->ROI[i]->result_klasse = tflite->GetClassFromImageBasis(GENERAL[_ana]->ROI[i]->image);
|
|
|
- ESP_LOGD(TAG, "Result General(Digit)%i: %d", i, GENERAL[_ana]->ROI[i]->result_klasse);
|
|
|
+ GENERAL[n]->ROI[roi]->result_klasse = 0;
|
|
|
+ GENERAL[n]->ROI[roi]->result_klasse = tflite->GetClassFromImageBasis(GENERAL[n]->ROI[roi]->image);
|
|
|
+ ESP_LOGD(TAG, "Result General(Digit)%i: %d", roi, GENERAL[n]->ROI[roi]->result_klasse);
|
|
|
|
|
|
if (isLogImage)
|
|
|
{
|
|
|
- string _imagename = GENERAL[_ana]->name + "_" + GENERAL[_ana]->ROI[i]->name;
|
|
|
+ string _imagename = GENERAL[n]->name + "_" + GENERAL[n]->ROI[roi]->name;
|
|
|
if (isLogImageSelect)
|
|
|
{
|
|
|
- if (LogImageSelect.find(GENERAL[_ana]->ROI[i]->name) != std::string::npos)
|
|
|
- LogImage(logPath, _imagename, NULL, &GENERAL[_ana]->ROI[i]->result_klasse, time, GENERAL[_ana]->ROI[i]->image_org);
|
|
|
+ if (LogImageSelect.find(GENERAL[n]->ROI[roi]->name) != std::string::npos)
|
|
|
+ LogImage(logPath, _imagename, NULL, &GENERAL[n]->ROI[roi]->result_klasse, time, GENERAL[n]->ROI[roi]->image_org);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- LogImage(logPath, _imagename, NULL, &GENERAL[_ana]->ROI[i]->result_klasse, time, GENERAL[_ana]->ROI[i]->image_org);
|
|
|
+ LogImage(logPath, _imagename, NULL, &GENERAL[n]->ROI[roi]->result_klasse, time, GENERAL[n]->ROI[roi]->image_org);
|
|
|
}
|
|
|
}
|
|
|
} break;
|
|
|
/*
|
|
|
case DigitalHyprid:
|
|
|
{
|
|
|
+ LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "CNN Type: DigitalHyprid");
|
|
|
int _num, _nachkomma;
|
|
|
|
|
|
tflite->LoadInputImageBasis(GENERAL[_ana]->ROI[i]->image);
|
|
|
@@ -716,6 +718,7 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(string time)
|
|
|
/*
|
|
|
case DigitalHyprid10:
|
|
|
{
|
|
|
+ LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "CNN Type: DigitalHyprid10");
|
|
|
int _num, _nachkomma;
|
|
|
|
|
|
tflite->LoadInputImageBasis(GENERAL[_ana]->ROI[i]->image);
|
|
|
@@ -753,12 +756,13 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(string time)
|
|
|
|
|
|
case DoubleHyprid10:
|
|
|
{
|
|
|
+ LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "CNN Type: DoubleHyprid10");
|
|
|
int _num, _numplus, _numminus;
|
|
|
float _val, _valplus, _valminus;
|
|
|
float _fit;
|
|
|
float _result_save_file;
|
|
|
|
|
|
- tflite->LoadInputImageBasis(GENERAL[_ana]->ROI[i]->image);
|
|
|
+ tflite->LoadInputImageBasis(GENERAL[n]->ROI[roi]->image);
|
|
|
tflite->Invoke();
|
|
|
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "Nach Invoke");
|
|
|
|
|
|
@@ -798,7 +802,7 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(string time)
|
|
|
|
|
|
if (_fit < CNNGoodThreshold)
|
|
|
{
|
|
|
- GENERAL[_ana]->ROI[i]->isReject = true;
|
|
|
+ GENERAL[n]->ROI[roi]->isReject = true;
|
|
|
result = -1;
|
|
|
_result_save_file+= 100; // Für den Fall, dass fit nicht ausreichend, soll trotzdem das Ergebnis mit "-10x.y" abgespeichert werden.
|
|
|
string zw = "Value Rejected due to Threshold (Fit: " + to_string(_fit) + "Threshold: " + to_string(CNNGoodThreshold) + ")";
|
|
|
@@ -806,24 +810,24 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(string time)
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- GENERAL[_ana]->ROI[i]->isReject = false;
|
|
|
+ GENERAL[n]->ROI[roi]->isReject = false;
|
|
|
}
|
|
|
|
|
|
|
|
|
- GENERAL[_ana]->ROI[i]->result_float = result;
|
|
|
- ESP_LOGD(TAG, "Result General(Analog)%i: %f", i, GENERAL[_ana]->ROI[i]->result_float);
|
|
|
+ GENERAL[n]->ROI[roi]->result_float = result;
|
|
|
+ ESP_LOGD(TAG, "Result General(Analog)%i: %f", roi, GENERAL[n]->ROI[roi]->result_float);
|
|
|
|
|
|
if (isLogImage)
|
|
|
{
|
|
|
- string _imagename = GENERAL[_ana]->name + "_" + GENERAL[_ana]->ROI[i]->name;
|
|
|
+ string _imagename = GENERAL[n]->name + "_" + GENERAL[n]->ROI[roi]->name;
|
|
|
if (isLogImageSelect)
|
|
|
{
|
|
|
- if (LogImageSelect.find(GENERAL[_ana]->ROI[i]->name) != std::string::npos)
|
|
|
- LogImage(logPath, _imagename, &_result_save_file, NULL, time, GENERAL[_ana]->ROI[i]->image_org);
|
|
|
+ if (LogImageSelect.find(GENERAL[n]->ROI[roi]->name) != std::string::npos)
|
|
|
+ LogImage(logPath, _imagename, &_result_save_file, NULL, time, GENERAL[n]->ROI[roi]->image_org);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- LogImage(logPath, _imagename, &_result_save_file, NULL, time, GENERAL[_ana]->ROI[i]->image_org);
|
|
|
+ LogImage(logPath, _imagename, &_result_save_file, NULL, time, GENERAL[n]->ROI[roi]->image_org);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -831,37 +835,38 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(string time)
|
|
|
case Digital100:
|
|
|
case Analogue100:
|
|
|
{
|
|
|
+ LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "CNN Type: Digital100 or Analogue100");
|
|
|
int _num;
|
|
|
float _result_save_file;
|
|
|
|
|
|
- tflite->LoadInputImageBasis(GENERAL[_ana]->ROI[i]->image);
|
|
|
+ tflite->LoadInputImageBasis(GENERAL[n]->ROI[roi]->image);
|
|
|
tflite->Invoke();
|
|
|
|
|
|
_num = tflite->GetOutClassification();
|
|
|
|
|
|
- if(GENERAL[_ana]->ROI[i]->CCW)
|
|
|
- GENERAL[_ana]->ROI[i]->result_float = 10 - ((float)_num / 10.0);
|
|
|
+ if(GENERAL[n]->ROI[roi]->CCW)
|
|
|
+ GENERAL[n]->ROI[roi]->result_float = 10 - ((float)_num / 10.0);
|
|
|
else
|
|
|
- GENERAL[_ana]->ROI[i]->result_float = (float)_num / 10.0;
|
|
|
+ GENERAL[n]->ROI[roi]->result_float = (float)_num / 10.0;
|
|
|
|
|
|
- _result_save_file = GENERAL[_ana]->ROI[i]->result_float;
|
|
|
+ _result_save_file = GENERAL[n]->ROI[roi]->result_float;
|
|
|
|
|
|
|
|
|
- GENERAL[_ana]->ROI[i]->isReject = false;
|
|
|
+ GENERAL[n]->ROI[roi]->isReject = false;
|
|
|
|
|
|
- ESP_LOGD(TAG, "Result General(Analog)%i - CCW: %d - %f", i, GENERAL[_ana]->ROI[i]->CCW, GENERAL[_ana]->ROI[i]->result_float);
|
|
|
+ ESP_LOGD(TAG, "Result General(Analog)%i - CCW: %d - %f", roi, GENERAL[n]->ROI[roi]->CCW, GENERAL[n]->ROI[roi]->result_float);
|
|
|
|
|
|
if (isLogImage)
|
|
|
{
|
|
|
- string _imagename = GENERAL[_ana]->name + "_" + GENERAL[_ana]->ROI[i]->name;
|
|
|
+ string _imagename = GENERAL[n]->name + "_" + GENERAL[n]->ROI[roi]->name;
|
|
|
if (isLogImageSelect)
|
|
|
{
|
|
|
- if (LogImageSelect.find(GENERAL[_ana]->ROI[i]->name) != std::string::npos)
|
|
|
- LogImage(logPath, _imagename, &_result_save_file, NULL, time, GENERAL[_ana]->ROI[i]->image_org);
|
|
|
+ if (LogImageSelect.find(GENERAL[n]->ROI[roi]->name) != std::string::npos)
|
|
|
+ LogImage(logPath, _imagename, &_result_save_file, NULL, time, GENERAL[n]->ROI[roi]->image_org);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- LogImage(logPath, _imagename, &_result_save_file, NULL, time, GENERAL[_ana]->ROI[i]->image_org);
|
|
|
+ LogImage(logPath, _imagename, &_result_save_file, NULL, time, GENERAL[n]->ROI[roi]->image_org);
|
|
|
}
|
|
|
}
|
|
|
|