Disons qu'il y a deux voitures dans une image. Comment peut-il détecter ces voitures, étant donné qu'il peut détecter une seule voiture dans une image?
Disons qu'il y a deux voitures dans une image. Comment peut-il détecter ces voitures, étant donné qu'il peut détecter une seule voiture dans une image?
Réponses:
Bien que de nombreuses solutions dans les systèmes de production utilisent toujours une fenêtre coulissante comme décrit ci-dessous dans cette réponse, le domaine de la vision par ordinateur évolue rapidement. Les avancées récentes dans ce domaine comprennent R-CNN et YOLO .
La détection des correspondances d'objets dans une image, lorsque vous avez déjà un classificateur d'objets formé, est généralement une question de balayage par force brute à travers les correctifs d'image.
Commencez avec la plus grande taille de patch attendue. Par exemple, si votre image est de 1024 x 768, mais toujours à distance d'une route, vous ne vous attendez pas à ce qu'une voiture occupe plus de 80 x 80 pixels dans l'image. Vous prenez donc un bloc de pixels 80x80 dans un coin de l'image et demandez à votre classificateur quelle chance il y a une voiture dans ce coin. Prenez ensuite le prochain patch - déplacez-vous peut-être de 20 pixels.
Répétez pour toutes les positions possibles et décidez quels patchs sont les plus susceptibles de contenir des voitures.
Ensuite, réduisez la taille du bloc (peut-être 60 x 60, en déplaçant 15 pixels à la fois) et répétez à nouveau le même exercice. Répétez cette opération jusqu'à ce que vous ayez atteint la plus petite taille de bloc attendue pour votre objectif.
Finalement, vous aurez une liste de zones dans l'image, avec la probabilité que chacune contienne une voiture.
Les blocs qui se chevauchent tous les deux avec une probabilité élevée sont probablement la même voiture, donc la logique doit avoir des seuils pour fusionner les blocs - en prenant généralement la zone de chevauchement avec le score de probabilité le plus élevé - et déclarer qu'il n'y a qu'une seule voiture dans cette zone.
Comme d'habitude avec les approches ML, vous devrez expérimenter avec des méta-paramètres corrects - dans ce cas, les tailles de bloc, les tailles de pas et les règles de fusion / division des zones - afin d'obtenir les résultats les plus précis.
Je voudrais ajouter la réponse de @ Neil_Slater en partageant mon application.
Dans mon application, je veux former un modèle capable de charger automatiquement une position d'échecs à partir d'un livre d'échecs comme celui-ci:
Ce n'était pas un problème difficile car c'était comme entraîner les chiffres MINST. J'ai collecté suffisamment d'échantillons et ajouté au hasard du bruit à ces échantillons. Mon modèle était un apprentissage profond convolutionnel à 2 couches.
Depuis l'échiquier est toujours un carré. J'utilise la détection de carrés disponible dans OpenCV pour me donner une liste de candidats. Je jetterais tout carré trop petit, trop grand ou non divisible par 64 (car il y a 64 carrés).
Ensuite, je recadrerais l'image à quelque chose comme ceci:
Maintenant, j'ai un autre réseau convolutionnel multicouche pour vérifier chaque carré de la carte. La longueur de foulée est la dimension de l'image divisée par 8 (car il y a huit carrés dans chaque dimension). La taille du patch est la même que la longueur de la foulée.
Ma tuyauterie a fonctionné car j'ai pu combiner deux classificateurs différents. Personnellement, je préfère former deux classificateurs, car il serait plus facile de former et de vérifier que d'essayer de tout mettre dans un seul modèle.
La question elle-même n'est pas tout à fait claire, car vous ne déclarez pas que vous avez un modèle qui peut détecter une voiture par course pour une image ou vous demandez simplement quels outils, algorithmes ou cadres utiliser pour détecter des voitures (ou d'autres objets) dans une image.
En réponse à la deuxième variante, vous devez utiliser des algorithmes développés pour la détection d'objets, qui sont soit des cascades de Haar (qui sont intégrées à OpenCV et il existe des didacticiels clairs sur la façon de former votre détecteur d'objet personnalisé, par exemple, un didacticiel sur les bananes ) ou des CNN, qui sont le choix pour la détection d'objets à l'aide de réseaux de neurones, personnellement, j'aime travailler avec cette implémentation - un code simple et complet et des résultats incroyables.
Les deux approches (Haar Cascades et CNN) trouvent essentiellement des motifs de formes mutuellement connectées et colocalisées qui décrivent votre objet particulier (que ce soit le visage, la banane, la voiture ou l'OVNI) et utilisent ces motifs pour trouver des objets sur une nouvelle image. L'inclusion mutuelle des objets détectés (lorsque les bordures des objets se croisent ou l'un est inclus par un autre) est utilisée pour trouver la meilleure correspondance pour chaque région.
Votre question indique explicitement que vous ne recherchez que plusieurs voitures plutôt que plusieurs objets, donc la réponse est dans la question. Vous ne recherchez pas plusieurs objets, mais plutôt plusieurs occurrences du même objet.
Si vous avez suffisamment formé le système pour reconnaître les deux types de voitures, ils devraient tous deux être détectés à l'aide d'approches de filtre en cascade standard ... C'est comme demander comment puis-je détecter 2 visages sur une photo?
Si vous recherchiez une voiture et un singe, la situation est très différente et en utilisant des approches courantes avec des outils tels que CV ouvert, vous formeriez généralement 2 classificateurs (un pour les voitures et un pour les singes) pour itérer deux fois l'image.
Plus vous voulez détecter de classes d'objets différentes, plus vous aurez besoin de classificateurs et d'itérations.