Biblioteca MLOps para avaliação de suficiência de treinamento de modelos de detecção de objetos
Project description
mlops_sufficiency
Biblioteca Python para avaliação de suficiência de treinamento de modelos de IA
Desenvolvida para o projeto de mestrado em MLOps aplicado à detecção de resíduos urbanos.
Autor: Yago de Jesus Martins
Visão Geral
mlops_sufficiency responde à pergunta central do projeto de mestrado:
"O modelo de detecção de objetos já está treinado o suficiente?"
A biblioteca avalia continuamente as métricas de inferência do modelo e decide, com base em critérios configuráveis, se o modelo está pronto para produção, se precisa de mais treinamento ou se está degradando em ambiente real.
Módulos
| Módulo | Responsabilidade |
|---|---|
InferenceMetricsCollector |
Coleta e agrega métricas de cada frame inferido |
DataDriftDetector |
Detecta deriva de dados comparando janelas temporais com o baseline |
TrainingSufficiencyEvaluator |
Decide o status de suficiência com score e critérios detalhados |
SufficiencyReport |
Gera relatórios em texto e JSON para logs, CI/CD e orientadores |
VideoAPIClient |
Integração com a API de vídeos do sistema (/movies/import) |
Instalação
# Clonando o repositório
git clone <repo>
cd mlops_sufficiency
pip install -e .
# Sem dependências externas — funciona com Python 3.9+ puro
Uso Básico
from mlops_sufficiency import (
TrainingSufficiencyEvaluator,
InferenceMetricsCollector,
SufficiencyReport,
)
from mlops_sufficiency.metrics import DetectionResult
# 1. Colete métricas de inferência
collector = InferenceMetricsCollector(window_size=100)
# Para cada frame processado pelo modelo YOLO:
collector.add(DetectionResult(
frame_id="frame_000001",
video_id="550e8400-e29b-41d4-a716-446655440000", # UUID da API
confidence_scores=[0.91, 0.78, 0.85],
true_positives=3,
false_positives=0,
false_negatives=1,
inference_time_ms=145.2,
))
# 2. Avalie suficiência
evaluator = TrainingSufficiencyEvaluator()
result = evaluator.evaluate(collector)
# 3. Gere o relatório
report = SufficiencyReport(result, model_name="yolov8-residuos-v1.2")
report.print()
print(result.is_sufficient()) # True / False
print(result.needs_retraining()) # True / False
print(result.score) # 0.0 – 1.0
Detecção de Deriva (Data Drift)
from mlops_sufficiency import DataDriftDetector
detector = DataDriftDetector(
confidence_drop_threshold=0.05, # queda de 5% na confiança
f1_drop_threshold=0.05,
fp_rate_increase_threshold=0.05,
)
# Define o baseline após o treinamento inicial
detector.set_baseline_from_collector(collector_inicial)
# Em produção, avalia periodicamente
drift_report = detector.evaluate(collector_producao)
print(drift_report.severity) # none / low / medium / high
print(drift_report.is_retraining_needed()) # True / False
print(drift_report.recommendation)
Integração com a API de Vídeos
from mlops_sufficiency import VideoAPIClient
client = VideoAPIClient(
base_url="http://localhost:3000",
token="SEU_JWT_TOKEN",
)
# Lista vídeos processados
videos = client.list_processed_videos()
# Estatísticas do pipeline
stats = client.pipeline_stats()
print(stats) # {"Enviado": 10, "Processado": 47, "Erro ao processar": 2, "total": 59}
Critérios de Suficiência (configuráveis)
from mlops_sufficiency.evaluator import SufficiencyThresholds
thresholds = SufficiencyThresholds(
min_mean_confidence=0.70, # confiança mínima média
min_mean_precision=0.75, # precisão mínima
min_mean_recall=0.70, # recall mínimo
min_mean_f1=0.72, # F1 mínimo
max_false_positive_rate=0.15, # máximo de FP
max_false_negative_rate=0.20, # máximo de FN
max_inference_time_ms=500.0, # latência máxima (ms)
max_confidence_std=0.12, # volatilidade máxima
min_samples=200, # amostras mínimas para avaliar
)
Executar Testes
python -m pytest tests/ -v
Status de Saída
| Status | Significado |
|---|---|
sufficient |
Modelo pronto. Pode ir para produção. |
needs_more_data |
Menos de min_samples amostras coletadas. |
needs_retraining |
Métricas abaixo dos limiares. Re-treinar. |
degraded |
Em produção, mas com deriva severa. Re-treinar urgente. |
Integração com o Pipeline MLOps
Vídeo ──► /movies/import ──► YOLO inference ──► InferenceMetricsCollector
│
TrainingSufficiencyEvaluator
│
┌─────────────────────┴──────────────────┐
│ │
sufficient needs_retraining
│ │
Deploy produção Trigger re-train pipeline
Estrutura do Projeto
mlops_sufficiency/
├── mlops_sufficiency/
│ ├── __init__.py
│ ├── metrics.py # InferenceMetricsCollector, DetectionResult
│ ├── drift.py # DataDriftDetector, DriftReport
│ ├── evaluator.py # TrainingSufficiencyEvaluator, SufficiencyResult
│ ├── report.py # SufficiencyReport
│ └── api_client.py # VideoAPIClient
├── tests/
│ └── test_mlops_sufficiency.py
├── example_uso_completo.py
├── setup.py
└── README.md
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mlops_sufficiency-0.1.1.tar.gz.
File metadata
- Download URL: mlops_sufficiency-0.1.1.tar.gz
- Upload date:
- Size: 4.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
089e51f91b47ac969b64264b39d9a4a1d112df63efeadb1a923fdbd9dc94ccbc
|
|
| MD5 |
f11f9c872f7b6419dca8f1405a3bdf5c
|
|
| BLAKE2b-256 |
cf46d883b36f2135e9e6fb91e01179b74e611dbc50569a945e06eddaf3a969d1
|
File details
Details for the file mlops_sufficiency-0.1.1-py3-none-any.whl.
File metadata
- Download URL: mlops_sufficiency-0.1.1-py3-none-any.whl
- Upload date:
- Size: 3.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
178bf8eb8bbd3934763f0ad59cfbe52f52335f047f5b73abcede6f720d31a568
|
|
| MD5 |
2122c4290557078a6720fc2e4aa34e48
|
|
| BLAKE2b-256 |
ce7dcffdf09dad5c483412616a747e8b94b87787b2d6209fb01416d7094ea02e
|