--- license: bsd-3-clause tags: - fireviewer - convnext - torchvision - fire - smoke - image-classification library_name: pytorch pipeline_tag: image-classification datasets: - fireviewer/fireviewer_fire_smoke_flame_v3_native model-index: - name: FireViewer ConvNeXt-Tiny · Context results: - task: type: image-classification name: Image Classification dataset: type: fireviewer/fireviewer_fire_smoke_flame_v3_native name: FireViewer · validation avec catégorie config: default split: validation revision: 8c8b197fa1c928217529a04bff434fb70a66614e metrics: - type: f1 name: F1 macro (%) value: 76.92 - type: accuracy name: Accuracy (%) value: 87.72 --- ![FireViewer · Classification de contexte](assets/card-header.svg) # ConvNeXt-Tiny · Six catégories de contexte **Classer une image selon le contexte visuel du feu ou de la fumée.** Ce modèle PyTorch produit une catégorie parmi six ; les cibles de classification proviennent des annotations Luna du corpus FireViewer. | Architecture | Entrée | F1 macro validation | Accuracy validation | |:---:|:---:|:---:|:---:| | **ConvNeXt-Tiny** | **920 × 920 · RGB** | **76,92 %** | **87,72 %** | ## Checkpoint disponible | Fichier | Contenu | |---|---| | [**best.pth**](best.pth) | Meilleur checkpoint de validation ; recommandé pour l’inférence. | | [**last.pth**](last.pth) | Dernier checkpoint complet conservé pour une éventuelle reprise. | | [architecture.json](architecture.json) | Architecture Torchvision et provenance de l’initialisation. | | [class_mapping.json](class_mapping.json) | Correspondance exacte des six indices de sortie. | ## Catégories prédites | ID | Catégorie | Sens de l’annotation | |---:|---|---| | 0 | `human_useful_fire` | Usage humain contrôlé : feu de camp, barbecue, activité agricole ou industrielle. | | 1 | `domestic_origin` | Foyer, poêle, cuisson ou contexte domestique identifiable. | | 2 | `suspect_origin` | Origine ou détails insuffisants ; feu ou fumée potentiellement dangereux. | | 3 | `fire_road_urban` | Véhicules, routes ou incident en milieu bâti. | | 4 | `forest_natural_area_wildfire` | Feu apparent de végétation non maîtrisé en zone naturelle. | | 5 | `negative` | Ni feu ni fumée visibles selon l’annotation de contexte. | Ces catégories décrivent le contexte apparent d’une image. **Elles ne forment pas une échelle ordinale de gravité.** `suspect_origin` ne signifie pas une origine criminelle établie ; il couvre une origine ou des détails insuffisants avec un feu ou une fumée potentiellement dangereux. ## Résultats sur la validation Évaluation du meilleur checkpoint sur **11 237 images disposant d’une catégorie**, à l’époque 5. La prédiction est la classe au logit maximal parmi les six sorties. | ID | Contexte | Précision | Rappel | F1 | Images | |---:|---|---:|---:|---:|---:| | 0 | Usage contrôlé | 62,39 % | 78,46 % | 69,51 % | 260 | | 1 | Contexte domestique | 47,46 % | 58,33 % | 52,34 % | 48 | | 2 | Origine suspecte / indéterminée | 74,71 % | 75,26 % | 74,98 % | 2292 | | 3 | Route / urbain | 88,35 % | 84,57 % | 86,42 % | 1121 | | 4 | Feu en zone naturelle | 80,20 % | 87,47 % | 83,68 % | 1181 | | 5 | Négatif | 95,76 % | 93,43 % | 94,58 % | 6335 | Le **F1 macro** donne le même poids aux six classes. L’accuracy agrège toutes les images et dépend davantage des classes fréquentes. La classe domestique ne compte que **48 images de validation** : son score est plus sensible à quelques erreurs. ![Évolution de la validation et F1 par classe](assets/validation-curves.png) Ces chiffres évaluent la concordance avec les catégories Luna du split de validation. Ils ne constituent ni une validation indépendante de la dangerosité réelle ni une mesure sur le test réservé. ## Inférence avec PyTorch ```bash pip install torch torchvision pillow huggingface_hub ``` ```python import torch from PIL import Image from torch import nn from torchvision.models import convnext_tiny from torchvision.transforms import functional as TF from huggingface_hub import hf_hub_download path = hf_hub_download( "fireviewer/convnext-tiny-alert-categories-v2", "best.pth", ) checkpoint = torch.load(path, map_location="cpu", weights_only=False) labels = checkpoint["classes"] size = int(checkpoint["image_size"]) model = convnext_tiny(weights=None) model.classifier[2] = nn.Linear(model.classifier[2].in_features, len(labels)) model.load_state_dict(checkpoint["model"]) model.eval() with Image.open("image.jpg") as image: image.draft("RGB", (size, size)) image = image.convert("RGB").resize((size, size), Image.Resampling.BILINEAR) tensor = TF.normalize( TF.to_tensor(image), mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225], ).unsqueeze(0) with torch.inference_mode(): logits = model(tensor) category = labels[int(logits.argmax(dim=1).item())] print(category) ``` Le prétraitement doit rester cohérent avec le run : **RGB, redimensionnement direct en 920 × 920**, interpolation bilinéaire, pixels dans `[0, 1]`, puis normalisation ImageNet. Le modèle n’utilise pas le letterboxing du détecteur YOLO. ## Données et paramètres du run | Paramètre | Valeur | |---|---| | Base | `torchvision.convnext_tiny`, initialisation `IMAGENET1K_V1` | | Tête de classification | Couche linéaire finale à 6 sorties | | Dataset | [fireviewer/fireviewer_fire_smoke_flame_v3_native](https://huggingface.co/datasets/fireviewer/fireviewer_fire_smoke_flame_v3_native) | | Révision des données | `8c8b197fa1c928217529a04bff434fb70a66614e` | | Catégories manquantes | 191 valeurs nulles exclues de la classification | | GPU | NVIDIA L4 | | Résolution | 920 × 920 | | Batch physique / accumulation | 8 / 4, soit un batch effectif de 32 | | Optimiseur | AdamW, LR de référence `0.0003` | | Plan de LR | Warmup de 3 époques puis décroissance cosinus | | Fonction de perte | Entropie croisée pondérée, `label_smoothing=0.05` | | Précision | BF16 | | Sélection du best | F1 macro de validation | | Patience configurée / plafond | 7 validations sans amélioration / 75 époques | | Époques complètes de ce checkpoint | 5 | Les splits du corpus sont conservés. Les images sans catégorie ne sont pas transformées en exemples `negative`. ## Usages et limites Le modèle peut servir à explorer, filtrer ou regrouper des images par contexte visuel. Il classe l’image entière : il ne produit pas de boîtes et n’identifie pas une distance caméra / foyer. Une même image peut contenir plusieurs contextes, alors que le modèle ne renvoie qu’une catégorie. Les scènes ambiguës et les différences entre caméras, éclairages ou environnements peuvent diminuer les performances. Les catégories d’origine sont visuelles et ne déterminent pas avec certitude la cause d’un incendie. ## Licence et traçabilité Licence déclarée : **BSD-3-Clause**. Les conditions des images sont décrites dans la [fiche du dataset](https://huggingface.co/datasets/fireviewer/fireviewer_fire_smoke_flame_v3_native). Les poids évalués proviennent de la révision `12dd4da71da5dd4264c63e07cab5f41c3a007b77` ; cette mise à jour de documentation ne modifie pas les checkpoints. **Projet :** [FireViewer](https://huggingface.co/fireviewer) · **Documentation mise à jour :** 12 novembre 2026.