visual-defect-detection
:::warning [UNTESTED] — v0.9 paper-correct
The defect_map core is host-unit-tested on native_sim/native/64; the full app runs end-to-end on native_sim with synthetic clean + defect frames. No model ships (stub + statistical fallback). HiL with a real CSI camera + a trained autoencoder is bench-gated.
:::
A camera-fed surface-inspection station that flags manufacturing defects as unsupervised anomalies: an autoencoder reconstructs the "normal" surface, and a region it reconstructs poorly (high error) is a defect — including defect types never seen in training.
Source: examples/ai/visual-defect-detection/.
Why unsupervised
Good product is abundant and uniform; defects are rare, varied, and costly to label. An autoencoder trained only on good surface flags anything it cannot reconstruct, so one model needs no defect labels and catches novel defects — a supervised classifier must see every defect class up front.
Pipeline
CSI camera --RGB565--> 64x64 luma grid --> autoencoder (reconstruction)
-> per-tile anomaly score (recon error, or statistical fallback)
-> worst tile (tx,ty) + coverage % + severity + PASS/FAIL
The luma grid is scored as an 8×8 grid of tiles; worst_tx/worst_ty ∈ [0,7] locate the worst tile, coverage_pct is the fraction of tiles flagged, and severity ∈ [0,1].
board.yaml
som:
sku: E1M-AEN701
preset: e1m-evk
supported_boards:
- e1m-evk
- e1m-x-evk
cores:
a32_cluster:
os: "off"
m55_hp:
app: ./src
inference:
default_arena_kib: 256
libraries:
- tflite_micro
peripherals:
- i2c # Camera SCCB (OV5640 control bus)
- gpio # Camera ancillaries (reset, power-down)
chips:
- ov5640 # 5 MP CSI camera sensor
diagnostics:
log_level: info
Flip som.sku to E1M-V2M101 for the V2N accelerator path.
Expected output
# DEFECT,frame,verdict,severity,coverage_pct,worst_tx,worst_ty,worst_score
DEFECT,1,PASS,0.00,0.0,0,0,0.33
DEFECT,2,FAIL,0.98,1.6,5,3,1.98
See also
<alp/camera.h>·<alp/inference.h>ai-camera-viewer— supervised person-detect variant on the same camera stack- Examples overview