satvs commited on
Commit
1d78f26
·
1 Parent(s): d476ed4

Preparing submission

Browse files
Dockerfile CHANGED
@@ -11,8 +11,8 @@ WORKDIR /app
11
 
12
  COPY --chown=user ./requirements.txt requirements.txt
13
 
14
- # Needed for dependency errors of opencv
15
- RUN pip install ultralytics
16
  RUN pip install opencv-python-headless
17
 
18
  RUN pip install --no-cache-dir --upgrade -r requirements.txt
 
11
 
12
  COPY --chown=user ./requirements.txt requirements.txt
13
 
14
+ # Needed here instead of requirements.txt, because of dependency errors of opencv
15
+ RUN pip install ultralytics==8.3.69
16
  RUN pip install opencv-python-headless
17
 
18
  RUN pip install --no-cache-dir --upgrade -r requirements.txt
README.md CHANGED
@@ -8,45 +8,39 @@ pinned: false
8
  ---
9
 
10
 
11
- # Random Baseline Model for Climate Disinformation Classification
12
 
13
  ## Model Description
14
 
15
- This is a random baseline model for the Frugal AI Challenge 2024, specifically for the text classification task of identifying climate disinformation. The model serves as a performance floor, randomly assigning labels to text inputs without any learning.
16
 
17
  ### Intended Use
18
 
19
- - **Primary intended uses**: Baseline comparison for climate disinformation classification models
20
  - **Primary intended users**: Researchers and developers participating in the Frugal AI Challenge
21
- - **Out-of-scope use cases**: Not intended for production use or real-world classification tasks
22
 
23
  ## Training Data
24
 
25
- The model uses the QuotaClimat/frugalaichallenge-text-train dataset:
26
- - Size: ~6000 examples
27
- - Split: 80% train, 20% test
28
- - 8 categories of climate disinformation claims
29
 
30
  ### Labels
31
- 0. No relevant claim detected
32
- 1. Global warming is not happening
33
- 2. Not caused by humans
34
- 3. Not bad or beneficial
35
- 4. Solutions harmful/unnecessary
36
- 5. Science is unreliable
37
- 6. Proponents are biased
38
- 7. Fossil fuels are needed
39
 
40
  ## Performance
41
 
42
  ### Metrics
43
- - **Accuracy**: ~12.5% (random chance with 8 classes)
44
  - **Environmental Impact**:
45
  - Emissions tracked in gCO2eq
46
  - Energy consumption tracked in Wh
47
 
48
  ### Model Architecture
49
- The model implements a random choice between the 8 possible labels, serving as the simplest possible baseline.
 
 
50
 
51
  ## Environmental Impact
52
 
@@ -57,15 +51,10 @@ Environmental impact is tracked using CodeCarbon, measuring:
57
  This tracking helps establish a baseline for the environmental impact of model deployment and inference.
58
 
59
  ## Limitations
60
- - Makes completely random predictions
61
- - No learning or pattern recognition
62
- - No consideration of input text
63
- - Serves only as a baseline reference
64
- - Not suitable for any real-world applications
65
 
66
  ## Ethical Considerations
67
 
68
- - Dataset contains sensitive topics related to climate disinformation
69
- - Model makes random predictions and should not be used for actual classification
70
  - Environmental impact is tracked to promote awareness of AI's carbon footprint
71
  ```
 
8
  ---
9
 
10
 
11
+ # Object Detector for forest fire smoke
12
 
13
  ## Model Description
14
 
15
+ This is a frugal object detector use to detect fire smoke, as part of the Frugal AI Challenge 2024. It is based of the yolo model series
16
 
17
  ### Intended Use
18
 
19
+ - **Primary intended uses**: Detect fire smoke on photos of forests, in different natural settings
20
  - **Primary intended users**: Researchers and developers participating in the Frugal AI Challenge
 
21
 
22
  ## Training Data
23
 
24
+ The model uses the pyronear/pyro-sdis dataset:
25
+ - Size: ~33 600 examples
26
+ - Split: 88% train, 12% test
27
+ - Images with smoke or no smoke
28
 
29
  ### Labels
30
+ Smoke
 
 
 
 
 
 
 
31
 
32
  ## Performance
33
 
34
  ### Metrics
35
+ - **Accuracy**: ~ 90%
36
  - **Environmental Impact**:
37
  - Emissions tracked in gCO2eq
38
  - Energy consumption tracked in Wh
39
 
40
  ### Model Architecture
41
+ Based of YOLOv11, see https://arxiv.org/abs/2410.17725, fine tuned on the pyronear dataset. The network is pruned and quantized to be as compressed as possible.
42
+
43
+ Inference should ideally performed on GPU - the speed bump is drastic, it is more energy efficient than CPU inference which takes much longer.
44
 
45
  ## Environmental Impact
46
 
 
51
  This tracking helps establish a baseline for the environmental impact of model deployment and inference.
52
 
53
  ## Limitations
54
+ - Quantization was performed to FP16 - INT8 could compress even more but the accuracy drop was too big. Finding a way to smartly quantize and calibrate to INT8 could be interesting
55
+ - To maximize inference speed even more, the model can be converted to TensorRT - it is note done in this repository, as the same type of GPU needs to be used both for exporting to TensorRT and inferencing with TensorRT
 
 
 
56
 
57
  ## Ethical Considerations
58
 
 
 
59
  - Environmental impact is tracked to promote awareness of AI's carbon footprint
60
  ```
requirements.txt CHANGED
@@ -12,3 +12,6 @@ requests>=2.31.0
12
  librosa==0.10.2.post1
13
  torch==2.5.1
14
  torchvision==0.20.1
 
 
 
 
12
  librosa==0.10.2.post1
13
  torch==2.5.1
14
  torchvision==0.20.1
15
+ onnx==1.17.0
16
+ onnxslim==0.1.48
17
+ onnxruntime==1.20.1
tasks/image.py CHANGED
@@ -97,16 +97,31 @@ async def evaluate_image(request: ImageEvaluationRequest):
97
  # YOUR MODEL INFERENCE CODE HERE
98
  # Update the code below to replace the random baseline with your model inference
99
  #--------------------------------------------------------------------------------------------
 
100
  from pathlib import Path
101
  from ultralytics import YOLO
102
- import torch
 
 
 
103
 
104
  # Load model
105
  model_path = Path("tasks", "models")
106
- # model_name = "best.pt" # nano 20e, unpruned
107
- model_name = "pruned.pt" # nano 20e, 20% pruned
108
- model = YOLO(Path(model_path, model_name))
109
- threshold = 0.14
 
 
 
 
 
 
 
 
 
 
 
110
 
111
  predictions = []
112
  true_labels = []
@@ -120,13 +135,8 @@ async def evaluate_image(request: ImageEvaluationRequest):
120
  true_labels.append(int(has_smoke))
121
 
122
  # Make prediction
123
- device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
124
- results = model.predict(example["image"], device=device, conf=threshold, verbose=False)[0] # index 0 since we predict on one image at a time
125
- if results.boxes.cls.numel()!=0:
126
- # This means a fire was detected, hence we append 1
127
- pred_has_smoke = 1
128
- else:
129
- pred_has_smoke = 0
130
  predictions.append(int(pred_has_smoke))
131
 
132
  # If there's a true box, parse it and add box prediction
 
97
  # YOUR MODEL INFERENCE CODE HERE
98
  # Update the code below to replace the random baseline with your model inference
99
  #--------------------------------------------------------------------------------------------
100
+ # Import strict minimum
101
  from pathlib import Path
102
  from ultralytics import YOLO
103
+ from torch import device
104
+ from torch.cuda import is_available
105
+
106
+ THRESHOLD = 0.18
107
 
108
  # Load model
109
  model_path = Path("tasks", "models")
110
+ # If CUDA is available, load FP16 pytorch
111
+ # if is_available():
112
+ # print("CUDA available, loading FP16 pytorch model")
113
+ model_name = "pruned_fp16.pt"
114
+ model = YOLO(Path(model_path, model_name), task="detect")
115
+ # device = device("cuda")
116
+ device_name = device("cuda" if is_available() else "cpu")
117
+ IMGSIZE = 1280
118
+ # # If not, load FP16 ONNX model
119
+ # else:
120
+ # print("CUDA not, available, loading ONNX model")
121
+ # model_name = "640_fp16_cpu.onnx"
122
+ # model = YOLO(Path(model_path, model_name), task="detect")
123
+ # device = device("cpu")
124
+ # IMGSIZE = 640 # required to make CPU inference a bit fast
125
 
126
  predictions = []
127
  true_labels = []
 
135
  true_labels.append(int(has_smoke))
136
 
137
  # Make prediction
138
+ results = model.predict(example["image"], device=device_name, conf=THRESHOLD, verbose=False, imgsz=IMGSIZE)[0]
139
+ pred_has_smoke = len(results) > 0
 
 
 
 
 
140
  predictions.append(int(pred_has_smoke))
141
 
142
  # If there's a true box, parse it and add box prediction
tasks/models/pruned.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:0e5e9ef2d0bbe8e8984d6739ccc2d21045844c2be98425b271090de621042ce8
3
- size 5470665
 
 
 
 
tasks/models/{best.pt → pruned_fp16.pt} RENAMED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:08ca51a239f739eab4f3653956abcf303f836e8ea3b9a1c225c85f0cc1d086fa
3
- size 5443539
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b39f8abf26409f62ce689af44095cfd8debd183eae3a83b18729d6e826fce51a
3
+ size 5558000