Merge remote-tracking branch 'upstream/main'
28
.github/workflows/build-docs.yaml
vendored
@@ -1,4 +1,11 @@
|
||||
name: Build and Pack
|
||||
###########################################################################################
|
||||
# Build the documentation using mkdocs
|
||||
# This will update the gh-pages branch which in return triggers the pages-build-deployment
|
||||
# Action (provided by Github, not editable)
|
||||
# That action will publish it to https://jomjol.github.io/AI-on-the-edge-device-docs
|
||||
###########################################################################################
|
||||
|
||||
name: Build Documentation
|
||||
|
||||
on:
|
||||
push:
|
||||
@@ -6,25 +13,30 @@ on:
|
||||
- 'main'
|
||||
|
||||
jobs:
|
||||
#########################################################################################
|
||||
## Build the documentation using mkdoc
|
||||
## It will be pushed to the gh-pages branch
|
||||
#########################################################################################
|
||||
build-documentation:
|
||||
# The type of runner that the job will run on
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||
steps:
|
||||
- name: Cache PIP
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pip-
|
||||
|
||||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: actions/setup-python@v2
|
||||
- uses: actions/setup-python@v4
|
||||
- run: |
|
||||
pip install --upgrade pip && pip install mkdocs mkdocs-gen-files mkdocs-awesome-pages-plugin mkdocs-material
|
||||
git config user.name 'github-actions[bot]'
|
||||
git config user.email 'github-actions[bot]@users.noreply.github.com'
|
||||
- name: Publish docs
|
||||
|
||||
- name: Store docs in gh-pages branch
|
||||
run: |
|
||||
mkdocs gh-deploy
|
||||
|
||||
13
README.md
@@ -1,4 +1,4 @@
|
||||
# AI-on-the-edge-device-docs
|
||||
# User Documentation for the AI on the Edge Device Project
|
||||
|
||||
This repo contains the documentation for the [AI-on-the-Edge-Device Project](https://github.com/jomjol/AI-on-the-edge-device).
|
||||
|
||||
@@ -13,25 +13,28 @@ The files from the [AI-on-the-Edge-Device Wiki](https://github.com/jomjol/AI-on-
|
||||
In the end, we should review all pages from there step by step and add them to the upper part of the navigation.
|
||||
|
||||
### Tasks to do
|
||||
- Make sure there is a top level title (#) and all other chaper headers are on lower levels (##, ###)
|
||||
- Check the links in the documents
|
||||
- Fetch included images and place them directly in the [docs/img](docs/img) folder
|
||||
- Rerwrite to have a clear structure
|
||||
|
||||
## Editing a page
|
||||
Each page has a link on its top-right corner `Edit on GitHub` which brings you directly to the Github editor.
|
||||
|
||||
## Adding new files
|
||||
## Adding new pages
|
||||
1. Add a new `*.md` document in the [docs](docs) folder.
|
||||
1. Add the **filename** to the [docs/nav.yml](docs/nav.yml) at the wished position in the **Links** section.
|
||||
|
||||
## Local Test
|
||||
To test it locally:
|
||||
1. Clone this repo
|
||||
1. Install the required tools:
|
||||
1. Install the required tools (See also [.github/workflows/build-docs.yaml](.github/workflows/build-docs.yaml)):
|
||||
```
|
||||
pip install --upgrade pip
|
||||
pip install mkdocs mkdocs-gen-files mkdocs-awesome-pages-plugin mkdocs-material
|
||||
pip install mkdocs mkdocs-gen-files mkdocs-awesome-pages-plugin mkdocs-material pymdown-extensions
|
||||
```
|
||||
1. In the main folder of the repo, call `mkdocs serve` (and keep it running).
|
||||
This will locally generate the documentation.
|
||||
You can access it under http://127.0.0.1:8000/AI-on-the-edge-device-docs/
|
||||
|
||||
Any change to the files will automatically be applied.
|
||||
Any change to the files will automatically be applied.
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
# Welcome to the AI-on-the-edge-device wiki!
|
||||
|
||||
Artifical inteligence based systems have been established in our every days live. Just think of speech or image recognition. Most of the systems relay on either powerfull processors or a direct connection to the cloud for doing the calculations up there. With the increasing power of modern processors the AI systems are coming closer to the end user - which is usally called **edge compution**.
|
||||
Here this edge computing is brough into a practical example, where a AI network is implemented on a ESP32 device so: **AI on the edge**.
|
||||
|
||||
**Have fun in studying the new posibilities and ideas**
|
||||
|
||||
This is about image recognition and digitalization, done totally on a cheap ESP32 board using artifical intelligence in form of convolutional neural networks (CNN). Everything, from image capture (OV2640), image preprocessing (auto alignment, ROI idenficiation) all the way down to the image recognition (CNN structure) and result plausiblisation is done on a cheap 10 EUR device.
|
||||
|
||||
This all is integrated in an easy to do setup and use environment, taking care for all the background processing and handling, including regular job scheduler. The user interface is an integrated web server, that can be easily adjusted an offers the data as an API in different options.
|
||||
|
||||
The task to be demonstrated here is an automated readout of an analog water meter. The water consumption is to be recorded within a house automatization and the water meter is totally analog without any electronic interface. Therefore the task is solved by taking regularly an image of the water meter and digitize the reading.
|
||||
|
||||
There are two types of CNN implemented, a classification network for reading the digital numbers and a single output network for digitize the analog pointers for the sub digit readings.
|
||||
|
||||
This project is a evolution of the [water-meter-system-complete](https://github.com/jomjol/water-meter-system-complete), which uses ESP32-CAM just for taking the image and a 1GB-Docker image to run the neural networks backbone. Here everything is integrated in an ESP32-CAM module with 4MB of SDRAM and a SD-Card as data storage.
|
||||
|
||||
|
||||
|
||||
This systems implements several functions:
|
||||
|
||||
* (water) meter readout - it can handle also dual meters with two or even more readings
|
||||
* picture provider
|
||||
* fileserver
|
||||
* OTA functionality
|
||||
* web server
|
||||
|
||||
The details can be found here: [[Integrated Functions]]
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
The following links point to additional information in other repos:
|
||||
|
||||
# Digits
|
||||
* [Overview](https://github.com/jomjol/neural-network-digital-counter-readout)
|
||||
* [Background](https://github.com/jomjol/neural-network-digital-counter-readout/blob/master/Train_Network.md)
|
||||
|
||||
# Analog
|
||||
* [Overview](https://github.com/jomjol/neural-network-analog-needle-readout)
|
||||
* [Background](https://github.com/jomjol/neural-network-analog-needle-readout/blob/master/Train_Network.md)
|
||||
9
docs/Additional-Information.md
Normal file
@@ -0,0 +1,9 @@
|
||||
The following links point to additional information in other repos:
|
||||
|
||||
# Digits
|
||||
* [Training and using a neural network to readout the value of a digital counter](https://github.com/jomjol/neural-network-digital-counter-readout)
|
||||
* [Training the CNN neural network](https://github.com/jomjol/neural-network-digital-counter-readout/blob/master/Train_Network.md)
|
||||
|
||||
# Analog
|
||||
* [Training and using a neural network to read out the value of an analog display](https://github.com/jomjol/neural-network-analog-needle-readout)
|
||||
* [Training the CNN neural network](https://github.com/jomjol/neural-network-analog-needle-readout/blob/master/Train_Network.md)
|
||||
@@ -1,23 +1,21 @@
|
||||
This page shows some best practices.
|
||||
# Camera Placement
|
||||
# Best Practice
|
||||
|
||||
This page shows some best practices:
|
||||
|
||||
## Camera Placement
|
||||
* Move the Camera as close as possible(~4cm), this will help get rid of reflections.
|
||||
-> focus can be adjusted by turning the outer black ring of the camera.
|
||||
* If the LED reflections are too strong, put tape over the LED to defuse the light
|
||||
* Change the ImageSize to QVGA under "Expert mode" configuration when close enough, this will be faster and is often good enough for digital recognition.
|
||||
|
||||
# Reflections
|
||||
## Reflections
|
||||
|
||||
* Try to get ride of the reflections by rotating the camera, so that the reflections are at positions, where no number is.
|
||||
* By using the external LED option, you can place WS2812 LEDs freely away from the main axis.
|
||||
* Users report, that a handy cover foil could also help
|
||||
|
||||
# Post-processing
|
||||
## Post-processing
|
||||
* Filter out the Number "9", as "3" will often be misread for a "9" and void every number between 3 and 9 due to it being negative flow.
|
||||
* Split the readings into two, while the decimal numbers might move to fast to be recognized, at least the slower moving part will produce a correct reading.
|
||||
-> keep in mind that the offset needs to be adjusted, a.e if you have a comma reading of "3", it needs to become "0.3". This can be done wherever the data ends up being sent, like home assistant using sensor templates.
|
||||
* If you are using a low resolution and only digital mode, processing can often be done in <1 minute. Check the logs to confirm how fast it is and then set the interval accordingly under "Expert mode" in configuration, as the normal mode will lock you to 3+ minutes.
|
||||
|
||||
***
|
||||
|
||||
* [ ] Todo condense from various discussions, eg. ~~https://github.com/jomjol/AI-on-the-edge-device/issues/765~~ and https://github.com/jomjol/AI-on-the-edge-device/discussions/984
|
||||
* [ ] Todo add images and more in-depth explanation
|
||||
|
||||
@@ -1,30 +1,2 @@
|
||||
# New
|
||||
# Build the Project
|
||||
See [README.md](https://github.com/jomjol/AI-on-the-edge-device/blob/master/code/README.md)
|
||||
|
||||
# Old
|
||||
|
||||
## Build the project yourself
|
||||
|
||||
- Download and install VS Code
|
||||
- https://code.visualstudio.com/Download
|
||||
- Install the VS Code platform io plugin
|
||||
- <img src="https://raw.githubusercontent.com/jomjol/ai-on-the-edge-device/master/images/platformio_plugin.jpg" width="200" align="middle">
|
||||
- Check for error messages, maybe you need to manually add some python libraries
|
||||
- e.g. in my Ubuntu a python3-env was missing: `sudo apt-get install python3-venv`
|
||||
- git clone this project
|
||||
- in Linux: `git clone https://github.com/jomjol/AI-on-the-edge-device.git`
|
||||
- in VS code, open the `AI-on-the-edge-device/code`
|
||||
- from terminal: `cd AI-on-the-edge-device/code && code .`
|
||||
- open a pio terminal (click on the terminal sign in the bottom menu bar)
|
||||
- make sure you are in the `code` directory
|
||||
- To build, type `platformio run --environment esp32cam`
|
||||
- or use the graphical interface:
|
||||
<img src="https://raw.githubusercontent.com/jomjol/ai-on-the-edge-device/master/images/platformio_build.jpg" width="200" align="middle">
|
||||
- the build artifacts are stored in `code/.pio/build/esp32cam/`
|
||||
- Connect the device and type `pio device monitor`. There you will see your device and can copy the name to the next instruction
|
||||
- Add `upload_port = you_device_port` to the `platformio.ini` file
|
||||
- make sure an sd card with the contents of the `sd_card` folder is inserted and you have changed the wifi details
|
||||
- `pio run --target erase` to erase the flash
|
||||
- `pio run --target upload` this will upload the `bootloader.bin, partitions.bin,firmware.bin` from the `code/.pio/build/esp32cam/` folder.
|
||||
- `pio device monitor` to observe the logs via uart
|
||||
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
# Which model should I use?
|
||||
# Model Selection
|
||||
|
||||
!!! Warning
|
||||
This page overlaps [Neural Network Types](../Neural-Network-Types). They should be merged to one page!
|
||||
|
||||
In the [Graphical Configuration Page](Graphical-configuration), you can choose different models depending on your needs.
|
||||
|
||||
@@ -13,7 +16,7 @@ For digits on water meters, gas-meters or power meters you can select between tw
|
||||
|
||||
This model can recognize full digits. All intermediate states shown a "N" for not a number. But in post process it uses older values to fill up the "N" values if possible.
|
||||
|
||||
<img width="333" alt="image" src="https://user-images.githubusercontent.com/412645/190924459-e4023630-c6d0-4a8c-ab56-59e6c0e3ffd8.png">
|
||||
{: style="width:300px"}
|
||||
|
||||
#### Main features
|
||||
|
||||
@@ -25,7 +28,8 @@ This model can recognize full digits. All intermediate states shown a "N" for no
|
||||
|
||||
These models are used to get a continuous reading with intermediate states. To see what the models are doing, you can go to the Recognition page.
|
||||
|
||||
<img width="323" alt="image" src="https://user-images.githubusercontent.com/412645/190924335-b8b75883-7b39-4fd6-a949-49c69834fee4.png">
|
||||
{: style="width:300px"}
|
||||
|
||||
|
||||
#### Main features
|
||||
|
||||
@@ -44,7 +48,7 @@ The difference is in the internal processing. Take the one that gives you the be
|
||||
|
||||
For pointers on water meters use the analog models. You can only choose between ana-class100 and ana-cont. Both do mainly the same.
|
||||
|
||||
<img width="231" alt="image" src="https://user-images.githubusercontent.com/412645/190924487-18ed16e1-1c89-45f1-823e-305b7e78ac46.png">
|
||||
{: style="width:250px"}
|
||||
|
||||
#### Main features
|
||||
|
||||
|
||||
@@ -173,7 +173,7 @@ LogfileRetentionInDays = 2
|
||||
```
|
||||
|
||||
This paragraph is used to switch on an extended logging. It is optional and by default only a minimum logging is enabled.
|
||||
**Attention:** in case of extended logging the size of the log file (`/log.txt`, `/alignment.txt`) might increase rapidly, therefore manually deletion from time to time is recommended
|
||||
**:bangbang: Attention:** in case of extended logging the size of the log file (`/log.txt`, `/alignment.txt`) might increase rapidly, therefore manually deletion from time to time is recommended
|
||||
|
||||
|
||||
|
||||
@@ -193,7 +193,7 @@ SetupMode = false
|
||||
```
|
||||
|
||||
This paragraph is used to switch on an extended logging. It is optional and by default only a minimum logging is enabled.
|
||||
**Attention:** in case of extended logging the size of the log file (`/log.txt`, `/alignment.txt`) might increase rapidly, therefore manually deletion from time to time is recommended
|
||||
**:bangbang: Attention:** in case of extended logging the size of the log file (`/log.txt`, `/alignment.txt`) might increase rapidly, therefore manually deletion from time to time is recommended
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,10 +1,16 @@
|
||||
# Configuration
|
||||
|
||||
!!! Warning
|
||||
This page overlaps [Graphical-Configuration](../Graphical-Configuration). They should be merged to one page!
|
||||
|
||||
|
||||
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.
|
||||
|
||||
More configuration parameters can be edited by hand in the `config.ini` and corresponding files in the `/config` directory on the SD-card.
|
||||
|
||||
|
||||
|
||||
If you where using the Version 1 of the watermeter you can easily transfer the configuration to the new system by following the steps in this [migration description](MigrateOldConfigToNew.md)
|
||||
If you where using the Version 1 of the watermeter 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)
|
||||
|
||||
|
||||
|
||||
@@ -64,7 +70,7 @@ It is recommended to do the configuration of the alignment structures and ROIs t
|
||||
|
||||
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](MigrateOldConfigToNew.md).
|
||||
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).
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -2,19 +2,12 @@ For Demo and Testing Purpose, the device can use pre-recorded images.
|
||||
|
||||
You need to enable it in the configuration (`TakeImage > Demo`) and also provide the needed files on the SD-Card.
|
||||
|
||||
One image per round gets used, starting with the first image for the first round.
|
||||
For each round one image gets used, starting with the first image for the first round.
|
||||
|
||||
For the reference image and the alignment also the first image gets used.
|
||||
|
||||
Once the last image got reached, it starts again with the first one.
|
||||
|
||||
## Example Demo
|
||||
You can use the following demo or create your own one.
|
||||
Just install it using the OTA Update functionality.
|
||||
|
||||
- [demo.zip](https://github.com/jomjol/AI-on-the-edge-device/files/10320454/demo.zip) (this is just a zip of [this](https://github.com/jomjol/AI-on-the-edge-device/tree/master/code) folder in the repo)
|
||||
|
||||
|
||||
## SD-Card Structure
|
||||
```
|
||||
demo/
|
||||
@@ -28,11 +21,10 @@ demo/
|
||||
- The jpg files can have any name
|
||||
- The jpg files must be smaller than 30'000 bytes
|
||||
- The `files.txt` must contains a list of those files, eg:
|
||||
```
|
||||
520.8983.jpg
|
||||
520.9086.jpg
|
||||
520.9351.jpg
|
||||
```
|
||||
|
||||
520.8983.jpg
|
||||
520.9086.jpg
|
||||
520.9351.jpg
|
||||
|
||||
## Recoding
|
||||
To record real images of a meter, you have to periodically fetch `http://<IP>/img_tmp/raw.jpg`.
|
||||
@@ -68,5 +60,38 @@ while [[ true ]]; do
|
||||
done
|
||||
```
|
||||
|
||||
## Installation
|
||||
Just install the zip file using the OTA Update functionality.
|
||||
|
||||
## How does it work
|
||||
The Demo Mode tries to interfere as less as possible with the normal behavior. Whenever a Cam Framebuffer gets taken (`esp_camera_fb_get()`), it replaces the framebuffer with the image from the SD-Card.
|
||||
The Demo Mode tries to interfere as less as possible with the normal behavior. Whenever a Cam Framebuffer gets taken (`esp_camera_fb_get()`), it replaces the framebuffer with the image from the SD-Card.
|
||||
|
||||
|
||||
## Example Data of a Watermeter
|
||||
You can use the following demo images if you want:
|
||||
|
||||
{:style="width:200px"}
|
||||
|
||||
It covers a meter range from `530.00688` to `531.85882`.
|
||||
|
||||
### All images (843 images)
|
||||
[{:style="width:400px"}](https://user-images.githubusercontent.com/1783586/211915731-9a2a3cd3-390b-4b1f-a064-5e7e443ab113.png)
|
||||
|
||||
[Demo_Images_Watermeter_530.00688-532.08243_843_images.zip](https://github.com/jomjol/AI-on-the-edge-device-docs/files/10395941/Demo_Images_Watermeter_530.00688-532.08243_843_images.zip)
|
||||
|
||||
|
||||
Animation of it (186 MB!)
|
||||
|
||||
|
||||
### Selection of 84 images
|
||||
[{:style="width:400px"}](https://user-images.githubusercontent.com/1783586/211915870-aa5c1342-c61c-4e1f-afe0-10e222f1499d.png)
|
||||
|
||||
[Demo_Images_Watermeter_530.00688-532.08243_84_images.zip](https://github.com/jomjol/AI-on-the-edge-device-docs/files/10395892/Demo_Images_Watermeter_530.00688-532.08243_84_images.zip)
|
||||
|
||||
|
||||
### Selection of 42 images
|
||||
[{:style="width:400px"}](https://user-images.githubusercontent.com/1783586/211915898-b499e109-7b63-4e21-ba5b-c0a370022f7a.png)
|
||||
|
||||
[Demo_Images_Watermeter_530.00688-532.08243_42_images.zip](https://github.com/jomjol/AI-on-the-edge-device-docs/files/10395893/Demo_Images_Watermeter_530.00688-532.08243_42_images.zip)
|
||||
|
||||
|
||||
|
||||
@@ -8,7 +8,8 @@ Most likely they are caused by a hardware issue!
|
||||
|
||||
## `0x00000001` PSRAM bad
|
||||
Your device most likely has no PSRAM at all or it is too small (needs to have at least 4 MBytes)!
|
||||
See https://github.com/jomjol/AI-on-the-edge-device/wiki/Hardware-Compatibility
|
||||
See [Hardware Compatibility](../Hardware-Compatibility).
|
||||
|
||||
Usually the log shows something like this:
|
||||
```
|
||||
psram: PSRAM ID read error: 0xffffffff
|
||||
@@ -21,7 +22,7 @@ The firmware failed to allocate enough memory. This most likely is a consequenti
|
||||
## `0x00000004` Cam bad
|
||||
The attached camera can not be initialized.
|
||||
This usually is because on of the following reasons:
|
||||
- The camera is not supported, see https://github.com/jomjol/AI-on-the-edge-device/wiki/Hardware-Compatibility
|
||||
- The camera is not supported, see [Hardware Compatibility](../Hardware-Compatibility)
|
||||
- The camera is not attached properly -> Try to remove and attach it again. Make sure you move the black part enough into the socket!
|
||||
- The camera or the camera cable is damaged
|
||||
|
||||
|
||||
14
docs/FAQs.md
@@ -1,6 +1,6 @@
|
||||
# Frequently Asked Questions
|
||||
|
||||
#### My device is reboot frequently. What can I do?
|
||||
## My device is reboot frequently. What can I do?
|
||||
|
||||
There are several reasons for the reboot:
|
||||
|
||||
@@ -8,10 +8,10 @@ There are several reasons for the reboot:
|
||||
* Wrong configuration, missing configuration files
|
||||
* Unstable hardware - see [[Hardware Compatibility]]
|
||||
|
||||
There is a dedicated Wiki page about this: [[Frequent Reboots]]
|
||||
There is a dedicated Wiki page about this: [Frequent Reboots](https://jomjol.github.io/AI-on-the-edge-device-docs/Frequent-Reboots/).
|
||||
|
||||
|
||||
#### How accurate are the detections?
|
||||
### How accurate are the detections?
|
||||
|
||||
It is hard to give a specific accuracy number. It depends on many factors, e.g.
|
||||
|
||||
@@ -26,12 +26,12 @@ Anecdotally, the authors of this wiki have great success with the meter. While t
|
||||
See the FAQs below for more details and configuration hints.
|
||||
|
||||
|
||||
#### My numbers are not corrected detected. What can I do?
|
||||
## My numbers are not corrected detected. What can I do?
|
||||
|
||||
* There is a dedicated Wiki page about the correct setting [[ROI Configuration]]
|
||||
* There is a dedicated Wiki page about the correct setting [ROI Configuration](https://jomjol.github.io/AI-on-the-edge-device-docs/ROI-Configuration/).
|
||||
* This page also includes the instructions for gathering new images for the training.
|
||||
|
||||
#### How can I ensure invalid numbers are never reported?
|
||||
## How can I ensure invalid numbers are never reported?
|
||||
|
||||
As mentioned above, the AI algorithm is not perfect. Sometimes it may read an incorrect value.
|
||||
|
||||
@@ -42,7 +42,7 @@ You can change the following settings to reduce incorrect readings (but potentia
|
||||
* Change `PostProcessing` configuration option `MaxRateType` to be time based instead of absolute. Set `MaxRateValue` to something realistic (e.g. `5` gal/min). You can often find the max flow rate your meter supports directly on the cover.
|
||||
* Reduce `AutoTimer` configuration option `Intervall` to the lowest it can be (e.g. `3` min). The more often you take readings, the less likely for data staleness to occur.
|
||||
|
||||
#### Even after I have setup everything perfect there is a false reading - especially around the zero crossing (roll over to next number)
|
||||
## Even after I have setup everything perfect there is a false reading - especially around the zero crossing (roll over to next number)
|
||||
* The roll over behavior is different for the different meters. E.g.:
|
||||
* Rolling over start with different previous position (e.g. at 7, 8 or 9)
|
||||
* The neutral position (no rolling) is not perfectly at zero, but rather at something like 7.9 or 8.1, even if it should be exactly 8
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Frequent reboots
|
||||
# Frequent Reboots
|
||||
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@ If your system is sometimes running smoothly over several runs and sometimes reb
|
||||
|
||||
You can check this in the standard log file on the SD card:
|
||||
|
||||
|
||||
```
|
||||
2021-12-26T06:34:09: task_autodoFlow - round done
|
||||
2021-12-26T06:34:09: CPU Temperature: 56.1
|
||||
@@ -79,7 +80,8 @@ Easy to detect: fast blinking red LED directly after startup, no reaction of the
|
||||
|
||||
Error message of no detectable SC card in the log file. **Normal looking** log for a 16GB SD card is like this:
|
||||
|
||||
```09:38:25.037 -> [0;32mI (4789) main: Using SDMMC peripheral[0m
|
||||
```
|
||||
09:38:25.037 -> [0;32mI (4789) main: Using SDMMC peripheral[0m
|
||||
09:38:25.037 -> [0;32mI (4789) main: Using SDMMC peripheral[0m
|
||||
09:38:25.138 -> Name: SC16G
|
||||
09:38:25.138 -> Type: SDHC/SDXC
|
||||
@@ -102,6 +104,7 @@ Sometimes, there is hardware, where only 2 MB of PSRAM is present - **even if yo
|
||||
|
||||
You can identify the amount of PSRAM in the serial log file:
|
||||
|
||||
|
||||
```
|
||||
09:38:21.224 -> [0;32mI (881) psram: This chip is ESP32-D0WD[0m
|
||||
09:38:21.224 -> [0;32mI (885) spiram: Found 64MBit SPI RAM device[0m
|
||||
@@ -1,23 +1,19 @@
|
||||
# Graphical configuration
|
||||
# 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.
|
||||
|
||||
- too frequent http-request could result in a reboot of the ESP32 - normally this is not a problem as the server react about 30s later normally.
|
||||
|
||||
|
||||
|
||||
## Access to the graphical user interface
|
||||
|
||||
The graphical configuration mode can be reached via the "Edit Configuration" button in the main menue (`/index.html`):
|
||||
|
||||
* <img src="https://raw.githubusercontent.com/jomjol/ai-on-the-edge-device/master/images/config_s1_access.jpg" width="600" align="middle">
|
||||
|
||||
|
||||
|
||||
* <img src="img/config_s1_access.jpg" width="600" align="middle">
|
||||
|
||||
|
||||
|
||||
@@ -41,13 +37,15 @@ This is a text editor for the config.ini. Changes commited with the button on th
|
||||
|
||||
* <img src="https://raw.githubusercontent.com/jomjol/ai-on-the-edge-device/master/images/config_s2_edit_config.jpg" width="600" align="middle">
|
||||
|
||||
Details see [Configuration-Parameter-Details](../Configuration-Parameter-Details).
|
||||
|
||||
|
||||
|
||||
### 2a. Create Reference Image
|
||||
|
||||
The reference image is the basis for the coordination of the ROIs. Therefore it is very important, to have a well aligned image, that is not rotated.
|
||||
|
||||
**Attention:** Updating the reference image, also means, that all alignment images and ROIs needs to be teached again. Therefore do this step only with caution.
|
||||
**:bangbang: Attention:** Updating the reference image, also means, that all alignment images and ROIs needs to be teached again. Therefore do this step only with caution.
|
||||
|
||||
* <img src="https://raw.githubusercontent.com/jomjol/ai-on-the-edge-device/master/images/config_s3_reference.jpg" width="400" align="middle">
|
||||
|
||||
@@ -100,15 +98,9 @@ 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).
|
||||
|
||||
|
||||
**:bangbang: Attention:** Currently you have to reboot the ESP32 to take the changes in the `config.ini` to take place.
|
||||
|
||||
|
||||
|
||||
**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.
|
||||
This steps are running on the ESP32 directly. So be patient with the results.
|
||||
@@ -1,8 +1,7 @@
|
||||
# Hardware Compatibility
|
||||
|
||||
See also https://github.com/jomjol/AI-on-the-edge-device/discussions/1732
|
||||
|
||||
General Remark: similar "looking" Board can have major differences:
|
||||
### General Remark
|
||||
Altrough a board looks similair, it can have major differences, eg.:
|
||||
|
||||
- Processor
|
||||
- Ram (Size! & Type) -> this Project needs at least 4MB RAM!
|
||||
@@ -25,23 +24,36 @@ Below you find some remarks and experiences from the community:
|
||||
|
||||
| Chip Version | Image | Status |
|
||||
| ------------------------- | ----- | -------- |
|
||||
| ESP32-D0WDQ6 (revision 1) | | **okay** |
|
||||
| ESP32-D0WDQ6 (revision 1) | | :heavy_check_mark: |
|
||||
|
||||
# PSRAM
|
||||
|
||||
There seems to be a lot of "fake" chips, or maybe wrongly configured ESP32 Boards.
|
||||
|
||||
|
||||
For AP MEMORY, all "real" APS**64**04\*3SQR Chips should work.
|
||||
|
||||
For ESP PSRAM, all "real" PSRAM**64**\* should work
|
||||
|
||||
64Mbit density = 8Mbyte PSRAM
|
||||
|
||||
This Table is just a snapshot of chips which worked
|
||||
|
||||
| Labeling on PSRAM module | Image | Status |
|
||||
| ---------------------------------------------- | ----- | ------------------------- |
|
||||
| IPUS<br/>IPS640LS0<br/>1815XBGN | | **okay** |
|
||||
| AP MEMORY<br/>6404L-3SOR<br/>1040H<br/>110089G | | **okay** |
|
||||
| AP MEMORY<br/>6404L-3SQR<br/>12205<br/>150047G | | **okay**<br />8MB |
|
||||
| AP MEMORY<br/>6404L-350R<br/>1120A<br/>130027G | | **NOT OK**<br />PSRAM not accessible|
|
||||
| AP MEMORY<br/>6404L-35QR<br/>11208<br/>130025G | | **NOT OK**<br />PSRAM not accessible|
|
||||
| AP MEMORY<br/>6404L-3SQR<br/>13100<br/>180026G| | **NOT OK**<br />PSRAM not accessible|
|
||||
| AP MEMORY<br/>6404L-3SQR<br/>11207<br/>130024G| | **NOT OK**<br />PSRAM not accessible|
|
||||
| AP MEMORY<br/>1604M-3SQR<br/>0280A<br/>070036G| | **NOT OK**<br />2MB only! |
|
||||
| ESP PSRAM64H 462021<br/>1B00286 | | **okay** |
|
||||
| ESP PSRAM16M 302020<br/> | | **NOT OK**<br />2MB only! |
|
||||
| ESP PSRAM16H 202020<br/>050022G | | **NOT OK**<br />2MB only! |
|
||||
| IPUS / IPS640LS0 / 1815XBGN | |:heavy_check_mark: |
|
||||
| AP MEMORY / **64**04L-3SOR / 1040H / 110089G | | :heavy_check_mark: |
|
||||
| AP MEMORY / **64**04L-3SQR / 12205 / 150047G | | :heavy_check_mark: 8MB |
|
||||
| AP MEMORY / **64**04L-3SQR / 12208 / 150047G | | :heavy_check_mark: 8MB |
|
||||
| AP MEMORY / **64**04L-350R / 1120A / 130027G | | :x: PSRAM not accessible|
|
||||
| AP MEMORY / **64**04L-35QR / 11208 / 130025G | | :x: PSRAM not accessible|
|
||||
| AP MEMORY / **64**04L-3SQR / 13100 / 180026G| | :x: PSRAM not accessible|
|
||||
| AP MEMORY / **64**04L-3SQR / 11207 / 130024G| | :x: PSRAM not accessible|
|
||||
| AP MEMORY / 1604M-3SQR / 0280A / 070036G| | :x: 2MB only! |
|
||||
| ESP PSRAM**64**H 462021 / 1B00286 | | :heavy_check_mark: |
|
||||
| ESP PSRAM**64**H 412021 /1A0039G | | :heavy_check_mark: (8MB) |
|
||||
| ESP PSRAM16M 302020 | | :x: 2MB only! |
|
||||
| ESP PSRAM16H 202020 / 050022G | | :x: 2MB only! |
|
||||
|
||||
# OV2640 - Camera
|
||||
|
||||
@@ -49,9 +61,9 @@ The experience with the camera only is based on single modules. It is well possi
|
||||
|
||||
| Labeling on Flex-Connector | Image | Status |
|
||||
| -------------------------- | ----- | --------------------------------- |
|
||||
| TY-OV2<br/>640-V2.0 | | **okay** |
|
||||
| DCX-OV2<br/>640-V2 | | **okay** |
|
||||
| DC-26<br/>40-V3 | | **okay**: 3x<br/>**NOT OKAY:** 1x |
|
||||
| TY-OV2 / 640-V2.0 | | :heavy_check_mark: |
|
||||
| DCX-OV2 / 640-V2 | | :heavy_check_mark: |
|
||||
| DC-26 / 40-V3 | | :heavy_check_mark: 3x<br> :x: 1x |
|
||||
|
||||
|
||||
|
||||
@@ -59,7 +71,7 @@ The experience with the camera only is based on single modules. It is well possi
|
||||
|
||||
| Module | Image | Status |
|
||||
| ------------------------------------------------------------ | ----- | ------------------------------ |
|
||||
| ESP32CAM<br/>Different versions on the market! Especially the PSRAM is sometimes labeled wrong (Label: 4MB, Real: only 2 MB --> will not work!) | | **okay**<br />with >=4 MB PSRAM! |
|
||||
| ESP32CAM / Different versions on the market!<br>Especially the PSRAM is sometimes labeled wrong<br>(Label: 4MB, Real: only 2 MB --> will not work!) | | :heavy_check_mark:<br />with >=4 MB PSRAM! |
|
||||
| ESP32-S3-EYE<br />No Flash LED, pins different used (e.g. LCD diskplay) | | **NOT OKAY** |
|
||||
|
||||
|
||||
@@ -72,14 +84,22 @@ It is observed, that smaller cards (up to 4 GB) tend to be more stable and large
|
||||
|
||||
# Devices known to work
|
||||
|
||||
Please add links to stores of which you know they work:
|
||||
- https://arduino-projekte.info/produkt/esp32-cam-v2-integriertem-ch340-mit-ov2640-kamera-modul/ ? See https://github.com/jomjol/AI-on-the-edge-device/discussions/1041
|
||||
- https://www.amazon.de/-/en/gp/product/B0B51CQ13R
|
||||
- https://www.reichelt.de/entwicklerboards-esp32-kamera-2mp-25--debo-cam-esp32-p266036.html?PROVID=2788&gclid=CjwKCAiAqaWdBhAvEiwAGAQlttJnV4azXWDYeaFUuNioMICh-jvxKp6Cifmcep9vvtoT2JRCDqBczRoC7Q0QAvD_BwE (27.12.2022)
|
||||
- ...
|
||||
Sandisk 2GB Micro SD Class 2 [Sandisk 2GB](https://www.amazon.co.uk/gp/product/B000N3LL02/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1)
|
||||
|
||||
### Modules (Old list, not up-to-date anymore):
|
||||
|
||||
See [https://github.com/jomjol/AI-on-the-edge-device/discussions/1732](https://github.com/jomjol/AI-on-the-edge-device/discussions/1732) for a more recent list.
|
||||
|
||||
- [https://arduino-projekte.info/produkt/esp32-cam-v2-integriertem-ch340-mit-ov2640-kamera-modul/](https://arduino-projekte.info/produkt/esp32-cam-v2-integriertem-ch340-mit-ov2640-kamera-modul/) (see [https://github.com/jomjol/AI-on-the-edge-device/discussions/1041](https://github.com/jomjol/AI-on-the-edge-device/discussions/1041))
|
||||
|
||||
- [https://www.amazon.de/-/en/gp/product/B0B51CQ13R](https://www.amazon.de/-/en/gp/product/B0B51CQ13R)
|
||||
|
||||
- [https://www.reichelt.de/entwicklerboards-esp32-kamera-2mp-25--debo-cam-esp32-p266036.html?PROVID=2788&gclid=CjwKCAiAqaWdBhAvEiwAGAQlttJnV4azXWDYeaFUuNioMICh-jvxKp6Cifmcep9vvtoT2JRCDqBczRoC7Q0QAvD_BwE](https://www.reichelt.de/entwicklerboards-esp32-kamera-2mp-25--debo-cam-esp32-p266036.html?PROVID=2788&gclid=CjwKCAiAqaWdBhAvEiwAGAQlttJnV4azXWDYeaFUuNioMICh-jvxKp6Cifmcep9vvtoT2JRCDqBczRoC7Q0QAvD_BwE) (27.12.2022)
|
||||
|
||||
### SD-Card
|
||||
|
||||
- Sandisk 2GB Micro SD Class 2 [Sandisk 2GB](https://www.amazon.co.uk/gp/product/B000N3LL02/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1)
|
||||
AITRIP ESP32 and CAM [ESP-32/CAM](https://www.amazon.co.uk/gp/product/B08X49P8P3/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&psc=1)
|
||||
- [Amazon US - Aideepen ESP32-CAM W BT Board ESP32-CAM-MB Micro USB to Serial Port CH-340G with OV2640 2MP Camera Module Dual Mode](https://www.amazon.com/gp/product/B0948ZFTQZ) with [Amazon US - Cloudisk 5Pack 4GB Micro SD Card 4 GB MicroSD Memory Card Class6](https://www.amazon.com/gp/product/B07QYTP4VN)
|
||||
|
||||
# Weak Wifi
|
||||
The ESP32-CAM supports an external antenna. It requires some soldering skills but can improve the connection quality. See https://randomnerdtutorials.com/esp32-cam-connect-external-antenna/
|
||||
The ESP32-CAM supports an external antenna. It requires some soldering skills but can improve the connection quality. See [https://randomnerdtutorials.com/esp32-cam-connect-external-antenna/](https://randomnerdtutorials.com/esp32-cam-connect-external-antenna/)
|
||||
|
||||
4
docs/Influx-DB.md
Normal file
@@ -0,0 +1,4 @@
|
||||
# Influx DB
|
||||
The device also supports direct sending of data to an Influ DB.
|
||||
|
||||
:bangbang: Only Influx DB 1 is supported!
|
||||
@@ -1,21 +0,0 @@
|
||||
# :bangbang: Living on the edge :bangbang:
|
||||
:bangbang: The branch [rolling](https://github.com/jomjol/AI-on-the-edge-device/tree/rolling) contains the latest version of the Firmware and the Web Interface. It is work in progress, don't expect it to work stable or be an improvement for your AI-on-the-edge-device! Also it might break the OTA Update and then require manual flashing over USB! :bangbang:
|
||||
|
||||
# Still here?
|
||||
|
||||
Grab the latest build from https://github.com/jomjol/AI-on-the-edge-device/actions and proceed as following:
|
||||
1. Pick the most top successful (green) build.
|
||||
2. Download the `firmware__extract_before_upload__only_needed_for_migration_from_11.2.0` and extract it (its a zip file).
|
||||
3. Flash that binary as new firmware.
|
||||
4. Download the `html__only_needed_for_migration_from_11.2.0__2022-09-15_19-13-37__rolling_(042ff18)`. It is also a zip file but you should **not** extract it!
|
||||
5. Flash the zip file als html part.
|
||||
|
||||
The filenames have changed, e.g. right now it is:
|
||||
* AI-on-the-edge-device__manual-setup__rolling_(4b23e0c)
|
||||
* AI-on-the-edge-device__remote-setup__rolling_(4b23e0c)
|
||||
* AI-on-the-edge-device__update__rolling_(4b23e0c)
|
||||
|
||||
Github bot-reply Rolling Build has the following info at the moment:
|
||||
|
||||
You can use the latest [Automatic Build](https://github.com/jomjol/AI-on-the-edge-device/actions/workflows/build.yaml?query=branch%3Arolling) of the the rolling branch. It might already contain a fix for your issue.
|
||||
Pick the most top passing entry (it has a green circle with a tick in it), then scroll down to the Artifacts and download the file named update_*. So I do not know what the manual-setup and remote-setup are used for.
|
||||
@@ -1,6 +1,7 @@
|
||||
# Installation
|
||||
|
||||
The installation requires multiple steps:
|
||||
|
||||
1. Get the right hardware and wire it up
|
||||
1. Flash the firmware onto the ESP32
|
||||
1. Write the data to the SD-Card
|
||||
@@ -11,10 +12,11 @@ The installation requires multiple steps:
|
||||
#### ESP32-CAM
|
||||
|
||||
* OV2640 camera module
|
||||
* SD-Card slot
|
||||
* 4 MB PSRAM.
|
||||
* Micro SD-Card slot
|
||||
* 4 or 8 MB PSRAM.
|
||||
|
||||
It can be easily found on the typical internet stores, searching for ESP32-CAM for less than 10 EUR.
|
||||
How ever since the hardware is cheap and coming from China, you unluckily could pick a malfunction device. See [Hardware Compatibility](../Hardware-Compatibility) for further advice!
|
||||
|
||||
#### USB->UART interface
|
||||
|
||||
@@ -24,18 +26,19 @@ For first time flashing the firmware a USB -> UART connector is needed. Later fi
|
||||
|
||||
For power supply a 5V source is needed. Most easily this can be done via an USB power supply. The power supply should support minimum 500mA. For buffering current peaks some users reported to use a large elco condensator like a 2200uF between ground and VCC.
|
||||
|
||||
**Attention:** in several internet forums there are problems reported, in case the ESP32-CAM is only supplied with 3.3V.
|
||||
**:bangbang: Attention:** in several internet forums there are problems reported, in case the ESP32-CAM is only supplied with 3.3V.
|
||||
|
||||
#### Housing
|
||||
|
||||
A small 3D-printable example for a very small case can be found in Thingiverse here: https://www.thingiverse.com/thing:4571627
|
||||
A small 3D-printable example for a very small case can be found in Thingiverse here: [https://www.thingiverse.com/thing:4571627](https://www.thingiverse.com/thing:4571627)
|
||||
|
||||
<img src="https://raw.githubusercontent.com/jomjol/ai-on-the-edge-device/master/images/main.jpg" width="300"><img src="https://raw.githubusercontent.com/jomjol/ai-on-the-edge-device/master/images/size.png" width="300">
|
||||
{: style="width:200px"}
|
||||
{: style="width:200px"}
|
||||
|
||||
|
||||
**:bangbang: Attention**: the focus of the OV2640 needs to be adjusted, as it is normally set from ~40cm to infinity. In order to get an image that is big enough, it needs to be changed to about 10cm. Therefore the sealing glue on the objective ring needs to be removed with a scalpel or sharp knife. Afterwards the objective can be rotated clockwise until the image is sharp again.
|
||||
|
||||
**Attention**: the focus of the OV2640 needs to be adjusted, as it is normally set from ~40cm to infinity. In order to get an image that is big enough, it needs to be changed to about 10cm. Therefore the sealing glue on the objective ring needs to be removed with a scalpel or sharp knife. Afterwards the objective can be rotated clockwise until the image is sharp again.
|
||||
<img src="https://raw.githubusercontent.com/jomjol/ai-on-the-edge-device/master/images/focus_adjustment.jpg" width="200">
|
||||
{: style="width:200px"}
|
||||
|
||||
|
||||
|
||||
@@ -45,7 +48,8 @@ Beside the 5V power supply, only for the first flashing a connection to the USB-
|
||||
|
||||
A example for wiring can be found here:
|
||||
|
||||
<img src="https://raw.githubusercontent.com/jomjol/ai-on-the-edge-device/master/images/wiring.png" width="600">
|
||||

|
||||
|
||||

|
||||
|
||||
|
||||
@@ -57,14 +61,15 @@ It is also possible to use external LEDs for the illumination instead of the int
|
||||
## Firmware flashing
|
||||
### Files
|
||||
Grab the firmware from the
|
||||
|
||||
- [Releases page](https://github.com/jomjol/AI-on-the-edge-device/releases) (Stable, tested versions), or the
|
||||
- [Automatically build development branch](https://github.com/jomjol/AI-on-the-edge-device/actions?query=branch%3Arolling) (experimental, untested versions). Please have a look on https://github.com/jomjol/AI-on-the-edge-device/wiki/Install-a-rolling-%28unstable%29-release first!
|
||||
|
||||
You need:
|
||||
|
||||
* partitions.bin
|
||||
* bootloader.bin
|
||||
* firmware.bin
|
||||
* html.zip
|
||||
|
||||
|
||||
### Flashing
|
||||
@@ -76,8 +81,7 @@ You can access it with the following link: https://jomjol.github.io/AI-on-the-ed
|
||||
|
||||
This is the preferred way for beginners as it also allows access to the USB Log:
|
||||
|
||||
[<img src=https://user-images.githubusercontent.com/1783586/200926652-293e9a1c-86ec-4b79-9cef-3e6f3c47ea4b.png height=200px>](https://user-images.githubusercontent.com/1783586/200926652-293e9a1c-86ec-4b79-9cef-3e6f3c47ea4b.png)
|
||||
|
||||
[](img/web-console.png)
|
||||
|
||||
#### 2. Using the Flash Tool from Espressif
|
||||
|
||||
@@ -85,7 +89,7 @@ The flashing of the firmware can be done with the "Flash Download Tool" from es
|
||||
|
||||
Download and extract the Flash tool, after starting choose "Developer Mode", then "ESP32-DownloadTool" and you are in the setup of the flashing tool. Connect the ESP32-CAM with the USB-UART connection and identify the COM-Port.
|
||||
|
||||
:bangbang: **Attention** :bangbang: if you reflashing the code again, it is strongly recommended to erase the flash memory before flashing the firmware. Especially if you used OTA in between, which might cause remaining information on the flash, to still boot from an old image in the OTA-area, which is not erased by a normal flash.
|
||||
:bangbang: **Attention**: if you reflashing the code again, it is strongly recommended to erase the flash memory before flashing the firmware. Especially if you used OTA in between, which might cause remaining information on the flash, to still boot from an old image in the OTA-area, which is not erased by a normal flash.
|
||||
|
||||
But your ESP32 in bootloader mode and push start, then it will identify the board and you can configure the bin-configuration according to the following table:
|
||||
|
||||
@@ -95,7 +99,7 @@ But your ESP32 in bootloader mode and push start, then it will identify the boar
|
||||
| partitions.bin | 0x8000 |
|
||||
| firmware.bin | 0x10000 |
|
||||
|
||||
<img src="https://raw.githubusercontent.com/jomjol/ai-on-the-edge-device/master/images/Flash_Settings.png" width="400">
|
||||

|
||||
|
||||
Alternatively it can be directly flashed from the development environment - here PlatformIO. But this is rather for experienced users, as the whole development chain needs to be installed for compilation.
|
||||
|
||||
@@ -127,7 +131,7 @@ For the first setup take the `initial_esp32_setup_*.zip` from the [Release](http
|
||||
|
||||
This must only be done once as further updates of the SD-Card are possible with the OTA Update.
|
||||
|
||||
### :bangbang: Attention :bangbang:
|
||||
### Notes
|
||||
|
||||
- Due to the limited availability of GPIOs (OV2640, Flash-Light, PSRAM & SD-Card) the communication mode to the SD card is limited to 1-line SD-Mode. It showed up, that this results in problems with very large SD-Cards (64GB, sometimes 32 GB) and some no name low cost SD-cards.
|
||||
- There must be no partition table on the SD-card (no GPT, but only MBR for the single partition)
|
||||
@@ -148,4 +152,4 @@ WLAN-Status indication:
|
||||
* **5 x** fast blinking (< 1 second): connection still pending
|
||||
* **3 x** slow blinking (1 second on/off): WLAN connection established
|
||||
|
||||
It is normal that at first one or two times a pending connection is indicated.
|
||||
It is normal that at first one or two times a pending connection is indicated.
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# Integration into Home Assistant
|
||||
There are 3 ways to get the data into your Home Assistant:
|
||||
|
||||
1. Using MQTT (Automatically Setup Entities using Homeassistant MQTT Discovery)
|
||||
1. Using MQTT (Manually Setup Entities)
|
||||
2. Using REST calls
|
||||
@@ -11,6 +12,7 @@ The first one is the easier way if you already have MQTT in use.
|
||||
:bangbang: This feature will be available with the next release!
|
||||
|
||||
Starting with Version `>12.0.1`, AI-on-the-edge-devices support Homeassistant Discovery.
|
||||
|
||||
1. Check [here](https://www.home-assistant.io/docs/mqtt/discovery/) to learn more about it and how to enable it in Homeassistant.
|
||||
1. You also have to enable it in the MQTT settings of your device:
|
||||
|
||||
@@ -127,10 +129,13 @@ Note that you also can add it using the UI.
|
||||
Creating Statistics Graphs (eg. usage per day) is easy using the [Energy Dashboard](https://www.home-assistant.io/home-energy-management/):
|
||||

|
||||
|
||||
Note that there seems to be a bug in the graph, see https://github.com/home-assistant/frontend/issues/13995!
|
||||
Note that there seems to be a bug in the graph, see [https://github.com/home-assistant/frontend/issues/13995](https://github.com/home-assistant/frontend/issues/13995)!
|
||||
|
||||
|
||||
### InfluxDb Graphs
|
||||
|
||||
See also [Influx-DB](../Influx-DB).
|
||||
|
||||
If you have setup InfluxDB already, it is also possible to fetch statistics from there, eg. daily usage:
|
||||
```
|
||||
from(bucket: "HomeAssistant")
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
# Learn a model with your own images
|
||||
If your device has new, different digits and the existing models don't recognize them well, you can collect your own images and train the model.
|
||||
|
||||
But before you do this, please check if your type really is not contained yet in the training data, see [digits](https://jomjol.github.io/neural-network-digital-counter-readout) resp. [pointers](https://jomjol.github.io/neural-network-analog-needle-readout/) for an overview of images used for the training
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# General Information
|
||||
# MQTT API
|
||||
The device is capable to register to a MQTT broker to publish data and subscribe to specific topics.
|
||||
|
||||
The MQTT service has to be enabled and configured properly in the device configuration via web interface (`Settings` -> `Configuration` -> section `MQTT`)
|
||||
@@ -11,70 +11,70 @@ The following parameters have to be defined:
|
||||
* Password (optional)
|
||||
* RetainFlag (optional)
|
||||
|
||||
# Published topics
|
||||
## Published topics
|
||||
|
||||
## Status
|
||||
### Status
|
||||
`MainTopic`/{status topic}, e.g. `watermeter/status`
|
||||
* ### Connection
|
||||
* #### Connection
|
||||
|
||||
* ### Interval
|
||||
* #### Interval
|
||||
|
||||
* ### MAC
|
||||
* #### MAC
|
||||
|
||||
* ### IP
|
||||
* #### IP
|
||||
|
||||
* ### Hostname
|
||||
* #### Hostname
|
||||
|
||||
* ### Uptime
|
||||
* #### Uptime
|
||||
|
||||
* ### FreeMem
|
||||
* #### FreeMem
|
||||
|
||||
* ### WifiRSSI
|
||||
* #### WifiRSSI
|
||||
|
||||
* ### CPUTemp
|
||||
* #### CPUTemp
|
||||
|
||||
* ### Status
|
||||
* #### Status
|
||||
|
||||
## Result
|
||||
### Result
|
||||
`MainTopic`/{NumberName}/{result topic}, e.g. `watermeter/main/value`
|
||||
|
||||
* ### Value
|
||||
* #### Value
|
||||
|
||||
* ### Raw
|
||||
* #### Raw
|
||||
|
||||
* ### Error
|
||||
* #### Error
|
||||
|
||||
* ### JSON
|
||||
* #### JSON
|
||||
|
||||
* ### Rate
|
||||
* #### Rate
|
||||
|
||||
* ### Rate_per_time_unit
|
||||
* #### Rate_per_time_unit
|
||||
The time Unit gets set with the Homeassistant Discovery, eg. `h` or `m` (minutes)
|
||||
|
||||
* ### Rate_per_digitalization_round
|
||||
* #### Rate_per_digitalization_round
|
||||
The `interval` defines when the next round gets triggered
|
||||
|
||||
* ### Changeabsolut
|
||||
* #### Changeabsolut
|
||||
|
||||
* ### Timestamp
|
||||
* #### Timestamp
|
||||
|
||||
* ### JSON
|
||||
* #### JSON
|
||||
All relevant results in JSON syntax
|
||||
|
||||
## GPIO
|
||||
### GPIO
|
||||
`MainTopic`/{GPIO topic}, e.g. `watermeter/GPIO/GPIO12`
|
||||
|
||||
* ### GPIO/GPIO{PinNumber}
|
||||
* #### GPIO/GPIO{PinNumber}
|
||||
Depending on device configuration (`Settings` --> `Configuration` --> Chapter `GPIO`)
|
||||
|
||||
|
||||
# Subscibed topics
|
||||
## Subscibed topics
|
||||
`MainTopic`/{subscribed topic}, e.g. `watermeter/ctrl/flow_start`
|
||||
|
||||
## Control
|
||||
### Control
|
||||
|
||||
* ### Ctrl/flow_start
|
||||
* #### ctrl/flow_start
|
||||
Trigger a flow start by publishing to this topic (any character, length > 0)
|
||||
|
||||
* ### GPIO/GPIO{PinNumber}
|
||||
Depending on device configuration (`Settings` --> `Configuration` --> Chapter `GPIO`)
|
||||
* #### GPIO/GPIO{PinNumber}
|
||||
Depending on device configuration (`Settings` --> `Configuration` --> Chapter `GPIO`)
|
||||
|
||||
@@ -1,17 +1,12 @@
|
||||
# Neural Network Types
|
||||
|
||||
!!! Warning
|
||||
This page overlaps [Choosing the Model](../Choosing-the-Model). They should be merged to one page!
|
||||
|
||||
This section is describing the different types of neural networks, that are used with the AI-on-the-edge approach and gives an introduction on how and where to use them.
|
||||
|
||||
|
||||
|
||||
### Content
|
||||
|
||||
1) Overview neural network type
|
||||
2) Naming convention
|
||||
3) Overview of trained types and details
|
||||
|
||||
_______________________________
|
||||
|
||||
|
||||
### 1. Overview neural network type
|
||||
## Overview neural network type
|
||||
|
||||
There are two **types of input**:
|
||||
|
||||
@@ -28,19 +23,17 @@ There are two **types of neural networks**:
|
||||
|
||||
No setting of the type in the firmware is necessary. The type can detect by the output structure automatically.
|
||||
|
||||
**Attention:**
|
||||
**:bangbang: Attention:**
|
||||
|
||||
* It is very important to choose the right network type (digits or analog pointers).
|
||||
Technically a wrong network will work and create output, but that would be totally arbitrary
|
||||
* Not all type of pointers are trained in all networks.
|
||||
* For the 11 classes digits network there many different types of digits trained. The reason is, that you 1) only need 20-30 training images and 2) the data collection is ongoing much longer
|
||||
* For the continious and 100 classes network especially for the digits, there are only a view types of digits trained up to now
|
||||
* For the continious and 100 classes network especially for the digits, there are only a few types of digits trained up to now
|
||||
* Therefore sometimes for the digits it is more effective to choose the simpler 11 classes network type (= default).
|
||||
|
||||
_______________________________
|
||||
|
||||
|
||||
### 2. Naming convention
|
||||
## Naming convention
|
||||
|
||||
| | Classification<br />11 classes<br />0, 1, ... 9 + "N" | Classification<br />100 classes<br />0.0, 0.1, ... 9.9 | Continuous<br />Interval<br />[0, 10[ |
|
||||
| ---------------------------------------------------- | ----------------------------------------------------- | ------------------------------------------------------ | ------------------------------------- |
|
||||
@@ -66,37 +59,34 @@ Example: `dig-class11_1410_s2_q.tflite`
|
||||
|
||||
|
||||
|
||||
## Overview of trained types and details
|
||||
|
||||
_______________________________________________________
|
||||
|
||||
### 3. Overview of trained types and details
|
||||
|
||||
#### 3a. Analog Pointer ("ana-cont_XXX.tflite" & "ana-class100_XXX.tflite")
|
||||
### Analog Pointer ("ana-cont_XXX.tflite" & "ana-class100_XXX.tflite")
|
||||
|
||||
This is to transfer the direction of a pointer into a continuous number between 0 and 1, whereas 0 (=1) is the upwards position (12 o'clock), 0.25 corresponds to the 3 o'clock positions and so on. This network is a envolop for all different types of pointers. Currently there are no dedicated network trainings for specific types of pointers.
|
||||
|
||||
There are two types of network structure, currently both are supported. The "class100" is a pure classification network, that might need a bit more accuracy in the labeling. "cont" is a no classic approach with a continuous output off only 2 neurons (details see below).
|
||||
|
||||
##### Types of counters trained:
|
||||
#### Types of counters trained:
|
||||
|
||||
| | | | |
|
||||
| ----------------------------------- | ----------------------------------- | ----------------------------------- | ----------------------------------- |
|
||||
|  |  |  |  |
|
||||
|  |  |  | |
|
||||
|
||||
##### Training data needs
|
||||
#### Training data needs
|
||||
|
||||
* Quadratic images, minimum size: 32x32 pixel
|
||||
* Typically 100 - 200 images with a resultion of 1/100 of the full rotation (every 0.1 value or 3.6°)
|
||||
* Naming: x.y_ARBITRARY.jpg, where x.y = value 0.0 ... 9.9
|
||||
|
||||
##### CNN Technical details:
|
||||
#### CNN Technical details:
|
||||
|
||||
###### Input
|
||||
##### Input
|
||||
|
||||
* 32 x 32 RGB images
|
||||
|
||||
###### Output
|
||||
##### Output
|
||||
|
||||
* **ana-cont**_XXX.tflite:
|
||||
* 2 neurons with output in range [-1, 1] - representing a sinus / cosinus encoding of the angle
|
||||
@@ -108,12 +98,12 @@ There are two types of network structure, currently both are supported. The "cla
|
||||
|
||||
|
||||
|
||||
#### 3b. Digits with 11 classes ("dig-class11_XXX.tflite")
|
||||
### Digits with 11 classes ("dig-class11_XXX.tflite")
|
||||
|
||||
The digit type is a classical classification network, with 11 classes representing the numbers 0, 1, ... 9 and the special class "N". It is trained for the rolling ring of gas and electric meters. As there is sometime a status between two images, the special class "N" is representing Not-A-Number for the case, that the image cannot be unique classified to one number e.g. because it is between two digits. For this type the lowest amount of training data per type is needed, resulting in a large variety of type being already part of the training set.
|
||||
|
||||
|
||||
##### Types of counters trained:
|
||||
#### Types of counters trained:
|
||||
|
||||
| | | | | | | |
|
||||
| -------------------------- | -------------------------- | -------------------------- | -------------------------- | -------------------------- | -------------------------- | -------------------------- |
|
||||
@@ -122,20 +112,20 @@ The digit type is a classical classification network, with 11 classes representi
|
||||
| | | | | | | |
|
||||
|
||||
|
||||
##### Training data needs
|
||||
#### Training data needs
|
||||
|
||||
* RGB images, with minimum size: 20x32 pixel
|
||||
* Typically 10 - 20 images (1-2 for each digit and an arbitrary number for the "N" class
|
||||
|
||||
* Naming: x_ARBITRARY.jpg, where x = value 0 ... 9 + N
|
||||
|
||||
##### CNN Technical details:
|
||||
#### CNN Technical details:
|
||||
|
||||
###### Input
|
||||
##### Input
|
||||
|
||||
* 20 x 32 RGB images
|
||||
|
||||
###### Output
|
||||
##### Output
|
||||
|
||||
* 11 neurons for image classification (last layer normalized to 1)
|
||||
* Neuron 0 to 9 represent the corresponding numbers "0" to "9"
|
||||
@@ -143,12 +133,12 @@ The digit type is a classical classification network, with 11 classes representi
|
||||
|
||||
|
||||
|
||||
#### 3c. Digits with rolling results ("dig-class100_XXX.tflite" & "dig-cont_XXX.tflite")
|
||||
### Digits with rolling results ("dig-class100_XXX.tflite" & "dig-cont_XXX.tflite")
|
||||
|
||||
This type of network tries to overcome the problem, that there are intermediate values, when a rolling digit is between two numbers. Previous this was the "N" class. In this network type, there are also subdigit values trained, so that the intermediate state can be used as additional information for the algorithms.
|
||||
|
||||
|
||||
##### Types of counters trained:
|
||||
#### Types of counters trained:
|
||||
|
||||
| | | | |
|
||||
| ---------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ---- |
|
||||
@@ -157,20 +147,20 @@ This type of network tries to overcome the problem, that there are intermediate
|
||||
|
||||
|
||||
|
||||
##### Training data needs
|
||||
#### Training data needs
|
||||
|
||||
* RGB images, with minimum size: 20x32 pixel
|
||||
* Typically 100 - 200 images (1-2 for each possible position)
|
||||
|
||||
* Naming: x.y_ARBITRARY.jpg, where x.y = 0.0, 0.1, ... 9.9 representing the intermediate state
|
||||
|
||||
##### CNN Technical details:
|
||||
#### CNN Technical details:
|
||||
|
||||
###### Input
|
||||
##### Input
|
||||
|
||||
* 20 x 32 RGB images
|
||||
|
||||
###### Output
|
||||
##### Output
|
||||
|
||||
* **dig-cont**_XXX.tflite:
|
||||
* 10 neurons representing the digits 0, 1, ... 9. The intermediate values are represented by weighted normalized values of two neighboring output neurons
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
# REST API
|
||||
Various information is directly accessible over specific REST calls.
|
||||
|
||||
For an up-to-date list search the Github repository for [registered handlers](https://github.com/jomjol/AI-on-the-edge-device/search?q=camuri.uri)
|
||||
|
||||
# Often used APIs
|
||||
Just append them to the IP, separated with a `/`, eg. `http://192.168.1.1/json`
|
||||
To use it, just append them to the IP, separated with a `/`, eg. `http://192.168.1.1/json`
|
||||
|
||||
## Control
|
||||
* ### flow_start
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# ROI (Region of Interest) Configuration
|
||||
# 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.
|
||||
@@ -12,27 +12,36 @@ The most critical settings for accurate detection are:
|
||||
|
||||
_____
|
||||
|
||||
## 1. Correct Setup of ROI
|
||||
## Correct Setup of ROI
|
||||
Please proceed in the following order!
|
||||
|
||||
Don't forget to save after each step!
|
||||
|
||||
### 1. 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** See [these instructions](https://github.com/jomjol/water-meter-picture-provider/blob/master/ESP32-CAM_Lens_Modification.md) for help.
|
||||
### 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!**
|
||||
|
||||
### 2. Horizontal Alignment
|
||||
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.
|
||||
|
||||
**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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||
### Horizontal Alignment
|
||||
Ensure an **exact horizontal alignment** of the number via the alignment / reference setup:
|
||||
|
||||
| :heavy_check_mark: Okay | :x: Not Okay |
|
||||
| ------------------------------ | ---------------------------------- |
|
||||
|  |  |
|
||||
|
||||
### 3. Correct Size for ROI
|
||||
### 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.
|
||||
|
||||
### 4. Model Selection
|
||||
### 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.
|
||||
|
||||
@@ -71,4 +80,3 @@ Here an example:
|
||||
| :heavy_check_mark: **Okay** | <img width="125" alt="dig-class100_OK" src="https://user-images.githubusercontent.com/412645/199028380-7623776e-59b9-4356-ab55-3852253609df.png"> |
|
||||
| :x: **Not** Okay | <img width="125" alt="dig-class100_NOK" src="https://user-images.githubusercontent.com/412645/199028469-3a69ed31-e5c9-4038-a8dc-6d44a42437ed.png"> |
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
## Preparing for release
|
||||
# Preparing for Release
|
||||
|
||||
1. [Changelog](https://github.com/jomjol/AI-on-the-edge-device/blob/rolling/Changelog.md) is merged back from `master` branch to `rolling` branch (should be the last step of the previous release creation)
|
||||
1. All changes are documented in the [Changelog](https://github.com/jomjol/AI-on-the-edge-device/blob/rolling/Changelog.md) in `rolling` branch
|
||||
|
||||
6
docs/Upload-files-by-script.md
Normal file
@@ -0,0 +1,6 @@
|
||||
# Scripted File Upload
|
||||
To upload a file eg. using `curl`, you first have to delete it and then upload it:
|
||||
```
|
||||
curl -d '' http://192.168.1.153/delete/html/index.html
|
||||
curl --data-binary @ota_page.html http://192.168.1.153/upload/html/index.html
|
||||
```
|
||||
@@ -1,4 +1,4 @@
|
||||
# Understanding the problem
|
||||
# Analog/Digital Transition on Watermeters
|
||||
|
||||
At first, for the most watermeters the default configuration should be work. But the digit, especially the last digit differs in some devices.
|
||||
|
||||
|
||||
BIN
docs/img/Flash_Settings.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
docs/img/ana-class100.png
Normal file
|
After Width: | Height: | Size: 71 KiB |
BIN
docs/img/config_s1_access.jpg
Normal file
|
After Width: | Height: | Size: 161 KiB |
BIN
docs/img/cont_img_ok.png
Normal file
|
After Width: | Height: | Size: 73 KiB |
BIN
docs/img/dig-class100.png
Normal file
|
After Width: | Height: | Size: 88 KiB |
BIN
docs/img/dig-class11.png
Normal file
|
After Width: | Height: | Size: 89 KiB |
BIN
docs/img/edit_reference.jpg
Normal file
|
After Width: | Height: | Size: 144 KiB |
BIN
docs/img/focus_adjustment.jpg
Normal file
|
After Width: | Height: | Size: 682 KiB |
BIN
docs/img/idea.jpg
Normal file
|
After Width: | Height: | Size: 106 KiB |
BIN
docs/img/initial_setup_1_reference_image.jpg
Normal file
|
After Width: | Height: | Size: 234 KiB |
BIN
docs/img/initial_setup_2_alignment_marks.jpg
Normal file
|
After Width: | Height: | Size: 235 KiB |
BIN
docs/img/initial_setup_3_analog_example.jpg
Normal file
|
After Width: | Height: | Size: 84 KiB |
BIN
docs/img/initial_setup_3_rois.jpg
Normal file
|
After Width: | Height: | Size: 204 KiB |
BIN
docs/img/initial_setup_5_configuration.jpg
Normal file
|
After Width: | Height: | Size: 441 KiB |
BIN
docs/img/initial_setup_6_finish_reboot.jpg
Normal file
|
After Width: | Height: | Size: 123 KiB |
BIN
docs/img/initial_setup_7_access_normal_mode.jpg
Normal file
|
After Width: | Height: | Size: 214 KiB |
BIN
docs/img/logo.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
746
docs/img/logo.svg
Normal file
@@ -0,0 +1,746 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
|
||||
<svg
|
||||
version="1.1"
|
||||
id="Layer_1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
viewBox="0 0 310.39999 310.39999"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="watermeter.svg"
|
||||
width="310.39999"
|
||||
height="310.39999"
|
||||
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"><metadata
|
||||
id="metadata151"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs149"><inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 155.2 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="310.39999 : 155.2 : 1"
|
||||
inkscape:persp3d-origin="155.2 : 103.46666 : 1"
|
||||
id="perspective1295" /><linearGradient
|
||||
id="linearGradient888"
|
||||
inkscape:swatch="solid"><stop
|
||||
style="stop-color:#ff0000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop886" /></linearGradient></defs><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1003"
|
||||
id="namedview147"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="0.31481804"
|
||||
inkscape:cx="-1332.5158"
|
||||
inkscape:cy="-481.23036"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Layer_1"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
inkscape:snap-text-baseline="false" />
|
||||
|
||||
|
||||
<circle
|
||||
style="fill:#000000;fill-opacity:1"
|
||||
cx="155.2"
|
||||
cy="155.2"
|
||||
r="155.2"
|
||||
id="circle6"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001" />
|
||||
<circle
|
||||
style="fill:#999999"
|
||||
cx="155.2"
|
||||
cy="155.2"
|
||||
id="circle8"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001"
|
||||
r="141.60001" />
|
||||
<path
|
||||
style="fill:#ff0000;fill-opacity:1"
|
||||
d="m 240.8,122 h -14 c -3.2,0 -5.6,-2.4 -5.6,-5.6 V 87.999997 c 0,-3.2 2.4,-5.6 5.6,-5.6 h 14 c 3.2,0 5.6,2.4 5.6,5.6 V 116.4 c -0.4,3.2 -2.8,5.6 -5.6,5.6 z"
|
||||
id="path10"
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001" />
|
||||
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1"
|
||||
d="m 209.2,122 h -14 c -3.2,0 -5.6,-2.4 -5.6,-5.6 V 87.999997 c 0,-3.2 2.4,-5.6 5.6,-5.6 h 14 c 3.2,0 5.6,2.4 5.6,5.6 V 116.4 c 0,3.2 -2.4,5.6 -5.6,5.6 z"
|
||||
id="path14"
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001" />
|
||||
|
||||
<path
|
||||
style="fill:#000002;fill-opacity:1"
|
||||
d="m 178,122 h -14 c -3.2,0 -5.6,-2.4 -5.6,-5.6 V 87.999997 c 0,-3.2 2.4,-5.6 5.6,-5.6 h 14 c 3.2,0 5.6,2.4 5.6,5.6 V 116.4 c -0.4,3.2 -2.8,5.6 -5.6,5.6 z"
|
||||
id="path18"
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001" />
|
||||
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1"
|
||||
d="m 146.8,122 h -14 c -3.2,0 -5.6,-2.4 -5.6,-5.6 V 87.999997 c 0,-3.2 2.4,-5.6 5.6,-5.6 h 14 c 3.2,0 5.6,2.4 5.6,5.6 V 116.4 c -0.4,3.2 -2.8,5.6 -5.6,5.6 z"
|
||||
id="path22"
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001" />
|
||||
|
||||
<path
|
||||
style="fill:#000003;fill-opacity:1"
|
||||
d="m 115.2,122 h -14 c -3.2,0 -5.6,-2.4 -5.6,-5.6 V 87.999997 c 0,-3.2 2.4,-5.6 5.6,-5.6 h 14 c 3.2,0 5.6,2.4 5.6,5.6 V 116.4 c 0,3.2 -2.4,5.6 -5.6,5.6 z"
|
||||
id="path26"
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001" />
|
||||
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1"
|
||||
d="M 84,122 H 70 c -3.2,0 -5.6,-2.4 -5.6,-5.6 V 87.999997 c 0,-3.2 2.4,-5.6 5.6,-5.6 h 14 c 3.2,0 5.6,2.4 5.6,5.6 V 116.4 c -0.4,3.2 -2.8,5.6 -5.6,5.6 z"
|
||||
id="path30"
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001" />
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<g
|
||||
id="g116"
|
||||
transform="translate(-98.8,-98.800003)"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001">
|
||||
</g>
|
||||
<g
|
||||
id="g118"
|
||||
transform="translate(-98.8,-98.800003)"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001">
|
||||
</g>
|
||||
<g
|
||||
id="g120"
|
||||
transform="translate(-98.8,-98.800003)"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001">
|
||||
</g>
|
||||
<g
|
||||
id="g122"
|
||||
transform="translate(-98.8,-98.800003)"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001">
|
||||
</g>
|
||||
<g
|
||||
id="g124"
|
||||
transform="translate(-98.8,-98.800003)"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001">
|
||||
</g>
|
||||
<g
|
||||
id="g126"
|
||||
transform="translate(-98.8,-98.800003)"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001">
|
||||
</g>
|
||||
<g
|
||||
id="g128"
|
||||
transform="translate(-98.8,-98.800003)"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001">
|
||||
</g>
|
||||
<g
|
||||
id="g130"
|
||||
transform="translate(-98.8,-98.800003)"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001">
|
||||
</g>
|
||||
<g
|
||||
id="g132"
|
||||
transform="translate(-98.8,-98.800003)"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001">
|
||||
</g>
|
||||
<g
|
||||
id="g134"
|
||||
transform="translate(-98.8,-98.800003)"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001">
|
||||
</g>
|
||||
<g
|
||||
id="g136"
|
||||
transform="translate(-98.8,-98.800003)"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001">
|
||||
</g>
|
||||
<g
|
||||
id="g138"
|
||||
transform="translate(-98.8,-98.800003)"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001">
|
||||
</g>
|
||||
<g
|
||||
id="g140"
|
||||
transform="translate(-98.8,-98.800003)"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001">
|
||||
</g>
|
||||
<g
|
||||
id="g142"
|
||||
transform="translate(-98.8,-98.800003)"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001">
|
||||
</g>
|
||||
<g
|
||||
id="g144"
|
||||
transform="translate(-98.8,-98.800003)"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001">
|
||||
</g>
|
||||
<rect
|
||||
style="fill:none;fill-opacity:1;stroke:#0c0000;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="rect958"
|
||||
width="222.78813"
|
||||
height="51.122875"
|
||||
x="44.665253"
|
||||
y="76.849152"
|
||||
rx="10"
|
||||
ry="10"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001" />
|
||||
|
||||
|
||||
<g
|
||||
id="g2493"
|
||||
transform="matrix(-0.44400058,-1.0430452,1.0430452,-0.44400058,-85.63466,328.03956)"
|
||||
style="stroke-width:0.882135"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001"><path
|
||||
style="fill:#e6e9ee;stroke-width:0.882135"
|
||||
d="m 72.8,202.4 v 0 c -16,0 -29.2,-13.2 -29.2,-29.2 v 0 c 0,-16 13.2,-29.2 29.2,-29.2 v 0 c 16,0 29.2,13.2 29.2,29.2 v 0 c 0,16.4 -13.2,29.2 -29.2,29.2 z"
|
||||
id="path44"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 72.8,198.4 c -0.8,0 -1.2,-0.4 -1.2,-1.2 v -6 c 0,-0.8 0.4,-1.2 1.2,-1.2 0.8,0 1.2,0.4 1.2,1.2 v 6 c 0,0.8 -0.4,1.2 -1.2,1.2 z"
|
||||
id="path46"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 72.8,156.8 c -0.8,0 -1.2,-0.4 -1.2,-1.2 v -6 c 0,-0.8 0.4,-1.2 1.2,-1.2 0.8,0 1.2,0.4 1.2,1.2 v 5.6 c 0,0.8 -0.4,1.6 -1.2,1.6 z"
|
||||
id="path48"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 54.8,174.8 h -6 c -0.8,0 -1.2,-0.4 -1.2,-1.2 0,-0.8 0.4,-1.2 1.2,-1.2 h 6 c 0.8,0 1.2,0.4 1.2,1.2 0,0.4 -0.4,1.2 -1.2,1.2 z"
|
||||
id="path50"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 96.8,174.8 h -6 c -0.8,0 -1.2,-0.4 -1.2,-1.2 0,-0.8 0.4,-1.2 1.2,-1.2 h 6 c 0.8,0 1.2,0.4 1.2,1.2 0,0.4 -0.8,1.2 -1.2,1.2 z"
|
||||
id="path52"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 56,191.6 c -0.4,0 -0.8,0 -0.8,-0.4 -0.4,-0.4 -0.4,-1.2 0,-1.6 l 4,-4 c 0.4,-0.4 1.2,-0.4 1.6,0 0.4,0.4 0.4,1.2 0,1.6 l -4,4 c -0.4,0 -0.4,0.4 -0.8,0.4 z"
|
||||
id="path54"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 85.6,162 c -0.4,0 -0.8,0 -0.8,-0.4 -0.4,-0.4 -0.4,-1.2 0,-1.6 l 4,-4 c 0.4,-0.4 1.2,-0.4 1.6,0 0.4,0.4 0.4,1.2 0,1.6 l -4,4 c -0.4,0 -0.4,0.4 -0.8,0.4 z"
|
||||
id="path56"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 60,162 c -0.4,0 -0.8,0 -0.8,-0.4 l -4,-4 c -0.4,-0.4 -0.4,-1.2 0,-1.6 0.4,-0.4 1.2,-0.4 1.6,0 l 4,4 c 0.4,0.4 0.4,1.2 0,1.6 0,0 -0.4,0.4 -0.8,0.4 z"
|
||||
id="path58"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 89.6,191.6 c -0.4,0 -0.8,0 -0.8,-0.4 l -4,-4 c -0.4,-0.4 -0.4,-1.2 0,-1.6 0.4,-0.4 1.2,-0.4 1.6,0 l 4,4 c 0.4,0.4 0.4,1.2 0,1.6 0,0 -0.4,0.4 -0.8,0.4 z"
|
||||
id="path60"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 82,196.8 c -0.4,0 -0.8,-0.4 -1.2,-0.8 l -2.4,-5.6 c -0.4,-0.8 0,-1.2 0.8,-1.6 0.8,-0.4 1.2,0 1.6,0.8 l 2.4,5.6 c 0.4,0.8 0,1.2 -0.8,1.6 0,0 -0.4,0 -0.4,0 z"
|
||||
id="path62"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 66,158 c -0.4,0 -0.8,-0.4 -1.2,-0.8 l -2.4,-5.6 c -0.4,-0.8 0,-1.2 0.8,-1.6 0.8,-0.4 1.2,0 1.6,0.8 l 2.4,5.6 c 0.4,0.8 0,1.2 -0.8,1.6 0,0 -0.4,0 -0.4,0 z"
|
||||
id="path64"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 50.8,183.6 c -0.4,0 -0.8,-0.4 -1.2,-0.8 -0.4,-0.8 0,-1.2 0.8,-1.6 l 5.6,-2.4 c 0.8,-0.4 1.2,0 1.6,0.8 0.4,0.8 0,1.2 -0.8,1.6 l -5.6,2.4 z"
|
||||
id="path66"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 89.6,167.6 c -0.4,0 -0.8,-0.4 -1.2,-0.8 -0.4,-0.8 0,-1.2 0.8,-1.6 l 5.6,-2.4 c 0.8,-0.4 1.2,0 1.6,0.8 0.4,0.8 0,1.2 -0.8,1.6 l -5.6,2.4 c -0.4,0 -0.4,0 -0.4,0 z"
|
||||
id="path68"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 63.6,196.8 h -0.4 c -0.8,-0.4 -0.8,-1.2 -0.8,-1.6 l 2.4,-5.6 c 0.4,-0.8 1.2,-0.8 1.6,-0.8 0.8,0.4 0.8,1.2 0.8,1.6 l -2.4,5.6 c 0,0.4 -0.8,0.8 -1.2,0.8 z"
|
||||
id="path70"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 79.6,158 h -0.4 c -0.8,-0.4 -0.8,-1.2 -0.8,-1.6 l 2.4,-5.6 c 0.4,-0.8 1.2,-0.8 1.6,-0.8 0.8,0.4 0.8,1.2 0.8,1.6 l -2.4,5.6 c 0,0.4 -0.8,0.8 -1.2,0.8 z"
|
||||
id="path72"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="M 56,167.6 H 55.6 L 50,165.2 c -0.8,-0.4 -0.8,-1.2 -0.8,-1.6 0.4,-0.8 1.2,-0.8 1.6,-0.8 l 5.6,2.4 c 0.8,0.4 0.8,1.2 0.8,1.6 0,0.8 -0.4,0.8 -1.2,0.8 z"
|
||||
id="path74"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 94.8,183.6 h -0.4 l -5.6,-2.4 C 88,180.8 88,180 88,179.6 c 0.4,-0.8 1.2,-0.8 1.6,-0.8 l 5.6,2.4 c 0.8,0.4 0.8,1.2 0.8,1.6 0,0.8 -0.8,0.8 -1.2,0.8 z"
|
||||
id="path76"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#ff0000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 72.8,180.4 v 0 c -4,0 -6.8,-3.2 -6.8,-6.8 v 0 c 0,-4 3.2,-6.8 6.8,-6.8 v 0 c 4,0 6.8,3.2 6.8,6.8 v 0 c 0,3.6 -2.8,6.8 -6.8,6.8 z"
|
||||
id="path78"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
id="rect1441"
|
||||
style="opacity:1;fill:#ff0000;stroke-width:2.21715"
|
||||
d="m 72.801641,150.78759 v 0 l 5.635295,19.11133 h -11.27059 z"
|
||||
sodipodi:nodetypes="ccccc" /></g><g
|
||||
id="g2493-1"
|
||||
transform="matrix(-1.0365525,-0.458954,0.458954,-1.0365525,191.69502,452.08902)"
|
||||
inkscape:transform-center-x="-0.13984455"
|
||||
inkscape:transform-center-y="1.3468756"
|
||||
style="stroke-width:0.882135"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001"><path
|
||||
style="fill:#e6e9ee;stroke-width:0.882135"
|
||||
d="m 72.8,202.4 v 0 c -16,0 -29.2,-13.2 -29.2,-29.2 v 0 c 0,-16 13.2,-29.2 29.2,-29.2 v 0 c 16,0 29.2,13.2 29.2,29.2 v 0 c 0,16.4 -13.2,29.2 -29.2,29.2 z"
|
||||
id="path44-8"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 72.8,198.4 c -0.8,0 -1.2,-0.4 -1.2,-1.2 v -6 c 0,-0.8 0.4,-1.2 1.2,-1.2 0.8,0 1.2,0.4 1.2,1.2 v 6 c 0,0.8 -0.4,1.2 -1.2,1.2 z"
|
||||
id="path46-79"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 72.8,156.8 c -0.8,0 -1.2,-0.4 -1.2,-1.2 v -6 c 0,-0.8 0.4,-1.2 1.2,-1.2 0.8,0 1.2,0.4 1.2,1.2 v 5.6 c 0,0.8 -0.4,1.6 -1.2,1.6 z"
|
||||
id="path48-2"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 54.8,174.8 h -6 c -0.8,0 -1.2,-0.4 -1.2,-1.2 0,-0.8 0.4,-1.2 1.2,-1.2 h 6 c 0.8,0 1.2,0.4 1.2,1.2 0,0.4 -0.4,1.2 -1.2,1.2 z"
|
||||
id="path50-0"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 96.8,174.8 h -6 c -0.8,0 -1.2,-0.4 -1.2,-1.2 0,-0.8 0.4,-1.2 1.2,-1.2 h 6 c 0.8,0 1.2,0.4 1.2,1.2 0,0.4 -0.8,1.2 -1.2,1.2 z"
|
||||
id="path52-2"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 56,191.6 c -0.4,0 -0.8,0 -0.8,-0.4 -0.4,-0.4 -0.4,-1.2 0,-1.6 l 4,-4 c 0.4,-0.4 1.2,-0.4 1.6,0 0.4,0.4 0.4,1.2 0,1.6 l -4,4 c -0.4,0 -0.4,0.4 -0.8,0.4 z"
|
||||
id="path54-3"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 85.6,162 c -0.4,0 -0.8,0 -0.8,-0.4 -0.4,-0.4 -0.4,-1.2 0,-1.6 l 4,-4 c 0.4,-0.4 1.2,-0.4 1.6,0 0.4,0.4 0.4,1.2 0,1.6 l -4,4 c -0.4,0 -0.4,0.4 -0.8,0.4 z"
|
||||
id="path56-7"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 60,162 c -0.4,0 -0.8,0 -0.8,-0.4 l -4,-4 c -0.4,-0.4 -0.4,-1.2 0,-1.6 0.4,-0.4 1.2,-0.4 1.6,0 l 4,4 c 0.4,0.4 0.4,1.2 0,1.6 0,0 -0.4,0.4 -0.8,0.4 z"
|
||||
id="path58-5"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 89.6,191.6 c -0.4,0 -0.8,0 -0.8,-0.4 l -4,-4 c -0.4,-0.4 -0.4,-1.2 0,-1.6 0.4,-0.4 1.2,-0.4 1.6,0 l 4,4 c 0.4,0.4 0.4,1.2 0,1.6 0,0 -0.4,0.4 -0.8,0.4 z"
|
||||
id="path60-9"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 82,196.8 c -0.4,0 -0.8,-0.4 -1.2,-0.8 l -2.4,-5.6 c -0.4,-0.8 0,-1.2 0.8,-1.6 0.8,-0.4 1.2,0 1.6,0.8 l 2.4,5.6 c 0.4,0.8 0,1.2 -0.8,1.6 0,0 -0.4,0 -0.4,0 z"
|
||||
id="path62-22"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 66,158 c -0.4,0 -0.8,-0.4 -1.2,-0.8 l -2.4,-5.6 c -0.4,-0.8 0,-1.2 0.8,-1.6 0.8,-0.4 1.2,0 1.6,0.8 l 2.4,5.6 c 0.4,0.8 0,1.2 -0.8,1.6 0,0 -0.4,0 -0.4,0 z"
|
||||
id="path64-8"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 50.8,183.6 c -0.4,0 -0.8,-0.4 -1.2,-0.8 -0.4,-0.8 0,-1.2 0.8,-1.6 l 5.6,-2.4 c 0.8,-0.4 1.2,0 1.6,0.8 0.4,0.8 0,1.2 -0.8,1.6 l -5.6,2.4 z"
|
||||
id="path66-9"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 89.6,167.6 c -0.4,0 -0.8,-0.4 -1.2,-0.8 -0.4,-0.8 0,-1.2 0.8,-1.6 l 5.6,-2.4 c 0.8,-0.4 1.2,0 1.6,0.8 0.4,0.8 0,1.2 -0.8,1.6 l -5.6,2.4 c -0.4,0 -0.4,0 -0.4,0 z"
|
||||
id="path68-7"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 63.6,196.8 h -0.4 c -0.8,-0.4 -0.8,-1.2 -0.8,-1.6 l 2.4,-5.6 c 0.4,-0.8 1.2,-0.8 1.6,-0.8 0.8,0.4 0.8,1.2 0.8,1.6 l -2.4,5.6 c 0,0.4 -0.8,0.8 -1.2,0.8 z"
|
||||
id="path70-36"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 79.6,158 h -0.4 c -0.8,-0.4 -0.8,-1.2 -0.8,-1.6 l 2.4,-5.6 c 0.4,-0.8 1.2,-0.8 1.6,-0.8 0.8,0.4 0.8,1.2 0.8,1.6 l -2.4,5.6 c 0,0.4 -0.8,0.8 -1.2,0.8 z"
|
||||
id="path72-1"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="M 56,167.6 H 55.6 L 50,165.2 c -0.8,-0.4 -0.8,-1.2 -0.8,-1.6 0.4,-0.8 1.2,-0.8 1.6,-0.8 l 5.6,2.4 c 0.8,0.4 0.8,1.2 0.8,1.6 0,0.8 -0.4,0.8 -1.2,0.8 z"
|
||||
id="path74-2"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 94.8,183.6 h -0.4 l -5.6,-2.4 C 88,180.8 88,180 88,179.6 c 0.4,-0.8 1.2,-0.8 1.6,-0.8 l 5.6,2.4 c 0.8,0.4 0.8,1.2 0.8,1.6 0,0.8 -0.8,0.8 -1.2,0.8 z"
|
||||
id="path76-9"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#ff0000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 72.8,180.4 v 0 c -4,0 -6.8,-3.2 -6.8,-6.8 v 0 c 0,-4 3.2,-6.8 6.8,-6.8 v 0 c 4,0 6.8,3.2 6.8,6.8 v 0 c 0,3.6 -2.8,6.8 -6.8,6.8 z"
|
||||
id="path78-3"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
id="rect1441-1"
|
||||
style="opacity:1;fill:#ff0000;stroke-width:2.21715"
|
||||
d="m 72.801641,150.78759 v 0 l 5.635295,19.11133 h -11.27059 z"
|
||||
sodipodi:nodetypes="ccccc" /></g><g
|
||||
id="g2493-9"
|
||||
transform="matrix(1.1065407,0.24626723,-0.24626723,1.1065407,81.269684,28.240985)"
|
||||
style="stroke-width:0.882135"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001"><path
|
||||
style="fill:#e6e9ee;stroke-width:0.882135"
|
||||
d="m 72.8,202.4 v 0 c -16,0 -29.2,-13.2 -29.2,-29.2 v 0 c 0,-16 13.2,-29.2 29.2,-29.2 v 0 c 16,0 29.2,13.2 29.2,29.2 v 0 c 0,16.4 -13.2,29.2 -29.2,29.2 z"
|
||||
id="path44-4"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 72.8,198.4 c -0.8,0 -1.2,-0.4 -1.2,-1.2 v -6 c 0,-0.8 0.4,-1.2 1.2,-1.2 0.8,0 1.2,0.4 1.2,1.2 v 6 c 0,0.8 -0.4,1.2 -1.2,1.2 z"
|
||||
id="path46-78"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 72.8,156.8 c -0.8,0 -1.2,-0.4 -1.2,-1.2 v -6 c 0,-0.8 0.4,-1.2 1.2,-1.2 0.8,0 1.2,0.4 1.2,1.2 v 5.6 c 0,0.8 -0.4,1.6 -1.2,1.6 z"
|
||||
id="path48-4"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 54.8,174.8 h -6 c -0.8,0 -1.2,-0.4 -1.2,-1.2 0,-0.8 0.4,-1.2 1.2,-1.2 h 6 c 0.8,0 1.2,0.4 1.2,1.2 0,0.4 -0.4,1.2 -1.2,1.2 z"
|
||||
id="path50-5"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 96.8,174.8 h -6 c -0.8,0 -1.2,-0.4 -1.2,-1.2 0,-0.8 0.4,-1.2 1.2,-1.2 h 6 c 0.8,0 1.2,0.4 1.2,1.2 0,0.4 -0.8,1.2 -1.2,1.2 z"
|
||||
id="path52-0"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 56,191.6 c -0.4,0 -0.8,0 -0.8,-0.4 -0.4,-0.4 -0.4,-1.2 0,-1.6 l 4,-4 c 0.4,-0.4 1.2,-0.4 1.6,0 0.4,0.4 0.4,1.2 0,1.6 l -4,4 c -0.4,0 -0.4,0.4 -0.8,0.4 z"
|
||||
id="path54-36"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 85.6,162 c -0.4,0 -0.8,0 -0.8,-0.4 -0.4,-0.4 -0.4,-1.2 0,-1.6 l 4,-4 c 0.4,-0.4 1.2,-0.4 1.6,0 0.4,0.4 0.4,1.2 0,1.6 l -4,4 c -0.4,0 -0.4,0.4 -0.8,0.4 z"
|
||||
id="path56-1"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 60,162 c -0.4,0 -0.8,0 -0.8,-0.4 l -4,-4 c -0.4,-0.4 -0.4,-1.2 0,-1.6 0.4,-0.4 1.2,-0.4 1.6,0 l 4,4 c 0.4,0.4 0.4,1.2 0,1.6 0,0 -0.4,0.4 -0.8,0.4 z"
|
||||
id="path58-0"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 89.6,191.6 c -0.4,0 -0.8,0 -0.8,-0.4 l -4,-4 c -0.4,-0.4 -0.4,-1.2 0,-1.6 0.4,-0.4 1.2,-0.4 1.6,0 l 4,4 c 0.4,0.4 0.4,1.2 0,1.6 0,0 -0.4,0.4 -0.8,0.4 z"
|
||||
id="path60-6"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 82,196.8 c -0.4,0 -0.8,-0.4 -1.2,-0.8 l -2.4,-5.6 c -0.4,-0.8 0,-1.2 0.8,-1.6 0.8,-0.4 1.2,0 1.6,0.8 l 2.4,5.6 c 0.4,0.8 0,1.2 -0.8,1.6 0,0 -0.4,0 -0.4,0 z"
|
||||
id="path62-3"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 66,158 c -0.4,0 -0.8,-0.4 -1.2,-0.8 l -2.4,-5.6 c -0.4,-0.8 0,-1.2 0.8,-1.6 0.8,-0.4 1.2,0 1.6,0.8 l 2.4,5.6 c 0.4,0.8 0,1.2 -0.8,1.6 0,0 -0.4,0 -0.4,0 z"
|
||||
id="path64-2"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 50.8,183.6 c -0.4,0 -0.8,-0.4 -1.2,-0.8 -0.4,-0.8 0,-1.2 0.8,-1.6 l 5.6,-2.4 c 0.8,-0.4 1.2,0 1.6,0.8 0.4,0.8 0,1.2 -0.8,1.6 l -5.6,2.4 z"
|
||||
id="path66-06"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 89.6,167.6 c -0.4,0 -0.8,-0.4 -1.2,-0.8 -0.4,-0.8 0,-1.2 0.8,-1.6 l 5.6,-2.4 c 0.8,-0.4 1.2,0 1.6,0.8 0.4,0.8 0,1.2 -0.8,1.6 l -5.6,2.4 c -0.4,0 -0.4,0 -0.4,0 z"
|
||||
id="path68-1"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 63.6,196.8 h -0.4 c -0.8,-0.4 -0.8,-1.2 -0.8,-1.6 l 2.4,-5.6 c 0.4,-0.8 1.2,-0.8 1.6,-0.8 0.8,0.4 0.8,1.2 0.8,1.6 l -2.4,5.6 c 0,0.4 -0.8,0.8 -1.2,0.8 z"
|
||||
id="path70-5"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 79.6,158 h -0.4 c -0.8,-0.4 -0.8,-1.2 -0.8,-1.6 l 2.4,-5.6 c 0.4,-0.8 1.2,-0.8 1.6,-0.8 0.8,0.4 0.8,1.2 0.8,1.6 l -2.4,5.6 c 0,0.4 -0.8,0.8 -1.2,0.8 z"
|
||||
id="path72-5"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="M 56,167.6 H 55.6 L 50,165.2 c -0.8,-0.4 -0.8,-1.2 -0.8,-1.6 0.4,-0.8 1.2,-0.8 1.6,-0.8 l 5.6,2.4 c 0.8,0.4 0.8,1.2 0.8,1.6 0,0.8 -0.4,0.8 -1.2,0.8 z"
|
||||
id="path74-4"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 94.8,183.6 h -0.4 l -5.6,-2.4 C 88,180.8 88,180 88,179.6 c 0.4,-0.8 1.2,-0.8 1.6,-0.8 l 5.6,2.4 c 0.8,0.4 0.8,1.2 0.8,1.6 0,0.8 -0.8,0.8 -1.2,0.8 z"
|
||||
id="path76-7"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#ff0000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 72.8,180.4 v 0 c -4,0 -6.8,-3.2 -6.8,-6.8 v 0 c 0,-4 3.2,-6.8 6.8,-6.8 v 0 c 4,0 6.8,3.2 6.8,6.8 v 0 c 0,3.6 -2.8,6.8 -6.8,6.8 z"
|
||||
id="path78-6"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
id="rect1441-5"
|
||||
style="opacity:1;fill:#ff0000;stroke-width:2.21715"
|
||||
d="m 72.801641,150.78759 v 0 l 5.635295,19.11133 h -11.27059 z"
|
||||
sodipodi:nodetypes="ccccc" /></g><g
|
||||
id="g2493-3"
|
||||
transform="matrix(0.81724208,0.78561769,-0.78561769,0.81724208,322.48101,-24.488096)"
|
||||
style="stroke-width:0.882135"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001"><path
|
||||
style="fill:#e6e9ee;stroke-width:0.882135"
|
||||
d="m 72.8,202.4 v 0 c -16,0 -29.2,-13.2 -29.2,-29.2 v 0 c 0,-16 13.2,-29.2 29.2,-29.2 v 0 c 16,0 29.2,13.2 29.2,29.2 v 0 c 0,16.4 -13.2,29.2 -29.2,29.2 z"
|
||||
id="path44-6"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 72.8,198.4 c -0.8,0 -1.2,-0.4 -1.2,-1.2 v -6 c 0,-0.8 0.4,-1.2 1.2,-1.2 0.8,0 1.2,0.4 1.2,1.2 v 6 c 0,0.8 -0.4,1.2 -1.2,1.2 z"
|
||||
id="path46-7"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 72.8,156.8 c -0.8,0 -1.2,-0.4 -1.2,-1.2 v -6 c 0,-0.8 0.4,-1.2 1.2,-1.2 0.8,0 1.2,0.4 1.2,1.2 v 5.6 c 0,0.8 -0.4,1.6 -1.2,1.6 z"
|
||||
id="path48-5"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 54.8,174.8 h -6 c -0.8,0 -1.2,-0.4 -1.2,-1.2 0,-0.8 0.4,-1.2 1.2,-1.2 h 6 c 0.8,0 1.2,0.4 1.2,1.2 0,0.4 -0.4,1.2 -1.2,1.2 z"
|
||||
id="path50-3"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 96.8,174.8 h -6 c -0.8,0 -1.2,-0.4 -1.2,-1.2 0,-0.8 0.4,-1.2 1.2,-1.2 h 6 c 0.8,0 1.2,0.4 1.2,1.2 0,0.4 -0.8,1.2 -1.2,1.2 z"
|
||||
id="path52-5"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 56,191.6 c -0.4,0 -0.8,0 -0.8,-0.4 -0.4,-0.4 -0.4,-1.2 0,-1.6 l 4,-4 c 0.4,-0.4 1.2,-0.4 1.6,0 0.4,0.4 0.4,1.2 0,1.6 l -4,4 c -0.4,0 -0.4,0.4 -0.8,0.4 z"
|
||||
id="path54-6"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 85.6,162 c -0.4,0 -0.8,0 -0.8,-0.4 -0.4,-0.4 -0.4,-1.2 0,-1.6 l 4,-4 c 0.4,-0.4 1.2,-0.4 1.6,0 0.4,0.4 0.4,1.2 0,1.6 l -4,4 c -0.4,0 -0.4,0.4 -0.8,0.4 z"
|
||||
id="path56-2"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 60,162 c -0.4,0 -0.8,0 -0.8,-0.4 l -4,-4 c -0.4,-0.4 -0.4,-1.2 0,-1.6 0.4,-0.4 1.2,-0.4 1.6,0 l 4,4 c 0.4,0.4 0.4,1.2 0,1.6 0,0 -0.4,0.4 -0.8,0.4 z"
|
||||
id="path58-9"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 89.6,191.6 c -0.4,0 -0.8,0 -0.8,-0.4 l -4,-4 c -0.4,-0.4 -0.4,-1.2 0,-1.6 0.4,-0.4 1.2,-0.4 1.6,0 l 4,4 c 0.4,0.4 0.4,1.2 0,1.6 0,0 -0.4,0.4 -0.8,0.4 z"
|
||||
id="path60-1"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 82,196.8 c -0.4,0 -0.8,-0.4 -1.2,-0.8 l -2.4,-5.6 c -0.4,-0.8 0,-1.2 0.8,-1.6 0.8,-0.4 1.2,0 1.6,0.8 l 2.4,5.6 c 0.4,0.8 0,1.2 -0.8,1.6 0,0 -0.4,0 -0.4,0 z"
|
||||
id="path62-2"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 66,158 c -0.4,0 -0.8,-0.4 -1.2,-0.8 l -2.4,-5.6 c -0.4,-0.8 0,-1.2 0.8,-1.6 0.8,-0.4 1.2,0 1.6,0.8 l 2.4,5.6 c 0.4,0.8 0,1.2 -0.8,1.6 0,0 -0.4,0 -0.4,0 z"
|
||||
id="path64-7"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 50.8,183.6 c -0.4,0 -0.8,-0.4 -1.2,-0.8 -0.4,-0.8 0,-1.2 0.8,-1.6 l 5.6,-2.4 c 0.8,-0.4 1.2,0 1.6,0.8 0.4,0.8 0,1.2 -0.8,1.6 l -5.6,2.4 z"
|
||||
id="path66-0"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 89.6,167.6 c -0.4,0 -0.8,-0.4 -1.2,-0.8 -0.4,-0.8 0,-1.2 0.8,-1.6 l 5.6,-2.4 c 0.8,-0.4 1.2,0 1.6,0.8 0.4,0.8 0,1.2 -0.8,1.6 l -5.6,2.4 c -0.4,0 -0.4,0 -0.4,0 z"
|
||||
id="path68-9"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 63.6,196.8 h -0.4 c -0.8,-0.4 -0.8,-1.2 -0.8,-1.6 l 2.4,-5.6 c 0.4,-0.8 1.2,-0.8 1.6,-0.8 0.8,0.4 0.8,1.2 0.8,1.6 l -2.4,5.6 c 0,0.4 -0.8,0.8 -1.2,0.8 z"
|
||||
id="path70-3"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 79.6,158 h -0.4 c -0.8,-0.4 -0.8,-1.2 -0.8,-1.6 l 2.4,-5.6 c 0.4,-0.8 1.2,-0.8 1.6,-0.8 0.8,0.4 0.8,1.2 0.8,1.6 l -2.4,5.6 c 0,0.4 -0.8,0.8 -1.2,0.8 z"
|
||||
id="path72-6"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="M 56,167.6 H 55.6 L 50,165.2 c -0.8,-0.4 -0.8,-1.2 -0.8,-1.6 0.4,-0.8 1.2,-0.8 1.6,-0.8 l 5.6,2.4 c 0.8,0.4 0.8,1.2 0.8,1.6 0,0.8 -0.4,0.8 -1.2,0.8 z"
|
||||
id="path74-0"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 94.8,183.6 h -0.4 l -5.6,-2.4 C 88,180.8 88,180 88,179.6 c 0.4,-0.8 1.2,-0.8 1.6,-0.8 l 5.6,2.4 c 0.8,0.4 0.8,1.2 0.8,1.6 0,0.8 -0.8,0.8 -1.2,0.8 z"
|
||||
id="path76-6"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#ff0000;fill-opacity:1;stroke-width:0.882135"
|
||||
d="m 72.8,180.4 v 0 c -4,0 -6.8,-3.2 -6.8,-6.8 v 0 c 0,-4 3.2,-6.8 6.8,-6.8 v 0 c 4,0 6.8,3.2 6.8,6.8 v 0 c 0,3.6 -2.8,6.8 -6.8,6.8 z"
|
||||
id="path78-2"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
id="rect1441-6"
|
||||
style="opacity:1;fill:#ff0000;stroke-width:2.21715"
|
||||
d="m 72.801641,150.78759 v 0 l 5.635295,19.11133 h -11.27059 z"
|
||||
sodipodi:nodetypes="ccccc" /></g><text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:33.3333px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="67.090721"
|
||||
y="114.12241"
|
||||
id="text1475"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan1473"
|
||||
x="67.090721"
|
||||
y="114.12241"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:33.3333px;font-family:Sans;-inkscape-font-specification:'Sans Bold';fill:#ffffff">5</tspan></text><text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:33.3333px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="99.090721"
|
||||
y="114.12241"
|
||||
id="text7150"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan7148"
|
||||
x="99.090721"
|
||||
y="114.12241"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:33.3333px;font-family:Sans;-inkscape-font-specification:'Sans Bold';fill:#ffffff">2</tspan></text><text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:33.3333px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="131.09073"
|
||||
y="114.12241"
|
||||
id="text7154"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan7152"
|
||||
x="131.09073"
|
||||
y="114.12241"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:33.3333px;font-family:Sans;-inkscape-font-specification:'Sans Bold';fill:#ffffff">0</tspan></text><text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:33.3333px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="161.09073"
|
||||
y="114.12241"
|
||||
id="text7158"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan7156"
|
||||
x="161.09073"
|
||||
y="114.12241"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:33.3333px;font-family:Sans;-inkscape-font-specification:'Sans Bold';fill:#ffffff">3</tspan></text><text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:33.3333px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="193.09073"
|
||||
y="114.12241"
|
||||
id="text7400"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan7398"
|
||||
x="193.09073"
|
||||
y="114.12241"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:33.3333px;font-family:Sans;-inkscape-font-specification:'Sans Bold';fill:#ffffff">0</tspan></text><text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:33.3333px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="225.09073"
|
||||
y="114.12241"
|
||||
id="text7404"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan7402"
|
||||
x="225.09073"
|
||||
y="114.12241"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:33.3333px;font-family:Sans;-inkscape-font-specification:'Sans Bold';fill:#ffffff">1</tspan></text><rect
|
||||
style="fill:none;stroke:#1f00ea;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="rect18406"
|
||||
width="23.916084"
|
||||
height="39.886673"
|
||||
x="222.59164"
|
||||
y="81.731308"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001" /><rect
|
||||
style="fill:none;stroke:#1f00ea;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="rect20467"
|
||||
width="23.916084"
|
||||
height="39.886673"
|
||||
x="190.59164"
|
||||
y="81.731308"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001" /><rect
|
||||
style="fill:none;stroke:#1f00ea;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="rect20469"
|
||||
width="23.916084"
|
||||
height="39.886673"
|
||||
x="158.59164"
|
||||
y="81.731308"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001" /><circle
|
||||
style="fill:none;stroke:#02ea00;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="path20619"
|
||||
cx="245.87659"
|
||||
cy="173.6358"
|
||||
r="35.34029"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001" /><circle
|
||||
style="fill:none;stroke:#02ea00;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="path20619-5"
|
||||
cx="195.75063"
|
||||
cy="239.26401"
|
||||
r="35.34029"
|
||||
inkscape:export-filename="/home/gruinelli/temp/AI-on-the-edge-device/images/icon/favicon.ico"
|
||||
inkscape:export-xdpi="19.790001"
|
||||
inkscape:export-ydpi="19.790001" /></svg>
|
||||
|
After Width: | Height: | Size: 38 KiB |
BIN
docs/img/main.jpg
Normal file
|
After Width: | Height: | Size: 716 KiB |
BIN
docs/img/setup_initial_welcome.png
Normal file
|
After Width: | Height: | Size: 914 KiB |
BIN
docs/img/size.png
Normal file
|
After Width: | Height: | Size: 557 KiB |
BIN
docs/img/watermeter.jpg
Normal file
|
After Width: | Height: | Size: 219 KiB |
BIN
docs/img/watermeter_all.jpg
Normal file
|
After Width: | Height: | Size: 111 KiB |
BIN
docs/img/web-console.png
Normal file
|
After Width: | Height: | Size: 82 KiB |
BIN
docs/img/wiring.png
Normal file
|
After Width: | Height: | Size: 167 KiB |
@@ -1,4 +1,8 @@
|
||||
# Welcome to the AI-on-the-edge-device!
|
||||
# Welcome
|
||||
|
||||
Welcome to the AI-on-the-edge-device project!
|
||||
|
||||
This is the documentation. For the source code, please head to [github.com/jomjol/AI-on-the-edge-device](https://github.com/jomjol/AI-on-the-edge-device).
|
||||
|
||||
Artificial intelligence based systems have been established in our every days live. Just think of speech or image recognition. Most of the systems relay on either powerful processors or a direct connection to the cloud for doing the calculations up there. With the increasing power of modern processors the AI systems are coming closer to the end user - which is usually called **edge computing**.
|
||||
Here this edge computing is brought into a practical oriented example, where a AI network is implemented on a ESP32 device so: **AI on the edge**.
|
||||
@@ -10,27 +14,30 @@ Here this edge computing is brought into a practical oriented example, where a A
|
||||
- camera and illumination integrated
|
||||
- Web surface to administrate and control
|
||||
- OTA-Interface to update directly through the web interface
|
||||
- API for easy integration
|
||||
- Full integration into Homeassistant
|
||||
- Support for Influx DB 1
|
||||
- MQTT
|
||||
- REST API
|
||||
|
||||
## Idea
|
||||
|
||||
<img src="https://raw.githubusercontent.com/jomjol/AI-on-the-edge-device/master/images/idea.jpg" width="600">
|
||||
{: style="width:600px"}
|
||||
|
||||
|
||||
### Hardware
|
||||
|
||||
<img src="https://raw.githubusercontent.com/jomjol/AI-on-the-edge-device/master/images/watermeter_all.jpg" width="200"><img src="https://raw.githubusercontent.com/jomjol/AI-on-the-edge-device/master/images/main.jpg" width="200"><img src="https://raw.githubusercontent.com/jomjol/AI-on-the-edge-device/master/images/size.png" width="200">
|
||||
|
||||
{: style="width:200px"}
|
||||
{: style="width:200px"}
|
||||
{: style="width:200px"}
|
||||
|
||||
|
||||
### Web interface
|
||||
|
||||
<img src="https://raw.githubusercontent.com/jomjol/AI-on-the-edge-device/master/images/watermeter.jpg" width="600">
|
||||
{: style="width:600px"}
|
||||
|
||||
### Configuration Interface
|
||||
|
||||
<img src="https://raw.githubusercontent.com/jomjol/AI-on-the-edge-device/master/images/edit_reference.jpg" width="600">
|
||||
|
||||
{: style="width:600px"}
|
||||
|
||||
|
||||
**Have fun in studying the new possibilities and ideas**
|
||||
@@ -44,17 +51,3 @@ The task to be demonstrated here is a automated readout of an analog water meter
|
||||
There are two types of CNN implemented, a classification network for reading the digital numbers and a single output network for digitalize the analog pointers for the sub digit readings.
|
||||
|
||||
This project is a evolution of the [water-meter-system-complete](https://github.com/jomjol/water-meter-system-complete), which uses ESP32-CAM just for taking the image and a 1GB-Docker image to run the neural networks backbone. Here everything is integrated in an ESP32-CAM module with 8MB of RAM and a SD-Card as data storage.
|
||||
|
||||
|
||||
## Functionality
|
||||
This systems implements several functions:
|
||||
|
||||
* water meter readout
|
||||
* picture provider
|
||||
* file server
|
||||
* OTA functionality
|
||||
* graphical configuration manager
|
||||
* web server
|
||||
|
||||
The details can be found here: [[Integrated Functions]]
|
||||
|
||||
|
||||
162
docs/inital-setup.md
Normal file
@@ -0,0 +1,162 @@
|
||||
# Initial Setup
|
||||
|
||||
After setting up the device (firmware, sd-card, wlan) the device will connect to the wifi access point and start in an initial setup configuration:
|
||||
|
||||
{: 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).
|
||||
|
||||
## 1. Reference Image
|
||||
|
||||
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.
|
||||
|
||||
{: 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**).
|
||||
|
||||
|
||||
|
||||
#### Correct Horizontal Alignment
|
||||
|
||||
Ensure an **exact horizontal alignment** of the number via the alignment / reference setup:
|
||||
|
||||
| :heavy_check_mark: Okay | :x: Not Okay |
|
||||
| --------------------------- | ------------------------------- |
|
||||
|  |  |
|
||||
|
||||
**:bangbang: Attention:** Updating the reference image, also means, that all alignment images and ROIs needs to be teached 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).
|
||||
|
||||
{: 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).
|
||||
|
||||
{: 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 indiviual 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 aequidistant order 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":
|
||||
|
||||
{: 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 subdigit resulition (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** | {: style="width:80px"} | {: style="width:80px"} |
|
||||
| :x: **Not** Okay | {: style="width:80px"} | {: style="width:80px"} |
|
||||
| :x: **Not** Okay | {: style="width:80px"}| {: style="width:80px"}|
|
||||
|
||||
|
||||
|
||||
|
||||
## 5. General Settings
|
||||
|
||||
In the next steps you can configure the behavior and external interfaces in detail:
|
||||
|
||||
{: style="width:500px"}
|
||||
|
||||
The configuration is divided into different sub topics:
|
||||
|
||||
* TakeImage
|
||||
* Digits
|
||||
* Analog
|
||||
* PostProcessing
|
||||
* MQTT
|
||||
* InfluxDB
|
||||
* GPIOSettings
|
||||
* Autotimer
|
||||
* DataLogging
|
||||
* Debug
|
||||
* System
|
||||
|
||||
The details are explained in other parts of the manual (see links (**TBD**))
|
||||
|
||||
Some of the sections as well as parameters are mandatory. They can be en/disabled in the first column (1).
|
||||
The setting itself is done in the next column (2) and a brief explanation you can find in the last column (3).
|
||||
|
||||
Don' t forget to save the settings with "Save" and do not reboot at this stage.
|
||||
|
||||
#### Expert Modus
|
||||
|
||||
With the normal parameters you should be able to make the needed settings for most of the system. Sometimes there is some fine tunning needed. For this there is an expert modus available. This can be enabled with the check box at the top (4). After this you see much more parameters. But before modifiying them you should be really sure, what they are about.
|
||||
|
||||
|
||||
|
||||
## Finish Setup and change to normal operation
|
||||
|
||||
After setting up everything, there is a last step to be done:
|
||||
|
||||
{: style="width:500px"}
|
||||
|
||||
With (1) you leave the setup modus and reboot to normal operation mode.
|
||||
|
||||
|
||||
|
||||
## Access to setup in normal operation mode
|
||||
|
||||
You can access all the settings also during the normal working mode via the "Settings" menue:
|
||||
|
||||
{: style="width:500px"}
|
||||
|
||||
(1) Access to configuration parameters
|
||||
|
||||
(2) Update of reference image
|
||||
|
||||
(3) Update of alignment marks
|
||||
|
||||
(4)/(5) Update of the ROI setting
|
||||
52
docs/nav.yml
@@ -3,13 +3,61 @@
|
||||
|
||||
nav:
|
||||
# List all files in the expected order
|
||||
- index.md
|
||||
- Getting Started:
|
||||
- index.md
|
||||
- Installation.md
|
||||
- inital-setup.md
|
||||
- Hardware-Compatibility.md
|
||||
- Best-Practice.md
|
||||
- FAQs.md
|
||||
|
||||
- Links:
|
||||
- External Links:
|
||||
- Releases: https://github.com/jomjol/AI-on-the-edge-device/releases
|
||||
- Web Installer/Console: https://jomjol.github.io/AI-on-the-edge-device/index.html
|
||||
- Place an Issues: https://github.com/jomjol/AI-on-the-edge-device/issues
|
||||
- Join a Discussions: https://github.com/jomjol/AI-on-the-edge-device/discussions
|
||||
|
||||
- Configuration:
|
||||
- ROI-Configuration.md
|
||||
- Choosing-the-Model.md
|
||||
- Neural-Network-Types.md
|
||||
- ota.md
|
||||
|
||||
- Advanced:
|
||||
- Integration-Home-Assistant.md
|
||||
- External-LED.md
|
||||
- rolling-installation.md
|
||||
- Configuration-Parameter-Details.md
|
||||
- Configuration.md
|
||||
- Watermeter-specific-analog---digital-transition.md
|
||||
- Learn-models-with-your-own-images.md
|
||||
- Correction Algorithm.md
|
||||
- Additional-Information.md
|
||||
|
||||
- Troubleshooting:
|
||||
- Error-Codes.md
|
||||
- Error-Debugging.md
|
||||
- Frequent-Reboots.md
|
||||
|
||||
- API's:
|
||||
- REST-API.md
|
||||
- MQTT-API.md
|
||||
- Influx-DB.md
|
||||
# - ...
|
||||
|
||||
- Development:
|
||||
- Build-Instructions.md
|
||||
- Demo-Mode.md
|
||||
- Upload-files-by-script.md
|
||||
- Testing.md
|
||||
- Release-creation.md
|
||||
|
||||
|
||||
- Old Pages (no longer maintained):
|
||||
- outdated--Integrated-Functions.md
|
||||
- outdated--Gasmeter-Log-Downloader.md
|
||||
- outdated--Migrate-Old-Config-To-New-Config.md
|
||||
|
||||
- Asorted Pages:
|
||||
# List all pages which are not covered by above list
|
||||
# Step by step we should migrate those page to the above list
|
||||
|
||||
@@ -4,7 +4,7 @@ You can do an OTA (over-the-air) update via the graphical user interface.
|
||||
Grab the firmware from the
|
||||
|
||||
* [Releases page](https://github.com/jomjol/AI-on-the-edge-device/releases) (Stable, tested versions), or the
|
||||
* [Automatically build development branch](https://github.com/jomjol/AI-on-the-edge-device/actions?query=branch%3Arolling) (experimental, untested versions). Please have a look on https://github.com/jomjol/AI-on-the-edge-device/wiki/Install-a-rolling-%28unstable%29-release first!
|
||||
* [Automatically build development branch](https://github.com/jomjol/AI-on-the-edge-device/actions?query=branch%3Arolling) (experimental, untested versions). Please have a look on [](https://github.com/jomjol/AI-on-the-edge-device/wiki/Install-a-rolling-%28unstable%29-release) first!
|
||||
|
||||
You need:
|
||||
* firmware.bin
|
||||
@@ -1,4 +1,7 @@
|
||||
## **Gasmeter Log-Downloader**
|
||||
# Gasmeter Log-Downloader
|
||||
|
||||
!!! Warning
|
||||
This page no longer is maintained!
|
||||
|
||||
This small tool downloads the logfiles from your ESP32 and stores the last value of the day in an *.csv file.
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
# Integrated Functions
|
||||
|
||||
!!! Warning
|
||||
This page no longer is maintained!
|
||||
|
||||
## wasserzaehler
|
||||
|
||||
```http://IP-ESP32/wasserzaehler.html```
|
||||
@@ -1,6 +1,7 @@
|
||||
# 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.
|
||||
|
||||
10
docs/rolling-installation.md
Normal file
@@ -0,0 +1,10 @@
|
||||
# Living on the edge
|
||||
The branch [rolling](https://github.com/jomjol/AI-on-the-edge-device/tree/rolling) contains the latest version of the Firmware and the Web Interface. It might already contain a fix for your issue. But it is work in progress, don't expect it to work stable or be an improvement for your AI-on-the-edge-device! Also it might break the [OTA Update](../ota) and thus require manual flashing over USB!
|
||||
|
||||
## You still want to try it?
|
||||
|
||||
Grab the latest `rolling` build from [Github Actions](https://github.com/jomjol/AI-on-the-edge-device/actions/workflows/build.yaml?query=branch%3Arolling) Page and proceed as following:
|
||||
|
||||
1. Pick the most top successful (green) build.
|
||||
2. Download the `AI-on-the-edge-device__update__rolling_*.zip`
|
||||
5. Flash the zip file using the [OTA Update](../ota) page of your device.
|
||||
19
mkdocs.yml
@@ -2,23 +2,22 @@ site_name: AI on the Edge Device
|
||||
|
||||
site_url: https://jomjol.github.io/AI-on-the-edge-device-docs/
|
||||
repo_url: https://github.com/jomjol/AI-on-the-edge-device-docs
|
||||
edit_uri: https://github.com/jomjol/AI-on-the-edge-device-docs/edit/main/doc
|
||||
edit_uri: https://github.com/jomjol/AI-on-the-edge-device-docs/edit/main/docs
|
||||
|
||||
theme: readthedocs
|
||||
theme:
|
||||
name: readthedocs
|
||||
custom_dir: readthedocs-mod/
|
||||
|
||||
favicon: favicon.ico
|
||||
|
||||
plugins:
|
||||
- search
|
||||
- awesome-pages:
|
||||
filename: nav.yml
|
||||
|
||||
# The navigation is configured in the nav.yml file!
|
||||
# The navigation is configured in the docs/nav.yml file!
|
||||
|
||||
# Emoji support
|
||||
# See https://squidfunk.github.io/mkdocs-material/reference/icons-emojis/
|
||||
markdown_extensions:
|
||||
- attr_list
|
||||
- pymdownx.emoji:
|
||||
emoji_index: !!python/name:materialx.emoji.twemoji
|
||||
emoji_generator: !!python/name:materialx.emoji.to_svg
|
||||
- attr_list # Needed to scale images
|
||||
- pymdownx.emoji: # Emoji support
|
||||
emoji_generator: !!python/name:pymdownx.emoji.to_alt
|
||||
- markdown.extensions.admonition
|
||||
14
readthedocs-mod/main.html
Normal file
@@ -0,0 +1,14 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{%- block site_name %}
|
||||
<img src={{ config.site_url }}/img/logo.png>
|
||||
{%- if config.theme.logo %}
|
||||
<a href="{{ nav.homepage.url|url }}">
|
||||
{%- else %}
|
||||
<a href="{{ nav.homepage.url|url }}" class="icon icon-home"> {{ config.site_name }}
|
||||
{%- endif %}
|
||||
{%- if config.theme.logo %}
|
||||
<img src="{{ config.theme.logo|url }}" class="logo" alt="{% trans %}Logo{% endtrans %}"/>
|
||||
{%- endif %}
|
||||
</a>
|
||||
{%- endblock %}
|
||||