Détection des valeurs aberrantes en ligne

10

Je souhaite traiter des images de microscopie à segmentation automatique pour détecter des images défectueuses et / ou des segmentations défectueuses, dans le cadre d'un pipeline d'imagerie à haut débit. Il existe une multitude de paramètres qui peuvent être calculés pour chaque image brute et segmentation, et qui deviennent «extrêmes» lorsque l'image est défectueuse. Par exemple, une bulle dans l'image entraînera des anomalies telles qu'une taille énorme dans l'une des "cellules" détectées, ou un nombre de cellules anormalement bas pour l'ensemble du champ. Je recherche un moyen efficace de détecter ces cas anormaux. Idéalement, je préférerais une méthode qui présente les propriétés suivantes (à peu près par ordre de désirabilité):

  1. ne nécessite pas de seuils absolus prédéfinis (bien que les pourcentages prédéfinis soient OK);

  2. ne nécessite pas d'avoir toutes les données en mémoire, ni même d'avoir vu toutes les données; il serait bon que la méthode soit adaptative et actualise ses critères à mesure qu'elle voit plus de données; (évidemment, avec une faible probabilité, des anomalies peuvent se produire avant que le système n'ait vu suffisamment de données et seront manquées, etc.)

  3. est parallélisable: par exemple, dans un premier tour, de nombreux nœuds travaillant en parallèle produisent des anomalies candidates intermédiaires, qui subissent ensuite un deuxième tour de sélection après la fin du premier tour.

Les anomalies que je recherche ne sont pas subtiles. Ce sont ceux qui sont clairement évidents si l'on regarde un histogramme des données. Mais le volume de données en question, et l'objectif ultime d'effectuer cette détection d'anomalie en temps réel pendant la génération des images, exclut toute solution qui nécessiterait l'inspection des histogrammes par un évaluateur humain.

Merci!

kjo
la source
Ai-je raison de dire que votre problème est essentiellement univarié?
user603
1
Publiez des données car cela pourrait m'aider à "voir" le problème que vous avez. Je connais bien l'histogramme mettant en évidence la valeur aberrante et je pourrais peut-être vous fournir des conseils sur un moyen efficace de détecter ces cas anormaux en utilisant des méthodes statistiques au lieu d'inspecter les histogrammes par un évaluateur humain. Voir une discussion récente sur la détection de l'aléatoire stats.stackexchange.com/questions/12955/… Vous essayez bien sûr de détecter les violations déterministes de l'aléatoire.
IrishStat
Pouvez-vous nous donner plus de détails? Les paramètres sont-ils continus ou discrets? Quelle est la distribution des paramètres pour les images non défectueuses? Gaussien? Les paramètres sont-ils indépendants ou corrélés? Environ combien de paramètres extrayez-vous, par image? De combien d'images par seconde avez-vous besoin pour pouvoir gérer (ou quelle latence par image est acceptable)? Peut-être pouvez-vous afficher des histogrammes pour quelques paramètres typiques, sur un grand ensemble de données d'images non défectueuses, puis afficher l'histogramme correspondant pour les images défectueuses? Cela peut aider à trouver une bonne solution.
DW

Réponses:

3

Avez-vous envisagé quelque chose comme un classificateur à une classe?

Vous auriez besoin d'un ensemble de formation d'images connues, qui sont utilisées pour former un classificateur qui essaie de faire la distinction entre "des images comme votre ensemble de formation" et tout le reste. Il y a une thèse de David Tax qui contient probablement plus d'informations que vous n'en avez réellement besoin sur le sujet, mais pourrait être un bon point de départ.

En plus de nécessiter un ensemble de formation, il semble qu'il répondrait à vos besoins:

  • Les paramètres sont appris à partir des données (pas de publicité publicitaire ici)

  • Une fois que vous avez le modèle, il n'est pas nécessaire de conserver les données en mémoire.

  • De même, le classificateur entraîné peut être exécuté sur autant de nœuds que vous en avez.

Selon votre application, vous pourrez peut-être former un classificateur utilisable une fois et le réutiliser pour différents types d'échantillons / colorants / taches / florophores / etc. Alternativement, vous pourriez être en mesure d'amener les utilisateurs à évaluer manuellement une partie du premier lot de chaque exécution - j'imagine qu'un humain pourrait vérifier au moins 5-8 exemples / minute avec une bonne interface.

Matt Krause
la source
2

Voir http://scholar.google.com/scholar?q=stream+outlier+detection

Quelques méthodes établies telles que LOF ont été adoptées dans un contexte de streaming. Il existe également des méthodes qui mettent à jour les histogrammes en continu et signalent ainsi des valeurs aberrantes unidimensionnelles évidentes. Cela pourrait-il être suffisant pour vous?

A QUIT - Anony-Mousse
la source
1

Il existe de nombreuses approches possibles, mais il est difficile de savoir ce qui peut être le mieux dans votre situation sans plus d'informations.

Il semble que, pour chaque image, vous recevez un vecteur d'entité, qui est un élément de . Si tel est le cas, voici quelques solutions candidates:Rn

  • Stockez les vecteurs de caractéristiques de toutes les images précédentes, ainsi que leur classification, sur le disque. Périodiquement (disons, une fois par jour), entraînez un algorithme d'apprentissage sur ces données et utilisez l'algorithme résultant pour classer de nouvelles images. L'espace disque est bon marché; cette solution peut être pragmatique et efficace pour convertir un algorithme d'apprentissage hors ligne en un algorithme qui peut être utilisé dans votre environnement en ligne.

  • Stockez les vecteurs de caractéristiques d'un échantillon aléatoire de 1 000 (ou 1 000 000) images antérieures, ainsi que leur classification. Former périodiquement un algorithme d'apprentissage sur ce sous-échantillon.

    Notez que vous pouvez mettre à jour efficacement ce sous-échantillon de manière en ligne en utilisant des astuces standard . Cela n'est intéressant que s'il y a une raison pour laquelle il est difficile de stocker tous les vecteurs de caractéristiques de toutes les images antérieures (ce qui semble difficile à imaginer, pour moi, mais qui sait).

  • Pour chacun des vecteurs, gardez une trace de la moyenne courante et de l'écart-type des images non défectueuses vues jusqu'à présent. Ensuite, lorsque vous recevez une nouvelle image, si l'une de ses caractéristiques présente au moins écarts-types au-delà de la moyenne de cette fonction, classez-la comme défectueuse, sinon classez-la comme non défectueuse. Vous pouvez choisir fonction de et du compromis souhaité entre les faux positifs et les faux négatifs.nccn

    En d'autres termes, vous conservez un vecteur de moyennes et un vecteur d'écarts-types, où est la moyenne du ème vecteur de caractéristique et est l'écart-type de cette caractéristique. Lorsque vous recevez un nouveau vecteur d' , vous vérifiez si pour tout . Sinon, vous le classifiez comme non défectueux et vous mettez à jour et .nμnσμiiσix|xiμi|cσiiμσ

    Cette approche suppose que chaque paramètre d'une image non défectueuse a une distribution gaussienne et que les paramètres sont indépendants. Ces hypothèses peuvent être optimistes. Il existe de nombreuses variantes plus sophistiquées de ce schéma qui élimineront le besoin de ces hypothèses ou amélioreront les performances; ce n'est qu'un exemple simple pour vous donner une idée.

En général, vous pouvez consulter les algorithmes en ligne et les algorithmes de streaming.

DW
la source
DW Un filtre / modèle ARIMA est une optimisation d'une "moyenne mobile" où le nombre de termes (N) et les poids spécifiques à appliquer sont identifiés empiriquement. Un modèle particulier et manifestement présomptif consiste à deviner à "N" le nombre de valeurs à utiliser dans la "moyenne mobile" puis à aggraver l'inanité en supposant que les poids sont égaux les uns aux autres.
IrishStat
@IrishStat, Je ne sais pas si je comprends votre commentaire. Dans le cas où mon écriture n'était pas claire, je ne proposais pas ARIMA, bien que ce soit quelque chose que l'on puisse également envisager. Je proposais quelque chose de beaucoup plus simple: garder une trace de la moyenne de toutes les observations jusqu'à présent et de l'écart-type. Chaque fois que vous voyez une nouvelle observation, vous pouvez mettre à jour la moyenne et l'écart-type (tant que vous avez gardé une trace du nombre d'observations vues jusqu'à présent) avec des méthodes standard. C'est peut-être simpliste, mais je ne vois pas pourquoi ce serait stupide.
DW
0

D'après ce que je comprends de votre question, vous recevez une séquence de vecteurs dans et vous souhaitez signaler le vecteur actuel comme étant une valeur aberrante compte tenu de tous les vecteurs que vous avez vus jusqu'à présent. (Je suppose que les paramètres d'image sont les éléments du vecteur.)Rn

Si les valeurs aberrantes sont assez évidentes, une astuce simple qui fonctionnerait est la suivante. Construisez une fonction de hachage sensible à la localité à partir de vos vecteurs. (Un hachage aléatoire simple comme le côté d'un ensemble d'hyperplans aléatoires sur lequel le vecteur tombe pourrait fonctionner. Cela donnerait un vecteur booléen comme valeur de hachage.) Maintenant que vous recevez des vecteurs, vous calculez la valeur de hachage du vecteur et stockez la valeur de hachage (le vecteur booléen dans le cas des hyperplans) et les nombres dans un dictionnaire. Vous stockez également le nombre total de vecteurs vus jusqu'à présent. À tout moment, vous pouvez signaler un vecteur donné comme étant une valeur aberrante si le nombre total de vecteurs qui entrent en collision avec lui dans le hachage sont inférieurs à un pourcentage prédéfini du total.

Vous pouvez voir cela comme la construction d'un histogramme de manière incrémentielle. Mais comme les données ne sont pas univariées, nous utilisons l'astuce de hachage pour qu'elles se comportent comme elles.

Innuo
la source