Makatia commited on
Commit
ab76f7f
·
verified ·
1 Parent(s): e390be8

Update README.md

Browse files
Files changed (1) hide show
  1. README.md +293 -293
README.md CHANGED
@@ -1,293 +1,293 @@
1
- ---
2
- language: en
3
- license: mit
4
- library_name: pytorch
5
- tags:
6
- - image-classification
7
- - few-shot-learning
8
- - prototypical-network
9
- - dinov2
10
- - semiconductor
11
- - defect-detection
12
- - vision-transformer
13
- - meta-learning
14
- datasets:
15
- - custom
16
- pipeline_tag: image-classification
17
- model-index:
18
- - name: semiconductor-defect-classifier
19
- results:
20
- - task:
21
- type: image-classification
22
- name: Few-Shot Defect Classification
23
- metrics:
24
- - name: Accuracy (1-shot)
25
- type: accuracy
26
- value: 0.995
27
- verified: false
28
- - name: Accuracy (5-shot)
29
- type: accuracy
30
- value: 0.997
31
- verified: false
32
- - name: Accuracy (20-shot)
33
- type: accuracy
34
- value: 0.998
35
- verified: false
36
- - name: Macro F1 (20-shot)
37
- type: f1
38
- value: 0.999
39
- verified: false
40
- ---
41
-
42
- # Semiconductor Defect Classifier
43
-
44
- **Few-Shot Semiconductor Wafer Defect Classification using DINOv2 ViT-L/14 + Prototypical Network**
45
-
46
- Built for the **ASU Intel Semiconductor Solutions Challenge 2026**. Classifies grayscale semiconductor wafer microscopy images into 9 categories (8 defect types + good) using as few as 1-5 reference images per class.
47
-
48
- ## Model Description
49
-
50
- This model combines a **DINOv2 ViT-L/14** backbone (304M parameters, self-supervised pre-training on 142M images) with a **Prototypical Network** classification head. It was trained using episodic meta-learning on the Intel challenge dataset.
51
-
52
- ### Architecture
53
-
54
- ```
55
- Input Image (grayscale, up to 7000x5600)
56
- |
57
- v
58
- DINOv2 ViT-L/14 Backbone
59
- - 304M parameters (last 6 blocks fine-tuned)
60
- - Gradient checkpointing enabled
61
- - Output: 1024-dim CLS token
62
- |
63
- v
64
- 3-Layer Projection Head
65
- - Linear(1024, 768) + LayerNorm + GELU
66
- - Linear(768, 768) + LayerNorm + GELU
67
- - Linear(768, 512) + L2 Normalization
68
- |
69
- v
70
- Prototypical Classification
71
- - Cosine similarity with learned temperature
72
- - Softmax over class prototypes
73
- - Good-detection gap threshold (0.20)
74
- ```
75
-
76
- ### Key Design Choices
77
-
78
- - **DINOv2 backbone**: Self-supervised features transfer exceptionally well to few-shot tasks, even on out-of-distribution semiconductor images
79
- - **Prototypical Network**: Non-parametric classifier that works with any number of support examples (K=1 to K=20+) without retraining
80
- - **Cosine similarity + learned temperature**: More stable than Euclidean distance for high-dimensional embeddings
81
- - **Differential learning rates**: Backbone fine-tuned at 5e-6, projection head at 3e-4 (60x ratio)
82
- - **Gradient checkpointing**: Reduces VRAM from ~24 GB to ~2 GB with minimal speed penalty
83
-
84
- ## Training Details
85
-
86
- ### Dataset
87
-
88
- Intel Semiconductor Solutions Challenge 2026 dataset:
89
-
90
- | Class | Name | Samples | Description |
91
- |-------|------|---------|-------------|
92
- | 0 | Good | 7,135 | Non-defective wafer surface |
93
- | 1 | Defect 1 | 253 | Scratch-type defect |
94
- | 2 | Defect 2 | 178 | Particle contamination |
95
- | 3 | Defect 3 | 9 | Micro-crack (extremely rare) |
96
- | 4 | Defect 4 | 14 | Edge defect (extremely rare) |
97
- | 5 | Defect 5 | 411 | Pattern anomaly |
98
- | 8 | Defect 8 | 803 | Surface roughness |
99
- | 9 | Defect 9 | 319 | Deposition defect |
100
- | 10 | Defect 10 | 674 | Etch residue |
101
-
102
- **Note**: Classes 6 and 7 do not exist in the dataset. The extreme class imbalance (793:1 ratio between good and defect3) and visually similar class pairs (defect3/defect9 at 0.963 cosine similarity, defect4/defect8 at 0.889) make this a challenging benchmark.
103
-
104
- ### Training Configuration
105
-
106
- | Parameter | Value |
107
- |-----------|-------|
108
- | Training paradigm | Episodic meta-learning |
109
- | Episodes per epoch | 500 |
110
- | Episode structure | 9-way 5-shot 10-query |
111
- | Optimizer | AdamW |
112
- | Learning rate (head) | 3.0e-4 |
113
- | Learning rate (backbone) | 5.0e-6 |
114
- | LR schedule | Cosine annealing with 5-epoch warmup |
115
- | Weight decay | 1.0e-4 |
116
- | Label smoothing | 0.1 |
117
- | Gradient clipping | Max norm 1.0 |
118
- | Mixed precision | AMP (float16) |
119
- | Batch processing | Gradient checkpointing |
120
- | Early stopping | Patience 20 epochs |
121
- | Input resolution | 518x518 (DINOv2 native) |
122
- | Preprocessing | LongestMaxSize + PadIfNeeded (aspect-ratio preserving) |
123
-
124
- ### Training Hardware
125
-
126
- - **GPU**: NVIDIA RTX PRO 6000 Blackwell Workstation Edition (95.6 GB VRAM)
127
- - **Actual VRAM usage**: ~2 GB (gradient checkpointing)
128
- - **Training time**: ~17 minutes/epoch
129
- - **Convergence**: 7 epochs (early stopping triggered at epoch 27)
130
-
131
- ## Performance
132
-
133
- ### K-Shot Classification Accuracy
134
-
135
- | K (support images per class) | Accuracy |
136
- |------------------------------|----------|
137
- | K=1 | 99.5% |
138
- | K=3 | 99.7% |
139
- | K=5 | 99.7% |
140
- | K=10 | 99.7% |
141
- | K=20 | 99.8% |
142
-
143
- ### Per-Class F1 Scores (K=20)
144
-
145
- | Class | F1 Score |
146
- |-------|----------|
147
- | Defect 1 (Scratch) | 1.000 |
148
- | Defect 2 (Particle) | 1.000 |
149
- | Defect 3 (Micro-crack) | 1.000 |
150
- | Defect 4 (Edge) | 1.000 |
151
- | Defect 5 (Pattern) | 0.994 |
152
- | Defect 8 (Roughness) | 1.000 |
153
- | Defect 9 (Deposition) | 1.000 |
154
- | Defect 10 (Etch residue) | 0.996 |
155
-
156
- **Balanced accuracy (K=20)**: 0.999
157
- **Macro F1 (K=20)**: 0.999
158
-
159
- ### Good Image Detection
160
-
161
- The model includes a cosine similarity gap threshold for detecting non-defective ("good") wafer images:
162
-
163
- | Metric | Value |
164
- |--------|-------|
165
- | Good image accuracy | ~90% |
166
- | Defect image accuracy | ~97% |
167
- | Gap threshold | 0.20 |
168
-
169
- ## How to Use
170
-
171
- ### Quick Start
172
-
173
- ```python
174
- import torch
175
- import yaml
176
- from PIL import Image
177
- from problem_a.src.backbone import get_backbone
178
- from problem_a.src.protonet import PrototypicalNetwork, IncrementalPrototypeTracker
179
- from problem_a.src.augmentations import get_eval_transform
180
-
181
- # Load model
182
- with open('problem_a/configs/default.yaml') as f:
183
- cfg = yaml.safe_load(f)
184
-
185
- backbone = get_backbone(cfg['model']['backbone'], cfg['model']['backbone_size'])
186
- model = PrototypicalNetwork(backbone, cfg['model']['proj_hidden'], cfg['model']['proj_dim'])
187
-
188
- checkpoint = torch.load('best_model.pt', map_location='cpu', weights_only=False)
189
- model.load_state_dict(checkpoint['model_state_dict'])
190
- model.eval().cuda()
191
-
192
- transform = get_eval_transform(cfg['data']['img_size'])
193
-
194
- # Create tracker and add support images
195
- tracker = IncrementalPrototypeTracker(model, torch.device('cuda'))
196
-
197
- # Add support images (at least 1 per class)
198
- for class_id, image_path in support_images:
199
- img = Image.open(image_path).convert('L')
200
- tensor = transform(img)
201
- tracker.add_example(tensor, class_id)
202
-
203
- # Classify a query image
204
- query_img = Image.open('query.png').convert('L')
205
- query_tensor = transform(query_img).unsqueeze(0).cuda()
206
-
207
- with torch.no_grad():
208
- log_probs = model.classify(query_tensor, tracker.prototypes)
209
- probs = torch.exp(log_probs).squeeze(0)
210
-
211
- # Get prediction
212
- label_map = tracker.label_map
213
- reverse_map = {v: k for k, v in label_map.items()}
214
- pred_idx = probs.argmax().item()
215
- predicted_class = reverse_map[pred_idx]
216
- confidence = probs[pred_idx].item()
217
- print(f'Predicted: class {predicted_class}, confidence: {confidence:.3f}')
218
- ```
219
-
220
- ### Download with huggingface_hub
221
-
222
- ```python
223
- from huggingface_hub import hf_hub_download
224
-
225
- checkpoint_path = hf_hub_download(
226
- repo_id="Makatia/semiconductor-defect-classifier",
227
- filename="best_model.pt"
228
- )
229
- ```
230
-
231
- ## Model Specifications
232
-
233
- | Property | Value |
234
- |----------|-------|
235
- | Architecture | DINOv2 ViT-L/14 + Prototypical Network |
236
- | Total parameters | 306,142,209 |
237
- | Trainable parameters | 77,366,273 (25.3%) |
238
- | Backbone | DINOv2 ViT-L/14 (frozen + last 6 blocks) |
239
- | Embedding dimension | 512 (L2-normalized) |
240
- | Projection head | 1024 -> 768 -> 768 -> 512 |
241
- | Input size | 518x518 (aspect-ratio preserved with padding) |
242
- | Input channels | Grayscale (converted to 3-channel internally) |
243
- | Inference time | ~700ms (GPU) / ~3s (CPU) |
244
- | VRAM (inference) | ~2 GB |
245
- | Checkpoint size | 1.17 GB |
246
- | Framework | PyTorch 2.0+ |
247
- | Dependencies | timm >= 1.0, albumentations >= 1.3 |
248
-
249
- ## Checkpoint Contents
250
-
251
- The `.pt` file contains:
252
-
253
- ```python
254
- {
255
- 'epoch': 7, # Best epoch
256
- 'model_state_dict': {...}, # Full model weights
257
- 'best_val_acc': 0.906, # Validation accuracy (episodic)
258
- 'config': {...}, # Training configuration
259
- }
260
- ```
261
-
262
- ## Intended Use
263
-
264
- - **Primary use**: Semiconductor wafer defect detection and classification in manufacturing quality control
265
- - **Few-shot scenarios**: When only 1-20 labeled examples per defect class are available
266
- - **Research**: Few-shot learning, meta-learning, and industrial defect detection benchmarks
267
-
268
- ## Limitations
269
-
270
- - Trained specifically on Intel challenge semiconductor images; may need fine-tuning for other semiconductor processes
271
- - Good image detection (~90% accuracy) is less reliable than defect classification (97-100%)
272
- - Requires grayscale input images; color images should be converted before inference
273
- - Extremely rare classes (defect3: 9 samples, defect4: 14 samples) have lower representation in training
274
-
275
- ## Source Code
276
-
277
- Full training pipeline, evaluation scripts, and PySide6/QML desktop application available at:
278
- [github.com/fidel-makatia/Semiconductor_Defect_Classification_model](https://github.com/fidel-makatia/Semiconductor_Defect_Classification_model)
279
-
280
- ## Citation
281
-
282
- ```bibtex
283
- @misc{makatia2026semiconductor,
284
- title={Few-Shot Semiconductor Defect Classification with DINOv2 and Prototypical Networks},
285
- author={Fidel Makatia},
286
- year={2026},
287
- howpublished={Intel Semiconductor Solutions Challenge 2026},
288
- }
289
- ```
290
-
291
- ## License
292
-
293
- MIT License
 
1
+ ---
2
+ language: en
3
+ license: mit
4
+ library_name: pytorch
5
+ tags:
6
+ - image-classification
7
+ - few-shot-learning
8
+ - prototypical-network
9
+ - dinov2
10
+ - semiconductor
11
+ - defect-detection
12
+ - vision-transformer
13
+ - meta-learning
14
+ datasets:
15
+ - custom
16
+ pipeline_tag: image-classification
17
+ model-index:
18
+ - name: semiconductor-defect-classifier
19
+ results:
20
+ - task:
21
+ type: image-classification
22
+ name: Few-Shot Defect Classification
23
+ metrics:
24
+ - name: Accuracy (1-shot)
25
+ type: accuracy
26
+ value: 0.995
27
+ verified: false
28
+ - name: Accuracy (5-shot)
29
+ type: accuracy
30
+ value: 0.997
31
+ verified: false
32
+ - name: Accuracy (20-shot)
33
+ type: accuracy
34
+ value: 0.998
35
+ verified: false
36
+ - name: Macro F1 (20-shot)
37
+ type: f1
38
+ value: 0.999
39
+ verified: false
40
+ ---
41
+
42
+ # Semiconductor Defect Classifier
43
+
44
+ **Few-Shot Semiconductor Wafer Defect Classification using DINOv2 ViT-L/14 + Prototypical Network**
45
+
46
+ Classifies grayscale semiconductor wafer microscopy images into 9 categories (8 defect types + good) using as few as 1-5 reference images per class.
47
+
48
+ ## Model Description
49
+
50
+ This model combines a **DINOv2 ViT-L/14** backbone (304M parameters, self-supervised pre-training on 142M images) with a **Prototypical Network** classification head. It was trained using episodic meta-learning on the Intel challenge dataset.
51
+
52
+ ### Architecture
53
+
54
+ ```
55
+ Input Image (grayscale, up to 7000x5600)
56
+ |
57
+ v
58
+ DINOv2 ViT-L/14 Backbone
59
+ - 304M parameters (last 6 blocks fine-tuned)
60
+ - Gradient checkpointing enabled
61
+ - Output: 1024-dim CLS token
62
+ |
63
+ v
64
+ 3-Layer Projection Head
65
+ - Linear(1024, 768) + LayerNorm + GELU
66
+ - Linear(768, 768) + LayerNorm + GELU
67
+ - Linear(768, 512) + L2 Normalization
68
+ |
69
+ v
70
+ Prototypical Classification
71
+ - Cosine similarity with learned temperature
72
+ - Softmax over class prototypes
73
+ - Good-detection gap threshold (0.20)
74
+ ```
75
+
76
+ ### Key Design Choices
77
+
78
+ - **DINOv2 backbone**: Self-supervised features transfer exceptionally well to few-shot tasks, even on out-of-distribution semiconductor images
79
+ - **Prototypical Network**: Non-parametric classifier that works with any number of support examples (K=1 to K=20+) without retraining
80
+ - **Cosine similarity + learned temperature**: More stable than Euclidean distance for high-dimensional embeddings
81
+ - **Differential learning rates**: Backbone fine-tuned at 5e-6, projection head at 3e-4 (60x ratio)
82
+ - **Gradient checkpointing**: Reduces VRAM from ~24 GB to ~2 GB with minimal speed penalty
83
+
84
+ ## Training Details
85
+
86
+ ### Dataset
87
+
88
+ Intel Semiconductor Solutions Challenge 2026 dataset:
89
+
90
+ | Class | Name | Samples | Description |
91
+ |-------|------|---------|-------------|
92
+ | 0 | Good | 7,135 | Non-defective wafer surface |
93
+ | 1 | Defect 1 | 253 | Scratch-type defect |
94
+ | 2 | Defect 2 | 178 | Particle contamination |
95
+ | 3 | Defect 3 | 9 | Micro-crack (extremely rare) |
96
+ | 4 | Defect 4 | 14 | Edge defect (extremely rare) |
97
+ | 5 | Defect 5 | 411 | Pattern anomaly |
98
+ | 8 | Defect 8 | 803 | Surface roughness |
99
+ | 9 | Defect 9 | 319 | Deposition defect |
100
+ | 10 | Defect 10 | 674 | Etch residue |
101
+
102
+ **Note**: Classes 6 and 7 do not exist in the dataset. The extreme class imbalance (793:1 ratio between good and defect3) and visually similar class pairs (defect3/defect9 at 0.963 cosine similarity, defect4/defect8 at 0.889) make this a challenging benchmark.
103
+
104
+ ### Training Configuration
105
+
106
+ | Parameter | Value |
107
+ |-----------|-------|
108
+ | Training paradigm | Episodic meta-learning |
109
+ | Episodes per epoch | 500 |
110
+ | Episode structure | 9-way 5-shot 10-query |
111
+ | Optimizer | AdamW |
112
+ | Learning rate (head) | 3.0e-4 |
113
+ | Learning rate (backbone) | 5.0e-6 |
114
+ | LR schedule | Cosine annealing with 5-epoch warmup |
115
+ | Weight decay | 1.0e-4 |
116
+ | Label smoothing | 0.1 |
117
+ | Gradient clipping | Max norm 1.0 |
118
+ | Mixed precision | AMP (float16) |
119
+ | Batch processing | Gradient checkpointing |
120
+ | Early stopping | Patience 20 epochs |
121
+ | Input resolution | 518x518 (DINOv2 native) |
122
+ | Preprocessing | LongestMaxSize + PadIfNeeded (aspect-ratio preserving) |
123
+
124
+ ### Training Hardware
125
+
126
+ - **GPU**: NVIDIA RTX PRO 6000 Blackwell Workstation Edition (95.6 GB VRAM)
127
+ - **Actual VRAM usage**: ~2 GB (gradient checkpointing)
128
+ - **Training time**: ~17 minutes/epoch
129
+ - **Convergence**: 7 epochs (early stopping triggered at epoch 27)
130
+
131
+ ## Performance
132
+
133
+ ### K-Shot Classification Accuracy
134
+
135
+ | K (support images per class) | Accuracy |
136
+ |------------------------------|----------|
137
+ | K=1 | 99.5% |
138
+ | K=3 | 99.7% |
139
+ | K=5 | 99.7% |
140
+ | K=10 | 99.7% |
141
+ | K=20 | 99.8% |
142
+
143
+ ### Per-Class F1 Scores (K=20)
144
+
145
+ | Class | F1 Score |
146
+ |-------|----------|
147
+ | Defect 1 (Scratch) | 1.000 |
148
+ | Defect 2 (Particle) | 1.000 |
149
+ | Defect 3 (Micro-crack) | 1.000 |
150
+ | Defect 4 (Edge) | 1.000 |
151
+ | Defect 5 (Pattern) | 0.994 |
152
+ | Defect 8 (Roughness) | 1.000 |
153
+ | Defect 9 (Deposition) | 1.000 |
154
+ | Defect 10 (Etch residue) | 0.996 |
155
+
156
+ **Balanced accuracy (K=20)**: 0.999
157
+ **Macro F1 (K=20)**: 0.999
158
+
159
+ ### Good Image Detection
160
+
161
+ The model includes a cosine similarity gap threshold for detecting non-defective ("good") wafer images:
162
+
163
+ | Metric | Value |
164
+ |--------|-------|
165
+ | Good image accuracy | ~90% |
166
+ | Defect image accuracy | ~97% |
167
+ | Gap threshold | 0.20 |
168
+
169
+ ## How to Use
170
+
171
+ ### Quick Start
172
+
173
+ ```python
174
+ import torch
175
+ import yaml
176
+ from PIL import Image
177
+ from problem_a.src.backbone import get_backbone
178
+ from problem_a.src.protonet import PrototypicalNetwork, IncrementalPrototypeTracker
179
+ from problem_a.src.augmentations import get_eval_transform
180
+
181
+ # Load model
182
+ with open('problem_a/configs/default.yaml') as f:
183
+ cfg = yaml.safe_load(f)
184
+
185
+ backbone = get_backbone(cfg['model']['backbone'], cfg['model']['backbone_size'])
186
+ model = PrototypicalNetwork(backbone, cfg['model']['proj_hidden'], cfg['model']['proj_dim'])
187
+
188
+ checkpoint = torch.load('best_model.pt', map_location='cpu', weights_only=False)
189
+ model.load_state_dict(checkpoint['model_state_dict'])
190
+ model.eval().cuda()
191
+
192
+ transform = get_eval_transform(cfg['data']['img_size'])
193
+
194
+ # Create tracker and add support images
195
+ tracker = IncrementalPrototypeTracker(model, torch.device('cuda'))
196
+
197
+ # Add support images (at least 1 per class)
198
+ for class_id, image_path in support_images:
199
+ img = Image.open(image_path).convert('L')
200
+ tensor = transform(img)
201
+ tracker.add_example(tensor, class_id)
202
+
203
+ # Classify a query image
204
+ query_img = Image.open('query.png').convert('L')
205
+ query_tensor = transform(query_img).unsqueeze(0).cuda()
206
+
207
+ with torch.no_grad():
208
+ log_probs = model.classify(query_tensor, tracker.prototypes)
209
+ probs = torch.exp(log_probs).squeeze(0)
210
+
211
+ # Get prediction
212
+ label_map = tracker.label_map
213
+ reverse_map = {v: k for k, v in label_map.items()}
214
+ pred_idx = probs.argmax().item()
215
+ predicted_class = reverse_map[pred_idx]
216
+ confidence = probs[pred_idx].item()
217
+ print(f'Predicted: class {predicted_class}, confidence: {confidence:.3f}')
218
+ ```
219
+
220
+ ### Download with huggingface_hub
221
+
222
+ ```python
223
+ from huggingface_hub import hf_hub_download
224
+
225
+ checkpoint_path = hf_hub_download(
226
+ repo_id="Makatia/semiconductor-defect-classifier",
227
+ filename="best_model.pt"
228
+ )
229
+ ```
230
+
231
+ ## Model Specifications
232
+
233
+ | Property | Value |
234
+ |----------|-------|
235
+ | Architecture | DINOv2 ViT-L/14 + Prototypical Network |
236
+ | Total parameters | 306,142,209 |
237
+ | Trainable parameters | 77,366,273 (25.3%) |
238
+ | Backbone | DINOv2 ViT-L/14 (frozen + last 6 blocks) |
239
+ | Embedding dimension | 512 (L2-normalized) |
240
+ | Projection head | 1024 -> 768 -> 768 -> 512 |
241
+ | Input size | 518x518 (aspect-ratio preserved with padding) |
242
+ | Input channels | Grayscale (converted to 3-channel internally) |
243
+ | Inference time | ~700ms (GPU) / ~3s (CPU) |
244
+ | VRAM (inference) | ~2 GB |
245
+ | Checkpoint size | 1.17 GB |
246
+ | Framework | PyTorch 2.0+ |
247
+ | Dependencies | timm >= 1.0, albumentations >= 1.3 |
248
+
249
+ ## Checkpoint Contents
250
+
251
+ The `.pt` file contains:
252
+
253
+ ```python
254
+ {
255
+ 'epoch': 7, # Best epoch
256
+ 'model_state_dict': {...}, # Full model weights
257
+ 'best_val_acc': 0.906, # Validation accuracy (episodic)
258
+ 'config': {...}, # Training configuration
259
+ }
260
+ ```
261
+
262
+ ## Intended Use
263
+
264
+ - **Primary use**: Semiconductor wafer defect detection and classification in manufacturing quality control
265
+ - **Few-shot scenarios**: When only 1-20 labeled examples per defect class are available
266
+ - **Research**: Few-shot learning, meta-learning, and industrial defect detection benchmarks
267
+
268
+ ## Limitations
269
+
270
+ - Trained specifically on Intel challenge semiconductor images; may need fine-tuning for other semiconductor processes
271
+ - Good image detection (~90% accuracy) is less reliable than defect classification (97-100%)
272
+ - Requires grayscale input images; color images should be converted before inference
273
+ - Extremely rare classes (defect3: 9 samples, defect4: 14 samples) have lower representation in training
274
+
275
+ ## Source Code
276
+
277
+ Full training pipeline, evaluation scripts, and PySide6/QML desktop application available at:
278
+ [github.com/fidel-makatia/Semiconductor_Defect_Classification_model](https://github.com/fidel-makatia/Semiconductor_Defect_Classification_model)
279
+
280
+ ## Citation
281
+
282
+ ```bibtex
283
+ @misc{makatia2026semiconductor,
284
+ title={Few-Shot Semiconductor Defect Classification with DINOv2 and Prototypical Networks},
285
+ author={Fidel Makatia},
286
+ year={2026},
287
+ howpublished={Intel Semiconductor Solutions Challenge 2026},
288
+ }
289
+ ```
290
+
291
+ ## License
292
+
293
+ MIT License