Added a lot to the doc
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 750 B |
|
After Width: | Height: | Size: 259 KiB |
|
After Width: | Height: | Size: 750 B |
|
After Width: | Height: | Size: 73 KiB |
|
After Width: | Height: | Size: 750 B |
|
After Width: | Height: | Size: 73 KiB |
|
After Width: | Height: | Size: 744 B |
|
After Width: | Height: | Size: 582 KiB |
|
After Width: | Height: | Size: 281 KiB |
|
After Width: | Height: | Size: 750 B |
|
After Width: | Height: | Size: 617 B |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 9.3 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 422 B |
|
After Width: | Height: | Size: 5.5 KiB |
|
After Width: | Height: | Size: 8.9 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 376 B |
@@ -149,7 +149,7 @@ Voici un exemple d'interface possible pour une page :
|
||||
|
||||
----
|
||||
|
||||
*On va considérer que tous les user ont un abonnement F1 TV PRO
|
||||
'*'On va considérer que tous les user ont un abonnement F1 TV PRO
|
||||
|
||||
Un user veut récupérer les data :
|
||||
|
||||
@@ -483,7 +483,7 @@ Mais chaque type de donnée va avoir des methodes de post traitement différents
|
||||
|
||||
Donc voici les différents types de reconnaissance et leur post traitements :
|
||||
|
||||
TEXTE :
|
||||
###### Texte
|
||||
|
||||
Alors ce type de reconnaissance est utilisé par la WINDOW du nom de pilote et de la position du pilote.
|
||||
|
||||
@@ -503,18 +503,20 @@ Donc pour le rendre plus facilement lisible et augmenter les chances que toutes
|
||||
|
||||

|
||||
|
||||
2 : Je fais un Treshhold * de 165 car avec moins le texte parfois prend trop du background et avec plus les lettres sont trop fines.
|
||||
2 : Je fais un *Treshhold* de 165 car avec moins le texte parfois prend trop du background et avec plus les lettres sont trop fines.
|
||||
|
||||

|
||||
|
||||
3 : Je fais un Resize * de l'image pour avoir une meilleure résolution et permettre une meilleure détection. J'augmente la hauteur et la largeur par un facteur 2. J'ai trouvé cette valeur suffisante et aller plus haut consomme beaucoup de ressources.
|
||||
3 : Je fais un *Resize* de l'image pour avoir une meilleure résolution et permettre une meilleure détection. J'augmente la hauteur et la largeur par un facteur 2. J'ai trouvé cette valeur suffisante et aller plus haut consomme beaucoup de ressources.
|
||||
|
||||

|
||||
|
||||
4: Je fais une très rapide Dilatation * du texte pour retirer le flou amené par la methode de Resize. Je n'utilise qu'une valeur de 1 car je ne veux pas trop changer comment le texte est modelé je veux juste retirer le flou.
|
||||
4: Je fais une très rapide *Dilatation* du texte pour retirer le flou amené par la methode de Resize. Je n'utilise qu'une valeur de 1 car je ne veux pas trop changer comment le texte est modelé je veux juste retirer le flou.
|
||||
|
||||

|
||||
|
||||
*Explication des methodes précises plus bas*
|
||||
|
||||
Voila pour ce qui est du post processing. Je ne dis pas que ce sont les meilleurs paramêtres possibles mais dans mes tests ce sont ceux qui ont le mieux marchés.
|
||||
|
||||
C'est aussi les premières methodes que j'ai pu développer alors forcément elles n'ont pas le niveau de détails de certaines autres.
|
||||
@@ -532,9 +534,7 @@ Pour résumer le fonctionnement dans lordre :
|
||||
- On trouve quel nom de pilote ressemble le plus à ce résultat
|
||||
- On renvoie le nom du pilote
|
||||
|
||||
*(Explication des methodes précises plus bas)
|
||||
|
||||
CHIFFRES :
|
||||
###### Chiffres
|
||||
|
||||
Cette methode en réalité utilise simplement la même methode que celle qui va récupèrer le texte sur une image. Cependant, la, on envoie à Tesseract l'information qu'il ne peut trouver que des chiffres sur l'image ce qui lui permet d'être beaucoup plus précis et de ne pas confondre un 9 avec un P ou un 11 avec un H PAR EXEMPLE (non pas que ca me soit arrivé très régulièrement et que ca me soit resté dans la gorge évidemment)
|
||||
|
||||
@@ -566,22 +566,24 @@ Cette partie est un peu plus complexe car si la detection n'est pas fiable les c
|
||||
|
||||
Voici donc les étapes de post-traitement que j'ai mis en place pour leur détection :
|
||||
|
||||
1: J'applique un Treshold* de 185 pour enlever les ambiguités d'alisaising et avoir une image en noir et blanc claire. La valeur de 185 est assez élevée car le but est de vraiment garder uniquement les contours. Comme les chiffres se ressemlent beaucoup plu que les lettres, il faut tenter le plus possible de conserver leur formes spécifiques. Je me suis rendu compte que cette valeur était une de celles qui marchent le mieux.
|
||||
1: J'applique un *Treshold* de 185 pour enlever les ambiguités d'alisaising et avoir une image en noir et blanc claire. La valeur de 185 est assez élevée car le but est de vraiment garder uniquement les contours. Comme les chiffres se ressemlent beaucoup plu que les lettres, il faut tenter le plus possible de conserver leur formes spécifiques. Je me suis rendu compte que cette valeur était une de celles qui marchent le mieux.
|
||||
|
||||

|
||||
|
||||
2: J'applique un Resize* de 2 pour augmenter la résolution des chiffres et permettre une meilleure détection. Le but est d'avoir plus de pixels et donc de permettre à Tesseract de mieux utiliser ses matrices de convolution.
|
||||
2: J'applique un *Resize* de 2 pour augmenter la résolution des chiffres et permettre une meilleure détection. Le but est d'avoir plus de pixels et donc de permettre à Tesseract de mieux utiliser ses matrices de convolution.
|
||||
|
||||

|
||||
|
||||
3: Comme le Resize* amène du flou, j'utilise une methode de Dilatation* qui me permet de retirer ce flou et de remplir un peu plus certaines parties qui ont été un peu laissée par le Resize*;
|
||||
3: Comme le *Resize* amène du flou, j'utilise une methode de Dilatation* qui me permet de retirer ce flou et de remplir un peu plus certaines parties qui ont été un peu laissée par le *Resize*;
|
||||
|
||||

|
||||
|
||||
4: Contrairement aux mots plus haut, la rondeur ajoutée par la dilatation n'est pas vraiment désirée. En effet, elle peut rendre confuse certains chiffres et empêcher Tesseract de bien trouver le chiffre. Alors j'applique une Erosion* qui me permet de contrecarrer en partie les rondeurs ajoutées par la dilatation et retrouver des chiffres bien formées. Pour l'Erosion* et la Dilatation* j'ai utilisé une valeur de 1 car je ne voulais pas trop changer les chiffres.
|
||||
4: Contrairement aux mots plus haut, la rondeur ajoutée par la dilatation n'est pas vraiment désirée. En effet, elle peut rendre confuse certains chiffres et empêcher Tesseract de bien trouver le chiffre. Alors j'applique une *Erosion* qui me permet de contrecarrer en partie les rondeurs ajoutées par la dilatation et retrouver des chiffres bien formées. Pour l'*Erosion* et la *Dilatation* j'ai utilisé une valeur de 1 car je ne voulais pas trop changer les chiffres.
|
||||
|
||||

|
||||
|
||||
*Explication des methodes précises plus bas*
|
||||
|
||||
Et avec ce post processing on retrouve de plutôts bon résultats qui demandent peu de traitement.
|
||||
|
||||
Le traitement dépend du type de WINDOW cependant.
|
||||
@@ -598,11 +600,179 @@ Je passe les détails du reste du nettoyage car c'est vraiment du cas par cas ma
|
||||
|
||||
Pour résumer le fonctionnement dans l'ordre :
|
||||
|
||||
- On prend l'image et on lui applique une série de
|
||||
- On prend l'image et on lui applique une série de filtres
|
||||
- On envoie l'image filtrée à Tesseract
|
||||
- On nettoie le résultat Tesseract pour compenser certains biais
|
||||
- On convertis le résultat en milisecondes
|
||||
|
||||
*(Explication des methodes précises plus bas)
|
||||
###### Pneus
|
||||
|
||||
PNEUS :
|
||||
La on arrive sur la partie la plus pénible.
|
||||
|
||||
Pour comprendre la problématique il faut d'abord faire un petit point sur comment les pneus fonctionnent en Formule 1.
|
||||
|
||||
Depuis 2019 en Formule 1 nous avons 5 grandes familles de pneus :
|
||||
|
||||
- Les pneus tendres
|
||||
- Les pneus medium
|
||||
- Les pneus durs
|
||||
- Les pneus intermédiaires
|
||||
- Les pneus pluie
|
||||
|
||||

|
||||
|
||||
Les trois premiers pneus sont des pneus faits pour piste sèche, le pneu intermédiaire pour piste humide et le neu pluie pour la pluie.
|
||||
|
||||
Chaque pneu a sa durée de vie et son niveau de performance propre mais je ne vais pas rentrer dans le détail ici. Tout ce qu'il faut savoir ce que savoir sur quel pneu chaque pilote est et depuis combien de temps il les chausse est une information très importante.
|
||||
|
||||
Chaque pneu a une couleur donnée qui permet de les différencier.
|
||||
|
||||
Voici un exemple de ce à quoi une WINDOW de pneus peut ressembler :
|
||||
|
||||

|
||||
|
||||
Mais cette zone peut aussi ressembler à ca :
|
||||
|
||||

|
||||
|
||||
Mais aussi à ca :
|
||||
|
||||

|
||||
|
||||
Voire même ca :
|
||||
|
||||

|
||||
|
||||
Je pense que vous pouvez tout de suite comprendre la difficulté que représente la tâche de récupèration de données à partir de cette image.
|
||||
|
||||
En gros le fonctionnement de cette zone d'information est assez simple.
|
||||
|
||||
- Au fur et à mesure que la course avance, le trait fait de même.
|
||||
- Le chiffre dans le round tout à droite indique le nombre de tour que le pilote a passé sur ce pneu.
|
||||
- La couleur indique le type de pneu.
|
||||
- Si il y a une lettre à la place d'un chiffre c'est que c'est le premier tour sur ce pneu. La lettre indique le type de pneu.
|
||||
|
||||
Et pas besoin de dire que si on essaie simplement de donner l'image à Tesseract on ne récupère ni les chiffres ni les lettres correctement si ce n'est pas du tout.
|
||||
|
||||
Il faut donc utiliser une methode qui permette d'isoler le rond le plus à droite, lui appliquer un traitement qui permette à Tesseract de lire ce qu'il y a marqué et qui puisse determiner quel pneu est en train d'être utilisé.
|
||||
|
||||
J'ai décidé de m'occuper dans un premier temps de trouver ce rond avant d'appliquer les filtres car plus l'image est petite plus les filtres sont rapides.
|
||||
|
||||
Le programme va tirer un trait depuis le bord droit de la zone, et il va avancer vers la gauche jusqu'à trouver un obstacle. Je détecte un obstacle si le pixel sur lequel est mon trait possède une valeur de plus de 0x50 dans le channel R,G ou B. J'ai trouvé en faisant des tests que les couleurs de background de la F1TV ne dépassaient jamais ces valeurs.
|
||||
|
||||
Ensuite après avoir trouvé le premier obstacle, je récupère une zone qui doit englober le cercle.
|
||||
|
||||
Voici un exemple avec cette image en entrée :
|
||||
|
||||

|
||||
|
||||
Elle est automatiquement coupée de cette facon :
|
||||
|
||||

|
||||
|
||||
Cela me permet d'isoler uniquement ce qui m'intéresse ce qui est très pratique pour Tesseract et pour la detection de couleur.
|
||||
|
||||
Ensuite avec cette image je peux commencer le processus de reconnaissance.
|
||||
|
||||
Je commence par faire une moyenne de tous les pixels de l'image en excluant les pixels trop sombres qui font sûrement partie du background ou du chiffre.
|
||||
|
||||
Ensuite j'utilise une methode qui calcule la différence entre la couleur obbtenue et la liste de couleurs possible.
|
||||
|
||||
Il y a cinq couleurs des pneus possibles :
|
||||
|
||||
"#ff0000" pneu tendre/soft
|
||||
|
||||

|
||||
|
||||
"#f5bf00" pneu medium
|
||||
|
||||

|
||||
|
||||
"#a4a5a8" pneu dur/hard
|
||||
|
||||

|
||||
|
||||
"#00a42e" pneu inter
|
||||
|
||||

|
||||
|
||||
"#2760a6" pneu pluie/wet
|
||||
|
||||

|
||||
|
||||
Ce qui est pratique c'est que même dans les cas ou il n'y a pas beaucoup de couleur comme celui la :
|
||||
|
||||

|
||||
|
||||
On arrive à une couleur moyenne de :
|
||||
|
||||

|
||||
|
||||
Et il est donc assez facile de determiner le type de pneu en question.
|
||||
|
||||
Attention, les résultats peuvent être très vite dérangés par la couleur du pneu précédent si le découpage de la fenêtre n'a pas été assez précis.
|
||||
|
||||
Ensuite il "suffit" de lire le chiffre dans le rond et si on arrive pas à le lire alors c'est que c'est une lettre et on sait que le nombre de tours est donc de 0.
|
||||
|
||||
Maintenant vient le moment très sympatique de la lecture du chiffre.
|
||||
|
||||
Vous saurez que Tesseract en plus de detester les grandes images et les images avec des couleurs, deteste également les formes dans une image. Donc dans notre cas, le round de couleur autour du chiffre, même si il n'est pas complet, il interfère avec la reconnaissance et empêche de bien lire le chiffre.
|
||||
|
||||
Il faut donc retirer le background et ensuite la couleur. Sauf que comme le chiffre est de la couleur du background, si on retire le background et ensuite la couleur il ne reste plus rien. Il faut donc retirer le background AUTOUR du rond, et ensuite si on retire la couleur il devrait rester le chiffre sur fond blanc.
|
||||
|
||||
Pour se faire, j'ai tiré des traits depuis les bords de l'image jusqu'à ce qu'ils rencontrent le rond. Ensuite je retire tous les pixels entre le rond et les bords de l'image ce qui nous donne ceci :
|
||||
|
||||

|
||||
|
||||
Ensuite on peu retirer les pixels qui ont une valeur dans un channel RGB plus haute qu'un certain seuil :
|
||||
|
||||

|
||||
|
||||
Et la on a ce que l'on veut !
|
||||
|
||||
A partir de la c'est les filtres que l'on connait qui sont utilisés pour en faire une image plus facile à utiliser par Tesseract.
|
||||
|
||||
1 : On effectue un *Resize* de facteur 4 (oui c'est beaucoup mais en même temps le chiffre est vraiment petit à la base) qui permet d'avoir une image d'une bien meilleure résolution.
|
||||
|
||||

|
||||
|
||||
2: On fait une *Dilatation* de facteur 1 pour retirer tout le flou de l'image pour aider Tesseract
|
||||
|
||||

|
||||
|
||||
Et on a un chiffre qui est utilisable par Tesseract !
|
||||
|
||||
*Explication des methodes précises plus bas*
|
||||
|
||||
Pour résumer :
|
||||
|
||||
- On prend l'image de la zone et on la crop pour ne garder que la partie essentielle
|
||||
- On détermine le type de pneu avec la couleur moyenne de la zone
|
||||
- On retire le background autour de cette zone
|
||||
- On retire la couleur qui reste pour ne garder que le chiffre
|
||||
- On augmente la résolution du chiffre
|
||||
- On rend ce chiffre net
|
||||
- On envoie l'image traitée et filtrée à Tesseract
|
||||
- On détermine le nombre de tours que le pilote a fait avec ses pneus avec le résultat de Tesseract
|
||||
|
||||
###### Filtres et methodes sur les images
|
||||
|
||||
Dans ce projet on a du utiliser différentes methodes d'édition d'image que ce soit sous forme de filtres ou de modification de l'image directement.
|
||||
Voici un sommaire des methodes utilisées et comment elles fonctionnent.
|
||||
|
||||
*Tresholding*
|
||||
|
||||
*Resize*
|
||||
|
||||
*Dilatation*
|
||||
|
||||
*Erosion*
|
||||
|
||||
*GrayScale*
|
||||
|
||||
*Remove Background*
|
||||
|
||||
Il y aussi d'autre methodes comme un filtre Gaussien ou *Highlight countour* que j'ai du développer mais que je n'ai pas utilisé donc je ne vais pas en parler ici
|
||||
|
||||
### Lecture des images
|
||||
|
||||
|
||||
@@ -1719,4 +1719,12 @@ On peut simplement regarder la couleur dominante et determiner le pneu. En effet
|
||||
|
||||
Et tout simplement si il n'arrive pas à lire le chiffre c'est que c'est une lettre et que donc on est à 0 tours. Cela marche plutôt bien et cela simplifie pas mal le processing.
|
||||
|
||||
Voila, la je vais me remettre à la documentation sinon je vais encore prendre du retard.
|
||||
Voila, la je vais me remettre à la documentation sinon je vais encore prendre du retard.
|
||||
|
||||
## Mardi 25 Avril 2023
|
||||
|
||||
Encore une fois j'ai pris du temps de doc pour changer des choses sur la partie OCR. Mais en même temps en documentant je vois des choses que j'ai soit mal fait soit que je pourrais faire mieux en changeant très peu de choses. J'éspère que les changement que j'ai fait vont aider au moins à la cohérence du code et un peu pour les performances.
|
||||
|
||||
Il semble que dans les conditions que j'ai testé le nombre de tour soit plutôt fiable mais je pense que je devrai faire un peu de travail en aval dans la récupération de ces données car je sens que cela va poser problème quelques fois. Je pense que en utilisant bien l'historique on peut potentiellement se passer de l'utilisation de ce chiffre pas toujours complêtement fiable.
|
||||
|
||||
Mais sinon aujourd'hui c'est encore une fois un gros jour de doc. J'essaie d'expliquer les différents procédés avant de les oublier. J'essaie aussi de donner un maximum d'exemples sous formes de photos intermédiaires mais ca me prend pas mal de temps car il faut que j'ajoute un peu partout dans le code des lignes pour sortir des images intermédiaires.
|
||||