Norway's National AI Championship Β· March 19β22, 2026 Β· 1,000,000 NOK Prize Pool Β· 410+ Teams
Solo competitor entry across three AI challenges: grocery shelf object detection, AI-powered accounting agent, and Norse world state prediction.
| Task | Score | Details |
|---|---|---|
| Object Detection (NorgesGruppen) | 0.8807 mAP@0.5 | YOLOv8x + multi-scale TTA + classifier re-ranking |
| AI Accounting Agent (Tripletex) | Scored | FastAPI + Gemini 2.5 Flash + Tripletex API |
| Astar Island | Built | Viewport observation + prior-based prediction |
nm-ai-2026/
βββ object-detection/
β βββ run.py # Competition inference script (ONNX + TTA + WBF + classifier)
β βββ train.py # YOLOv8x training at 1280px resolution
β βββ train_v8l.py # YOLOv8l backup model training at 1024px
β βββ export_onnx.py # PyTorch β ONNX export with FP32 at 1280px
β βββ prepare_data.py # COCO β YOLO format conversion
β βββ build_ref_bank.py # Reference product image feature extraction
β βββ eval_submission.py # Local mAP evaluation against COCO ground truth
β βββ gpu_sweep.py # GPU-accelerated parameter sweep (WBF, thresholds)
β βββ sweep_eval.py # Multi-scale inference + parameter optimization
β βββ package_submission.py # Zip packaging with size validation
β
βββ tripletex-agent/
β βββ main.py # FastAPI server with /solve and /health endpoints
β βββ agent.py # LLM-powered agent with Gemini 2.5 Flash
β βββ tripletex_client.py # Tripletex REST API client with Basic Auth
β βββ prompts.py # Norwegian accounting system prompt + API schemas
β βββ requirements.txt # Python dependencies
β βββ Dockerfile # Cloud Run deployment container
β
βββ astar-island/
β βββ main.py # End-to-end pipeline: observe β predict β submit
β βββ client.py # Astar Island REST API client
β βββ config.py # Configuration, terrain classes, API settings
β βββ predictor.py # Prior + observation blending for probability tensors
β βββ aggregator.py # Viewport observation frequency aggregation
β βββ tiler.py # Viewport tiling strategy for 40Γ40 maps
β βββ scores.py # Score retrieval and display
β
βββ README.md
Detect and classify 357 grocery product categories on store shelf images. Scored by mAP@0.5 with a weighted split: 70% detection (bounding box accuracy, category ignored) and 30% classification (correct product identification).
- Training data: 248 shelf images, ~22,700 COCO-format bounding box annotations
- Categories: 357 product classes across 4 store sections (Egg, Frokost, Knekkebrod, Varmedrikker)
- Reference data: 327 individual products with multi-angle photos
- Sandbox: NVIDIA L4 GPU (24GB), Python 3.11, 300-second timeout, no network access
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β INFERENCE PIPELINE β
β β
β ββββββββββββ βββββββββββββββββββββ ββββββββββββββββββββββββ β
β β β β Multi-Scale TTA β β β β
β β Input βββββΆβ 960px + 1280px βββββΆβ Weighted Box β β
β β Image β β + 1536px β β Fusion (WBF) β β
β β β β β β IoU=0.55 β β
β ββββββββββββ βββββββββββββββββββββ ββββββββββββ¬ββββββββββββ β
β β β
β ββββββββββββββββββββββββββββββ β
β βΌ β
β βββββββββββββββββββββββββββ β
β β Section-Aware Filter β β
β β Suppress impossible β β
β β categories per store β β
β β section (4 sections) β β
β ββββββββββββββ¬βββββββββββββ β
β βΌ β
β βββββββββββββββββββββββββββ β
β β Classifier Re-Ranking β β
β β EfficientNet (timm) β β
β β crops vs reference β β
β β product images β β
β ββββββββββββββ¬βββββββββββββ β
β βΌ β
β βββββββββββββββββββββββββββ β
β β COCO JSON Output β β
β β predictions.json β β
β βββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β TRAINING PIPELINE β
β β
β ββββββββββββ ββββββββββββββββββ ββββββββββββββββββββββββββββ β
β β COCO β β prepare_data β β YOLOv8x Training β β
β β Dataset βββββΆβ .py βββββΆβ imgsz=1280, batch=1 β β
β β 248 img β β COCO β YOLO β β AdamW, cos_lr β β
β ββββββββββββ ββββββββββββββββββ β epochs=300, patience=80β β
β ββββββββββββββ¬ββββββββββββββ β
β βΌ β
β ββββββββββββββββ ββββββββββββββββββ ββββββββββββββββββββββ β
β β submission β β package_ β β export_onnx.py β β
β β .zip βββββ submission.py βββββ ONNX @ 1280px β β
β β 324 MB β β verify < 420MBβ β FP32, opset=17 β β
β ββββββββββββββββ ββββββββββββββββββ ββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
| Run | Model | Resolution | Epochs | Val mAP@0.5 | Notes |
|---|---|---|---|---|---|
| 1 | YOLOv8l | 640 | 81 (early stop) | 0.764 | First successful run, OOM debugging |
| 2 | YOLOv8x | 960 | 117 (interrupted) | 0.763 | Auto-batch tuning |
| 3 | YOLOv8l | 1024 | 67 (early stop) | 0.765 | Backup model for ensemble experiments |
| 4 | YOLOv8x | 1280 | ~200 | 0.8807* | Overnight training, final submission |
*Competition leaderboard score with full inference pipeline
| Optimization | Impact | Description |
|---|---|---|
| Baseline (single scale) | 0.7202 | YOLOv8l @ 1024, single inference pass |
| + Section restriction | +0.005 | Suppress impossible categories per store section |
| + Multi-scale TTA | +0.036 | Inference at 960 + 1280 + 1536px with WBF fusion |
| + Classifier re-ranking | +0.003 | EfficientNet crop classifier vs reference product images |
| + WBF parameter tuning | +0.009 | conf_type=box_and_model_avg, removing dedup NMS |
| Training at 1280 resolution | ~+0.10 | Eliminating train/inference resolution mismatch |
TTA_SCALES = [960, 1280, 1536]
TTA_HFLIP = False
WBF_IOU = 0.55
CONF_TYPE = "box_and_model_avg"
FINAL_SCORE_THRES = 0.001
DEDUP_IOU = 1.0
CLS_OVERRIDE_SIM = 0.55
CLS_YOLO_CONF_THRES = 0.60
CLS_BOOST = 1.30The competition sandbox blocks dangerous imports (os, sys, subprocess, pickle, yaml, shutil, multiprocessing, threading, etc.). All file operations use pathlib, configuration uses json. Maximum submission size: 420MB with at most 3 weight files and 10 Python files.
Build an autonomous AI agent exposed as an HTTPS endpoint that receives accounting tasks in Norwegian natural language, parses them, and executes the correct API calls against Tripletex β Norway's leading accounting platform. Scored on field-by-field correctness with an efficiency bonus for fewer API calls.
- 30 unique task types across 3 difficulty tiers
- 300-second timeout per task
- Fresh API credentials provided with each submission
- Norwegian language prompts with domain-specific accounting terminology
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β TRIPLETEX AI AGENT β
β β
β Competition β
β Platform βββββββββββββββ β
β β β FastAPI β β
β β POST β /solve β β
β βββββββββββββΆβ endpoint β β
β β ββββββββ¬βββββββ β
β β β β
β β ββββββββΌβββββββββββββββββββββββββββ β
β β β API Discovery Layer β β
β β β GET /vatType, /currency, β β
β β β /costCategory, /paymentType, β β
β β β /department, /employee β β
β β ββββββββ¬βββββββββββββββββββββββββββ β
β β β cached IDs injected β
β β ββββββββΌβββββββββββββββββββββββββββ β
β β β Gemini 2.5 Flash β β
β β β Parse Norwegian prompt β β β
β β β Structured tool calls β β
β β ββββββββ¬βββββββββββββββββββββββββββ β
β β β function calls β
β β ββββββββΌβββββββββββββββββββββββββββ β
β β β Tripletex API Client β β
β β β Basic Auth (0:session_token) β β
β β β POST /employee, /customer, β β
β β β /invoice, /order, etc. β β
β β ββββββββ¬βββββββββββββββββββββββββββ β
β β β β
β β {"status": β β
β β "completed"} β β
β βββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- Request arrives with a Norwegian prompt, optional file attachments (PDFs, images), and fresh Tripletex API credentials
- Discovery layer queries Tripletex to cache VAT types, currencies, cost categories, departments, and employees
- Gemini 2.5 Flash parses the prompt using the full OpenAPI schema (3.6MB parsed) and returns structured function calls
- API client executes calls against the Tripletex proxy using Basic Auth (
0:session_token) - Agent returns
{"status": "completed"}β the competition platform then verifies field-by-field correctness
| Norwegian | English | API Endpoint |
|---|---|---|
| Opprett en ansatt | Create employee | POST /employee |
| Opprett en kunde | Create customer | POST /customer |
| Lag en faktura | Create invoice | POST /invoice |
| Registrer betaling | Register payment | POST /invoice/{id}/payment |
| Kreditnota | Credit note | POST /creditNote |
| Reiseregning | Travel expense | POST /travelExpense |
| BokfΓΈr bilag | Post voucher | POST /ledger/voucher |
| Bankavstemming | Bank reconciliation | POST /bankReconciliation |
| Kontoadministrator | Admin user | userType: "EXTENDED" |
- Gemini 2.5 Flash for LLM inference β free via GCP, 3-6 second responses, no rate limits
- OpenAPI spec parsing β extracted exact field names from 3.6MB Tripletex Swagger spec to eliminate validation errors
- Dynamic ID discovery β pre-fetched real entity IDs on each request so the LLM operates on concrete values
- 240-second hard timeout β enforced below 300s competition limit to prevent silent timeouts
Observe a procedurally generated Norse civilization simulator through limited 15Γ15 viewports (50 queries shared across 5 seeds) and predict the final terrain probability distribution across a 40Γ40 grid with 6 terrain types. Scored by entropy-weighted KL divergence.
- Tiled observation: 9 viewport tiles cover the full 40Γ40 map per seed (10 queries per seed from 50 budget)
- Prior initialization: Initial terrain type boosted by 0.5 probability weight
- Observation blending: Smoothed empirical frequency merged with prior for observed cells, pure prior for unobserved
- Probability floor: Minimum 0.01 per terrain type to avoid KL divergence explosions
- Validation: Per-cell probability normalization verified before submission
cd object-detection/
# Training environment
pip install ultralytics==8.1.0 torch==2.6.0 torchvision==0.21.0 --index-url https://download.pytorch.org/whl/cu124
pip install onnx onnxruntime-gpu onnxsim ensemble-boxes timm==0.9.12
# Prepare data (COCO β YOLO format)
python prepare_data.py
# Train
python train.py
# Export to ONNX
python export_onnx.py
# Evaluate locally
python eval_submission.py
# Package submission
python package_submission.pycd tripletex-agent/
pip install -r requirements.txt
# Set environment variable
export GEMINI_API_KEY="your-gemini-api-key"
# Run locally
python main.py # Starts on port 8080
# Deploy to Google Cloud Run
gcloud run deploy tripletex-agent \
--source . \
--region europe-north1 \
--allow-unauthenticated \
--memory 1Gi \
--timeout 300cd astar-island/
pip install requests numpy
# Edit config.py with your JWT token
python main.pyNM i AI 2026 is Norway's national AI championship β a 69-hour competition bringing together 3,000+ participants across 410+ teams competing for a 1,000,000 NOK prize pool. The competition featured three independent AI challenges spanning computer vision, autonomous agents, and probabilistic prediction, with the overall score calculated as the average of normalized scores across all tasks.
This was my first AI competition. I competed solo, building all three systems from scratch over a single weekend β debugging CUDA memory constraints at 3am, iterating on model architectures, parsing Norwegian accounting terminology, and managing three parallel codebases under extreme time pressure. The experience was an intensive crash course in applied ML engineering: every decision was a real-time tradeoff between model quality, inference speed, and the ticking clock.
| Category | Tools |
|---|---|
| ML Frameworks | PyTorch, Ultralytics YOLOv8, ONNX Runtime, timm |
| LLM APIs | Google Gemini 2.5 Flash |
| Backend | FastAPI, Docker |
| Infrastructure | Google Cloud Platform (Cloud Run, Vertex AI) |
| Hardware | NVIDIA RTX 5080 Laptop (16GB), NVIDIA L4 (competition sandbox) |
MIT
Built in 48 hours as a solo competitor. A first AI competition β and definitely not the last.