diff --git a/README.md b/README.md index 76054055..7546ce24 100644 --- a/README.md +++ b/README.md @@ -19,30 +19,27 @@ A 3d-printable housing can be found here: https://www.thingiverse.com/thing:4571 ### Known Issues -* spontaneous reboot, especially in case of intensive web server access (improved since v2.1.0) +* reboot on extensive web access due to the limits of the internal web server ------ **General remark:** Beside the `firmware.bin`, typically also the content of `/html` needs to be updated! -##### Rolling - (2020-11-08) -* Implementation of rolling log-files - can be controlled by parameter: `LogfileRetentionInDays = 2` - that means log files will be deleted after 2 days - Many thanks to **[zwer2k](https://forum.iobroker.net/user/zwer2k)** -* Bug-fixing for reducing reboots - internal memory removed - - Many thanks to **[hike6688](https://github.com/hike6688)** + +##### Rolling - (2020-11-15) + +* based on v4.0.0 (2020-11-15) + -2020-11-08 +##### 4.0.0 Tflite Core - (2020-11-15) +* Implementation of rolling log-files -* Updated Tensorflow tflite Kernel to master@20201108 (R2.4?) - -2020-11-03 - -* Bug-Fix in time sync on warm reboot - -* based on v3.1.0 (2020-10-26) +* Update Tflite-Core to master@20201108 (v2.4) +* Bug-fixing for reducing reboots + ##### 3.1.0 MQTT-Client - (2020-10-26) @@ -64,7 +61,6 @@ A 3d-printable housing can be found here: https://www.thingiverse.com/thing:4571 * Bug-Fixing (hostname in wlan.ini and error handling inside flow) - ##### 2.2.0 Version Control (2020-09-27) @@ -73,8 +69,6 @@ A 3d-printable housing can be found here: https://www.thingiverse.com/thing:4571 * Update Build-System to PlatformIO - Espressif 32 v2.0.0 (ESP-IDF 4.1) - - ##### 2.1.0 Decimal Shift, Chrome & Edge (2020-09-25) * Implementation of Decimal Shift @@ -91,7 +85,6 @@ A 3d-printable housing can be found here: https://www.thingiverse.com/thing:4571 * Bug fixing, code corrections - ##### 2.0.0 Layout update (2020-09-12) diff --git a/code/lib/jomjol_tfliteclass/CTfLiteClass._cpp_old b/code/lib/jomjol_tfliteclass/CTfLiteClass._cpp_old deleted file mode 100644 index dcd56ce0..00000000 --- a/code/lib/jomjol_tfliteclass/CTfLiteClass._cpp_old +++ /dev/null @@ -1,254 +0,0 @@ -#include "CTfLiteClass.h" - -#include "bitmap_image.hpp" - -#include - -float CTfLiteClass::GetOutputValue(int nr) -{ - TfLiteTensor* output2 = this->interpreter->output(0); - - int numeroutput = output2->dims->data[1]; - if ((nr+1) > numeroutput) - return -1000; - - return output2->data.f[nr]; -} - - -int CTfLiteClass::GetClassFromImage(std::string _fn) -{ -// printf("Before Load image %s\n", _fn.c_str()); - if (!LoadInputImage(_fn)) - return -1000; -// printf("After Load image %s\n", _fn.c_str()); - - Invoke(); - printf("After Invoke %s\n", _fn.c_str()); - - return GetOutClassification(); -// return 0; -} - -int CTfLiteClass::GetOutClassification() -{ - TfLiteTensor* output2 = interpreter->output(0); - - float zw_max = 0; - float zw; - int zw_class = -1; - - if (output2 == NULL) - return -1; - - int numeroutput = output2->dims->data[1]; - for (int i = 0; i < numeroutput; ++i) - { - zw = output2->data.f[i]; - if (zw > zw_max) - { - zw_max = zw; - zw_class = i; - } - } -// printf("Result Ziffer: %d\n", zw_class); - return zw_class; -} - -void CTfLiteClass::GetInputDimension(bool silent = false) -{ - TfLiteTensor* input2 = this->interpreter->input(0); - - int numdim = input2->dims->size; - if (!silent) printf("NumDimension: %d\n", numdim); - - int sizeofdim; - for (int j = 0; j < numdim; ++j) - { - sizeofdim = input2->dims->data[j]; - if (!silent) printf("SizeOfDimension %d: %d\n", j, sizeofdim); - if (j == 1) im_height = sizeofdim; - if (j == 2) im_width = sizeofdim; - if (j == 3) im_channel = sizeofdim; - } -} - - -void CTfLiteClass::GetOutPut() -{ - TfLiteTensor* output2 = this->interpreter->output(0); - - int numdim = output2->dims->size; - printf("NumDimension: %d\n", numdim); - - int sizeofdim; - for (int j = 0; j < numdim; ++j) - { - sizeofdim = output2->dims->data[j]; - printf("SizeOfDimension %d: %d\n", j, sizeofdim); - } - - - float fo; - - // Process the inference results. - int numeroutput = output2->dims->data[1]; - for (int i = 0; i < numeroutput; ++i) - { - fo = output2->data.f[i]; - printf("Result %d: %f\n", i, fo); - } -} - -void CTfLiteClass::Invoke() -{ - interpreter->Invoke(); -// printf("Invoke Done.\n"); -} - - -bool CTfLiteClass::LoadInputImage(std::string _fn) -{ - bitmap_image image(_fn); - unsigned int w = image.width(); - unsigned int h = image.height(); - unsigned char red, green, blue; - - input_i = 0; - float* input_data_ptr = (interpreter->input(0))->data.f; - - for (int y = 0; y < h; ++y) - for (int x = 0; x < w; ++x) - { - red = image.red_channel(x, y); - green = image.green_channel(x, y); - blue = image.blue_channel(x, y); - *(input_data_ptr) = (float) red; - input_data_ptr++; - *(input_data_ptr) = (float) green; - input_data_ptr++; - *(input_data_ptr) = (float) blue; - input_data_ptr++; - -// printf("BMP: %f %f %f\n", (float) red, (float) green, (float) blue); - - } - return true; -} - - -void CTfLiteClass::MakeAllocate() -{ -/* - this->micro_op_resolver.AddBuiltin( - tflite::BuiltinOperator_RESHAPE, - tflite::ops::micro::Register_RESHAPE()); - this->micro_op_resolver.AddBuiltin(tflite::BuiltinOperator_CONV_2D, - tflite::ops::micro::Register_CONV_2D()); - this->micro_op_resolver.AddBuiltin(tflite::BuiltinOperator_FULLY_CONNECTED, - tflite::ops::micro::Register_FULLY_CONNECTED()); - this->micro_op_resolver.AddBuiltin(tflite::BuiltinOperator_SOFTMAX, - tflite::ops::micro::Register_SOFTMAX()); - this->micro_op_resolver.AddBuiltin(tflite::BuiltinOperator_DEPTHWISE_CONV_2D, - tflite::ops::micro::Register_DEPTHWISE_CONV_2D()); - - - this->interpreter = new tflite::MicroInterpreter(this->model, this->micro_op_resolver, this->tensor_arena, this->kTensorArenaSize, this->error_reporter); -*/ - - - static tflite::ops::micro::AllOpsResolver resolver; - this->interpreter = new tflite::MicroInterpreter(this->model, resolver, this->tensor_arena, this->kTensorArenaSize, this->error_reporter); - - TfLiteStatus allocate_status = this->interpreter->AllocateTensors(); - if (allocate_status != kTfLiteOk) { - TF_LITE_REPORT_ERROR(error_reporter, "AllocateTensors() failed"); - this->GetInputDimension(); - return; - } - - printf("Allocate Done.\n"); -} - -void CTfLiteClass::GetInputTensorSize(){ - float *zw = this->input; - int test = sizeof(zw); - printf("Input Tensor Dimension: %d\n", test); - - printf("Input Tensor Dimension: %d\n", test); -} - -long CTfLiteClass::GetFileSize(std::string filename) -{ - struct stat stat_buf; - long rc = stat(filename.c_str(), &stat_buf); - return rc == 0 ? stat_buf.st_size : -1; -} - - -unsigned char* CTfLiteClass::ReadFileToCharArray(std::string _fn) -{ - long size; - - size = this->GetFileSize(_fn); - - if (size == -1) - { - printf("\nFile existiert nicht.\n"); - return NULL; - } - - - unsigned char *result = (unsigned char*) malloc(size); - - if(result != NULL) { -// printf("\nSpeicher ist reserviert\n"); - FILE* f = fopen(_fn.c_str(), "rb"); // vorher nur "r" - fread(result, 1, size, f); - fclose(f); - }else { - printf("\nKein freier Speicher vorhanden.\n"); - } - - - return result; -} - -void CTfLiteClass::LoadModel(std::string _fn){ - - - this->error_reporter = new tflite::MicroErrorReporter; - - unsigned char *rd; - rd = this->ReadFileToCharArray(_fn.c_str()); -// printf("loadedfile: %d", (int) rd); - - this->model = tflite::GetModel(rd); - free(rd); - TFLITE_MINIMAL_CHECK(model != nullptr); - printf("tfile Loaded.\n"); - -} - - - -CTfLiteClass::CTfLiteClass() -{ -// this->accessSD = _accessSD; - this->model = nullptr; - this->interpreter = nullptr; - this->input = nullptr; - this->output = nullptr; - this->kTensorArenaSize = 600 * 1024; - this->tensor_arena = new uint8_t[kTensorArenaSize]; - -// micro_op_resolver.AddBuiltin(tflite::BuiltinOperator_CONV_2D, -// tflite::ops::micro::Register_CONV_2D()); -} - -CTfLiteClass::~CTfLiteClass() -{ - delete this->tensor_arena; -} - - diff --git a/code/lib/jomjol_tfliteclass/CTfLiteClass._h_old b/code/lib/jomjol_tfliteclass/CTfLiteClass._h_old deleted file mode 100644 index 01d972bf..00000000 --- a/code/lib/jomjol_tfliteclass/CTfLiteClass._h_old +++ /dev/null @@ -1,72 +0,0 @@ -#pragma once - -#ifndef __CFINDTEMPLATE -#define __CFINGTEMPLATE - -#define TFLITE_MINIMAL_CHECK(x) \ - if (!(x)) { \ - fprintf(stderr, "Error at %s:%d\n", __FILE__, __LINE__); \ - exit(1); \ - } - -//#include "CAccessSD.h" -#include "CFindTemplate.h" - -#include "tensorflow/lite/micro/kernels/all_ops_resolver.h" -#include "tensorflow/lite/micro/micro_error_reporter.h" -#include "tensorflow/lite/micro/micro_interpreter.h" -#include "tensorflow/lite/schema/schema_generated.h" -#include "tensorflow/lite/version.h" -#include "tensorflow/lite/micro/kernels/micro_ops.h" -#include "esp_err.h" -#include "esp_log.h" - -//extern CAccessSDClass accessSD; - -class CTfLiteClass -{ - protected: -// CAccessSDClass *accessSD; - - tflite::ErrorReporter* error_reporter; - - const tflite::Model* model; - tflite::MicroInterpreter* interpreter; -// TfLiteTensor* input = nullptr; - TfLiteTensor* output = nullptr; - static tflite::ops::micro::AllOpsResolver *resolver; - - tflite::MicroOpResolver<5> micro_op_resolver; - - - int kTensorArenaSize; - uint8_t *tensor_arena; - - float* input; - int input_i; - - int im_height, im_width, im_channel; - - long GetFileSize(std::string filename); - unsigned char* ReadFileToCharArray(std::string _fn); - - public: -// CTfLiteClass(CAccessSDClass *_accessSD); - CTfLiteClass(); - ~CTfLiteClass(); - void LoadModel(std::string _fn); - void MakeAllocate(); - void GetInputTensorSize(); - bool LoadInputImage(std::string _fn); - void Invoke(); - void GetOutPut(); - int GetOutClassification(); - int GetClassFromImage(std::string _fn); - - float GetOutputValue(int nr); - void GetInputDimension(bool silent); - -}; - - -#endif \ No newline at end of file diff --git a/code/src/version.cpp b/code/src/version.cpp index af330b14..8911e364 100644 --- a/code/src/version.cpp +++ b/code/src/version.cpp @@ -1,4 +1,4 @@ -const char* GIT_REV="46265de"; +const char* GIT_REV="707472b"; const char* GIT_TAG=""; const char* GIT_BRANCH="rolling"; -const char* BUILD_TIME="2020-11-13 18:39"; \ No newline at end of file +const char* BUILD_TIME="2020-11-15 11:59"; \ No newline at end of file diff --git a/code/src/version.h b/code/src/version.h index 6570e6f9..7d39a034 100644 --- a/code/src/version.h +++ b/code/src/version.h @@ -13,7 +13,7 @@ extern "C" #include "Helper.h" #include -const char* GIT_BASE_BRANCH = "master - v3.1.0 - 2020-10-26"; +const char* GIT_BASE_BRANCH = "master - v4.0.0 - 2020-11-15"; const char* git_base_branch(void) diff --git a/code/src/zip._c b/code/src/zip._c deleted file mode 100644 index e69de29b..00000000 diff --git a/code/version.cpp b/code/version.cpp index af330b14..8911e364 100644 --- a/code/version.cpp +++ b/code/version.cpp @@ -1,4 +1,4 @@ -const char* GIT_REV="46265de"; +const char* GIT_REV="707472b"; const char* GIT_TAG=""; const char* GIT_BRANCH="rolling"; -const char* BUILD_TIME="2020-11-13 18:39"; \ No newline at end of file +const char* BUILD_TIME="2020-11-15 11:59"; \ No newline at end of file diff --git a/firmware/bootloader.bin b/firmware/bootloader.bin index da605ae2..b41cfc0a 100644 Binary files a/firmware/bootloader.bin and b/firmware/bootloader.bin differ diff --git a/firmware/firmware.bin b/firmware/firmware.bin index 5f2c78ad..8e69fef0 100644 Binary files a/firmware/firmware.bin and b/firmware/firmware.bin differ diff --git a/firmware/html.zip b/firmware/html.zip index de3694be..914d6404 100644 Binary files a/firmware/html.zip and b/firmware/html.zip differ diff --git a/sd-card/config/dig0650s3.tflite b/sd-card/config/dig0650s3.tflite index 56ac6a92..1c81acaf 100644 Binary files a/sd-card/config/dig0650s3.tflite and b/sd-card/config/dig0650s3.tflite differ diff --git a/sd-card/html/version.txt b/sd-card/html/version.txt index 9084fa2f..26aaba0e 100644 --- a/sd-card/html/version.txt +++ b/sd-card/html/version.txt @@ -1 +1 @@ -1.1.0 +1.2.0