Views
No views yet
tf_efficientnet_lite2 models (~9M params each, ~0.04B total) fine-tuned from
timm/tf_efficientnet_lite2.in1k on iNaturalist research-grade observations. They
run offline on a Raspberry Pi 5 + Hailo 8L in a handheld device; the same ONNX
weights run on a free CPU.photo (224x224 RGB, ImageNet-normalized)
-> domain_router_v2 (berry / mushroom / plant / other)
conf < 0.74 or "other" -> ABSTAIN
else route to the ONE expert that owns the domain:
berry -> berry_expert
mushroom -> highvalue_expert
plant -> medicinals_expert
expert below confidence gate -> ABSTAIN
-> SAFE / CAUTION / DEADLY (+ scientific name, look-alike, key difference)| Folder | Domain | Classes |
|---|---|---|
domain_router_v2/ | berry / mushroom / plant / other | 4 |
berry_expert/ | wild berries + toxic look-alikes | 11 |
highvalue_expert/ | chanterelle, morel, lion's mane, ginseng… | 11 |
medicinals_expert/ | wild medicinals + deadly look-alikes | 21 |
*_logits.onnx (CPU/edge), *_classes.json (label order), and
*.pt (the fine-tuned timm checkpoint: model_state_dict + classes + arch).
energy_thresholds.json holds per-expert in-domain energy percentiles for optional
OOD gating.1import onnxruntime as ort, numpy as np, json
2sess = ort.InferenceSession("berry_expert/berry_expert_logits.onnx",
3 providers=["CPUExecutionProvider"])
4classes = json.load(open("berry_expert/berry_expert_classes.json"))
5# x: float32 [1,3,224,224], ImageNet-normalized (Resize 255 -> CenterCrop 224)
6logits = sess.run(None, {"input": x})[0][0]
7probs = np.exp(logits - logits.max()); probs /= probs.sum()
8print(classes[int(probs.argmax())], float(probs.max()))HomesteaderLabs (2026). Forager's Field Station Field ID Models. https://homesteaderlabs.com