Desejo processar imagens de microscopia segmentadas automaticamente para detectar imagens e / ou segmentações defeituosas, como parte de um pipeline de geração de imagens de alto rendimento. Há vários parâmetros que podem ser calculados para cada imagem e segmentação brutas e que se tornam "extremos" quando a imagem está com defeito. Por exemplo, uma bolha na imagem resultará em anomalias, como um tamanho enorme em uma das "células" detectadas ou uma contagem anormalmente baixa de células para todo o campo. Estou procurando uma maneira eficiente de detectar esses casos anômalos. Idealmente, eu preferiria um método que possua as seguintes propriedades (aproximadamente em ordem de conveniência):
não requer limites absolutos predefinidos (embora porcentagens predefinidas estejam OK);
não requer ter todos os dados na memória, ou mesmo ter visto todos os dados; seria bom que o método fosse adaptável e atualize seus critérios à medida que vê mais dados; (obviamente, com algumas probabilidades pequenas, podem ocorrer anomalias antes que o sistema tenha visto dados suficientes e sejam perdidos etc.)
é paralelizável: por exemplo, em um primeiro turno, muitos nós trabalhando em paralelo produzem anomalias candidatas intermediárias, que passam por uma segunda rodada de seleção após a conclusão da primeira rodada.
As anomalias que estou procurando não são sutis. Eles são do tipo claramente óbvio se olharmos para um histograma dos dados. Mas o volume de dados em questão e o objetivo final de realizar essa detecção de anomalias em tempo real à medida que as imagens são geradas, impedem qualquer solução que exija inspeção de histogramas por um avaliador humano.
Obrigado!
Respostas:
Você já pensou em algo como um classificador de uma classe?
Você precisaria de um conjunto de treinamento de imagens conhecidas, que são usadas para treinar um classificador que tenta distinguir entre "imagens como o conjunto de treinamento" e tudo o mais. Há uma tese de David Tax que provavelmente possui mais informações do que você realmente precisa sobre o assunto, mas que pode ser um bom ponto de partida.
Além de exigir um conjunto de treinamento, parece que ele atenderia aos seus requisitos:
Os parâmetros são aprendidos com os dados (sem ad-hockery aqui)
Depois de obter o modelo, não há necessidade de manter os dados na memória.
Da mesma forma, o classificador treinado pode ser executado em quantos nós você tiver.
Dependendo da sua aplicação, você poderá treinar um classificador que pode ser reparado uma vez e reutilizá-lo para diferentes tipos de amostras / corantes / manchas / floróforos / etc. Como alternativa, você pode conseguir que os usuários classifiquem manualmente alguns dos primeiros lotes de cada execução - imagino que um humano possa verificar pelo menos 5-8 exemplos / minuto com uma boa interface.
fonte
Consulte http://scholar.google.com/scholar?q=stream+outlier+detection
Alguns métodos estabelecidos, como o LOF , foram adotados em um contexto de streaming. É claro que também existem métodos que atualizam os histogramas de maneira fluida e, portanto, sinalizam outliers unidimensionais óbvios. Isso poderia ser suficiente para você?
fonte
Existem muitas abordagens possíveis, mas é difícil saber o que pode ser melhor na sua situação sem mais informações.
Armazene os vetores de recursos de todas as imagens anteriores, juntamente com sua classificação, em disco. Periodicamente (digamos, uma vez por dia), treine um algoritmo de aprendizado nesses dados e use o algoritmo resultante para classificar novas imagens. O espaço em disco é barato; Essa solução pode ser pragmática e eficaz para converter um algoritmo de aprendizado offline em um que possa ser usado na sua configuração online.
Armazene os vetores de recursos de uma amostra aleatória de 1.000 (ou 1.000.000) imagens anteriores, juntamente com sua classificação. Treine periodicamente um algoritmo de aprendizado nesta subamostra.
Observe que você pode atualizar com eficiência essa subamostra de maneira on-line usando truques padrão . Isso é interessante apenas se houver alguma razão pela qual é difícil armazenar todos os vetores de recursos de todas as imagens anteriores (o que parece difícil de imaginar, para mim, mas quem sabe).
Essa abordagem supõe que cada parâmetro de uma imagem não defeituosa tenha uma distribuição gaussiana e que os parâmetros sejam independentes. Essas suposições podem ser otimistas. Existem muitas variantes mais sofisticadas desse esquema que eliminam a necessidade dessas suposições ou melhoram o desempenho; este é apenas um exemplo simples para lhe dar uma ideia.
Em geral, você pode procurar algoritmos online e algoritmos de streaming.
fonte
Se os outliers forem bastante óbvios, um truque simples que funcionaria é o seguinte. Construa uma função de hash sensível à localidade a partir de seus vetores. (Um hash aleatório simples como o lado de um conjunto de hiperplanos aleatórios no qual o vetor se encaixa pode funcionar. Isso produziria um vetor booleano como o valor do hash.) Agora, ao receber vetores, você calcula o valor do hash do vetor e armazena o valor de hash (o vetor booleano no caso de hiperplanos) e as contagens em um dicionário. Você também armazena o número total de vetores vistos até o momento. A qualquer momento, você pode sinalizar um determinado vetor como um erro externo se o número total de vetores que colidem com ele no hash for menor que uma porcentagem predefinida do total.
Você pode ver isso como construir um histograma de forma incremental. Mas como os dados não são univariados, usamos o truque de hash para fazê-lo se comportar como ele.
fonte