Actuellement, je développe un projet de compteur de piétons (utilisant OpenCV + QT sous Linux). Mon idée de l'approche est la suivante:
- Capturer des images
- Faire une soustraction d'arrière-plan
- bruits clairs (éroder, dilater)
- find blobs (cvBlobslib) - objets de premier plan
- Pour chaque blob, définissez le retour sur investissement et recherchez les piétons (LBP avec detectMultiScale) dans ces blobs (pour de meilleures performances)
- Pour chaque piéton trouvé, effectuez une recherche imbriquée sur le haut du corps (Pas sûr) (meilleure fiabilité)
- Si le même piéton est trouvé sur les images continues (3-4 images peut-être) - ajoutez cette zone au camshift et à la piste - marquez comme piéton
- Exclure les zones suivies par camshift de la détection de blob pour les images suivantes
- Si un piéton croise un numéro d'incrément de ligne
Je veux vérifier si je suis sur la bonne voie. Avez-vous des suggestions pour améliorer mon approche? Si quelqu'un travaillait sur quelque chose de similaire, j'apprécierais tous les conseils, ressources (et critiques) utiles sur ce problème.
Réponses:
Je peux voir un certain nombre de problèmes possibles avec cette approche. Je parle de ma propre expérience ici de l'amélioration d'un système de comptage des piétons avec une approche très similaire, donc je ne veux pas être décourageant. Au contraire, je voudrais vous avertir des éventuels obstacles que vous pourriez avoir à surmonter pour construire un système précis et robuste.
Premièrement, la soustraction d'arrière - plan suppose que les objets d'intérêt seront toujours en mouvement, et les objets que vous n'êtes pas intéressé à compter resteront complètement immobiles. Assurément, cela peut être le cas dans votre scénario, mais c'est toujours une hypothèse très limitative. J'ai également trouvé que la soustraction d'arrière-plan était très sensible aux changements d'éclairage (je suis d'accord avec geometrikal).
Méfiez-vous de faire l'hypothèse qu'une goutte = une personne , même si vous pensez que votre environnement est bien contrôlé. Il est arrivé trop souvent que les blobs correspondant aux personnes ne soient pas détectés parce qu'ils ne bougeaient pas ou qu'ils étaient trop petits, ils ont donc été supprimés par l'érosion ou par certains critères de seuil (et croyez-moi, vous ne voulez pas entrer dans le " régler les seuils jusqu'à ce que tout fonctionne "piège. Cela ne fonctionne pas;)). Il peut également arriver qu'une seule goutte correspond à deux personnes marchant ensemble, ou à une seule personne portant une sorte de bagage. Ou un chien. Donc, ne faites pas d'hypothèses intelligentes sur les blobs.
Heureusement, puisque vous mentionnez que vous utilisez des LBP pour la détection de personnes , je pense que vous êtes dans la bonne voie pour ne pas faire les erreurs dans le paragraphe ci-dessus. Je ne peux cependant pas commenter l'efficacité des LBP en particulier. J'ai également lu que le HOG (histogramme des gradients) est une méthode de pointe dans la détection des personnes, voir Histogrammes de gradients orientés pour la détection humaine .
Mon dernier reproche concerne l'utilisation de Camshift . Il est basé sur des histogrammes de couleurs, donc, en soi, il fonctionne bien lors du suivi d'un seul objet qui est facile à distinguer par la couleur, tant que la fenêtre de suivi est assez grande et qu'il n'y a pas d'occlusions ou de changements brusques. Mais dès que vous devez suivre plusieurs cibles qui peuvent avoir des descriptions de couleurs très similaires et qui se rapprochent très près les unes des autres, vous ne pouvez tout simplement pas vous passer d'un algorithme qui vous permet en quelque sorte de maintenir plusieurs hypothèses. Il peut s'agir d'un filtre à particules ou d'un cadre tel que MCMCDA (Markov Chain Monte Carlo Data Association, voir Markov Chain Monte Carlo Data Association for Multiple-Target Tracking). Mon expérience avec l'utilisation de Meanshift seul lors du suivi de plusieurs objets est tout ce qui ne devrait pas se produire avec le suivi: perte de piste, confusion des cibles, fixation en arrière-plan, etc. Lisez un peu sur les problèmes de suivi d'objets multiples et d'association de données, cela pourrait être cœur de compter plusieurs personnes après tout (je dis "peut-être" parce que votre objectif est de compter sans suivre, donc je n'écarte pas complètement la possibilité d'une approche intelligente qui compte sans suivre ...)
Mon dernier conseil est le suivant: il n'y a pas grand-chose à faire avec une approche donnée , et vous aurez besoin de choses plus sophistiquées pour obtenir de meilleures performances (donc je ne suis pas d'accord avec user36624 à cet égard). Cela peut impliquer de changer une partie de votre algorithme par quelque chose de plus puissant, ou de changer complètement l'architecture. Bien sûr, vous devez savoir quels trucs fantaisistes vous sont vraiment utiles. Il existe des publications qui tentent de résoudre le problème d'une manière de principe, tandis que d'autres proposent simplement un algorithme pour un ensemble de données donné et s'attendent à ce que vous formiez un classificateur qui n'est pas vraiment adapté au problème actuel, tout en vous obligeant à ajustez également quelques seuils. Le nombre de personnes estrecherche en cours, alors ne vous attendez pas à ce que les choses viennent facilement. Faites un effort pour apprendre des choses qui dépassent légèrement vos capacités, puis recommencez encore et encore ...
Je reconnais que je n'ai proposé aucune solution et au lieu de cela, j'ai seulement signalé des failles dans votre approche (qui proviennent toutes de ma propre expérience). Pour vous inspirer, je vous recommande de lire quelques recherches récentes, par exemple le suivi multi-cible stable dans la vidéo de surveillance en temps réel . Bonne chance!
la source
Je pense que ce que vous demandez concerne la faisabilité de votre algorithme pour les piétons.
Il existe deux stratégies générales pour ce type de problèmes:
(de bas en haut) Considérez-le comme un pur problème de détection, où dans chaque image, vous ne détectez que des piétons. Une fois que vous les avez détectés, a) compter leur nombre dans un cadre est assez facile; et b) le suivi de l'un d'eux dans des trames consécutives est également facile. Par conséquent, vous résolvez tout.
(de haut en bas) Considérez-le comme un problème de reconnaissance d'action, où vous détectez si un retour sur investissement dans des cadres consécutifs est un piéton ou non en fonction de ses actions. Une fois que vous avez résolu ce problème, vous résolvez les problèmes de détection et de suivi simultanément.
Votre algorithme heuristique est dans la première catégorie. Je ne veux pas vous décourager, mais vous pourriez manquer le point clé que la façon de détecter un piéton. Parce que les vraies données peuvent être plus compliquées que ce que vous pensiez. Par exemple, s'il s'agit d'une caméra de métro, dont les cadres peuvent être remplis de piétons et donc supprimer l'arrière-plan ou détecter des taches n'aide pas du tout. Dans ce cas, il est peut-être plus raisonnable d'utiliser des algorithmes de détection et de reconnaissance des visages pour résoudre le problème, car si vous trouvez un visage, vous trouvez un piéton. D'un autre côté, selon votre définition d'un piéton, il est peut-être vrai que tout le monde n'apparaît pas dans un cadre ne doit pas être traité comme un piéton. Dans ce cas, il peut être raisonnable d'utiliser des algorithmes de reconnaissance d'action (la deuxième catégorie), où vous pouvez définir explicitement un piéton en fonction de ses comportements.
Voici quelques conseils basés sur mon expérience:
Conservez ce que vous savez et ce que vous pouvez facilement ramasser. Ne consacrez pas votre temps à quelque chose de fantaisiste mais nécessitant de nombreux antécédents. Croyez-moi, tous ces algorithmes seront bons dans certains cas mais mauvais dans d'autres. Par conséquent, la première chose à faire est de faire fonctionner quelque chose, peu importe qu'il soit bon ou mauvais.
En savoir plus sur vos données, puis déterminer votre méthode. Une description générale d'un problème est insuffisante dans de nombreux cas.
Si vous souhaitez démontrer votre idée, il est préférable d'utiliser MATLAB et de construire un prototype.
la source