Repositório criado para registrar o conteúdo prático da disciplina de Agentes Inteligentes.
O diretório lung_nodule_agent reúne um agente que combina três detectores de nódulos em radiografias de tórax: YOLOv8, RT-DETR/DETR e Faster R-CNN. Cada adaptador roda a inferência do modelo correspondente, normaliza as saídas e o agente calcula uma fusão para emitir o veredito final.
pip install -r requirements.txtOs arquivos de pesos não precisam ficar dentro do repositório. Informe o caminho completo de cada arquivo .pt ou .pth no momento da execução. Duas abordagens são suportadas:
-
Passar os caminhos na linha de comando. Substitua os exemplos pelos locais onde você guardou seus checkpoints.
python run_agent.py \ --yolo /caminho/para/yolov8.pt \ --detr /caminho/para/detr.pth \ --faster-rcnn /caminho/para/faster_rcnn.pth \ --image /caminho/para/imagem.png
Para processar um diretório completo:
python run_agent.py \ --yolo /caminho/para/yolov8.pt \ --detr /caminho/para/detr.pth \ --faster-rcnn /caminho/para/faster_rcnn.pth \ --dataset /caminho/para/pasta_de_testes \ --output resultados.json \ --log-feedback feedbacks.jsonl \ --feedback-note "Execução em 05/06/2024" -
Criar um script de configuração próprio. Ele centraliza os caminhos dos pesos para que você não precise digitá-los sempre.
from lung_nodule_agent import YOLOv8Adapter, DETRAdapter, FasterRCNNAdapter, LungNoduleDecisionAgent adapters = [ YOLOv8Adapter("/caminho/para/yolov8.pt"), DETRAdapter("/caminho/para/detr.pth"), FasterRCNNAdapter("/caminho/para/faster_rcnn.pth"), ] agent = LungNoduleDecisionAgent(adapters) resultado = agent.predict("/caminho/para/imagem.png") print(resultado.to_dict())
Salve o exemplo como
meu_agente.pye execute compython meu_agente.pydepois de ajustar os caminhos.
O agente pode gerar imagens anotadas para cada modelo e para a fusão. Existem duas formas de habilitar o recurso:
-
Usar o parâmetro
--visualizations-dirna linha de comando. O script cria subpastas chamadasYOLOv8,DETR,Faster R-CNNefusiondentro do diretório informado. Cada imagem recebe as caixas previstas pelo modelo correspondente.python run_agent.py \ --yolo /caminho/para/yolov8.pt \ --detr /caminho/para/detr.pth \ --faster-rcnn /caminho/para/faster_rcnn.pth \ --dataset /caminho/para/pasta_de_testes \ --visualizations-dir saidas_visuais
-
Ativar o diretório no script
meu_agente.py. Ajuste a constanteVISUALIZATIONS_DIRpara apontar para a pasta desejada ou defina comoNonese quiser desativar a exportação.
A flag --log-feedback cria ou atualiza um arquivo JSON Lines (.jsonl) com todas as decisões do agente, incluindo parâmetros e observações opcionais (--feedback-note). Cada linha guarda uma execução e pode ser versionada no GitHub.
Também é possível registrar feedback programaticamente:
from lung_nodule_agent import export_feedback
decisions = agent.evaluate_directory("/caminho/pasta_testes")
export_feedback(
decisions,
"feedbacks.jsonl",
metadata={"note": "Rodada de validação local"},
)--confidence-thresholddefine o limiar mínimo para aceitar uma detecção individual (padrão 0.25).--vote-thresholddefine quantos modelos precisam concordar para emitir "Provável presença de nódulo".--iou-thresholddefine o limite de IoU usado para mesclar detecções (padrão 0.5).
Os resultados ficam disponíveis em JSON (arquivo indicado em --output ou saída padrão) e trazem as detecções de cada modelo e as detecções agregadas.
Algumas versões antigas do TorchVision expõem construtores diferentes. Se você receber mensagens como cannot import name 'detr_resnet50' ou erros envolvendo parâmetros weights ou pretrained, atualize para torchvision 0.13 ou superior. O adaptador tenta instanciar o modelo via TorchVision e, caso não consiga, recorre automaticamente ao torch.hub (facebookresearch/detr). Na primeira execução pode ocorrer um download com cache em ~/.cache/torch/hub.
Checkpoints do Ultralytics RT-DETR também são aceitos. Quando o adaptador identifica esse formato, ele usa o runtime da Ultralytics. Certifique-se de instalar o pacote ultralytics antes de usar pesos RT-DETR.
ℹ️ PyTorch 2.6+ e checkpoints customizados
A versão 2.6 do PyTorch passou a usar
weights_only=Truepor padrão emtorch.load, bloqueando classes externas durante a desserialização. Os adaptadores registram automaticamente as classes necessárias e tentam nova carga em modo seguro. Como último recurso (apenas se você confiar no arquivo) o carregamento altera paraweights_only=Falsepara aceitar checkpoints legados.