--- library_name: onnx pipeline_tag: video-classification tags: - onnx - video-classification - accident-detection - dashcam - rockchip - rk3588 license: mit --- # 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`, `3` consecutive 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 ```python 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.