O blog da AWS

Utilizando image classification em imagens de raio-x para detecção de COVID-19 – Parte1

Por Thiago Couto, Arquiteto de Soluções AWS.

 

A pandemia causada pelo Covid-19 atingiu todos os setores e com ela trouxe novos desafios, especialmente na área da saúde. Cientistas ao redor do mundo buscam novos tratamentos, formas de prevenção e detecção da doença. Nessa busca por novos métodos um requisito crucial é a escala, dadas as proporções da pandemia, se faz necessário que os resultados sejam escaláveis para alcançar uma grande parte da população.

Um dos métodos que podem ser utilizados para triagem de pacientes com suspeita do Covid-19 é a análise de raio-x e tomografia da região torácica, nessa análise podemos aplicar técnicas de classificação de imagem com Machine Learning para agilizar a detecção e escalar para um maior número de pacientes. Nessa linha algumas publicações como https://data.mendeley.com/datasets/8h65ywd2jr/3 exploram essa possibilidade.

Nesse blogpost vamos explorar a utilização do algoritmo built-in da AWS para classificação de imagem (https://docs.thinkwithwp.com/sagemaker/latest/dg/image-classification.html) para classificar imagens de raio-x torácico de pacientes entre covid-19 detectado ou não detectado. O algoritmo utiliza uma CNN(ResNet) e pode ser treinado utilizando transfer learning para melhores resultados quando um maior número de imagens não está disponível.

A postagem foi inspirada nesse trabalho https://github.com/shervinmin/DeepCovid, bem como o dataset utilizado, que por sua vez é baseado nos datasets públicos https://github.com/ieee8023/covid-chestxray-dataset e https://stanfordmlgroup.github.io/competitions/chexpert/. O jupyter notebook dessa postagem está disponível em https://github.com/thiagomcouto/covid19_image_classification e foi testado em uma instância ml.t2.medium

 

Preparando o Dataset

 Para iniciar vamos fazer o download do dataset https://github.com/shervinmin/DeepCovid/tree/master/data e organizar a estrutura das pasta

 

 

O dataset atual possui imagens de outras enfermidades que para efeito dessa análise vamos considerar como “Covid não detectado”, abaixo selecionamos algumas imagens do dataset para testar nosso modelo posteriormente, essas imagens não serão utilizadas no treinamento.

 

 

Data Augmentation

O dataset atual está desbalanceado, contendo 184 imagens de pacientes diagnosticado com Covid-19 e 5 mil imagens de pacientes sem Covid-19. Para reduzir essa diferença vamos utilizar uma library em python para gerar 1 mil novas imagens de pacientes com Covid-19 positivo.

 

 

Gerando RecordIO

Com as imagens estruturadas nas pastas, vamos converter as imagens para MXNet RecordIO, formato recomendado, mais detalhes sobre o formato e os benefícios de utilizá-lo nesse link https://mxnet.apache.org/versions/1.7.0/api/architecture/note_data_loading.html

 

 

Utilizando os arquivos lst criaremos os arquivos recordIO redimensionando as imagens para um tamanho único.

 

 

Criando o Modelo

Com o dataset criado, vamos iniciar a criação do modelo. Abaixo utilizamos as libs boto3 e sagemaker para buscar a sessão e a role (provenientes do Notebook Instance), bem como a uri da imagem que vamos utilizar para treinamento.

 

 

Upload do dataset

Com o dataset criado e divido em treino e validação, vamos utilizar da lib boto3 para fazermos o upload e armazenar em variáveis para serem usadas como channel posteriormente.

 

 

Hyperparameters

 Na célula abaixo informaremos os hyperparameters para o modelo, para essa postagem utilizaremos uma ResNet18 com transfer learning, 20 epochs e learning rate de 0.0005. Além disso vamos usar a funcionalidade nativa de data augmentation para aumentar o número de samples e configuração de early stop. A instância utilizada no treinamento é a ml.p2.xlarge. Demais configurações nos comentários. Mais informações sobre as possibilidades de hyperparameter acessar o link https://docs.thinkwithwp.com/sagemaker/latest/dg/IC-Hyperparameter.html

 

Treinando o Modelo

 Com as configurações acima, vamos iniciar o treinamento do modelo e aguardar sua finalização.

 

 

Na célula abaixo, vamos configurar um modelo baseado no resultado do treinamento anterior, em posse desse modelo podemos iniciar um endpoint para inferências em tempo real ou fazermos inferências em batch.

 

 

Inferências em Batch

 Com o modelo criado, vamos fazer upload dos dados de teste que separamos anteriormente e criarmos um job em batch para inferência. Como citado anteriormente, podemos também configurar um endpoint com o modelo e executarmos inferências em tempo real, mas para o objetivo desse blog post inferências em batch são suficientes. O job vai realizar as inferências das imagens especificadas no bucket S3 e armazenar o resultado em arquivos json na pasta output.

 

 

Na célula abaixo criamos o job de inferência em batch e aguardamos a conclusão do mesmo

 

 

Validando o Modelo

 Após a conclusão do job de inferência, vamos inspecionar os resultados na pasta output e validarmos como nosso modelo se saiu.

 

 

Embora nossos dados de teste sejam de volume reduzido. Vamos gerar a matriz de confusão e calcular a precisão para facilitar a validação de trabalhos futuros e utilização de datasets maiores.

 

 

Resultado e Próximos Passos

 Devido ao caráter randômico da separação dos dados os resultados obtidos podem variar, nos meus testes realizados o modelo classificou todos os pacientes corretamente dentre as imagens de teste. Caso desejamos buscar melhores resultados podemos utilizar a feature do sagemaker de automatic model tunning, mais informações nesse link: https://docs.thinkwithwp.com/sagemaker/latest/dg/automatic-model-tuning-how-it-works.html

Para o cenário apresentado, podem haver casos em que tenhamos uma probabilidade de classificação baixa, tornando necessário uma validação de um médico especialista.

A validação humana é um caso comum para workloads de machine learning em que o modelo tenha uma resposta com probabilidade abaixo de um determinado threshold. Para solucionar esse problema a AWS dispõe do serviço Augmented IA, que será o assunto da parte 2 desse blogpost.

 

 


Sobre o autor

Thiago Couto é arquiteto de soluções na AWS e atua no segmento Enterprise auxiliando clientes de Retail e CPG em suas jornadas para nuvem. Possui mais de 10 anos de experiência atuando em arquiteturas que englobam AI/ML, integrações, IoT e correlatos.