J'essaie de mettre en œuvre un algorithme où étant donné une image avec plusieurs objets sur une table plane, souhaitée est la sortie de masques de segmentation pour chaque objet. Contrairement aux CNN, l'objectif ici est de détecter des objets dans un environnement inconnu. Quelles sont les meilleures approches à ce problème? Existe-t-il également des exemples de mise en œuvre disponibles en ligne?
Edit: je suis désolé, la question peut avoir été un peu trompeuse. Ce que je voulais dire par «environnement inconnu», c'est que les objets peuvent être inconnus de l'algorithme. L'algorithme ne devrait pas avoir besoin de comprendre ce qu'est l'objet, mais devrait seulement détecter l'objet. Comment dois-je aborder ce problème?
Réponses:
Réponse rapide
Mean Shift LSH qui est une mise à niveau en du célèbre algorithme Mean Shift en bien connu pour sa capacité de segmentation d'imageO(n) O(n2)
Quelques explications
Si vous souhaitez une véritable approche non supervisée pour segmenter les images, utilisez des algorithmes de clustering . Le fait est qu'il existe de nombreux algorithmes avec une complexité et une spécificité temporelles différentes . Prenez le plus célèbre, le -Means, il est en donc assez rapide mais vous devez spécifier combien de cluster vous voulez, ce qui n'est pas ce que vous voulez en explorant une image inconnue sans aucune information sur le nombre de formes présente en elle. De plus, même si vous supposez que vous savez combien de formes sont présentes, nous pouvons supposer qu'il y a des formes aléatoires, ce qui est un autre point où les -Means échouent car il est conçu pour trouver des amas elliptiques et NONO ( n ) KK O(n) K ceux de forme aléatoire.
À l'opposé, nous avons le décalage moyen qui est capable de trouver automatiquement le nombre de grappes - ce qui est utile lorsque vous ne savez pas ce que vous recherchez - avec des formes aléatoires .
Bien sûr, vous remplacez le paramètre de -Means par d'autres paramètres Mean Shift qui peuvent être difficiles à affiner, mais il n'existe pas d'outil qui vous permet de faire de la magie si vous ne vous entraînez pas à faire de la magie.KK K
Un conseil pour le clustering de segmentation d'images
Transformez votre espace colorimétrique du RVB au LUV, ce qui est mieux pour la distance euclidienne.
Mean Shift LSH est plus lent mais il correspond mieux à vos besoins. Il reste toujours linéaire et est également évolutif avec l'implémentation mentionnée.
PS: Ma photo de profil est une application du Mean Shift LSH sur moi-même si elle peut aider à comprendre comment cela fonctionne.
la source
Vous devrez peut-être jeter un œil à ce travail soumis et accepté pour CVPR 2018: Apprendre à segmenter chaque chose
Dans ce travail, ils essaient de tout segmenter, même les objets inconnus du réseau. Le masque R-CNN a été utilisé, combiné avec un sous-réseau d'apprentissage par transfert, ils obtiennent de très bons résultats en segmentant presque tout.
la source
L'état de l'art (SOTA) pour la segmentation d'images serait le Mask-RCNN de Facebook .
Bien qu'il soit généralement formé sur un ensemble de données tel que COCO ou Pascal qui présentent des objets réels, vous pouvez le recycler sur un ensemble de données de votre choix, réel ou non.
Facebook fournit une implémentation ( Detectron ) sous la licence Apache2. Essaie!
la source
En fait, votre tâche est supervisée.
Segnet
peut être une bonne architecture pour votre objectif, dont l'une de ses implémentations est accessible ici . SegNet apprend à prédire les étiquettes de classe par pixel à partir d'un apprentissage supervisé. Par conséquent, nous avons besoin d'un ensemble de données d'images d'entrée avec des étiquettes de vérité au sol correspondantes. Images d'étiquettes doivent être un seul canal, chaque pixel marqué par sa classe ... .Jetez également un œil aux réseaux entièrement convolutifs qui conviennent parfaitement à votre tâche.
Sur la base des modifications de la question, j'ajoute des informations supplémentaires. Il existe de nombreuses méthodes qui peuvent être appliquées pour cette tâche. Fondamentalement, la plus simple consiste à utiliser une étiquette d' arrière - plan et à classer les classes que vous ne connaissez pas comme arrière-plan en utilisant les architectures mentionnées. Ce faisant, vous aurez des étiquettes qui peuvent se chevaucher pour la classe d'arrière-plan, ce qui est un inconvénient probable de cette approche, mais son avantage est que dans les cas où vos étiquettes entraînées sont fréquemment utilisées dans les entrées, vous pouvez avoir une version relativement légère de l'architecture qui reconnaît les classes inconnues.
la source
C'est peut-être quelque chose que vous recherchez. Puisque vous demandez une segmentation d'image et non une
semantic / instance
segmentation, je suppose que vous n'avez pas besoin de l'étiquetage pour chaque segment de l'image.La méthode est appelée
scene-cut
qui segmente une image en régions indépendantes de la classe de manière non supervisée. Cela fonctionne très bien en cas d'environnement encombré à l'intérieur.Lien papier: arxiv
Code: code
la source