J'étudie au centre CS de Novossibirsk pour la deuxième année. Avant d'entrer, j'avais déjà un emploi dans l'informatique - j'ai travaillé comme analyste chez Yandex, mais je voulais continuer à développer, découvrir quelque chose au-delà des tâches actuelles et, sur les conseils d'un collègue, je suis entré dans le centre CS. Dans cet article, je veux parler de la pratique que j'ai vécue pendant mes études.
Au début du premier semestre, on nous a proposé plusieurs projets. Mon attention a été immédiatement attirée par un projet intitulé "Méthode d'évaluation de la couleur du grain d'une photographie". Ce sujet a été suggéré par des spécialistes de l'Institut de Cytologie et Génétique du SB RAS, mais le projet lui-même était plus lié à l'analyse et au traitement d'images qu'à la biologie. Je l'ai choisi parce que j'étais intéressé par l'apprentissage automatique et la reconnaissance des formes et je voulais pratiquer dans ces domaines.
L'essence du projet
Il existe une application
SeedCounter conçue pour compter et mesurer la taille des grains de blé d'une photographie pour libérer les agronomes du travail ennuyeux et routinier de comptage et d'analyse des grains. J'avais besoin d'étudier la possibilité de déterminer la couleur des grains à partir d'une photographie et de l'implémenter dans l'application afin que les grains puissent être divisés en classes significatives. Les classes obtenues peuvent correspondre, par exemple, au contenu de substances utiles à l'homme.
Exemple de photo avant et après l'étalonnage:

Il semblerait que prendre et comprendre la couleur des grains d'une photographie est une tâche simple, surtout s'il existe déjà un algorithme pour trouver les grains eux-mêmes. Cependant, la couleur obtenue est très dépendante de l'éclairage et la caméra introduit sa propre distorsion. En conséquence, la couleur obtenue a peu de rapport avec les propriétés du grain lui-même. Par conséquent, l'objectif principal était d'obtenir des couleurs de grain calibrées, c'est-à-dire tels qu'ils seraient dans des conditions de prise de vue idéales.
Pour ajuster les couleurs, nous avons utilisé une palette de référence appelée ColorChecker. ColorChecker est situé sur le même cadre que les grains, ses couleurs sont connues à l'avance. L'application doit choisir une conversion d'image telle que les couleurs du ColorChecker soient aussi proches que possible des couleurs de référence connues.
Autrement dit, la tâche a été divisée en trois sous-tâches:
- trouver ColorChecker dans l'image,
- calcul de la conversion des couleurs et application à l'image,
- séparation des grains selon les couleurs obtenues.
Avancement des travaux
Tout d'abord, nous avons recherché l'algorithme de recherche ColorChecker déjà implémenté - il a été trouvé dans le package gratuit macduff. Je l'ai essayé sur des images de test, ça s'est mal passé: même avec un petit tour de ColorChecker, trop peu de carrés de la palette ont été reconnus, après quoi j'ai commencé à chercher d'autres méthodes de recherche où l'orientation n'était pas importante. Il s'est avéré qu'il existe une méthode utilisée pour une tâche plus générale de recherche d'un objet arbitraire - elle est basée sur la sélection de points caractéristiques dans l'image et leur comparaison avec le modèle. Tous les composants nécessaires sont déjà dans OpenCV, il n'a donc pas été difficile de l'implémenter.
Pour mettre en évidence les points caractéristiques d'OpenCV, nous avons utilisé plusieurs algorithmes: à la fois brevetés (SIFT / SURF) et gratuits (ORB / FAST). Initialement, la méthode fonctionnait assez bien avec les options brevetées, mais elle était très lente, ce qui est critique lorsqu'elle est utilisée sur un appareil mobile. Ils étaient également absents de la version standard de la bibliothèque, ce qui pouvait entraîner des difficultés lors du portage vers Android. Lors de l'utilisation d'options plus rapides, la qualité de la reconnaissance a diminué.
Pour augmenter la qualité de la reconnaissance, j'ai examiné des exemples où l'algorithme était incorrect. Dans la plupart des cas, l'algorithme a trouvé l'emplacement approximatif de ColorChecker, mais n'a pas déterminé avec précision sa zone. En raison d'une détermination inexacte de la zone du point à partir de laquelle les couleurs ont été prises pour l'étalonnage, elles ne sont pas tombées dans les bons carrés de la palette, respectivement, les couleurs ont été restaurées incorrectement. Pour résoudre ce problème, j'ai essayé de relancer l'algorithme, d'obtenir une approximation initiale inexacte, et également de déplacer empiriquement les points utilisés pour l'étalonnage, dans le sens des carrés souhaités. Après cela, la qualité de la méthode a augmenté et est devenue acceptable, même pour des algorithmes initialement faibles mais rapides:
Algorithme | Précision | Temps de travail |
Surf | 75% | 2,8 s |
83% (+ 8%) | 14s |
SIFT | 88% | 3.4s |
96% (+ 8%) | 15 s |
Brisk | 65% | 0,5 s |
93% (+ 28%) | 1,5 s |
ORB | 56% | 0,4 s |
79% (+ 23%) | 1s |
Pour l'étalonnage, j'utilise une régression simple des moindres carrés: à la fois linéaire en couleur et dans les ordres supérieurs. En conséquence, la question s'est posée: comment choisir le meilleur parmi plusieurs modèles. Les mesures basées sur la proximité de la couleur avec la norme ont donné des résultats mitigés: une image bien calibrée utilisant des critères formels peut sembler artificielle d'un point de vue humain. L'image ci-dessous montre un exemple d'un tel effet. Pour illustrer, au lieu de grains, j'ai pris une tranche de tubercule de pomme de terre, car elle est plus grande, et nous pouvons mieux voir les distorsions de couleur. Nous avons essayé de changer les métriques, mais à la fin nous avons décidé qu'il valait mieux évaluer le modèle pour l'étalonnage par son influence sur le résultat de la tâche finale - la séparation des grains.
Tranche de tubercule de pomme de terre, de gauche à droite: avant étalonnage, après étalonnage par régression des premier, deuxième et troisième ordres.

Ensuite, il a fallu assembler un ensemble de données sur lequel vérifier la qualité de la recherche et de l'étalonnage ColorChecker, et également résoudre le problème de la séparation des grains par couleur. Pour ce faire, nous avons prélevé des échantillons de grains de différentes variétés et photographié sur différents appareils, avec différentes sources d'éclairage: artificielles et en plein jour. Après cela, j'ai exécuté toutes les images à travers l'algorithme d'étalonnage et collecté les couleurs des grains, l'algorithme de reconnaissance des grains m'a été prêt. J'ai dû faire plus d'une itération de ce processus: la reconnaissance sur des images de mauvaise qualité ne fonctionnait pas toujours bien, j'ai dû sélectionner des heuristiques supplémentaires pour trier les ordures.
En fin de compte, il s'est avéré recueillir un ensemble de données, dont la qualité m'a satisfait. J'ai formalisé le problème de la séparation des grains comme suit: neuf variétés de grains étaient divisées en trois classes (blanc, rouge et violet), chaque grain individuel devait être classé par couleur dans l'une des trois classes. J'ai essayé des méthodes de classification simples telles que KNN et les classificateurs linéaires, mais je n'ai pas réussi à obtenir une bonne précision. Cependant, même vu à l'œil nu, il était clair que les classes se croisent fortement et qu'il n'y a aucune surface de division apparente entre elles.
Résumé
Le résultat principal du travail est l'algorithme de recherche ColorChecker, qui fonctionne rapidement et avec une bonne qualité, et l'étalonnage des couleurs par celui-ci. Il peut être utile non seulement pour les céréales. Par exemple, il a été possible de l'appliquer pour analyser des épis de blé.
J'ai également vérifié la possibilité de classer les grains par couleur - je n'ai pas pu obtenir une grande précision ici, même avec l'aide de l'étalonnage.
Mais le résultat le plus important est que j'ai acquis de l'expérience dans la résolution d'un problème pour lequel aucun algorithme prêt à l'emploi n'est présenté sur les étagères, et découvert pour moi-même un domaine passionnant de la vision par ordinateur, que j'espère que je rencontrerai à l'avenir.