From be7cd69ee790c6b02a4fdb3a214569c0eb076848 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Tue, 21 Feb 2023 01:39:50 +0100 Subject: [PATCH] . --- docs/Alignment.md | 33 ++++ docs/Configuration.md | 77 ++++----- docs/Graphical-Configuration.md | 27 +--- docs/ROI-Configuration.md | 147 ++++++++++++++---- docs/Reference-Image.md | 57 +++++++ docs/img/expert-parameters.png | Bin 0 -> 9024 bytes docs/img/expert-parameters2.png | Bin 0 -> 16894 bytes docs/img/manual-config-editing.png | Bin 0 -> 32924 bytes docs/initial-setup.md | 97 +----------- docs/nav.yml | 8 +- docs/outdated--Gasmeter-Log-Downloader.md | 23 --- ...dated--Migrate-Old-Config-To-New-Config.md | 131 ---------------- 12 files changed, 254 insertions(+), 346 deletions(-) create mode 100644 docs/Alignment.md create mode 100644 docs/Reference-Image.md create mode 100644 docs/img/expert-parameters.png create mode 100644 docs/img/expert-parameters2.png create mode 100644 docs/img/manual-config-editing.png delete mode 100644 docs/outdated--Gasmeter-Log-Downloader.md delete mode 100644 docs/outdated--Migrate-Old-Config-To-New-Config.md diff --git a/docs/Alignment.md b/docs/Alignment.md new file mode 100644 index 0000000..6e10ac0 --- /dev/null +++ b/docs/Alignment.md @@ -0,0 +1,33 @@ +# Alignment References + +The alignment references are used in every round to re-align the taken image to the reference coordinates. +Two alignment structures must be defined and the taken image then in each round is shifted and rotated according to their position +with the target to be in exactly the same position as the reference image. + +!!! Note + The alignment structures needs to be unique and have a good contrast. + It is advised to have them as far apart as possible. + + + +## Precondition +Please make sure to have setup your camera properly and taken a good [Reference Image](../Reference-Image). + +## Define two Reference Images + +![](img/initial_setup_2_alignment_marks.jpg){: style="width:500px"} + +You can switch between this two marks with `(1)`. + +Then define the reference area in the image by either directly drag and drop with the mouse or use the input boxes below. +To apply the currently marked image part you need to push `"Update Reference" (2)`. + +In some cases it might be useful to use a reference with a higher contrast. This can be achieved by pushing `Enhance Contrast" (3)`. +The result will be calculated on the ESP32 - so be a bit patient, before you see it active. + +To save push `"Save to config.ini" (4)`. + +!!! Note + A reboot is not required at this point of time. + +As next you should define the [Digit and Analog ROIs](ROI-Configuration.md). diff --git a/docs/Configuration.md b/docs/Configuration.md index 60fa058..01f2948 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -1,74 +1,63 @@ -# Configuration +# Graphical Configuration +Most of the settings can be modified on the Settings page: -!!! Warning - This page overlaps [Graphical-Configuration](../Graphical-Configuration). They should be merged to one page! + +It can be reached via the menu `Settings > Configuration`. -Most of the settings can be modified with the help of a web based [graphical user interface](Graphical-configuration). This is hosted through the web server on the ESP32. +!!! Note + - To activate the changes, the device needs to be restarted after saving the changes. + - Most of the commands need processing on the ESP32 device. This is not very fast - so please be patient. -More configuration parameters can be edited by hand in the `config.ini` and corresponding files in the `/config` directory on the SD-card. +All parameters are documented on the [Parameters](../Parameters) page and as tooltips on the config page. +## Expert Parameters +Some parameters are treated as **Expert Parameters** and are hidden by default. +Tick the checkbox in the top left corner to enable them: +![](../img/expert-parameters.png) -If you where using the Version 1 of the water meter you can easily transfer the configuration to the new system by following the steps in this [migration description](outdated--Migrate-Old-Config-To-New-Config.md) +The **Expert Parameters** then will be shown with a red background: +![](../img/expert-parameters2.png) +## Manual Editing of the Config File +Even more configuration parameters can be edited manually in the `config.ini`: +![](../img/manual-config-editing.png) -## Processing / Config.ini principle +To edit the `config.ini` file directly, click on the `Edit Config.ini directly` button. + +## Background Information + +!!! Note + You do not need to understand this! + But you might be interested in it. The principle is very simple and can most easily be described as a flow of processing steps. Each step has a dedicated parameter description in the ``config.ini``, which is indicated by brackets ```[name_of_step]```. The steps are processed in the order written in the config file. That means, that you first have to describe the image taking, then the aligning and cutting and only after that you can start to config a neural network. The last step is the post processing. ### Processing steps - Overview - In the following you get a short overview over the available steps. This order is also the suggested order for the processing flow. Single steps can be left out, if not needed (e.g. omit the analog part, if only digits are present) -#### 1. ``[MakeImage]`` - -* This steps parametrises the taking of the image by the ESP32-CAM. Size, quality and storage for logging and debugging can be set. +#### 1. ``[TakeImage]`` +This steps parametrises the taking of the image by the ESP32-CAM. Size, quality and storage for logging and debugging can be set. #### 2. ``[Alignment]`` -* Image preprocessing, including image alignment with reference images +Image preprocessing, including image alignment with reference images #### 3. ``[Digits]`` - -* Neural network evaluation of an image for digits. The neural network is defined by a tflite formatted file and the output is a number between 0 .. 9 or NaN (if image is not unique enough) +Neural network evaluation of an image for digits. The neural network is defined by a tflite formatted file and the output is a number between 0 .. 9 or NaN (if image is not unique enough) #### 4. ``[Analog]`` -- Neural network evaluation of analog counter. The neural network is defined by a tflite formatted file and the output is a number between 0.0 .. 9.9, representing the position of the pointer. - +Neural network evaluation of analog counter. The neural network is defined by a tflite formatted file and the output is a number between 0.0 .. 9.9, representing the position of the pointer. #### 5. ``[PostProcessing]`` -- Summarized the individually converted pictures to the overall result. It also implements some error corrections and consistency checks to filter wrong reading. +Summarized the individually converted pictures to the overall result. It also implements some error corrections and consistency checks to filter wrong reading. #### 6. ``[MQTT]`` - - - Transfer of the readings to a MQTT server. - +Transfer of the readings to a MQTT server. #### 7. ``[AutoTimer]`` -- Configuration of the automated flow start at the start up of the ESP32. +Configuration of the automated flow start at the start up of the ESP32. #### 8. ``[Debug]`` -- Configuration for debugging details - -#### 9. ``[Ende]`` -- No meaning, just an additional indication, that the configuration is finished. - - - -**A detailed parameter description can be found here: [[Configuration Parameter Details]].** - - - -## Graphical configuration interface - -It is recommended to do the configuration of the alignment structures and ROIs through the graphical user interface. A step by step instruction can be found here: [[Graphical Configuration]] - - - -## Background for Image Alignment - -Details on the image recognition flow can be found in the other project here: https://github.com/jomjol/water-meter-system-complete/blob/master/images/Alignment_procedure_draft.pdf - -The ```config.ini``` here has the same functionality and options, but a slightly different syntax due to a own written ini-parser is used. Migration see [here](outdated--Migrate-Old-Config-To-New-Config.md). - +Configuration for debugging details diff --git a/docs/Graphical-Configuration.md b/docs/Graphical-Configuration.md index 5dfd0b1..dfe37c2 100644 --- a/docs/Graphical-Configuration.md +++ b/docs/Graphical-Configuration.md @@ -1,20 +1,7 @@ # Graphical Configuration -!!! Warning - This page overlaps [Configuration](../Configuration). They should be merged to one page! - -### **General remark:** - -- to activate the changes, currently the device needs a restart after saving the changes. -- partially the commands needs processing on the ESP32 device. This is not very fast - so please be patient. - - -## Access to the graphical user interface - -The graphical configuration mode can be reached via the "Edit Configuration" button in the main menu (`/index.html`): - -* - +!!! ERROR + This page is outdated! ## Overview function @@ -37,8 +24,7 @@ This is a text editor for the config.ini. Changes committed with the button on t * -Details see [Configuration-Parameter-Details](../Configuration-Parameter-Details). - +Details see [Parameters](../Parameters). ### 2a. Create Reference Image @@ -98,9 +84,6 @@ In order to have a good recognition, the active ROI has two rectangles for align * The line in the middle should go through the middle of the number (in case it is not moving in or out) -To save the result push "Save all to config.ini" (4). +To save the result push `"Save all to config.ini" (4)`. - -**:bangbang: Attention:** Currently you have to reboot the ESP32 to take the changes in the `config.ini` to take place. - -This steps are running on the ESP32 directly. So be patient with the results. +A reboot is required to apply the changed configuration! diff --git a/docs/ROI-Configuration.md b/docs/ROI-Configuration.md index e304fbc..7a1447e 100644 --- a/docs/ROI-Configuration.md +++ b/docs/ROI-Configuration.md @@ -1,51 +1,125 @@ # ROI (Region of Interest) -General remark: -> You are using a neural network approach which is trained to fit as many different type of meters as possible. The accuracy will never be 100%. It is normal to see a missing reading once in a while. There there are several precautions to detect this. For details see the section `PostProcessing` on the configuration page. +!!! Notes + You are using a neural network approach which is trained to fit as many different type of meters as possible. + The accuracy will never be 100%. It is normal to see a missing reading once in a while. + There are several precautions to detect this. For details see the section `PostProcessing` on the configuration page. -The most critical settings for accurate detection are: +The most critical components for an accurate detection are: 1. Correct setting of the **R**egions **O**f **I**nterest (ROIs) for detection of the image. - > This must be done manually for each meter! -2. Number type is part of the training set. - > Have a look on the [Digital Counters](https://jomjol.github.io/neural-network-digital-counter-readout/) resp. [Analog Needles](https://jomjol.github.io/neural-network-analog-needle-readout) to check if your types are contained. If your number types are **not** contained, you should take the effort to record them so we can add them to the training data. See: [Learn models with your own images](../Learn-models-with-your-own-images) on how to create new input. -_____ + **This must be done manually for each device/installation!** -## Correct Setup of ROI -Please proceed in the following order! +2. Well trained Models. + + Have a look on the [Digital Counters](https://jomjol.github.io/neural-network-digital-counter-readout/) resp. [Analog Needles](https://jomjol.github.io/neural-network-analog-needle-readout) to check if your types are contained. If your number types are **not** contained, you should take the effort to record them so we can add them to the training data. See [Collect images to improve the models](../Learn-models-with-your-own-images) on how to collect new training data. -Don't forget to save after each step! -### Image Sharpness -Ensure a sharp image of the camera by adjusting the focal length of the ESP OV2640 camera. **Adjust the focus for the clearest possible image!** +## Precondition +Please make sure to have: -In order to use it for reading a meter, the focal-length of the OV2640 camera has to be manipulated, as by default it only results in sharp image for distance bigger than ~40cm, causing the image of the water meter to be too small for automated readout processing. +1. Setup your camera properly and taken a good [Reference Image](../Reference-Image). +1. Selected good [Alignment References](../Alignment). -**ATTENTION:** this modification will void any warranty, as the sealing of the lens objective is broken! -**ATTENTION:** This modification will render the camera unsuitable for general, web-cam type applications unless the focal length is changed back to the original setting. +## Define the ROIs +For each digit or analog pointer, a ROI must be defined. -![](img/focus_adjustment.jpg) +You can even have multiple independent **Numbers** (eg. electerical meters mostly have 2 numbers for the high and low tariff). -Remove the fixing glue of the OV2640 lens with a sharp knife. After this you can screw the lens in and out. Rotating it by about a quarter of a turn counterclockwise results in a focus plane of about 10cm. You need to figure out your best setting with a little bit of trial and error for your specific environment. +Depending if you have only one of those types, you can `enable/disable (1)` it on the top left corner: -### Horizontal Alignment -Ensure an **exact horizontal alignment** of the number via the alignment / reference setup: +![](img/initial_setup_3_rois.jpg){: style="width:500px"} -| :heavy_check_mark: Okay | :x: Not Okay | -| ------------------------------ | ---------------------------------- | -| ![](img/alignment_okay.jpg) | ![](img/alignment_not_okay.jpg) | +You can switch between the ROIs with the `Drop down box (2)`. If you need additional ROIs or delete them you can do this with the `control at (2)`. -### Correct Size for ROI -Choose the right size of the ROI: -> The configuration of ROIs differs a bit on the model you choose. Below you find the differences between the different AI models. Pick the one you think fits best your purpose. If you don't get to good result, try another model. +!!! Warning + The order of the ROIs defines how the individual digits are combined to the total number. The first ROI is the digit with the highest order (left side), then the second and so on. You can control the order in the selector tab and change it with the buttons `"move Next"` or `"move Previous"`. -### Model Selection -#### dig-class11 Configuration -dig-class11 - Models recognize the **complete digit only**. Here it is not relevant if the ROI fits the Border of the digit window. -For this model, there should be a border of 20% of the image size around the number itself. This border is shown in the ROI setup image by the inner thinner rectangle. This rectangle should fit perfectly around the number when the number has not started to rotate to the next position: + + + +TODO rework + + +As for the reference images you can change position, size and name of the ROI in the text fields or define them via drag and drop through the mouse button. + +In most cases the digits are ordered in a equidistantly and have the same size, you can synchronize them with the `control in (4)`. + +Don' t forget to save the settings with "Save" and do not reboot at this stage. + + + +### Detail for ROI configuration - Analog Meters + +For analog meters the ROI setting is rather straight forward as the meter is usually quadratic with a clear center. The circle should exactly fit to the outer size of the meter and the cross should be in the middle. + +Here is an example with the details for the ROI "ana1": + +![](img/initial_setup_3_analog_example.jpg){: style="width:500px"} + + +### Detail for ROI configuration - Digital Meters + +For the digital meters it is a little bit more complicated, as there are different options of digital models, that you can choose. + +1. Digital meter, that only recognized full digits (0, 1, 2, 3, ... 9) - Naming: `dig-class11-....tfl` + + **Advantage:** broad variety of types included in the training + + **Disadvantage:** partially rotated numbers cannot be detected +2. Model with sub-digit resolution (0.0, 0.1, 0.2, .... 9.8, 9.9) - Naming: `dig-cont-....tfl` or `dig-class100-....tfl` + + **Advantage:** partial numbers can be detected and a better post processing is possible + + **Disadvantage:** only limited types of meter types are trained due to the high effort for the training data + +Details and the corresponding "perfect" setting is explained here: [Details ROI Configuration](https://jomjol.github.io/AI-on-the-edge-device-docs/ROI-Configuration/) + +For a first run you can choose the following general settings: + +* There is an inner and an outer frame for the ROIs. +* Make the inner frame exactly the size of the number. + +| |Example 1|Example 2| +|---|---|---| +| :heavy_check_mark: **Okay** | ![](img/cont_img_ok.png){: style="width:80px"} | ![](img/wb_okay.jpg){: style="width:80px"} | +| :x: **Not** Okay | ![](img/bw_not_okay_small.jpg){: style="width:80px"} | ![](img/wb_not_okay_small.jpg){: style="width:80px"} | +| :x: **Not** Okay | ![](img/bw_not_okay_big.jpg){: style="width:80px"}| ![](img/wb_not_okay_big.jpg){: style="width:80px"}| + + + + + + + + + + + + + + + + + +## Correct Size for ROI +Choose the right size of the ROI. +The configuration of ROIs differs a bit on the selected model. + +If you are in the initial setup, the model will be selectable in the next step. By default it is a `dig-cont` resp. `ana-cont` model. + +In [Model Selection](../Choosing-the-Model) you find the differences between the different available models. Pick the one you think fits best your purpose. If you don't get to good result, try another model. + +Here we only show the different configuration of the ROIs. + +## Digit Model Selection +### dig-class11 Configuration +`dig-class11` - Models recognize the **complete digit only**. Here it is not relevant if the ROI fits the Border of the digit window. + +For this model, there should be a border of `20%` of the image size around the number itself. This border is shown in the ROI setup image by the inner thinner rectangle. This rectangle should fit perfectly around the number when the number has not started to rotate to the next position: @@ -56,15 +130,14 @@ For this model, there should be a border of 20% of the image size around the num | :x: **Not** Okay | ![](img/bw_not_okay_big.jpg) | ![](img/wb_not_okay_big.jpg) | - -If you have perfect alignment you and are not getting satisfying results, most probably your numbers are not part of the training data yet. Read on [Learn models with your own images](../Learn-models-with-your-own-images) how to add your meter's type of numbers to the training set. +If you have perfect alignment and still are not getting satisfying results, most probably your numbers are not part of the training data yet. See [Collect images to improve the models](../Learn-models-with-your-own-images) on how to collect new training data. -#### dig-class100 / dig-cont Configuration +### dig-class100 / dig-cont Configuration These models recognize the tenths (fractions) between the numbers. This model requires a different ROI setup; the height must be set differently and more accurately. -First, the width can be set as for dig-class11, i.e. 20% margin left and right. +First, the width can be set as for `dig-class11`, i.e. `20%` margin left and right. ROI-setup @@ -79,3 +152,11 @@ Here an example: | ------------ | --------------------------------- | | :heavy_check_mark: **Okay** | dig-class100_OK | | :x: **Not** Okay | dig-class100_NOK | + +### Analog Model Selection +Proceed the same way as with the Digit Model Selection. + +### Saving +To save push `"Save`. + +A reboot is required to apply the changed configuration! \ No newline at end of file diff --git a/docs/Reference-Image.md b/docs/Reference-Image.md new file mode 100644 index 0000000..50799cb --- /dev/null +++ b/docs/Reference-Image.md @@ -0,0 +1,57 @@ +# Reference Image + +!!! Note + The Reference Image is the basis for the coordinate system of the ROIs. Therefore it is very important, to have a well aligned image, that is not rotated. + +At first an example image is shown. +To define a new reference image push the button `"Create new Reference" (2)` and afterwards `"Take Image" (2)`. It might take some seconds for processing, then your actual camera image should be shown. +Then play with the provided parameters to get a good result. + +![](img/initial_setup_1_reference_image.jpg){: style="width:500px"} + +## Focus +This is the first time, where you have access to the camera image. It most likely is out of focus and not sharp! +Ensure a sharp image of the camera by adjusting the focal length of the ESP OV2640 camera. + +!!! Note + Try to adjust the focus for the clearest possible image! + + +In order to use it for reading a meter, the focal-length of the OV2640 camera has to be manipulated. +By default it only results in sharp image for distance bigger than around `~40cm` which is not ideal for our purpose. + +Therefore you need to remove the fixing glue of the OV2640 lens with a sharp knife. After this you can rotate the lens in and out. Rotating it by about a quarter of a turn counterclockwise results in a focus plane shift of about 10cm. You need to figure out your best setting with a little bit of trial and error for your specific environment. + +!!! Error + Be **very** carefully when rotating the lens. Best is to held the camera itself with one hand or a plier and rotate the lens with the other hand. + Make sure **not** to rotate the whole camera as this can damage the ribbon cable! + +!!! Warning + This modification will void any warranty, as the sealing of the lens objective is broken! + +!!! Warning + This modification will render the camera unsuitable for general, web-cam type applications unless the focal length is changed back to the original setting. + +![](img/focus_adjustment.jpg) + + + +## Correct Horizontal Alignment + +Ensure an **exact horizontal alignment** of the number: + +| :heavy_check_mark: Okay | :x: Not Okay | +| --------------------------- | ------------------------------- | +| ![](img/alignment_okay.jpg) | ![](img/alignment_not_okay.jpg) | + +!!! Warning + Updating the reference image also means that all alignment images and ROIs needs to be configured again. + Therefore do this step later only with caution. + +If everything is done, you can save the result with `"Update Reference Image" (4)`. + +!!! Note + A reboot is not required at this point of time. + +As next you should update the [Alignment References](Alignment.md). + diff --git a/docs/img/expert-parameters.png b/docs/img/expert-parameters.png new file mode 100644 index 0000000000000000000000000000000000000000..e47d41a725071ff070f2657617cc597662373a64 GIT binary patch literal 9024 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 T6QT86N(`VNt143~WghlFlG$+w literal 0 HcmV?d00001 diff --git a/docs/img/expert-parameters2.png b/docs/img/expert-parameters2.png new file mode 100644 index 0000000000000000000000000000000000000000..cc85d2ebedf7ba03959f5950a3d4ec1d3f6a8714 GIT binary patch literal 16894 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≺9_t@OcSVs@QpIX9^R%i~P&$#wuJ0)busvms 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 literal 0 HcmV?d00001 diff --git a/docs/initial-setup.md b/docs/initial-setup.md index 339d7fc..5ae6e3a 100644 --- a/docs/initial-setup.md +++ b/docs/initial-setup.md @@ -4,108 +4,27 @@ After setting up the device (firmware, SD card, WLAN) the device will connect to ![](img/setup_initial_welcome.png){: style="width:500px"} -In the top you can navigate through 5 steps, that guide you through the necessary setup. All settings can be accessed also later in the normal operation mode (see below). +In the top you can navigate through 5 steps, that guide you through the necessary setup: -## 1. Reference Image +1. [Reference Image](Reference-Image.md) +1. [Alignment](Alignment.md) +1. [Digital ROIs](ROI-Configuration.md) +1. [Analog ROIs](ROI-Configuration.md) (Only required in case your meter has analoge pointers) +1. [General Settings](Configuration.md) -The reference image is the basis for the coordinate system of the ROIs. Therefore it is very important, to have a well aligned image, that is not rotated. - -![](img/initial_setup_1_reference_image.jpg){: style="width:500px"} - -At first the current image is shown. To define a new reference image push the button "Create new Reference" (2) and afterwards "Take Image" (2). It might take some seconds for processing, then your actual camera image should be shown. - -**Attention:** This is the first time, where you have access to the camera image. It might not be sharp yet. This is the first thing to do according to the following instruction (**TBD**). +All settings can be accessed also later in the normal operation mode. -#### Correct Horizontal Alignment - -Ensure an **exact horizontal alignment** of the number via the alignment / reference setup: - -| :heavy_check_mark: Okay | :x: Not Okay | -| --------------------------- | ------------------------------- | -| ![](img/alignment_okay.jpg) | ![](img/alignment_not_okay.jpg) | - -**:bangbang: Attention:** Updating the reference image, also means, that all alignment images and ROIs needs to be taught again. Therefore do this step later only with caution. - -If everything is done, you can save the result with "Update Reference Image" (4). Please do not reboot at this stage, but go to the next section. -## 2. Alignment References - -The alignment references are used to realign every taken image to the reference coordinates. Therefore two alignment structures are identified and the image is shifted and rotated according to their position with the target to be in exactly the same position as the reference image. The alignment structures needs to be unique and have a good contrast. You can switch between this two marks with (1). - -![](img/initial_setup_2_alignment_marks.jpg){: style="width:500px"} - -With the control in (3) position and size of the selected reference image. You can define the ROI in the image also directly via drag and drop with the mouse. To choose the currently marked image part you need to push "Update Reference" (2). - -In some cases it might be useful to use a reference with a higher contrast. This can be achieved by pushing "Enhance Contrast" (3). The result will be calculated on the ESP32 - so be a bit patient, before you see it active. - -To save the push finally "Save to config.ini" (4). Do not reboot at this stage, but proceed with the "next" button. -## 3./4. Define the ROIs for the number detection - -Here the regions of interest for the digital and analog pointers are defined. As both are done identically, here as an example the digital images are shown. - -### General usage - -First of all, if you don't have that kind of numbers on you meter, you can disable it with the check box at the top (1). - -![](img/initial_setup_3_rois.jpg){: style="width:500px"} - -In contrast to the reference images, here there are more ROIs possible. You can switch between them with the drop down box (2). If you need additional ROIs or delete them you can do this with the control at (2). - -**Attention:** The order of the ROIs defines, how the individual digits are combined to the total number. The first ROI is the digit with the highest order, then the second and so on. You can control the order in the selector tab and change it with the buttons "move Next" or "move Previous". - -As for the reference images you can change position, size and name of the ROI in the text fields or define them via drag and drop through the mouse button. - -In most cases the digits are ordered in a equidistantly and have the same size, you can synchronize them with the control in (4). - -Don' t forget to save the settings with "Save" and do not reboot at this stage. - - - -### Detail for ROI configuration - Analog Meters - -For analog meters the ROI setting is rather straight forward as the meter is usually quadratic with a clear center. The circle should exactly fit to the outer size of the meter and the cross should be in the middle. - -Here is an example with the details for the ROI "ana1": - -![](img/initial_setup_3_analog_example.jpg){: style="width:500px"} - - -### Detail for ROI configuration - Digital Meters - -For the digital meters it is a little bit more complicated, as there are different options of digital models, that you can choose. - -1. Digital meter, that only recognized full digits (0, 1, 2, 3, ... 9) - Naming: `dig-class11-....tfl` - - **Advantage:** broad variety of types included in the training - - **Disadvantage:** partially rotated numbers cannot be detected -2. Model with sub-digit resolution (0.0, 0.1, 0.2, .... 9.8, 9.9) - Naming: `dig-cont-....tfl` or `dig-class100-....tfl` - - **Advantage:** partial numbers can be detected and a better post processing is possible - - **Disadvantage:** only limited types of meter types are trained due to the high effort for the training data - -Details and the corresponding "perfect" setting is explained here: [Details ROI Configuration](https://jomjol.github.io/AI-on-the-edge-device-docs/ROI-Configuration/) - -For a first run you can choose the following general settings: - -* There is an inner and an outer frame for the ROIs. -* Make the inner frame exactly the size of the number. - -| |Example 1|Example 2| -|---|---|---| -| :heavy_check_mark: **Okay** | ![](img/cont_img_ok.png){: style="width:80px"} | ![](img/wb_okay.jpg){: style="width:80px"} | -| :x: **Not** Okay | ![](img/bw_not_okay_small.jpg){: style="width:80px"} | ![](img/wb_not_okay_small.jpg){: style="width:80px"} | -| :x: **Not** Okay | ![](img/bw_not_okay_big.jpg){: style="width:80px"}| ![](img/wb_not_okay_big.jpg){: style="width:80px"}| +TODO rework ## 5. General Settings diff --git a/docs/nav.yml b/docs/nav.yml index eafc6a7..675584c 100644 --- a/docs/nav.yml +++ b/docs/nav.yml @@ -18,17 +18,19 @@ nav: - Join a Discussion: https://github.com/jomjol/AI-on-the-edge-device/discussions - Configuration: + - Reference-Image.md + - Alignment.md - ROI-Configuration.md + - Configuration.md - Choosing-the-Model.md - Neural-Network-Types.md - ota.md - - Parameters.md - Advanced: + - Parameters.md - Integration-Home-Assistant.md - External-LED.md - rolling-installation.md - - Configuration.md - Watermeter-specific-analog---digital-transition.md - collect-new-images.md - Learn-models-with-your-own-images.md @@ -57,8 +59,6 @@ nav: - Old Pages (no longer maintained): - outdated--Integrated-Functions.md - - outdated--Gasmeter-Log-Downloader.md - - outdated--Migrate-Old-Config-To-New-Config.md - Assorted Pages: # List all pages which are not covered by above list diff --git a/docs/outdated--Gasmeter-Log-Downloader.md b/docs/outdated--Gasmeter-Log-Downloader.md deleted file mode 100644 index 3cf21b4..0000000 --- a/docs/outdated--Gasmeter-Log-Downloader.md +++ /dev/null @@ -1,23 +0,0 @@ -# Gas Meter Log Downloader - -!!! Warning - This page no longer is maintained! - -This small tool downloads the log files from your ESP32 and stores the last value of the day in an *.csv file. - -To use this tool you need to **activate the debug log files** in your configuration (Configuration / Debug / Logfile). I go with 30 days of retention in days. - -It downloads only the past log files (yesterday and older). - -You can define the max. number of log files to download (beginning from newest [yesterday]). - -I wrote this tool to get a chart of the daily gas consumption to optimize my gas powered heating. - -**Variables to define by yourself:** - -- **URL to Log file-Path on Device:** "http://ESP32-IP-Address/fileserver/log/message/" -- **Download Log files to:** enter a valid directory, e.g. "D:\Gaszaehler\Auswertung\Log-Downloads\" -- **Output CSV-File:** enter a valid directory, e.g. "D:\Gaszaehler\Auswertung\DailyValues.csv" -- **Download Log files from past # days:** enter the max. number of log files you want to download (<= your log files retention value in your device configuration) - -Feel free to optimize and modify it. diff --git a/docs/outdated--Migrate-Old-Config-To-New-Config.md b/docs/outdated--Migrate-Old-Config-To-New-Config.md deleted file mode 100644 index 8d3f699..0000000 --- a/docs/outdated--Migrate-Old-Config-To-New-Config.md +++ /dev/null @@ -1,131 +0,0 @@ -# Migration from water-meter „old“ to water-meter “AI-on-the-edge-device” - -!!! Warning - This page no longer is maintained! - -There are only some few steps necessary to migrate your old system to the new one. - -Please follow the following steps: - -#### 1. Follow the installation guide to flash the ESP32CAM and prepare a SD Card with the content of the master - -#### 2. Save the following files from the old Docker system on your PC: - -* Reference Points 1-3 (only 2 needed) -* `Config.ini` - -#### 3. Copy Reference Points 1-3 onto the new water-meter system (Directory `/config`) - -**Please note only two Reference Points are supported in the new system.** - -#### 4. Open new `config.ini` File: - -Insert from the old `Config.ini` file `[alignment]` and `[alignment.ref0]` and `[alignment.ref1]` section the two Ref x and y position and the `initial_rotation_angle= 123`into the new `Config.ini` File, e.g.: - -###### Old: -``` -[alignment.ref0] -image=./config/RB01_65x65.jpg -pos_x=28 -pos_y=63 - -[alignment.ref1] -image=./config/RB02_50x35.jpg -pos_x=497 -pos_y=127 - -[alignment] -initial_rotation_angle=180 -``` - -###### New: - -``` -[Alignment] -InitalRotate=180 -/config/RB01_65x65.jpg 28, 63 -/config/RB02_50x35.jpg 497, 127 -SearchFieldX = 20 -SearchFieldY = 20 -``` - - -#### 5. Insert the old Digit Values into the new `Config.ini` File, e.g.: - -###### Old: -``` -[Digital_Digit.ziffer1] -pos_x=265 -pos_y=117 -dx=28 -dy=51 - -[Digital_Digit.ziffer2] -pos_x=310 -pos_y=117 -dx=28 -dy=51 - -[Digital_Digit.ziffer3] -pos_x=354 -pos_y=117 -dx=28 -dy=51 - -[Digital_Digit.ziffer4] -pos_x=399 -pos_y=117 -dx=28 -dy=51 - -[Digital_Digit.ziffer5] -pos_x=445 -pos_y=115 -dx=28 -dy=51 -``` - -###### New: -``` -[Digits] -Model=/config/dig0630s3.tflite -;LogImageLocation = /log/digit -ModelInputSize 20, 32 -digit1, 265, 117, 28, 51 -digit2, 310, 117, 28, 51 -digit3, 354, 117, 28, 51 -digit4, 399, 117, 28, 51 -digit5, 445, 115, 28, 51 -``` - - -#### 6. Make sure that you have the same quality and size settings as in your old `Config.ini` - -In the old configuration this was coded in the html-string for the image source: -###### Old: -``` -URLImageSource=http://IP-ADRESS/capture_with_flashlight?quality=5&size=VGA -``` - -Default was Quality=5 and VGA. - -###### New: - -``` -ImageQuality = 5 -ImageSize = VGA -``` - - - -#### 7. Repeat the same for the analog section - -#### 8. Insert your SSID and Password into the new wlan.ini File - -#### 9. Compare and edit [ConsistencyCheck] Section with new [PostProcessing] Section - -#### 10. Save new config.ini File in the new System. - -#### 11. Restart the system. - -#### 12. After the first start set manually the PreValue in the new system