Usando IA para Análise de Imagens de Raio-X: Um Estudo de Caso com Streamlit e Google GenAI
Introdução
A inteligência artificial (IA) tem transformado diversas áreas, e a medicina é uma das que mais tem se beneficiado dessas inovações. Uma aplicação prática dessa tecnologia é a análise de imagens médicas, como as radiografias. A precisão na interpretação dessas imagens é crucial para um diagnóstico adequado e para a escolha do tratamento correto. Neste post, apresento uma solução que utiliza a IA para analisar imagens de raio-X, fornecendo diagnósticos e recomendações de tratamento. A solução é baseada em um código que combina Streamlit, PIL e o modelo Gemini da Google GenAI.
Aplicação
Hospitais e clínicas frequentemente enfrentam desafios na análise de radiografias devido à escassez de radiologistas especializados e à necessidade de diagnósticos rápidos e precisos. A demanda por análises de imagem aumenta continuamente, enquanto o número de profissionais qualificados não acompanha o ritmo. Além disso, a qualidade e a precisão das análises podem variar dependendo da experiência do radiologista e das condições da imagem.
A introdução de um sistema automatizado para análise de imagens de raio-X pode ser um divisor de águas. Este sistema pode não só melhorar a eficiência e a precisão dos diagnósticos, mas também aliviar a carga de trabalho dos profissionais de saúde, permitindo-lhes focar em casos mais complexos e no atendimento ao paciente.
Código
A solução proposta utiliza o modelo Gemini da Google GenAI para realizar análises de imagens de raio-X. A interface do usuário é construída com Streamlit, o que facilita o upload das imagens e a interação com o sistema. Abaixo, detalho como o código foi estruturado para implementar essa solução.
Para começar carregamos as bibliotecas necessárias: PIL para manipulação de imagens, Streamlit para a interface web, Google GenAI para o modelo de IA, e dotenv para gerenciar variáveis de ambiente. Como estamos usando uma api_key do gemini, você devera acessar o link https://ai.google.dev/gemini-api?hl=pt-br para criar a sua chave.
from PIL import Image
import streamlit as st
import google.generativeai as genai
from dotenv import load_dotenv
import os
# Carregar variáveis de ambiente do arquivo .env
load_dotenv()
Logo depois definimos as configurações do modelo, incluindo o nome, parâmetros de geração e o prompt que orienta o comportamento do modelo. As configurações de segurança garantem que o conteúdo gerado seja apropriado.
# Configurações do Modelo e Prompt
MODEL_NAME = 'gemini-1.5-pro-latest'
GENERATION_CONFIG = {
"temperature": 0,
"top_p": 0.95,
"top_k": 64,
"max_output_tokens": 8192,
"response_mime_type": "text/plain",
}
MODEL_NAME: Especifica o modelo de IA que será usado para gerar respostas. No caso,
gemini-1.5-pro-latest
é a versão mais recente do modelo Gemini da Google GenAI, que é especializado em gerar respostas de alta qualidade com base em prompts detalhados.GENERATION_CONFIG: Define como o modelo deve gerar as respostas:
temperature: Controla a aleatoriedade da resposta. Um valor de
0
significa que o modelo será mais determinístico e menos criativo, o que é ideal para tarefas que requerem precisão e consistência, como análises médicas.top_p: Também conhecido como "nucleus sampling", define a probabilidade acumulada para a seleção dos tokens mais prováveis. Um valor de
0.95
significa que o modelo considera o 95% mais provável dos tokens para gerar a resposta.top_k: Define o número máximo de tokens a serem considerados na geração da resposta. Um valor de
64
limita a escolha a 64 tokens mais prováveis, ajudando a balancear a criatividade e a precisão.max_output_tokens: Define o número máximo de tokens na resposta gerada. Um valor de
8192
permite respostas bastante extensas, adequadas para análises detalhadas e recomendações completas.response_mime_type: Especifica o tipo de conteúdo da resposta.
text/plain
garante que a resposta será em formato de texto simples.
SYSTEM_PROMPT = """
Você é um radiologista altamente qualificado, especializado na análise de imagens de raios-X.
Objetivo: Fornecer uma análise detalhada e recomendação de tratamento baseada na interpretação das imagens de raio-X.
Responsabilidades:
Análise detalhada: Analise minuciosamente cada imagem radiográfica, concentrando-se na identificação de fraturas ou quaisquer achados anormais.
Relatar as descobertas: Documente todas as suas descobertas. Articule claramente essas descobertas em um formato estruturado.
Recomendar tratamento: Com base na sua análise, sugira os próximos passos a seguir. Se houver fraturas ou quaisquer achados anormais, recomende o tratamento mais conhecido.
Escopo de Resposta:
Responda apenas se a imagem for uma imagem de raio-X.
Se a qualidade da imagem estiver impedindo a análise, mencione isso ao usuário.
Se a imagem não for uma imagem de raio-X ou se estiver fora do escopo das fraturas ósseas, informe que a análise não é possível.
"""
SYSTEM_PROMPT: É o texto que define como o modelo deve se comportar e qual é o escopo de sua análise. Neste caso, o modelo é instruído a agir como um radiologista altamente qualificado:
Objetivo: O modelo deve fornecer uma análise detalhada e recomendações de tratamento com base na interpretação das imagens de raio-X.
Responsabilidades: Inclui a análise minuciosa das imagens, documentação das descobertas e recomendação de tratamento apropriado.
Escopo de Resposta: Define as limitações do modelo, como responder apenas se a imagem for uma raio-X e notificar se a qualidade da imagem for inadequada para análise.
SAFETY_SETTINGS = [
{
"category": "HARM_CATEGORY_HARASSMENT",
"threshold": "BLOCK_MEDIUM_AND_ABOVE",
},
{
"category": "HARM_CATEGORY_HATE_SPEECH",
"threshold": "BLOCK_MEDIUM_AND_ABOVE",
},
{
"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
"threshold": "BLOCK_MEDIUM_AND_ABOVE",
},
{
"category": "HARM_CATEGORY_DANGEROUS_CONTENT",
"threshold": "BLOCK_MEDIUM_AND_ABOVE",
},
]
SAFETY_SETTINGS: Define as categorias de segurança e os níveis de bloqueio para garantir que o conteúdo gerado pelo modelo seja apropriado e seguro:
HARM_CATEGORY_HARASSMENT: Bloqueia conteúdos que possam ser considerados assédio.
HARM_CATEGORY_HATE_SPEECH: Bloqueia discursos de ódio.
HARM_CATEGORY_SEXUALLY_EXPLICIT: Bloqueia conteúdos sexualmente explícitos.
HARM_CATEGORY_DANGEROUS_CONTENT: Bloqueia conteúdos perigosos que possam representar risco.
Essas configurações asseguram que o conteúdo gerado pelo modelo seja seguro e apropriado, bloqueando qualquer conteúdo que possa ser considerado assédio, discurso de ódio, sexualmente explícito ou perigoso.
A seguir criamos a função criar_modelo
cria e configura o modelo generativo. A função validar_imagem
verifica se a imagem carregada está em um formato suportado (JPEG, JPG ou PNG).
def criar_modelo():
"""Cria uma instância do modelo com as configurações fornecidas."""
return genai.GenerativeModel(
model_name=MODEL_NAME,
safety_settings=SAFETY_SETTINGS,
generation_config=GENERATION_CONFIG,
system_instruction=SYSTEM_PROMPT
)
def validar_imagem(image):
"""Valida se a imagem carregada é uma imagem de raio-X."""
if image.format in ["JPEG", "JPG", "PNG"]:
return True
return False
E por fim na função main
, configuramos a API key para o Google GenAI e criamos o modelo. A interface do Streamlit permite o upload de uma imagem de raio-X. Se uma imagem é carregada, validamos o formato e exibimos a imagem na interface. O modelo analisa a imagem e fornece um diagnóstico, que é exibido ao usuário.
def main():
genai.configure(api_key=API_KEY)
modelo = criar_modelo()
st.title('GenAI para Diagnóstico de Imagens de Raio-X')
st.write("Carregue uma imagem de raio-X para análise. O sistema fornecerá uma análise detalhada e recomendações de tratamento.")
uploaded_file = st.file_uploader('Carregue uma imagem de raio-X:', type=['png', 'jpg', 'jpeg'])
if uploaded_file:
try:
image_data = Image.open(uploaded_file)
if not validar_imagem(image_data):
st.error("O arquivo carregado não parece ser uma imagem de raio-X válida.")
return
col1, col2 = st.columns(2)
with col1:
st.image(image_data, caption='Imagem Carregada', use_column_width=True)
with col2:
with st.spinner('Analisando imagem...'):
content = ["Analise esta imagem.", image_data]
resposta_modelo = modelo.start_chat().send_message(content)
st.success('Análise Concluída!')
st.write('Resultado da Análise:')
st.write(resposta_modelo.text)
except Exception as e:
st.error(f'Ocorreu um erro ao processar a imagem: {e}')
else:
st.info('Por favor, carregue uma imagem para análise.')
if __name__ == '__main__':
main()
Abaixo, você encontrará uma imagem que foi processada em nosso ambiente de análise de imagens médicas. No caso, a imagem, que é um exemplo de radiografia, foi submetida a uma análise detalhada por meio do modelo de IA Generativo (Gemini), desenvolvido para interpretar imagens de raio-X com alta precisão. A interface do usuário é intuitiva e permite o carregamento fácil de imagens, enquanto a análise é realizada em tempo real para fornecer diagnósticos e recomendações de tratamento.
Conclusão
A solução proposta demonstra como a IA pode ser utilizada para melhorar a análise de imagens médicas, fornecendo diagnósticos rápidos e precisos. Utilizando Streamlit, PIL e Google GenAI, criamos uma ferramenta prática que pode ser facilmente utilizada em hospitais e clínicas para auxiliar radiologistas e outros profissionais de saúde.
Experimente o código, adapte-o às suas necessidades e veja como a IA pode transformar sua prática médica! Você pode fazer o clone do projeto através do link https://github.com/FelipeAmaral13/EstudosLLM/tree/main/GenAI-XRay-Analysis
Referencia:
[1]https://gemini.google.com/app