Enem Flow — tipos de layout de questões do ENEM
Rede neural convolucional que recebe a imagem de uma questão do ENEM e devolve um JSON com o tipo de layout de impressão, segundo o catálogo layout-types-v2: como os blocos do enunciado se sucedem (texto, crédito, figura, tabela), como as alternativas estão dispostas e se há marcas como texto compartilhado, linhas numeradas ou blocos lado a lado.
Faz parte do Enem Flow, plataforma aberta de estudos para o ENEM, onde o tipo de layout orienta a apresentação de cada questão com a mesma diagramação do caderno.
Autores: Cassio Lima Silva e Diogo Vieira de Castro
Código, dados de treino e protocolo: https://github.com/LemonCandles/enem-flow
Versão: 1.0.0 · catálogo layout-types-v2 · licença MIT
Aviso. No teste, esta rede acerta o tipo exato em 71,4% das questões, abaixo do adaptador que lê o PDF original (93,5%) e da regra sobre o JSON de conteúdo (87,3%). Se você tem o PDF ou o JSON estruturado da questão, prefira esses métodos, que estão no repositório do projeto. Esta rede serve quando só há a imagem da questão, e a saída
needs_reviewindica quando conferir.
Uso
pip install -U huggingface_hub
hf download diogovc/enem-layout-types --local-dir enem-layout-types && cd enem-layout-types
pip install -r requirements.txt
python -m enem_layout.predict exemplos/enem-2024-dia2-azul-q093.png --model .
# Dentro da pasta baixada: o catálogo (layout-types.json) preenche descrição, in_catalog e needs_review.
from PIL import Image
from enem_layout import EnemLayoutClassifier, predict_images
from enem_layout.predict import load_catalog
model = EnemLayoutClassifier.from_pretrained(".")
print(predict_images(model, [Image.open("questao.png")], load_catalog(".")))
A imagem deve conter uma questão inteira (do título "QUESTÃO n" até a última alternativa), sem o resto da página. O modelo foi treinado com recortes renderizados do PDF a 150 dpi.
Saída
| Campo | Significado |
|---|---|
type |
Identificador do tipo, por exemplo texto-figura+credito-texto.alt-texto; null quando o corpo é outro. |
axes |
Rótulo de cada eixo: corpo, alternativas, marcas. |
probabilities |
Probabilidades calibradas por eixo (marcas são independentes). |
confidence |
Produto das probabilidades escolhidas. |
needs_review |
Verdadeiro abaixo de 0,905 de confiança, fora do catálogo ou com corpo outro. |
in_catalog, representable |
Se o tipo existe no catálogo e se o contrato de conteúdo do Enem Flow já o representa. |
Desempenho
Teste: 370 questões revisadas das provas de 2024 e 2025, nenhuma vista no treino. O treino usa o acervo de 2009 a 2023.
| Método | Acurácia do tipo exato | IC 95% |
|---|---|---|
| Esta rede (imagem) | 71,4% | 67,0–75,7% |
| Adaptador do PDF | 93,5% | 91,1–95,9% |
| Maioria (tipo mais comum do treino) | 44,9% | 39,7–49,7% |
| Regra sobre o JSON | 87,3% | 84,1–90,5% |
Média de três seeds no teste: 68,8% (desvio 4,6 p.p.). A seed publicada foi escolhida pelo desenvolvimento, sem olhar o teste.
O adaptador lê o PDF original (texto, vetores e imagem) e foi a fonte dos rótulos automáticos; ele é uma referência, não um concorrente justo. A regra sobre o JSON exige o conteúdo já estruturado.
| Eixo | Macro-F1 (teste) | Acurácia (teste) | Macro-F1 (desenvolvimento) |
|---|---|---|---|
| corpo | 0,270 | 73,8% | 0,257 |
| alternativas | 0,848 | 98,1% | 0,604 |
| marcas | 0,247 | 97,6% | 0,496 |
Calibração (ECE) no teste: 0,068. Com o limiar de revisão, o modelo aceita 16,2% das questões de teste, com 98,3% de acerto nelas.
Por fatia do teste:
| Fatia | Questões | Acurácia do tipo |
|---|---|---|
| ano:2024 | 185 | 68,6% |
| ano:2025 | 185 | 74,1% |
| conteudo:estruturado | 362 | 71,5% |
| conteudo:imagem-unica | 8 | 62,5% |
| rotulo:automatic-reviewed | 336 | 74,7% |
| rotulo:manual | 34 | 38,2% |
Por tipo no teste (suporte = questões do tipo):
| Tipo | Precisão | Revocação | F1 | Suporte |
|---|---|---|---|---|
texto-credito-texto.alt-texto |
0,912 | 0,880 | 0,896 | 166 |
texto.alt-texto |
0,740 | 0,864 | 0,797 | 66 |
texto-figura-texto.alt-texto |
0,543 | 0,610 | 0,575 | 41 |
texto-figura+credito-texto.alt-texto |
0,391 | 0,310 | 0,346 | 29 |
figura+credito-texto.alt-texto |
0,737 | 0,778 | 0,757 | 18 |
texto-tabela-texto.alt-texto |
0,667 | 0,750 | 0,706 | 8 |
texto-figura-texto-credito-texto.alt-texto |
0,000 | 0,000 | 0,000 | 6 |
texto-credito-texto.alt-texto.compartilhado.linhas-numeradas |
0,000 | 0,000 | 0,000 | 5 |
texto-credito-texto-figura+credito-texto.alt-texto |
0,000 | 0,000 | 0,000 | 4 |
texto-figura-texto.alt-grade |
1,000 | 0,500 | 0,667 | 4 |
texto-figura+credito-texto.alt-figura |
0,000 | 0,000 | 0,000 | 3 |
texto-figura-texto.alt-figura |
0,200 | 0,333 | 0,250 | 3 |
texto.alt-figura |
0,429 | 1,000 | 0,600 | 3 |
texto-credito-texto-figura-texto-credito-texto.alt-texto |
0,000 | 0,000 | 0,000 | 2 |
texto-figura+credito-texto-credito-texto.alt-texto |
0,000 | 0,000 | 0,000 | 2 |
texto-figura-texto-tabela-credito-texto.alt-texto |
0,000 | 0,000 | 0,000 | 2 |
texto-credito-texto.alt-texto.lado-a-lado |
0,000 | 0,000 | 0,000 | 1 |
texto-credito-texto.alt-texto.linhas-numeradas |
0,000 | 0,000 | 0,000 | 1 |
texto-figura-credito-texto.alt-texto.lado-a-lado |
0,000 | 0,000 | 0,000 | 1 |
texto-figura-texto-tabela-texto.alt-texto |
0,000 | 0,000 | 0,000 | 1 |
texto-tabela-credito-texto.alt-texto |
0,000 | 0,000 | 0,000 | 1 |
texto-tabela-figura-texto.alt-texto.lado-a-lado |
0,000 | 0,000 | 0,000 | 1 |
texto-tabela-texto.alt-grade |
0,000 | 0,000 | 0,000 | 1 |
texto.alt-grade |
1,000 | 1,000 | 1,000 | 1 |
Dados de treino
- Treino e desenvolvimento: 2855 e 503 questões de provas impressas do acervo oficial do Inep (2009–2023), com rótulo fraco automático: o adaptador de layout do Enem Flow lê o PDF original e só rotula as questões em que os canais vetorial e raster concordam e nenhuma invariante falha. As demais ficam fora do treino.
- Teste: 370 questões impressas únicas de seis cadernos de 2024 e 2025, com rótulos revisados, incluindo decisões manuais justificadas.
- Sem vazamento: questões agrupadas por identidade do conteúdo, texto repetido e texto de apoio compartilhado; questões do acervo que reaparecem no teste ficam fora do treino.
- Partições e rótulos: manifesto
layout-types-archive-v1(hashes de fonte, conteúdo e imagem) no repositório do projeto. As imagens não são redistribuídas; são geradas dos PDFs oficiais.
Arquitetura e treino
CNN de cerca de 10 milhões de parâmetros treinada do zero (sem pesos pré-treinados de terceiros), entrada em tons de cinza de 384×1024 com a proporção preservada, grade de posições verticais que preserva a ordem dos blocos, três cabeças (corpo e alternativas com softmax; marcas multirrótulo), perda ponderada por classe (peso das marcas limitado), aumentos leves sem espelhamento, precisão simples (fp32) e escolha da época e da seed pela acurácia do tipo exato no desenvolvimento. Temperatura, limiar das marcas e limiar de revisão calibrados no desenvolvimento.
Houve três rodadas de ajuste antes do treino final. A primeira mediu o teste; nas seguintes, que mudaram o peso e o limiar das marcas, o número de épocas, o critério de escolha e a resolução (512 px não ajudou), só o desenvolvimento foi usado.
Tipos do catálogo
| Tipo | Descrição | Representável |
|---|---|---|
texto-credito-texto.alt-texto |
Enunciado com texto, crédito e texto; alternativas em texto, uma por linha. | sim |
texto.alt-texto |
Enunciado com texto; alternativas em texto, uma por linha. | sim |
texto-figura-texto.alt-texto |
Enunciado com texto, figura e texto; alternativas em texto, uma por linha. | sim |
figura+credito-texto.alt-texto |
Enunciado com figura com crédito e texto; alternativas em texto, uma por linha. | sim |
texto-figura+credito-texto.alt-texto |
Enunciado com texto, figura com crédito e texto; alternativas em texto, uma por linha. | sim |
texto-tabela-texto.alt-texto |
Enunciado com texto, tabela e texto; alternativas em texto, uma por linha. | sim |
figura-texto.alt-texto |
Enunciado com figura e texto; alternativas em texto, uma por linha. | sim |
texto-figura-texto-credito-texto.alt-texto |
Enunciado com texto, figura, texto, crédito e texto; alternativas em texto, uma por linha. | sim |
figura-texto-credito-texto.alt-texto |
Enunciado com figura, texto, crédito e texto; alternativas em texto, uma por linha. | sim |
texto-figura-texto.alt-texto.lado-a-lado |
Enunciado com texto, figura e texto; alternativas em texto, uma por linha. Blocos impressos lado a lado. | não |
texto.alt-figura |
Enunciado com texto; alternativas em figura, uma abaixo da outra. | sim |
texto-tabela-credito-texto.alt-texto |
Enunciado com texto, tabela, crédito e texto; alternativas em texto, uma por linha. | sim |
texto-figura+credito-texto-credito-texto.alt-texto |
Enunciado com texto, figura com crédito, texto, crédito e texto; alternativas em texto, uma por linha. | sim |
texto-figura-texto.alt-grade |
Enunciado com texto, figura e texto; alternativas em figura, dispostas em colunas. | sim |
texto-figura-texto.alt-figura |
Enunciado com texto, figura e texto; alternativas em figura, uma abaixo da outra. | sim |
texto-credito-texto-figura+credito-texto.alt-texto |
Enunciado com texto, crédito, texto, figura com crédito e texto; alternativas em texto, uma por linha. | sim |
texto.alt-grade |
Enunciado com texto; alternativas em figura, dispostas em colunas. | sim |
texto-credito-texto.alt-texto.compartilhado.linhas-numeradas |
Enunciado com texto, crédito e texto; alternativas em texto, uma por linha. Texto de apoio compartilhado com outras questões. Texto com as linhas numeradas. | não |
texto-figura+credito-texto.alt-figura |
Enunciado com texto, figura com crédito e texto; alternativas em figura, uma abaixo da outra. | sim |
texto-figura-texto-tabela-texto.alt-texto |
Enunciado com texto, figura, texto, tabela e texto; alternativas em texto, uma por linha. | sim |
texto-credito-texto-figura-texto-credito-texto.alt-texto |
Enunciado com texto, crédito, texto, figura, texto, crédito e texto; alternativas em texto, uma por linha. | sim |
texto-figura-credito-texto.alt-texto.lado-a-lado |
Enunciado com texto, figura, crédito e texto; alternativas em texto, uma por linha. Blocos impressos lado a lado. | não |
texto-figura-texto-tabela-credito-texto.alt-texto |
Enunciado com texto, figura, texto, tabela, crédito e texto; alternativas em texto, uma por linha. | sim |
texto-credito-texto.alt-texto.lado-a-lado |
Enunciado com texto, crédito e texto; alternativas em texto, uma por linha. Blocos impressos lado a lado. | não |
texto-credito-texto.alt-texto.linhas-numeradas |
Enunciado com texto, crédito e texto; alternativas em texto, uma por linha. Texto com as linhas numeradas. | não |
texto-tabela-figura-texto.alt-texto.lado-a-lado |
Enunciado com texto, tabela, figura e texto; alternativas em texto, uma por linha. Blocos impressos lado a lado. | não |
texto-tabela-texto.alt-grade |
Enunciado com texto, tabela e texto; alternativas em figura, dispostas em colunas. | sim |
Corpos com menos de 10 exemplos no treino saem como outro; o vocabulário do modelo está em config.json.
Exemplos
Questões reais do Inep, de autoria do próprio Inep (sem textos ou imagens de terceiros), em exemplos/; origem e SHA-256 de cada caderno em exemplos/fontes.json.
| Imagem | Questão | Tipo revisado | Previsão desta rede | Confiança | Revisar |
|---|---|---|---|---|---|
enem-2024-dia2-azul-q093.png |
enem-2024-dia2-azul, questão 93 | texto.alt-texto |
texto.alt-texto ✓ |
0,965 | não |
enem-2024-dia2-azul-q096.png |
enem-2024-dia2-azul, questão 96 | texto-figura-texto.alt-texto |
texto-figura-texto.alt-texto ✓ |
0,994 | não |
enem-2024-dia2-azul-q139.png |
enem-2024-dia2-azul, questão 139 | texto-tabela-texto.alt-texto |
texto-figura-texto.alt-texto ✗ |
0,440 | sim |
enem-2024-dia2-azul-q161.png |
enem-2024-dia2-azul, questão 161 | texto-figura-texto.alt-grade |
texto-figura-texto.alt-grade ✓ |
0,253 | sim |
enem-2024-dia2-azul-q131.png |
enem-2024-dia2-azul, questão 131 | texto-figura-texto.alt-figura |
null (corpo outro) ✗ |
0,420 | sim |
enem-2025-regular-dia2-caderno-7-azul-q108.png |
enem-2025-regular-dia2-caderno-7-azul, questão 108 | texto.alt-figura |
texto.alt-figura ✓ |
0,637 | sim |
enem-2024-dia2-azul-q150.png |
enem-2024-dia2-azul, questão 150 | texto-figura-texto-tabela-texto.alt-texto |
texto-figura-texto.alt-texto ✗ |
0,266 | sim |
A rede acerta 4 de 7 exemplos; os exemplos cobrem tipos variados, inclusive raros, e não representam a distribuição do teste.
Uso pretendido e limites
- Uso pretendido: organizar e apresentar questões do ENEM com a diagramação do caderno, e triagem de provas novas na ingestão. Não avalia conteúdo pedagógico nem corrige respostas.
- Treinado só em provas impressas (regular, reaplicação e segunda aplicação) a partir de 2009; provas anteriores, digitais e formatos acessíveis estão fora.
- Os rótulos de treino são automáticos e podem repetir erros do adaptador; o teste revisado mede isso.
- Tipos raros e marcas têm pouco suporte; use
needs_reviewe as probabilidades. - A imagem precisa ser o recorte de uma questão; páginas inteiras ou fotos de celular não foram avaliadas.
Licença e fontes
Código e pesos sob a licença MIT (LICENSE). As provas são publicações do Inep; as imagens de exemplo são questões de autoria do Inep e trazem a fonte. O treino usou os cadernos oficiais listados no manifesto do projeto, vinculados por URL e SHA-256.
Citação
@software{enem_flow_layout_types,
author = {Cassio Lima Silva and Diogo Vieira de Castro},
title = {Enem Flow: tipos de layout de questões do ENEM},
year = {2026},
version = {1.0.0},
url = {https://huggingface.co/diogovc/enem-layout-types},
note = {Código: https://github.com/LemonCandles/enem-flow}
}
- Downloads last month
- -
Evaluation results
- Acurácia do tipo exato on Questões revisadas do ENEM 2024 e 2025self-reported0.714
- Macro-F1 (corpo) on Questões revisadas do ENEM 2024 e 2025self-reported0.270
- Macro-F1 (alternativas) on Questões revisadas do ENEM 2024 e 2025self-reported0.848
- Macro-F1 (marcas) on Questões revisadas do ENEM 2024 e 2025self-reported0.247