Nota sobre o campo
licenseacima. Ele dizother, e nãomit, de propósito. A licença MIT deste repositório cobre o código. A licença dos pesos não está determinada — verLICENSES.md. Marcar o repositório comomitafirmaria sobre os pesos exatamente o que a auditoria diz que não pode ser afirmado.
Estado de publicação. O pacote está tecnicamente pronto para publicação — equivalência, instalação limpa e testes verificados. A redistribuição dos pesos permanece condicionada à resolução das questões documentadas em
LICENSES.md. Enquanto elas não forem resolvidas, os pesos não devem ser descritos como open source, licenciados sob MIT, redistribuíveis ou de uso comercial, e a publicação não está juridicamente autorizada por este documento — que não é parecer jurídico.
AIDA — AI Detector Analysis (P0)
Detector de imagens geradas por IA. Funde três sensores independentes sobre o pixel — sem olhar metadados, sem marca d'água — e devolve uma probabilidade calibrada e uma classe.
Este repositório não distribui os pesos do modelo. Ele publica código, metodologia, arquitetura, métricas e limitações. Os pesos acompanham o Space
AIDAON/aida-api, que hospeda a API e faz as inferências de produção — sob licença em revisão. Ver AIDA Core P0, abaixo.
Leia isto antes de usar. O AIDA erra entre 9% e 47% das fotografias reais, dependendo do tipo de fotografia. Isso não é ruído de medição: é a principal limitação conhecida do modelo, está medida em 5.307 imagens e está documentada em detalhe no
MODEL_CARD.md. Um resultado do AIDA não é prova de que uma imagem seja gerada por IA.
Quick Start
Este repositório não executa inferência sozinho: ele não contém os pesos.
O que você consegue fazer aqui:
git clone <este-repositorio> aida-p0 && cd aida-p0
python -m venv .venv
.venv/bin/pip install -r requirements.txt --extra-index-url https://download.pytorch.org/whl/cpu
# ler a metodologia, a arquitetura, as métricas e as limitações
# MODEL_CARD.md RELEASE_BENCHMARK.md LICENSES.md
# rodar a suíte que não depende de pesos
.venv/bin/pip install -r requirements-dev.txt
.venv/bin/python -m pytest tests -q
Se você já tem um diretório models/ do AIDA por outra via, aponte para
ele e o código roda sem nenhuma alteração:
AIDA_P0_MODELS=/caminho/para/models .venv/bin/python scripts/predict.py foto.jpg
from aida_p0 import AidaP0
aida = AidaP0(models_dir="/caminho/para/models")
r = aida.analisar("foto.jpg")
print(r.score_ia, r.classe, r.threshold)
Sem esse diretório, o AidaP0 levanta ArtefatoAusente com uma mensagem
explicando exatamente isto — ele não devolve um número inventado.
O backbone CLIP (ViT-B-32-quickgelu) também não acompanha o repositório:
o open_clip o baixa na primeira execução (~350 MB).
Como obter um resultado do AIDA
Pelo serviço do AIDA, que roda o P0 no Space AIDAON/aida-api. O fluxo é:
imagem → frontend → backend/API → P0 → inferência → resultado
Nenhum peso trafega para o navegador nem para quem consome a API.
AIDA Core P0
| Status | Production Champion |
| Backbone visual | ViT-B-32-quickgelu |
| Representação | 512 dimensões |
| Pipeline | Visual Expert + Forensics + Rigid/Real Evidence + Fusion |
| Classificação | REAL / IA |
| Threshold | 0.48158617244389096 |
| Pesos | não incluídos neste repositório — ver abaixo |
Os pesos do modelo P0 não acompanham este repositório. Eles estão
publicados no Space que hospeda a API — AIDAON/aida-api — e é lá que as
inferências de produção acontecem.
Estarem publicados não é autorização de uso e não resolve a pendência
de licença: a situação dos pesos continua LICENSE_UNKNOWN_REVIEW_REQUIRED,
com Q1 e Q2 PENDENTE_DE_DECISAO. Ver LICENSES.md.
Este repositório publica o código, a metodologia, a arquitetura, as métricas e as limitações do detector. Ele não publica os pesos, e por isso não roda inferência sozinho — ver Quick Start.
What the score means
score_ia é uma probabilidade calibrada (Platt) de que a imagem se pareça,
estatisticamente, com as imagens geradas por IA que o modelo viu no treino.
O que ele não é:
- não é a probabilidade de a imagem ser gerada por IA no mundo real — isso dependeria de quantas imagens de IA existem no seu material, que o modelo não sabe;
- não é uma medida de autenticidade.
classe = REALsignifica "não se parece com IA para este modelo", não "imagem verdadeira e não editada"; - não é evidência de fraude, autoria ou intenção.
O release também devolve os três scores dos sensores. Quando eles discordam
muito (desacordo alto), a confiança é menor — a política oficial marca esses
casos como INCONCLUSIVO.
Threshold
0.48158617244389096
Este número saiu do índice de Youden sobre o conjunto de validação do champion anterior e foi deliberadamente congelado na promoção do P0, para que a comparação isolasse mudança de modelo de mudança de ponto de operação.
Ele não é um ótimo, e isso foi auditado. O limiar de MCC máximo é 0,2901 na validação, 0,5202 no External 882 e 0,8626 no External V2 — cada população pede um corte diferente. E mexer nele não resolve: no External 882, o melhor total de erros que qualquer política de limiar alcança é 118 contra os 119 do atual. Por isso ele permanece.
Se você precisa de um ponto de operação diferente, o release devolve score_ia
bruto — aplique o seu próprio corte, medido no seu material, e diga qual é
quando publicar resultados.
Architecture
imagem → normalização (1024 px, JPEG q92, em memória)
├── B2 FORENSE 846 características → RandomForest → Platt
├── B3 CLIP ViT-B-32-quickgelu congelado → cabeça linear → Platt
└── B5 RIGID 5 passes do CLIP com ruído → logística → Platt
└── média dos três → Platt → threshold
Detalhes de cada sensor e da fusão no MODEL_CARD.md.
Performance
Threshold oficial, POSITIVO = IA, FN = IA → REAL é o erro crítico.
| conjunto | n | FPR | FNR | MCC | ROC-AUC |
|---|---|---|---|---|---|
validacao_546 (escolheu o threshold) |
546 | 0,1078 | 0,1500 | 0,7432 | 0,9517 |
teste_546 |
546 | 0,0915 | 0,1375 | 0,7729 | 0,9345 |
teste_externo_882 (o número a citar) |
882 | 0,0972 | 0,1852 | 0,7235 | 0,9154 |
external_v2 (independente) |
900 | 0,4667 | 0,0028 | 0,5567 | 0,9836 |
pool_publico (2.433 fotos reais públicas) |
2.433 | 0,3453 | — | — | — |
TPR em regime de FPR baixo, no teste_externo_882: 0,4947 a 1% de FPR,
0,7328 a 5%, 0,8175 a 10%. A 0,5% de FPR o conjunto não tem resolução
estatística para responder.
Important Limitations
O FPR não é um número. Depende do que você está analisando.
| população | FPR |
|---|---|
acervo próprio (teste_546, teste_externo_882) |
9,2% – 9,7% |
| 2.433 fotografias reais públicas (COCO + ImageNet) | 34,5% |
| lote novo de 900 imagens, 88% do lado REAL é foto de cachorro | 46,7% |
Uma em cada três fotografias reais públicas é classificada como IA. Por domínio,
o FPR vai de 21,4% (coco:predios) a 49,4% (coco:animais) — nenhum
dos nove domínios testados é normal.
A causa foi investigada e medida: é cobertura do treino, não um defeito de ordenação. O ROC-AUC no conjunto mais deslocado é 0,9836, o mais alto de todos — o modelo continua sabendo ordenar; o que ele não sabe é onde cortar.
Outras limitações, todas detalhadas no MODEL_CARD.md:
- falsos positivos e falsos negativos são confiantes, não hesitantes — nenhum ajuste de corte os alcança;
- generalização para geradores fora de OpenAI / Google Gemini / ByteDance não foi avaliada;
- não detecta edição local nem deepfake de rosto;
- não é ferramenta forense e não atesta autenticidade;
- não foi auditado para viés demográfico.
Não use o AIDA como única evidência para acusar alguém de nada.
Reproducibility
Tudo neste pacote é verificável:
pip install -r requirements-dev.txt
pytest tests -q
tests/test_publico.py roda sem pesos e verifica que nenhum peso foi publicado, que a documentação não promete download, que o threshold e os benchmarks oficiais estão corretos e que a licença continua conservadora. tests/test_release.py testa a integridade dos pesos e por isso pula inteira aqui, com razão explícita.
Os testes conferem que o threshold é exatamente 0.48158617244389096, que os
SHA-256 dos dez artefatos e dos 32 módulos batem com o MANIFEST.json, que a
inferência não escreve em models/, que nenhum artefato de challenger foi
incluído e que o pacote roda sem nada do laboratório no PYTHONPATH.
O pipeline foi verificado contra o pipeline oficial de pesquisa em 40 imagens do
teste_externo_882, em processos separados: diferença máxima de exatamente
0,0 nos quatro scores. Ver RELEASE_BENCHMARK.md.
Files
README.md este arquivo
MODEL_CARD.md o documento que importa: escopo, limites, dataset shift
RELEASE_BENCHMARK.md equivalência, latência, ambiente, métricas congeladas
LICENSES.md licenças e a pendência de revisão dos pesos
LICENSE MIT (código)
MANIFEST.json SHA-256 de cada arquivo publicado (`pesos_incluidos: false`)
requirements.txt dependências de inferência
predict.py CLI
aida_p0/ interface do release (importável)
aida/ módulos do laboratório, copiados byte a byte
config/release.json metadados legíveis (o limiar oficial vive em models/)
scripts/predict.py CLI
examples/ exemplo mínimo de uso
tests/ a suíte do release
Citation
Trabalho de conclusão de curso, sem publicação formal e sem DOI. Ver
MODEL_CARD.md para o BibTeX. Não invente um DOI para
este trabalho.
License
Código sob MIT (LICENSE). A situação dos pesos está em
LICENSES.md como LICENSE_UNKNOWN_REVIEW_REQUIRED — leia
antes de redistribuir, e não descreva os pesos como open source,
redistributable ou de uso comercial enquanto a pendência estiver aberta. O backbone CLIP não é redistribuído aqui.