Como conquistamos nossa 3a medalha de bronze no Kaggle: algoritmos e dicas

Estratégias utilizando modelos 3D e baseados em redes recorrentes garantiram nossa posição entre os top 7% na competição do RSNA do Kaggle

NeuralMed
IA em Saúde: NeuralMed
6 min readNov 5, 2020

--

No último mês, o time de Data Science da NeuralMed participou da competição do Kaggle & RSNA, para detectar casos de tromboembolismo pulmonar (TEP) em exames de tomografia computadorizada de tórax. Essa foi uma competição muito desafiadora, pois além de identificarmos se as imagens tinham ou não TEP, precisávamos indicar características específicas do TEP em casos de exames positivos, como: razão/proporção, lateralidade, temporalidade em um dataset bastante desbalanceado.

Apesar de desafiadora, a competição trouxe muitos conhecimentos importantes para o nosso time, tanto na oportunidade de aplicação de novas técnicas e arquiteturas quanto no conhecimento mais aprofundado da patologia em questão. Para a nossa empresa, NeuralMed, são conhecimentos muito importantes e que são aproveitados diariamente!

A NeuralMed é uma startup que usa inteligência artificial aplicada à saúde, utilizando imagens e textos médicos. Nossos produtos são feitos com objetivo de auxiliar o diagnóstico, triagem de pacientes, etc. Por conta disso, tínhamos como maior motivação, ao entrar na competição, estudar e aprender mais sobre patologias que podemos identificar em exames de tomografia para melhorarmos nossos produtos.

Dados e Análise Exploratória

Os dados de exames de tomografia de tórax disponíveis na competição possuíam dez classes, sendo uma a nível de imagem, indicando a presença ou ausência de TEP no slice. As outras nove classes eram a nível de exame, sendo: exame negativo ou não, casos indeterminados (normalmente exames com baixa qualidade) e outras classes com características importantes para exames positivos:

  • razão/proporção (ratio): identificar se o ventrículo direito é maior que o ventrículo esquerdo no coração, achado sugestivo de sobrecarga na artéria pulmonar.
  • Lateralidade (side): identificar em qual lado do corpo está o TEP: direita, esquerda ou central, ou suas combinações.
  • Temporalidade (chronic/acute): O TEP em sua fase aguda é uma emergência médica que obriga conduta imediata. Como a morfologia do trombo é variável em relação ao tempo, é usada para esta diferenciação entre casos agudos e os crônicos

O dataset de treinamento disponível no Kaggle é composto por 7.274 exames com mais de 1,7MM de imagens. Apenas 2.368 dos exames (cerca de 33%) eram positivos, já indicando um desbalanceamento considerável no dataset. Dado que um exame de tomografia positivo para TEP possui poucos slices em que o TEP é visível, temos cerca de 5% do dataset de imagens positivas.

Após a análise exploratória dos dados, realizamos uma etapa de pré-processamento muito importante quando trabalhamos com dados de tomografia computadorizada: o janelamento dos slices. Janelamento é o processo de ajuste da escala de cinza da imagem de CT, alterando a aparência da imagem a fim de destacar estruturas específicas de interesse.

Após o pré-processamento, dividimos os esforços da equipe em duas estratégias principais dentro da competição: modelos de classificação por imagem (slices do CT) e de classificação por exame.

Classificação por imagem

Dentre as técnicas que testamos para modelos de classificação por imagem estão Convolutional Neural Networks (CNNs) com arquiteturas de ResNext, EfficientNet e LSTM com múltiplas saídas. Testamos estratégias mutilabel e multitask com essas arquiteturas.

Nesse cenário onde os modelos preveem a probabilidade por imagem, obtivemos o resultado por exame de duas formas: slice com maior predição ou média das 10 maiores predições por slice. Os melhores resultados foram obtidos com a ResNext multilabel, e utilizando a maior predição de cada classe como resposta por exame. Nessa solução não utilizamos labels de exame negativo e indeterminado, sendo que foram definidos a partir das demais predições ou da frequência da classe no conjunto de treino.

Classificação por exame

Nossos melhores resultados na competição foram utilizando modelos baseados na classificação do modelo com um todo. Nestes testamos modelos de 3D e baseados em redes recorrentes (LSTM e GRU) por exame, as duas arquiteturas com maior potencial foram:

  • Uma arquitetura volumétrica 3D construído usando a biblioteca MONAI, esse modelo aceita cubos de 160x160x160 pixeis (ou 160 camadas de imagens de tamanho 160x160) e retorna os scores das classes por exame. O score loss obtido com essa arquitetura foi de 0.319.
Exemplo de cubo usado como input para o modelo: as médias das cortes coronais, axiais e laterais do exame são na esquerda, na direita são os cortes no meio
  • Uma arquitetura GRU acoplada a uma rede neural EffNet pré-treinada, com 50 slices de input que retornava as predições por exame e por imagens. O score obtido com essa arquitetura foi de 0.212.
Arquitetura do modelo GRU

Nesses dois modelos, um loss customizado para ser próximo das métricas usada pelo Kaggle foi utilizado. O modelo de GRU foi treinado durante 5 épocas, o modelo cúbico de MONAI foi treinado durante 20 épocas.

Esses modelos têm resultados muito bons com quase todas as classes, exceto as classes minoritárias (acute_and_chronic, chronic e indeterminate). Para otimizar nosso score na competição, decidimos usar a média dos valores dessas classes como predição para cada paciente.

Dificuldades

Nossas principais dificuldades ao longo da competição foram com os limites de tempo de inferência e de GPU da plataforma do Kaggle. Passamos boa parte das primeiras semanas pensando em estratégias para não exceder o tempo de 9 horas dos notebooks de submissão, considerando a grande quantidade de dados. Dentre as soluções que aplicamos estão: identificar, com a ajuda de conhecimentos médicos de outros membros da equipe formas de diminuir a quantidade de imagens que precisava ser vista para cada exame; além disso, fizemos a predição do dataset de teste público separadamente do notebook de submissão final, de forma que, ao realizar a submissão, adicionamos as predições feitas anteriormente ao notebook que seria executado no dataset de teste privado.

Uma outra dificuldade encontrada foi o desbalanceamento do dataset. De fato, o dataset tinha muito mais imagens negativas que positivas. Ele também tinha poucas imagens com TEP central ou de tipo chronic.

Por fim, a maioria dos nossos modelos overfitaram, portanto, decidimos usar um modelo externo PENET para avaliar o dataset inteiro e guardar apenas as imagens bem preditas pelo modelo. Dessa maneira, resolvemos esse problema e conseguimos ter resultados que faziam muito mais sentido para alguns modelos que estavam mais propensos a overfitar.

Dicas para o Kaggle

A partir dos nossos aprendizados deixamos aqui 4 dicas que achamos essenciais para quem está começando e mesmo para quem já participa dos desafios do Kaggle:

  1. Acompanhem os Notebooks: a medida que avançávamos na competição, umas das coisas que nos ajudou com ideias e mesmo aprender técnicas novas foram os notebooks que eram publicados pelos outros competidores. Essa é uma dica que na verdade serve para qualquer pessoa que está trabalhando com Ciência de Dados, mesmo que não seja em uma competição: Procure notebooks do Kaggle sobre o assunto que está trabalhando, há dicas preciosas lá dentro e muito aprendizado.
  2. Acompanhem as discussões: as pessoas vão ter os mesmos problemas que você e é bom discutir com elas sobre isso! A questão do tempo de submissão, que foi onde mais perdemos tempo, foi resolvida em partes graças há uma discussão que estava rolando na competição.
  3. Prestem atenção na métrica de avaliação e façam avaliações internas: essa é uma dica que aprendemos na competição passada a duras penas! Fizemos a avaliação com nossos dados de teste, mas não confiamos neles, resultado: a submissão que para a gente estava com o melhor resultado era a de fato a que ficaria melhor na competição e não a que estava acima no leaderboard público. Por isso, faça seu notebook de avaliação interna com as métricas do Kaggle e confie nos resultados dele.
  4. Se você está em time, compartilhe ideias: A melhor parte da competição foi discutir ideias juntos e aprender como um time.

Valeu time!

Terminamos por aqui, agradecendo muito à todo o time que colaborou neste desafio! Apesar de desafiador, todo o processo que envolveu a competição foi muito proveitoso e divertido. A experiência de poder colaborar com a equipe e discutir diferentes ideias que poderíamos aplicar tanto na competição quanto nos produtos da empresa foi ótima. Como nosso time é muito diverso, cada integrante trouxe ótimas contribuições para a definição das estratégias e experimentos, além do apoio que tivemos do time da Fleury. Além disso, a nossa liderança foi essencial para nos ajudar a focar no essencial para o desafio que enfrentamos (e vencemos)! Além da medalha de bronze e ficar entre os top 7% da competição, o que ficou desta competição foram ótimos aprendizados e fortalecimento do trabalho incrível da nossa equipe!

--

--

NeuralMed
IA em Saúde: NeuralMed

NeuralMed is a healthcare startup focused on artificial intelligence to aid triage systems and diagnosis