Dashcam Collision Detector β Rockchip RK3588 (resnet18_temporal)
Causal sliding-window crash detector for the RK3588 NPU. Because the NPU has no 3D convolutions, this is a per-frame 2D-CNN + a small temporal head, deployed as two ONNX graphs (convert the backbone to INT8 RKNN; run the head on the CPU):
| file | shape | runs on |
|---|---|---|
backbone.onnx |
[1, 12, 112, 112] β [1, 512] |
NPU (INT8 RKNN) |
temporal_head.onnx |
[1, 16, 512] β [1] |
CPU |
rockchip.meta.json |
β | inference config |
- Input: RGB + temporal diffs at lags [1, 2, 4] (12 channels), 16-frame window
- Decision rule: threshold
0.95,3consecutive windows
Results (held-out videos, full-video streaming eval)
| metric | value |
|---|---|
| detection rate | 34.8 % |
| false-alarm rate | 15.0 % |
| mean localization error | 0.34 s |
| operating threshold | 0.95 |
Window-level ranking on validation windows (incl. full-timeline negatives): AUC 0.894, AP 0.528.
Usage
from huggingface_hub import hf_hub_download
import onnxruntime as ort, numpy as np, json
repo = "akhra92/dashcam-collision-rockchip-resnet18-motion"
bb = ort.InferenceSession(hf_hub_download(repo, "backbone.onnx"))
head = ort.InferenceSession(hf_hub_download(repo, "temporal_head.onnx"))
meta = json.load(open(hf_hub_download(repo, "rockchip.meta.json")))
T, C = meta["window_frames"], meta["feat_dim"]
feats = np.zeros((1, T, C), np.float32) # fill from per-frame backbone
frame = np.random.randn(*meta["frame_shape"]).astype("float32")
feats[0, -1] = bb.run(["feat"], {"frame": frame})[0][0]
logit = head.run(["logit"], {"feats": feats})[0]
See deploy/rockchip/ (convert_rknn.py, infer_rknn.py) in the source repo for the
INT8 conversion and streaming inference.
Inference Providers NEW
This model isn't deployed by any Inference Provider. π Ask for provider support