尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Traffic-CCTV console: national BPJT toll cameras, BTS layer, in-browser AI vision (COCO-SSD)
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗A map-based public-space monitoring console in a tactical SOC style, with a real in-browser AI vision engine running over public CCTV points.
Inspired by the "intelligence console" aesthetic from the reference clip: dark HUD, satellite map, live event feed, timeline. Built as a front-end you can run and extend.
mobilenet_v2 base) runs in the browser on:
hls.js and
analyzed frame-by-frame (the default when a node has a stream). Eight
verified-live cameras are pinned as presets; paste any .m3u8 URL to
analyze your own.Detections are generic COCO traffic classes (car, truck, bus,
motorcycle, bicycle, person). Large boxy vehicles that COCO mislabels as
train from an overhead toll angle are folded back into truck.
Camera points and HLS stream URLs come from BPJT (Badan Pengatur Jalan Tol, Kementerian PU) — the toll-road regulator's public camera registry at https://bpjt.pu.go.id/cctv/, which publishes operator, road, KM marker, coordinates and an HLS URL per camera for public traffic viewing.
js/cctv-data.js is auto-generated — don't hand-edit it. Stream IDs rotate,
so regenerate when cameras stop resolving:
python3 tools/update_cctv.py # all Indonesian toll cameras
python3 tools/update_cctv.py --bbox -6.4,106.68,-6.08,107.02 # one area only
Each camera is tagged with its city from a metro bounding-box table in the tool.
The featured presets in FEATURED_URLS (Jakarta, Surabaya, Sumatra) were each
verified live, H.264, and CORS-open down to the segment. Jasa Marga's jmlive
host (which serves Bandung, Semarang and others) is frequently down — those
cameras still plot as markers but their live playback falls back to the
simulated feed until the host recovers.
City-street CCTV (js/city-cctv-data.js) comes from individual city
portals, since there is no national registry for ATCS/Dishub cameras.
tools/update_city_cctv.py has one small adapter per city. A city is imported
only if its portal is public (no login) and its HLS streams are CORS-open;
only road/intersection cameras are kept (no parks, rivers, building security or
neighbourhood cameras). Currently: Kota Yogyakarta (cctv.jogjakota.go.id,
~100 ATCS/road cameras). Portals that lock streams to their own site (Bandung
Pelindung), need a login (Semarang) or are down are linked as view-only in the
console's source panel — they are not proxied or worked around.
python3 tools/update_city_cctv.py # refresh city cameras
BTS layer (data/bts.json, with counts in js/bts-data.js) holds the
Indonesian cell towers mapped in OpenStreetMap
(© OpenStreetMap contributors, ODbL), fetched from the public Overpass API by
tools/gen_bts.py. Only each tower's position and operator(s) are kept; other
tags, some of which carry phone numbers, are dropped. Volunteers map these, so
coverage is real but incomplete and uneven. The page loads the file only when
the layer is switched on.
python3 tools/gen_bts.py # refresh from OpenStreetMap (~1-2 min)
This console does generic, anonymous analytics only — object classes like
person, car, bus, truck, motorcycle, bicycle, and aggregate counts.
It intentionally does not implement:
Those features turn a monitoring tool into a targeted-surveillance / stalkerware system, so they are out of scope. Keep deployments to public spaces you are authorized to monitor, and follow local privacy law.
From the repo root:
python3 -m http.server 5173
Then open http://localhost:5173. (A browser is required — the AI model and map tiles load from CDNs, so you need an internet connection on first load.)
It's plain static files with no build step, so any static host works — this
repo is set up for GitHub Pages (.nojekyll makes Pages serve files as-is).
All camera streams are https://, so nothing is blocked as mixed content.
Note: the claude.ai Artifact viewer blocks every cross-origin image and
fetch, so inside an Artifact the map tiles, live HLS streams and model weights
don't load. Live features need a normal static host like this one.
hls.js fetches each segment over fetch/XHR, so a stream only works in the
browser if its server sends Access-Control-Allow-Origin. If it doesn't, the
video may still play but the canvas becomes tainted and
tf.browser.fromPixels() throws — the engine detects this, keeps the picture
up, and shows "detection blocked (CORS-restricted feed)" instead of failing.
The BPJT toll cameras used here send Access-Control-Allow-Origin: *, so both
playback and detection work. For a feed that can't (many city CCTV portals), run
a small reverse proxy / ffmpeg re-stream that adds the CORS header, and point
the console at that instead.
| File | Role |
|---|---|
index.html | Layout, HUD shell, camera modal, HLS controls |
css/styles.css | Tactical SOC theme |
js/cctv-data.js | Auto-generated CCTV node dataset (BPJT), city-tagged |
js/city-cctv-data.js | Auto-generated city-street CCTV (city portals) |
js/bts-data.js, data/bts.json | Auto-generated BTS towers from OpenStreetMap |
js/vision.js | VisionEngine — COCO-SSD + hls.js + webcam/file/sim |
js/app.js | Map, markers, layers, city selector, analytics, modal |
tools/update_cctv.py | Regenerate cctv-data.js from the BPJT registry |
tools/update_city_cctv.py | Regenerate city-cctv-data.js from city portals |
tools/gen_bts.py | Refresh the BTS towers from OpenStreetMap |
For many simultaneous real feeds, move inference off the browser: decode streams on a server/edge box and run a detector (YOLOv8 / RT-DETR via ONNX Runtime or a Triton server), then push detections to this UI over WebSocket. The front-end stays the same; only the stats source changes.
Libraries: Leaflet · TensorFlow.js · COCO-SSD. Imagery © Esri.