Advanced on the JDB
@@ -22,4 +22,5 @@ Le fichier `mkdocs.yml` est le fichier de configuation de mkdocs. Vous pouvez l'
|
||||
|
||||
Voici les liens Git vers les autres sous projets
|
||||
|
||||
[Sandbox OCR](https://gitea.parano.ch/Maxluli/Test_OCR)
|
||||
[Sandbox OCR](https://gitea.parano.ch/Maxluli/Test_OCR)
|
||||
[Tests OCR](https://gitea.parano.ch/Maxluli/OCR_TEST)
|
||||
|
After Width: | Height: | Size: 562 KiB |
|
After Width: | Height: | Size: 93 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 199 KiB |
|
After Width: | Height: | Size: 578 KiB |
|
After Width: | Height: | Size: 551 KiB |
|
After Width: | Height: | Size: 566 KiB |
|
After Width: | Height: | Size: 572 KiB |
|
After Width: | Height: | Size: 572 KiB |
@@ -1,6 +1,91 @@
|
||||
# Journal de bord
|
||||
|
||||
Avant de commencer pour de bon je veux être certain d'utiliser la bonne methode d'OCR
|
||||
## Mercredi 29 Mars 2023
|
||||
|
||||
----
|
||||
|
||||
Premier jour du travail de diplôme. Nous avons eu un briefing de mr Garcia et nous avons pu commencer à préparer le travail.
|
||||
|
||||
Nous avons eu les différents fichiers nescessaires à la bonne réalisation du projet et je me suis mis à faire les fichiers nescessaires
|
||||
|
||||
La première chose a été de faire ce mkdocs dans lequel j'ai mis un fichier yml plutôt standart qui risque de changer au fur et à mesure.
|
||||
|
||||
Voici le premier yml :
|
||||
|
||||
```
|
||||
site_name: Documentation Diplome
|
||||
theme:
|
||||
name: material
|
||||
palette:
|
||||
# Palette toggle for light mode
|
||||
- media: "(prefers-color-scheme: light)"
|
||||
scheme: default
|
||||
toggle:
|
||||
icon: material/brightness-7
|
||||
name: Switch to dark mode
|
||||
|
||||
# Palette toggle for dark mode
|
||||
- media: "(prefers-color-scheme: dark)"
|
||||
scheme: slate
|
||||
toggle:
|
||||
icon: material/brightness-4
|
||||
name: Switch to light mode
|
||||
markdown_extensions:
|
||||
- attr_list
|
||||
- md_in_html
|
||||
plugins:
|
||||
- glightbox
|
||||
- with-pdf
|
||||
```
|
||||
|
||||
Voici un example de à quoi ca ressemble en forme de site
|
||||
|
||||

|
||||
|
||||
Ensuite il m'a fallu faire une version plus à jour de mon cahier des charges car je n'y avait pas touché depuis novembre. J'ai envoyé un mail à mes enseignants pour qu'ils puissent y jeter un oeuil pour être sûr que je n'ai rien changé qui les dérangent.
|
||||
|
||||
Monsieur Jayr m'a demadé à l'occasion de lui faire un planning type Gantt alors je me suis mis à la tâche.
|
||||
|
||||
J'ai fait un planning prévisionnel et une légende les deux sont dispo dans le dossier planning de ce repertoire.
|
||||
|
||||
Ensuite je me suis mis à tout mettre sur git. A commencer par ce repertoire
|
||||
|
||||
Et c'est deja la fin de la journée ! Demain j'avance un peu sur la doc avec ce que je peux déja remplir et je finis de préparer ce dont j'ai besoin pour commencer à coder.
|
||||
|
||||
## Jeudi 30 Mars 2023
|
||||
|
||||
----
|
||||
|
||||
Aujourd'hui selon le planning je dois me charger des dernirers préparatifs pour commencer correctement. J'ai fait exprès de prenre du temps pour ca au début pour ne pas me créer de soucis plus loin pendant le travail.
|
||||
|
||||
Je vais envoyer par mail le planning que j'ai fait à mes suiveurs.
|
||||
|
||||
Ensuite je vais m'attaquer au squelette de la docmentation. Je vais essayer de remplir tout ce que je peux remplir dans un premier temps car cela tout ca de fait pour plus tard quitte à modifier quelques aspects au fur et à mesure.
|
||||
|
||||
J'ai aussi désactivé mkdocs with pdf par ce que les résultats ne sont vraiment pas ceux que j'attends et cela ralentis énormément le déploiment.
|
||||
|
||||
J'ai aussi rassemblé mes croquis pour le poster :
|
||||
|
||||

|
||||

|
||||
|
||||
On peut voir que dans un premier temps j'ai tenté de faire un poster un peu plus stylisé et marketing. Cependant après avoir discuté avec Mr Garcia et différents profs dont un de l'HEPIA et ils m'ont indiqué que ce qui était attendu était moins du marketing qu'un diagramme de fonctionnement.
|
||||
|
||||
On peut voir sur les derniers posters que le coté technique ressort de plus en plus. Le but sera de faire une version encore plus technique ou on peut voir les différents fonctionnements de l'application avec les technologies utilisées.
|
||||
|
||||
Le défi cela va être de faire un joli poster qui soit en même temps vendeur et en même temps rempli techniquement.
|
||||
|
||||
Oh et j'ai eu un problème ou mon calvier et ma souris ne voulaient d'un coup plus fonctionner. Dans mon cas c'était un problème de power management des ports. J'ai eu le soucis sur mon pc fixe à la maison et sur mon pc portable également. En gros de ce que j'ai compris le soucis c'est que le pc croit que un port est trop solicité niveau puissance et du coup décide de couper l'alimentation du port USB.
|
||||
|
||||
J'ai pu règler le soucis en allant dans le device manager sous universal bus controller sous power management et en décochant la case qui indique que windows peut désactiver ce port.
|
||||
|
||||
Je ne conseille pas ce fix si vous avez des composants de mauvaise qualité car cela pourrait être une vraie alerte cependant le fait que mes composants sont plutôt haut de gamme et le fait que mon clavier et ma souris le fassent en même temps et que ils fonctionnaient très bien depuis plus de 4 ans me font penser que c'est juste une nouvelle mise a jour de windows qui est pénible.
|
||||
|
||||
Demain je vais pouvoir commencer à coder pour de bon.
|
||||
|
||||
## Vendredi 31/03/2023
|
||||
|
||||
Aujourd'hui on s'occupe de la PT2 qui est la programmation de la récupèration des informations des images.
|
||||
|
||||
Je vais tester IronOcr
|
||||
|
||||
@@ -150,7 +235,7 @@ private static Bitmap ConvertToBlackAndWhite(Bitmap inputBmp)
|
||||
|
||||
Rien de bien dingue mais cela fonctionne et je peux jouer avec le BLACK_AND_WHITE_TRESHOLD pour changer son comportement.
|
||||
|
||||
J'ai dabord testé avec un treshold de 100 et le programme a réussi à me sortir Tsunoda en deux mots ce qui était déja très encourageant.
|
||||
J'ai dabord testé avec un treshold de 100 et le programme a réussi à me sortir Tsunoda en deux mots ce qui était déja très encourageant.
|
||||
|
||||
Et après avoir augmenté le Treshold... Tada :
|
||||
|
||||
@@ -203,83 +288,215 @@ Demain ce qui serait bien cela serait que je fasse un jeu d'images avec des vale
|
||||
|
||||
Automatiser un système de test de la sorte me sera très utile dans le futur pour vérifier la non regression de ma reconnaissance de texte quand je tenterai d'y faire des changements.
|
||||
|
||||
Je suis toujours curieux cependant de voir comment le programme se débrouille avec les nombres de tours qui se trouvent dans les icones de pneus.
|
||||
Je suis toujours curieux cependant de voir comment le programme se débrouille avec les nombres de tours qui se trouvent dans les icones de pneus.
|
||||
|
||||
# Journal de bord
|
||||
## Lundi 3 Avril
|
||||
|
||||
## Mercredi 29 Mars 2023
|
||||
Aujourd'hui on va faire un programme qui permet de créer un dataset qui permette de tester le programme de reconnaissance.
|
||||
|
||||
----
|
||||
Je pense que le meilleur moyen de faire serait un programme qui crée le dataset et qui ensuite peut tester différentes methodes de reconnaissance.
|
||||
|
||||
Premier jour du travail de diplôme. Nous avons eu un briefing de mr Garcia et nous avons pu commencer à préparer le travail.
|
||||
Par la même occasion je peux développer la technologie qui va permettre de découper une image en 20 lignes ce qui me servira ensuite pour la reconnaissance.
|
||||
|
||||
Nous avons eu les différents fichiers nescessaires à la bonne réalisation du projet et je me suis mis à faire les fichiers nescessaires
|
||||
Je me rend compte que pour faire un programme de tests je dois déja avoir une idée de la structure de mon programme.
|
||||
|
||||
La première chose a été de faire ce mkdocs dans lequel j'ai mis un fichier yml plutôt standart qui risque de changer au fur et à mesure.
|
||||
Pour le moment je réflechis à un système de "Zones" et de "Windows". L'idée serait que une Zone est juste une sous partie d'image qui peut encore être décomposé tandis que chaque Window contient une ou plusieurs informations à récupèrer.
|
||||
|
||||
Voici le premier yml :
|
||||
J'ai essayé de découper l'image pour que cela soit plus clair :
|
||||
|
||||
```
|
||||
site_name: Documentation Diplome
|
||||
theme:
|
||||
name: material
|
||||
palette:
|
||||
# Palette toggle for light mode
|
||||
- media: "(prefers-color-scheme: light)"
|
||||
scheme: default
|
||||
toggle:
|
||||
icon: material/brightness-7
|
||||
name: Switch to dark mode
|
||||

|
||||
|
||||
# Palette toggle for dark mode
|
||||
- media: "(prefers-color-scheme: dark)"
|
||||
scheme: slate
|
||||
toggle:
|
||||
icon: material/brightness-4
|
||||
name: Switch to light mode
|
||||
markdown_extensions:
|
||||
- attr_list
|
||||
- md_in_html
|
||||
plugins:
|
||||
- glightbox
|
||||
- with-pdf
|
||||
Ici on peut voir que l'image est découpée en plusieurs grandes zones. Dans un premier temps on ne s'occupe que de la première.
|
||||
|
||||
Ensuite :
|
||||
|
||||

|
||||
|
||||
On peut voir la que cette Main zone serait elle même décomposée en plusieurs plus petites zones.
|
||||
|
||||
Et ensuite chacunes de ces petites zones :
|
||||
|
||||

|
||||
|
||||
Sera décomposée en plusieurs windows qui elles sont des zones qui contiennent de l'information.
|
||||
|
||||
En gros on aurait trois types de zone :
|
||||
|
||||
- Les zones qui contiennent d'autres zones
|
||||
- Les zones qui contiennent des Windows
|
||||
- Les Windows
|
||||
|
||||
Cependant en y réflechissant on pourrait tout à fait avoir seulement des zones et des windows en faisant en sorte que les windows peuvent avoir une liste de windows et une liste de zones.
|
||||
|
||||
Une zone serait composée de :
|
||||
|
||||
- Une image de départ
|
||||
- Un rectangle qui la positionne sur cette dernière
|
||||
- Une liste de zones (potentiellement vide)
|
||||
- Une liste de windows (potentiellement vide)
|
||||
- Une methode qui permet de récupèrer une image de la zone
|
||||
- Une methode qui permet de lancer la reconnaissance sur chaque window
|
||||
|
||||
Une window serait composée de :
|
||||
|
||||
- Une image de départ (cela peut être l'image cropée de la zone parente peu importe)
|
||||
- Un rectangle qui la positionne sur cette dernière
|
||||
- Une methode qui permet de récupérer un image de la window
|
||||
- Une methode qui permet de lancer la reconnaisance sur l'image (Chaque type de zone doit l'implémenter)
|
||||
|
||||
Dans chaque window on peut imaginer que la methode qui fait la reconnaissance au lieu de retourner un objet qui peut contenir nimporte quel type d'information peut envoyer ce qu'elle vient de récupèrer dans une base de donnée ou un objet.
|
||||
|
||||
Par exemple une Zone de pilote pourrait très bien contenir un objet pilote et le donner à ses windows qui rempliraient ce même objet.
|
||||
|
||||
C'est une reflexion plus stockage que OCR mais c'est intéressant pour savoir ce que fait une window des données qu'elle récupère.
|
||||
|
||||
Dans un premier temps je pense que les windows vont simplement écrire dans un fichier ce qu'elles trouvent chacunes dans le format qu'elles veulent.
|
||||
|
||||
Pour comprendre pourquoi je me prend la tête il faut savoir que chaque window peut avoir accès à pleins d'informations différentes. On pourrait dire qu'elles retournent toutes une string sauf que si ca marche pour un temps au tour ou pour un nom de pilote, cela ne marche pas forcément pour un type de pneu ou un DRS ouver. Comme chaque window a plusieurs types de data elle devra elle même se charger de comment la traiter ET de la stocker.
|
||||
|
||||
Voila un diagramme qui résume comment je vois l'implémentation dans un premier temps :
|
||||
|
||||

|
||||
|
||||
Voici comment se présente le squellette d'une Zone :
|
||||
|
||||
```Csharp
|
||||
public class Zone
|
||||
{
|
||||
private Bitmap FullImage;
|
||||
private List<Zone> Zones;
|
||||
private List<Window> Windows;
|
||||
|
||||
private Rectangle _bounds;
|
||||
public Rectangle Bounds { get => _bounds; private set => _bounds = value; }
|
||||
|
||||
public Bitmap ZoneImage
|
||||
{
|
||||
get
|
||||
{
|
||||
Bitmap sample = new Bitmap(Bounds.Width, Bounds.Height);
|
||||
Graphics g = Graphics.FromImage(sample);
|
||||
g.DrawImage(FullImage, new Rectangle(0, 0, sample.Width, sample.Height), Bounds, GraphicsUnit.Pixel);
|
||||
return sample;
|
||||
}
|
||||
}
|
||||
|
||||
public Zone(Image fullImage, Rectangle bounds)
|
||||
{
|
||||
FullImage = (Bitmap)fullImage;
|
||||
Init(bounds);
|
||||
}
|
||||
public Zone(Bitmap fullImage, Rectangle bounds)
|
||||
{
|
||||
FullImage = fullImage;
|
||||
Init(bounds);
|
||||
}
|
||||
private void Init(Rectangle bounds)
|
||||
{
|
||||
Bounds = bounds;
|
||||
Zones = new List<Zone>();
|
||||
Windows = new List<Window>();
|
||||
}
|
||||
public void AddZone(Rectangle bounds)
|
||||
{
|
||||
if(Fits(bounds))
|
||||
Zones.Add(new Zone(ZoneImage,bounds));
|
||||
}
|
||||
public void AddWindow(Rectangle bounds)
|
||||
{
|
||||
if (Fits(bounds))
|
||||
Windows.Add(new Window(ZoneImage,bounds));
|
||||
}
|
||||
private bool Fits(Rectangle inputRectangle)
|
||||
{
|
||||
if (inputRectangle.X + inputRectangle.Width > Bounds.Width || inputRectangle.Y + inputRectangle.Height > Bounds.Height || inputRectangle.X < 0 || inputRectangle.Y < 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Voici un example de à quoi ca ressemble en forme de site
|
||||
Le but est ensuite de créer différent types de Zones.
|
||||
|
||||

|
||||
Par exemple la MainZone devra découper son contenu en 20 parties égales pour tenter de chopper les 20 pilotes. Il serait cool de trouver un moyen de calibrer automatiquement.
|
||||
|
||||
Ensuite il m'a fallu faire une version plus à jour de mon cahier des charges car je n'y avait pas touché depuis novembre. J'ai envoyé un mail à mes enseignants pour qu'ils puissent y jeter un oeuil pour être sûr que je n'ai rien changé qui les dérangent.
|
||||
C'est peut-être possible de calibrer avec de la reconnaissance de texte, on peut essayer de lancer la reconnaissance et voir ou on trouve du texte avec un peu de chance cela pourrait donner les positions et avec ca on peut peut-être determiner des lignes.
|
||||
|
||||
Monsieur Jayr m'a demadé à l'occasion de lui faire un planning type Gantt alors je me suis mis à la tâche.
|
||||
Et voici le squelette d'une window générique
|
||||
|
||||
J'ai fait un planning prévisionnel et une légende les deux sont dispo dans le dossier planning de ce repertoire.
|
||||
```Csharp
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Drawing;
|
||||
|
||||
Ensuite je me suis mis à tout mettre sur git. A commencer par ce repertoire
|
||||
namespace OCR_tester
|
||||
{
|
||||
public class Window
|
||||
{
|
||||
private Bitmap FullImage;
|
||||
|
||||
Et c'est deja la fin de la journée ! Demain j'avance un peu sur la doc avec ce que je peux déja remplir et je finis de préparer ce dont j'ai besoin pour commencer à coder.
|
||||
private Rectangle _bounds;
|
||||
public Rectangle Bounds { get => _bounds; private set => _bounds = value; }
|
||||
|
||||
## Jeudi 30 Mars 2023
|
||||
public Bitmap WindowImage
|
||||
{
|
||||
get
|
||||
{
|
||||
Bitmap sample = new Bitmap(Bounds.Width, Bounds.Height);
|
||||
Graphics g = Graphics.FromImage(sample);
|
||||
g.DrawImage(FullImage, new Rectangle(0, 0, sample.Width, sample.Height), Bounds, GraphicsUnit.Pixel);
|
||||
return sample;
|
||||
}
|
||||
}
|
||||
public Window(Bitmap fullImage, Rectangle bounds)
|
||||
{
|
||||
FullImage = fullImage;
|
||||
Bounds = bounds;
|
||||
}
|
||||
public virtual void RecoverInformations()
|
||||
{
|
||||
//Each Window type will have to implement its own way to recover the informations stored in the Window Image
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
----
|
||||
Chaque Window pourra ainsi elle même implémenter la récupèration d'informations. La facon de les retourner/stocker est encore un peu floue.
|
||||
|
||||
Aujourd'hui selon le planning je dois me charger des dernirers préparatifs pour commencer correctement. J'ai fait exprès de prenre du temps pour ca au début pour ne pas me créer de soucis plus loin pendant le travail.
|
||||
Par exemple pour un temps au tour on peut imaginer que il fait une petite vérification dans l'objet pilote et dans le tableau des tours si il n'y a pas deja une valeur et si il n'y en a pas une alors il peut l'ajouter.
|
||||
|
||||
Je vais envoyer par mail le planning que j'ai fait à mes suiveurs.
|
||||
Maintenant je vais essayer de créer une Main window qui se calibre toute seule.
|
||||
|
||||
Ensuite je vais m'attaquer au squelette de la docmentation. Je vais essayer de remplir tout ce que je peux remplir dans un premier temps car cela tout ca de fait pour plus tard quitte à modifier quelques aspects au fur et à mesure.
|
||||
Alors après avoir bien galèré avec l'interface pour permettre au user de cliquer sur la form pour voir les zones qu'il crée, j'ai pu créer un zone qui fait les dimensions de MainZone et j'ai pu lancer la reconnaissance sur l'image et voir ou il trouve du texte :
|
||||
|
||||
J'ai aussi désactivé mkdocs with pdf par ce que les résultats ne sont vraiment pas ceux que j'attends et cela ralentis énormément le déploiment.
|
||||

|
||||
|
||||
J'ai aussi rassemblé mes croquis pour le poster :
|
||||
Maintenant il faut que je nettoie la liste de rectangle pour exclure ceux qui sont trop grands pour être sur une seule ligne, ceux qui indiquent le nombre de tour en haut et ceux qui n'ont pas d'intérêts. On pourra ensuite isoler les lignes et créer une liste d'images.
|
||||
|
||||

|
||||

|
||||
Pour ce qui est de la ligne qui contient les "Gap interval last lap" et des chiffres sur les tours pour les pneus etc je vais juste demander à l'utilisateur de ne pas les prendre dans la screenshot. Comme ils contiennent des mots qui peuvent être utilisés plus loin dans les data je ne peux pas les blacklister et faire un système qui s'occupe de les enlever si ils existent selon le position y me prendrait trop de temps pour rien.
|
||||
|
||||
On peut voir que dans un premier temps j'ai tenté de faire un poster un peu plus stylisé et marketing. Cependant après avoir discuté avec Mr Garcia et différents profs dont un de l'HEPIA et ils m'ont indiqué que ce qui était attendu était moins du marketing qu'un diagramme de fonctionnement.
|
||||
Après avoir filtré un peu les resultats et enlevé les zones beaucoup trop grandes, on se retrouve déja plus qu'avec ca :
|
||||
|
||||
On peut voir sur les derniers posters que le coté technique ressort de plus en plus. Le but sera de faire une version encore plus technique ou on peut voir les différents fonctionnements de l'application avec les technologies utilisées.
|
||||

|
||||
|
||||
Le défi cela va être de faire un joli poster qui soit en même temps vendeur et en même temps rempli techniquement.
|
||||
Comme on peut le voir, du côté gauche de l'image on a beaucoup de choses reconnues mais avec beaucoup de tailles différentes ce qui n'est pas idéal. Alors j'ajoute un filtre qui permet de ne selectionner que les data sur la droite.
|
||||
|
||||
ATTENTION!!! NE PAS OUBLIER DE RENDRE LE JOURNAL DE BORD UNE FOIS QU'IL A ETE VALIDE !!! DERNIER JOUR
|
||||

|
||||
|
||||
Maintenant il devrait être possible de faire un algorythme qui ne prend que un seul carré par ligne.
|
||||
|
||||

|
||||
|
||||
Maintenant que on sait ou se trouve chaque ligne on peut faire un petit traitement et découper l'image en plusieurs windows.
|
||||
|
||||
Et voila :
|
||||
|
||||

|
||||
|
||||