202 lines
6.0 KiB
Markdown
202 lines
6.0 KiB
Markdown
# Frigate on Raspberry Pi 5 with a USB Google Coral
|
||||
|
|
|
|||
|
|
A ready-to-use Frigate NVR deployment for a Raspberry Pi 5 using a USB Google
|
|||
|
|
Coral EdgeTPU for hardware-accelerated object detection.
|
|||
|
|
|
|||
|
|
Based on the official Frigate documentation: https://docs.frigate.video/
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## What's in this folder
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
frigate/
|
|||
|
|
├── docker-compose.yml # Container definition (USB Coral passthrough, ports, volumes)
|
|||
|
|
├── config/
|
|||
|
|
│ └── config.yml # Frigate configuration (detector, cameras, recording)
|
|||
|
|
├── storage/ # Recordings, snapshots, and exports live here
|
|||
|
|
└── README.md # This file
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Before you start — hardware notes
|
|||
|
|
|
|||
|
|
- **Power the Pi properly.** Use the official 27W USB-C supply for the Pi 5.
|
|||
|
|
- **The USB Coral is power-hungry.** If you also attach a USB SSD or other USB
|
|||
|
|
devices, the Pi may not supply enough power and you'll get instability. Use a
|
|||
|
|
**powered external USB hub** in that case.
|
|||
|
|
- **Plug the Coral into a USB 3.0 (blue) port**, ideally through the powered hub.
|
|||
|
|
- **No hardware video decode on the Pi 5.** Unlike the Pi 4, the Pi 5 does not
|
|||
|
|
expose a `/dev/video11` decoder for Frigate, so camera decoding runs on the
|
|||
|
|
CPU. Keep camera count and detect resolution modest, and use camera
|
|||
|
|
**substreams** for the detect role (the included config already does this).
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Step 1 — Prepare the OS
|
|||
|
|
|
|||
|
|
Use a **64-bit** Debian-based OS (Raspberry Pi OS 64-bit, Bookworm or Trixie).
|
|||
|
|
Flash it, boot, then update:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
sudo apt update && sudo apt full-upgrade -y
|
|||
|
|
sudo reboot
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Step 2 — Install Docker and Docker Compose
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl -fsSL https://get.docker.com -o get-docker.sh
|
|||
|
|
sudo sh get-docker.sh
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Add your user to the `docker` group so you don't need `sudo` each time:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
sudo usermod -aG docker $USER
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Log out and back in (or reboot) for the group change to apply, then verify:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
docker --version
|
|||
|
|
docker compose version
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Step 3 — Connect and verify the USB Coral
|
|||
|
|
|
|||
|
|
Plug the Coral in (USB 3.0 port, powered hub if you have other USB devices).
|
|||
|
|
The Frigate container ships with the EdgeTPU libraries built in, so you do **not**
|
|||
|
|
need to install any Coral runtime on the host — passing `/dev/bus/usb` into the
|
|||
|
|
container (already configured in `docker-compose.yml`) is enough.
|
|||
|
|
|
|||
|
|
Confirm the host sees it:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
lsusb
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
A freshly plugged Coral appears as `Global Unichip Corp.`; after it runs
|
|||
|
|
inference once it re-enumerates as `Google Inc.`. Either is fine.
|
|||
|
|
|
|||
|
|
## Step 4 — Put these files on the Pi
|
|||
|
|
|
|||
|
|
Copy this entire `frigate/` folder to the Pi (e.g. to your home directory so it
|
|||
|
|
lives at `~/frigate`). You can use `scp`, a USB stick, or `git`.
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd ~/frigate
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Step 5 — Set your shm-size (shared memory)
|
|||
|
|
|
|||
|
|
Frigate stores decoded frames in shared memory. Calculate the minimum per camera
|
|||
|
|
using your **detect** resolution (this example is 720p, including logs):
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
python3 -c 'print("{:.2f}MB".format((1280 * 720 * 1.5 * 20 + 270480) / 1048576 + 40))'
|
|||
|
|
# ~66.63MB for one 720p camera
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Multiply the per-camera portion by your number of cameras and add ~40MB for
|
|||
|
|
logs. The provided `docker-compose.yml` uses `512mb`, which comfortably covers
|
|||
|
|
several cameras. Adjust the `shm_size` value if needed.
|
|||
|
|
|
|||
|
|
## Step 6 — Edit the config for your cameras
|
|||
|
|
|
|||
|
|
Open `config/config.yml` and update:
|
|||
|
|
|
|||
|
|
- **Camera RTSP URLs** — replace `user`, `password`, IP, and stream paths with
|
|||
|
|
your camera's real values. The RTSP path format varies by manufacturer.
|
|||
|
|
- **`detect` width/height** — must match the resolution of the stream assigned
|
|||
|
|
the `detect` role.
|
|||
|
|
- **MQTT** — set `enabled: true` and fill in the host if you use Home Assistant.
|
|||
|
|
|
|||
|
|
Also change `FRIGATE_RTSP_PASSWORD` in `docker-compose.yml` from `password` to
|
|||
|
|
something of your own.
|
|||
|
|
|
|||
|
|
## Step 7 — Start Frigate
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd ~/frigate
|
|||
|
|
docker compose up -d
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Follow the logs to confirm a clean startup and that the Coral was found:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
docker logs -f frigate
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Look for the EdgeTPU being detected and an inference speed (typically ~8–15ms on
|
|||
|
|
a USB Coral). Press `Ctrl+C` to stop following the logs.
|
|||
|
|
|
|||
|
|
## Step 8 — Open the web UI
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
https://<your-pi-ip>:8971
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
On first launch Frigate creates an admin account. Check the container logs for
|
|||
|
|
the initial password, log in, and change it.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Verifying the Coral is actually being used
|
|||
|
|
|
|||
|
|
In the web UI, open the **System / Metrics** page. Your `coral` detector should
|
|||
|
|
be listed with an inference speed and a detection FPS. If the inference speed is
|
|||
|
|
very high (hundreds of ms), detection is running on CPU and the Coral is not
|
|||
|
|
being used properly — see troubleshooting below.
|
|||
|
|
|
|||
|
|
## Troubleshooting: Coral not detected
|
|||
|
|
|
|||
|
|
Try these in order:
|
|||
|
|
|
|||
|
|
1. Restart the container: `docker compose restart`
|
|||
|
|
2. Unplug/replug the Coral, then restart.
|
|||
|
|
3. Use a **powered USB hub** if other USB devices are attached — power
|
|||
|
|
starvation is the most common cause of instability on the Pi.
|
|||
|
|
4. Try a different USB port; prefer USB 3.0 (blue).
|
|||
|
|
5. Confirm `lsusb` shows the Global Unichip or Google device.
|
|||
|
|
|
|||
|
|
Official EdgeTPU troubleshooting: https://docs.frigate.video/troubleshooting/edgetpu
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Updating Frigate later
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd ~/frigate
|
|||
|
|
docker compose pull
|
|||
|
|
docker compose up -d
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Useful commands
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
docker compose up -d # start (detached)
|
|||
|
|
docker compose down # stop and remove the container
|
|||
|
|
docker compose restart # restart
|
|||
|
|
docker logs -f frigate # follow logs
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Ports reference
|
|||
|
|
|
|||
|
|
| Port | Purpose |
|
|||
|
|
|------|----------------------------------------------------|
|
|||
|
|
| 8971 | Authenticated web UI + API (use this) |
|
|||
|
|
| 5000 | Internal unauthenticated UI/API (expose carefully) |
|
|||
|
|
| 8554 | RTSP restreaming |
|
|||
|
|
| 8555 | WebRTC (two-way talk), TCP + UDP |
|
|||
|
|
|
|||
|
|
## Documentation
|
|||
|
|
|
|||
|
|
- Installation: https://docs.frigate.video/frigate/installation
|
|||
|
|
- Object detectors (Coral): https://docs.frigate.video/configuration/object_detectors
|
|||
|
|
- Full config reference: https://docs.frigate.video/configuration/reference
|
|||
|
|
- Camera setup: https://docs.frigate.video/frigate/camera_setup
|