Parking Lot
This recipe deploys the Parking Lot Showcase from neoruntime-apps on NE503 and verifies vehicle events through the Event Bus.
The full source and configuration are in neoruntime-apps/showcases/parking-lot. This page keeps only the information needed to deploy and verify the app; use the repository for implementation details.
1. Goal and prerequisites
After completing this recipe, you should see the Parking Lot Monitor page and be able to receive:
parking/vehicles: vehicle boxes and confidence values;parking/plates: plate regions and recognized text;parking/alerts: depth anti-spoof alerts.
Before you start, confirm that:
- NE503 has a working OS installation and the Web Console is reachable;
- the four HEFs required by the Showcase are available under
/data/aipc/models; - you will use the ARM64 Release bundle, or have Docker and the source build environment ready.
2. App structure
2.1 Models and events
| Model ID | Purpose | Input |
|---|---|---|
yolov5m_vehicles | Vehicle detection | RGB, 1920 × 1080 |
scdepthv3 | Depth anti-spoof analysis | RGB, 320 × 256 |
license_plate_det | Plate-region detection | RGB, 416 × 416 |
plate_recognition | Plate-character recognition | NV12, 320 × 48 |
The app reads the model files from the device's read-only /data/aipc/models mount. At startup it registers models from MODEL_DEFS; the repository contains the full paths, post-processing configuration, and pipeline code.
2.2 Data flow
Camera
↓
sub.raw raw frames
↓
Vehicle detection → depth anti-spoofing → plate detection → plate recognition
↓ ↓
Parking Lot Web UI Event Bus
├─ parking/vehicles
├─ parking/plates
└─ parking/alerts
The default manifest uses sub.raw and STREAM_ID=sub. The app probes available streams against the model input sizes; do not change the stream name independently in app.py and app.yaml, or inference will fail when the device has no matching raw stream.
3. Get and configure the app
3.1 Download the Release bundle
The recommended path is the Parking Lot ARM64 bundle. After extraction, it should contain app.yaml, parking-lot-image.tar, and SHA256SUMS:
tar -xzf parking-lot-latest-arm64.tar.gz
cd parking-lot-*-arm64
sha256sum -c SHA256SUMS
3.2 Build from source
You need Docker, neoruntime-apps, and the sibling neoruntime-sdks repository:
cd ../neoruntime-sdks/python
python -m pip install --upgrade build
python -m build --wheel
cd ../../neoruntime-apps
scripts/build_showcase_artifacts.sh \
--wheel ../neoruntime-sdks/python/dist/hailo_ipc_sdk-*.whl \
parking-lot --arch arm64 --output dist/showcases
The output is written to dist/showcases/. Follow the neoruntime-apps README for the current build requirements.
3.3 Check the key manifest fields
Before installation, open app.yaml and confirm that an old bundle has not restored the wrong values:
permissions:
video:
- sub.raw
inference:
models:
- yolov5m_vehicles
- scdepthv3
- license_plate_det
- plate_recognition
allow_register_model: true
events:
publish:
- parking/vehicles
- parking/plates
- parking/alerts
network:
mode: host
env:
- name: STREAM_ID
value: "sub"
- name: HD_PREVIEW_ENABLED
value: "0"
With HD_PREVIEW_ENABLED=0, the page uses the app's own MJPEG /stream preview. On current shipping firmware, the platform H.264 address may listen only on an internal loopback address; an old manifest with 1 can therefore show a black preview in an external browser.
4. Install, start, and open the page
4.1 Install
In the Web Console, open App Management, import the extracted app.yaml and parking-lot-image.tar, then click Install.
You can also use the installation command from the repository README on an authenticated device terminal:
aipc-cli app install app.yaml parking-lot-image.tar
4.2 Start
After installation, open App Management → Installed Apps, find parking_lot, and click Start. Wait for Running before verifying; an installed container is not proof that the inference pipeline is working.
4.3 Open the Web UI
Open this URL from a browser that can reach the device:
http://<deviceIP>:8090
On success you should see Parking Lot Monitor, a live preview, and model statistics. If the page loads but the preview is black, first confirm HD_PREVIEW_ENABLED is 0, then check that http://<deviceIP>:8090/stream returns an MJPEG stream.
5. Verify the result
5.1 Verify the page and vehicle detection
- Refresh
http://<deviceIP>:8090and wait for the page to finish loading. - Confirm that the preview shows the real camera feed.
- Confirm that
Active Modelslists all four models. - Point the camera at vehicles and watch the vehicle boxes, the
VEHICLEScount, and the statistics.
FPS, inference latency, and detection counts vary with the scene, firmware, and device load; they are not fixed performance guarantees.

5.2 Verify the Event Bus
Subscribe to the parking topics on the device:
aipc-cli event subscribe 'parking/*'
Point the camera at vehicles and first confirm parking/vehicles; its payload should include vehicle boxes and confidence values. parking/plates appears only when the frame contains a clear plate that meets the model conditions, and parking/alerts appears only when depth analysis triggers an anti-spoof condition. No message on those two topics does not by itself mean that the models failed to start.
5.3 Check status and logs
In the app details page, confirm Running and inspect the app logs. Check for:
- successful registration of all four models;
- recurring media capture failures, model timeouts, or
Pipeline errormessages; - unexpected app restarts;
- a scene that actually meets the plate or anti-spoof trigger condition when the page has video but no corresponding event.
6. Related docs
- SDK Workflow — app layout, permissions, and build flow
- App Reference —
app.yamlpermissions, lifecycle, and container constraints - Event Integration — WebSocket, MQTT, and HTTP integration
- Version Compatibility Matrix — OS, platform, SDK, and model environment
- Person Detection — single-model inference and event publishing example