Ich möchte automatisch segmentierte Mikroskopbilder als Teil einer Bildgebungspipeline mit hohem Durchsatz verarbeiten, um fehlerhafte Bilder und / oder fehlerhafte Segmentierungen zu erkennen. Es gibt eine Vielzahl von Parametern, die für jedes Rohbild und jede Segmentierung berechnet werden können und die "extrem" werden, wenn das Bild fehlerhaft ist. Beispielsweise führt eine Blase im Bild zu Anomalien wie einer enormen Größe in einer der erkannten "Zellen" oder einer ungewöhnlich niedrigen Zellzahl für das gesamte Feld. Ich suche nach einem effizienten Weg, um diese anomalen Fälle zu erkennen. Idealerweise würde ich eine Methode bevorzugen, die die folgenden Eigenschaften aufweist (ungefähr in der Reihenfolge ihrer Erwünschtheit):
erfordert keine vordefinierten absoluten Schwellenwerte (obwohl vordefinierte Prozentsätze in Ordnung sind);
erfordert nicht, alle Daten im Speicher zu haben oder sogar alle Daten gesehen zu haben; Es wäre in Ordnung, wenn die Methode anpassungsfähig wäre und ihre Kriterien aktualisiert, wenn mehr Daten angezeigt werden. (Offensichtlich können mit geringer Wahrscheinlichkeit Anomalien auftreten, bevor das System genügend Daten gesehen hat und diese übersehen werden usw.)
ist parallelisierbar: z. B. erzeugen in einer ersten Runde viele parallel arbeitende Knoten Zwischenkandidatenanomalien, die nach Abschluss der ersten Runde eine zweite Auswahlrunde durchlaufen.
Die Anomalien, nach denen ich suche, sind nicht subtil. Sie sind die Art, die offensichtlich ist, wenn man sich ein Histogramm der Daten ansieht. Das fragliche Datenvolumen und das letztendliche Ziel, diese Anomalieerkennung in Echtzeit durchzuführen, während die Bilder erzeugt werden, schließen jedoch jede Lösung aus, die eine Überprüfung der Histogramme durch einen menschlichen Bewerter erfordern würde.
Vielen Dank!
Antworten:
Haben Sie so etwas wie einen Ein-Klassen-Klassifikator in Betracht gezogen?
Sie benötigen einen Trainingssatz mit bekanntermaßen guten Bildern, mit denen ein Klassifikator trainiert wird, der versucht, zwischen "Bildern wie Ihrem Trainingssatz" und allem anderen zu unterscheiden. Es gibt eine These von David Tax , die wahrscheinlich mehr Informationen enthält, als Sie tatsächlich zu diesem Thema benötigen, aber möglicherweise ein guter Anfang ist.
Abgesehen davon, dass ein Trainingsset erforderlich ist, scheint es Ihren Anforderungen zu entsprechen:
Parameter werden aus den Daten gelernt (hier kein Ad-Hockery)
Sobald Sie das Modell haben, müssen Sie die Daten nicht mehr im Speicher behalten.
Ebenso kann der trainierte Klassifikator auf so vielen Knoten ausgeführt werden, wie Sie haben.
Abhängig von Ihrer Anwendung können Sie einen wartungsfähigen Klassifikator möglicherweise einmal trainieren und für verschiedene Arten von Proben / Farbstoffen / Flecken / Florophoren / etc. Wiederverwenden. Alternativ können Sie Benutzer möglicherweise dazu bringen, einen Teil der ersten Charge jedes Laufs manuell zu bewerten. Ich kann mir vorstellen, dass ein Mensch mit einer guten Benutzeroberfläche mindestens 5 bis 8 Beispiele pro Minute überprüfen kann.
quelle
Siehe http://scholar.google.com/scholar?q=stream+outlier+detection
Einige etablierte Methoden wie LOF wurden in einen Streaming-Kontext übernommen. Es gibt natürlich auch Methoden, die Histogramme auf Streaming-Weise aktualisieren und so offensichtliche eindimensionale Ausreißer kennzeichnen. Das könnte dir eigentlich genügen?
quelle
Es gibt viele mögliche Ansätze, aber es ist schwer zu wissen, was in Ihrer Situation ohne weitere Informationen am besten ist.
Speichern Sie die Merkmalsvektoren aller vorherigen Bilder zusammen mit ihrer Klassifizierung auf der Festplatte. Trainieren Sie regelmäßig (z. B. einmal am Tag) einen Lernalgorithmus für diese Daten und verwenden Sie den resultierenden Algorithmus, um neue Bilder zu klassifizieren. Speicherplatz ist billig; Diese Lösung kann pragmatisch und effektiv sein, um einen Offline-Lernalgorithmus in einen zu konvertieren, der in Ihrer Online-Umgebung verwendet werden kann.
Speichern Sie die Merkmalsvektoren einer Zufallsstichprobe von 1.000 (oder 1.000.000) vorherigen Bildern zusammen mit ihrer Klassifizierung. Trainieren Sie regelmäßig einen Lernalgorithmus für diese Teilstichprobe.
Beachten Sie, dass Sie dieses Teilbeispiel mithilfe von Standardtricks effizient online aktualisieren können . Dies ist nur dann interessant, wenn es einen Grund gibt, warum es schwierig ist, alle Merkmalsvektoren aller vorherigen Bilder zu speichern (was für mich schwer vorstellbar erscheint, aber wer weiß).
Bei diesem Ansatz wird davon ausgegangen, dass jeder Parameter aus einem nicht fehlerhaften Bild eine Gaußsche Verteilung aufweist und dass die Parameter unabhängig sind. Diese Annahmen können optimistisch sein. Es gibt viel komplexere Varianten dieses Schemas, die diese Annahmen überflüssig machen oder die Leistung verbessern. Dies ist nur ein einfaches Beispiel, um Ihnen eine Idee zu geben.
Im Allgemeinen können Sie sich Online-Algorithmen und Streaming-Algorithmen ansehen.
quelle
Wenn die Ausreißer ziemlich offensichtlich sind, ist ein einfacher Trick, der funktionieren würde, der folgende. Erstellen Sie aus Ihren Vektoren eine lokalitätssensitive Hash-Funktion. (Ein einfacher randomisierter Hash wie die Seite eines Satzes zufälliger Hyperebenen, auf die der Vektor fällt, könnte funktionieren. Dies würde einen booleschen Vektor als Hashwert ergeben.) Wenn Sie nun Vektoren empfangen, berechnen Sie den Hashwert des Vektors und speichern ihn der Hash-Wert (der Boolesche Vektor bei Hyperebenen) und die Anzahl in einem Wörterbuch. Sie speichern auch die Gesamtzahl der bisher gesehenen Vektoren. Sie können einen bestimmten Vektor jederzeit als Ausreißer markieren, wenn die Gesamtzahl der Vektoren, die im Hash mit ihm kollidieren, weniger als einen vordefinierten Prozentsatz der Gesamtzahl beträgt.
Sie können dies als inkrementelles Erstellen eines Histogramms ansehen. Da die Daten jedoch nicht univariat sind, verwenden wir den Hashing-Trick, damit sie sich so verhalten.
quelle