GLASS for RDK S100/S100P β one-class industrial anomaly detection
Compiled BPU models (.hbm) for the D-Robotics RDK S100 / S100P, ready to
load β no ONNX export, no calibration, no hb_compile. Built and measured with
BCDL, a C++17 inference and media library
for the RDK S-series with Python bindings.
Upstream: GLASS (ECCV 2024), WideResNet-50 backbone, trained on MVTec-AD bottle
Non-commercial. These weights carry a restriction the upstream code licence never mentions β see Licence at the bottom. Redistribution is permitted; commercial use is not. If you need a commercial build, the recipe is public and you can retrain or substitute the backbone.
Files
| file | what it is |
|---|---|
glass_bottle_int8_nashm_288x288.hbm |
int8, 288x288, one product β 92.1 MB |
Measured on an S100P
| stage | latency | throughput |
|---|---|---|
| anomaly map | 72.6 ms | 14 FPS |
hrt_model_exec perf, one thread, minimum of three runs, on a board first gated
against its own previously recorded numbers. BPU time only β CPU
pre/post-processing is on top and is listed per task in BCDL's
benchmark results.
Use it
conda install -c https://mirrors.ruis.ai/conda -c conda-forge bcdl
import bcdl
engine = bcdl.Engine("glass_bottle_int8_nashm_288x288.hbm")
print(engine.input_shape(0), engine.output_shape(0))
Each task has a decoder in BCDL that turns those raw outputs into boxes, keypoints, masks, disparity or text β see the Python API (δΈζ).
What to know before deploying
This detects defects in one kind of bottle. It is an example, not a general anomaly detector β and retraining it for your own part is a realistic ask, which is the interesting part. The backbone is a frozen ImageNet WideResNet-50; per product only two small heads are trained (about 16 MB), from defect-free images only, with no labelled defects at all. The recipe is public.
Image and pixel AUROC are both 0.9905, matching float β at an output cosine of 0.9409. That cosine is far below any usual gate and costs nothing here, because AUROC is rank-based: quantisation noise nudges every score slightly without reordering them. (The same project's optical-flow model is the mirror image β 0.9954 cosine on a build that was unusable. Score the task in its own units, in both directions.)
What the AUROC hides, and what you must decide: good and defective scores overlap β best normal 0.953 against worst defect 0.882. Zero misses costs about 50% false alarms; zero false alarms misses about 5% of defects, all of them small foreign objects. The threshold is a line-side decision, not a property of the model.
The image score is the map's maximum, not its mean β a part is as bad as its worst patch, and a mean lets a large clean region hide a small defect.
The licence does not reach your deployment. A deployed GLASS is retrained on your defect-free parts, so it derives from your data, not from MVTec's. What is encumbered is this example checkpoint.
Licence
MIT on the code and the released weights, but this checkpoint is trained on MVTec AD, which is CC BY-NC-SA 4.0 β attribution, no commercial use, and derivatives under the same terms. The share-alike is why this repo carries CC BY-NC-SA 4.0 rather than a plain non-commercial notice.
BCDL itself is Apache-2.0 and is unrelated to these terms β it is a
general-purpose runtime that loads any .hbm. The licence above constrains
these weights and this compiled artefact.
The conversion recipe β ONNX export, calibration, hb_compile config and the
acceptance numbers β is public in
bcdl-model-zoo, so this build can
be reproduced or retargeted rather than taken on trust.