Spaces:
Sleeping
Sleeping
Commit History
-
fix: pass ruff lint+format, clean README, remove stray script
Priya Monishafa0ce5b -
fix: production audit β security hardening + observability + code qualityβ
Priya MonishaC-1 api/routes/classify.py: add missing logger (was NameError on unknown class) M-1 src/models/base_classifier.py: remove print() β logger.info already covers epoch progress m-1 src/data/dataset.py: assert -> ValueError for invalid split param SEC config.py + redis_cache.py + api/main.py: Redis password support (REDIS_PASSWORD env) SEC docker-compose.yml: conditional Redis auth (no-op when REDIS_PASSWORD empty) SEC docker-compose.airflow.yml: replace hardcoded airflow:airflow/admin:admin with env vars OBS api/prometheus_metrics.py: add http_errors Counter + models_loaded Gauge OBS api/main.py: middleware counts 4xx/5xx; models_loaded.set(1) on successful startup DOC .env.example: document REDIS_PASSWORD, AIRFLOW_DB_PASSWORD, AIRFLOW_ADMIN_PASSWORD6319415
-
section-7: model comparison, MLflow 5-run logging, MobileNet val-split drift baselineβ
Priya Monisha- model_factory.py: add pretrained=True param to get_model + all _build_* helpers (pretrained=False enables topology-correct CPU benchmarking without weight download) - notebooks/06_model_comparison.py: 9-cell notebook * VGG16 metrics.json reconstructed (null precision/recall/F1/val_accuracy) * CPU benchmark: vgg16=228ms mobilenet=39ms efficientnet=51ms resnet50=115ms yolov8n=154ms * Comparison JSON: schema_version=1.0, champion=resnet50 (65.5%) * MLflow: smartvision_classification (4 runs) + smartvision_detection (1 run), WAL mode SQLite * Drift baseline: val split (not train), get_eval_transforms from augmentor.py, correct+incorrect conditional distributions, 22 .npy score files30e35d2
-
results: Section 5 complete β all 4 CNNs trained, ResNet50 best at 65.5%β
Priya MonishaSection 5 final results: - VGG16: 59.5% (architecture ceiling) - MobileNetV2: 56.7% (backbone lr=1e-5 too conservative) - EfficientNetB0: 58.9% (backbone lr=1e-5 too conservative) - ResNet50: 65.5% test / 63.6% val (data volume bottleneck, 1464 params/img) Pipeline improvements committed alongside results: - dataset.py: create_stratified_split() β random stratified resplit, no sequential bias - loader.py: quality gates 48pxβ80px, 2% area; compute_overlap_ratio; check_person_overlap - model_factory.py: unfreeze_efficientnet_phase2() added - 01_data_acquisition.py: chair person-overlap filter, MAX_ITER 80kβ150k Next: Section 6 YOLOv8 detection training1a28594
-
fix: MobileNetV2 Round 2 overfitting -- Section 5 Round 3 prepβ
Priya Monisha27.4pp train/val gap. Root cause: 552 params/training-img at features[14:] unfreeze on 3,080 samples. Realistic R3 target: 68-74%. metrics.json: stale fast_mode artifact replaced with confirmed Colab Round 2 values (62.3%, 23ep). Realistic accuracy target documented. augmentor.py: RandomGrayscale(p=0.05) + RandomPerspective(scale=0.2,p=0.3) ColorJitter 0.2->0.3, rotation 15->20deg, ZoomOut (1.3)->(1.4) model_factory.py: get_model() dispatcher + _build_* internal functions MobileNet: full classifier replaced (Dropout 0.2->0.4) unfreeze_mobilenet_phase2: features[14:] slice -> enumerate idx>=16 ~1.23M unfrozen (401/img) vs 1.71M (552/img) Round 2 _build_resnet50: freeze ALL then replace fc (unambiguous ownership) Removed from API: freeze_resnet50_phase1, freeze_vgg16_phase1, unfreeze_vgg16_phase2, count_trainable_params notebook: MobileNet block rewritten AdamW replaces Adam; Phase 1 wd 1e-4->1e-3 Phase 2 backbone lr=1e-5 (was 1e-4) -- highest-impact change Phβ¦58027ad
-
section-5: fix all RCAs (BN stats, ZoomOut order, fc unfreeze, grad_clip, checkpoint format)
Priya Monisha4e27aff
-
fix: VGG16 freeze ALL params before replacing classifier[6] β was leaving classifier[0,3] (~118M) trainable; now correct 102K trainable (0.08%)
Priya Monishad5923af -
section-5: CNN training framework β base_classifier, model_factory, 04_train_classifierβ
Priya Monishasrc/models/base_classifier.py: - train_one_epoch(): single epoch, supports GradScaler for mixed precision (EfficientNet) - evaluate(): accuracy, precision, recall, F1 (macro) via sklearn - train(): full loop with early stopping, saves best state_dict (Rule 5) - save_model() / load_model(): state_dict with weights_only=True (Rule 36) - benchmark_inference(): warmup + timed n=100 runs, returns ms/image src/models/model_factory.py: - get_model(name): vgg16, resnet50, mobilenet, efficientnet β 25-class head - VGG16: features frozen, classifier[-1] replaced (4096β25) - ResNet50: fc replaced (2048β25), caller manages 2-phase freeze/unfreeze - MobileNetV2: features frozen, classifier[-1] (1280β25) - EfficientNetB0: features frozen, classifier[-1] (1280β25) - freeze_resnet50_phase1() / unfreeze_resnet50_phase2() helpers - count_trainable_params() notebooks/04_train_classifier.py: - Parameterized: set MODEL = "vgg16"|"resnet50"|"mobilenet"|"efficientnet", run once each - FAST_MODE=False localβ¦fecb3f1 -
section-0+1: project foundation β config.py, requirements, gitignore, project-docsβ
Priya Monisha- .claude/settings.json: permission allowlist + PostToolUse git-commit hook - .claude/rules/: no_model_in_pages, fast_mode, one_model_per_turn - config.py: Pydantic Settings + all 25 CLASSES with COCO ID comments + 38-rule reference - requirements.txt / requirements-docker.txt / requirements-hf.txt (CPU-only PyTorch index-url) - .gitignore: anchored /data/raw/, /models/*.pt, notebooks/*.ipynb, /runs/ - pyrightconfig.json: extraPaths=["."] for Pylance import resolution - All src/ and api/ __init__.py files - project-docs: 38 rules table, progress tracker, locked decisions - CLAUDE_CONTEXT.md: full session bootstrap contextd091717