Blog

Frigate sans Coral : la détection d'objets sur le GPU Intel avec OpenVINO

Nous avons fait tourner Frigate 0.18 avec 1, 4 et 8 caméras sur un serveur cloud avec un Intel UHD 770 partagé : avec OpenVINO et le décodage vidéo sur le GPU, 8 caméras très animées ont utilisé 1 vCPU au lieu de 3,9, et Frigate a analysé 57 % d'objets de plus par seconde. Comment relier vos caméras en toute sécurité, et ce que cela coûte par rapport à un Coral.

Frigate sans Coral : la détection d’objets sur le GPU Intel avec OpenVINO

Frigate est l’enregistreur vidéo (NVR) open source qu’adorent les utilisateurs de Home Assistant : il surveille vos caméras et sait distinguer une personne d’une voiture, d’un chat ou d’une ombre. Pendant des années, le conseil était « achetez un Google Coral » pour faire tourner son détecteur d’objets. Aujourd’hui, Frigate fait aussi tourner son détecteur avec OpenVINO sur un GPU Intel, et il peut décoder la vidéo sur ce même GPU avec VA-API.

Nous nous sommes donc posé une question simple : sur un serveur cloud avec un GPU Intel partagé, qu’apporte vraiment le GPU à Frigate ? Nous avons fait tourner les mêmes caméras sur le même serveur, avec le travail sur le GPU, puis sur le CPU seul, avec 1, 4 et 8 caméras.

Un carrefour vu par Frigate, avec un cadre autour de chaque personne et de chaque voiture trouvée par le détecteur OpenVINO sur le GPU
Ce que voit le détecteur : chaque cadre est une personne ou une voiture trouvée par OpenVINO sur le GPU, avec son score. Image tirée de l'API de Frigate (latest.jpg?bbox=1). Vidéo : RG72, Wikimedia Commons, CC BY-SA 4.0.

Les résultats en bref

  • Le GPU libère le CPU. Avec le décodage et la détection sur le GPU, Frigate a utilisé 0,57 vCPU pour 1 caméra, 0,90 pour 4 et 1,04 pour 8. Avec tout sur le CPU, il a utilisé 2,16 vCPU pour 1 caméra, et les 4 vCPU du serveur étaient pleins (96 à 97 %) dès 4 caméras.
  • Plus de détection quand ça s’anime. Avec 8 caméras très animées, le détecteur sur GPU a analysé 168 objets par seconde contre 107 sur le CPU (+57 %), et Frigate a analysé 62 % des images contre 44 %.
  • Le temps de détection par image est proche. OpenVINO a mis environ 5,6 à 6,7 ms par inférence sur le GPU et 7,2 à 10,8 ms sur le CPU dans la plupart des essais. Le vrai gain n’est pas la vitesse : c’est que le CPU reste libre.
  • Le décodage vidéo sur le GPU a coûté environ 1,7 % d’un cœur par caméra 1080p, contre environ 12 % quand le CPU décode. Huit flux 1080p ont utilisé environ un quart du moteur vidéo du GPU.
  • Pas besoin de Coral. Un seul serveur cloud avec le GPU a géré 8 caméras de rue très animées, avec 3 vCPU encore libres.

Configuration du test

ÉlémentValeur
ServeurDebian 13, Linux 7.3, Intel UHD 770 (GPU partagé), 4 vCPU, 12 Go de RAM
Frigate0.18.2 (image Docker officielle ghcr.io/blakeblackshear/frigate:stable), --device /dev/dri
Détecteurtype: openvino, device: GPU ou device: CPU, modèle SSDLite MobileNet v2 300×300 fourni dans l’image
Décodagehwaccel_args: preset-vaapi (GPU) ou sans accélération matérielle (CPU)
Caméras1, 4 ou 8 flux RTSP, H.264 1920×1080 à 25 i/s, 4 Mbit/s chacun, servis par MediaMTX sur le même serveur
Vidéoextraits en boucle de carrefours animés, tirés de Wikimedia Commons (licences dans les légendes)
Réglages Frigatedétection en 1280×720 à 5 i/s par caméra, objets : personne, voiture, vélo, moto, bus, camion, sans enregistrement
Mesures60 s de mise en route, puis 90 s ; CPU de tout le serveur via /proc/stat, /api/stats de Frigate toutes les 5 s, moteurs du GPU via le noyau (DRM fdinfo)

Les chiffres CPU sont en vCPU (1,00 = un cœur entier sur les 4). Les « objets analysés par seconde » sont le detection_fps de Frigate : le nombre de zones d’image passées dans le détecteur chaque seconde, toutes caméras confondues.

Nos extraits sont un cas difficile : des carrefours en ville où piétons et voitures bougent sans arrêt, si bien que Frigate fait tourner le détecteur sur 10 à 20 zones par image. Une allée de garage ou l’entrée d’un magasin, immobile la plupart du temps, demande beaucoup moins de détection.

1. Le CPU du serveur : la principale différence

Graphique en barres : CPU du serveur utilisé par Frigate avec 1, 4 et 8 caméras, tout sur le GPU contre tout sur le CPU
CPU de tout le serveur, en vCPU sur 4. Avec le décodage et la détection sur le GPU (vert), 8 caméras utilisent environ 1 vCPU. Sur le CPU seul (orange), le serveur est plein dès 4 caméras.
CamérasTout sur le GPUDétecteur GPU, décodage CPUDétecteur CPU, décodage GPUTout sur le CPU
10,57 vCPU (14 %)0,40 vCPU (10 %)2,80 vCPU (70 %)2,16 vCPU (54 %)
40,90 vCPU (23 %)1,23 vCPU (31 %)3,83 vCPU (96 %)3,84 vCPU (96 %)
81,04 vCPU (26 %)1,68 vCPU (42 %)3,85 vCPU (96 %)3,89 vCPU (97 %)

C’est le détecteur qui remplit le CPU. Quand OpenVINO tourne sur le CPU, le processus détecteur de Frigate à lui seul a utilisé 2,4 à 3,1 cœurs ; sur le GPU, il a utilisé 0,1 à 0,3 cœur. Le décodage vidéo vient en second : chaque flux 1080p coûtait environ 12 % d’un cœur quand le CPU le décodait, et 1,7 % avec VA-API. Avec une seule caméra, l’écart entre décodage GPU et CPU reste dans le bruit de mesure ; à partir de 4 caméras, VA-API économise une part visible du CPU.

2. Combien de détection le serveur peut-il faire ?

Graphique en barres : objets analysés par le détecteur de Frigate par seconde avec 1, 4 et 8 caméras, tout sur le GPU contre tout sur le CPU
Zones d'image analysées par le détecteur chaque seconde, toutes caméras confondues. Avec 8 caméras, le GPU en fait 168 par seconde, le CPU 107 en occupant tout le serveur.
CamérasObjets analysés / sImages analysées / reçuesTemps d’inférence
1Tout sur le GPU53,75,0 / 5,06,7 ms
1Tout sur le CPU56,85,0 / 5,18,3 ms
4Tout sur le GPU114,611,7 / 20,18,5 ms
4Détecteur GPU, décodage CPU173,417,8 / 20,15,6 ms
4Tout sur le CPU127,513,3 / 20,27,2 ms
8Tout sur le GPU167,925,1 / 40,35,8 ms
8Tout sur le CPU106,817,8 / 40,49,1 ms

Avec une caméra, les deux modes suivent toutes les images. Avec 4 et 8 caméras très animées, le détecteur unique de Frigate devient la limite : quand il est plein, Frigate saute des images (il continue de suivre les objets, mais les regarde moins souvent). Sur le GPU, le détecteur a plafonné à environ 165 à 175 objets par seconde ; sur le CPU, il a atteint 107 à 136 en occupant tout le serveur.

Soyons honnêtes sur un résultat : l’essai « 4 caméras, tout sur le GPU » est sorti plus lent (8,5 ms par inférence, 115 objets par seconde) que l’essai avec décodage sur le CPU (5,6 ms, 173 par seconde). Le GPU est partagé avec d’autres serveurs et le temps d’inférence a varié entre 5,6 et 11,6 ms sur le GPU au fil de nos essais : lisez donc les chiffres de débit comme des ordres de grandeur, pas comme des limites exactes. Les chiffres CPU ne changent rien à ce constat : sur le CPU, le serveur est toujours plein.

Page Système de Frigate : vitesse d'inférence du détecteur 5,73 ms, CPU du détecteur 27,5 %, utilisation du GPU 82 %, décodeur GPU 10,5 %
La page Système de Frigate avec 4 caméras sur le GPU : 5,7 ms par inférence, le processus détecteur utilise 27,5 % d'un cœur, et le décodeur du GPU environ 10 %.
La vue en direct de Frigate avec quatre caméras de rue, chacune affichant des icônes personne et voiture pour les objets suivis
La vue en direct avec 4 caméras. Les icônes dans les coins montrent ce que suit chaque caméra (personnes, voitures). Vidéos : RG72, Wikimedia Commons, CC BY-SA 4.0.

3. Relier vos caméras à un Frigate dans le cloud

Frigate dans le cloud doit lire le flux RTSP de chaque caméra, chez vous ou au bureau. Il y a trois façons de faire, et seule la première devrait être votre choix par défaut.

Recommandé : un VPN (Tailscale ou WireGuard), rien d’ouvert

Installez Tailscale (ou simplement WireGuard) sur un petit appareil toujours allumé, sur le même réseau que les caméras : un Raspberry Pi, un NAS ou un routeur compatible WireGuard. Cet appareil devient un subnet router : il permet au serveur cloud d’atteindre le réseau local par un tunnel chiffré. Frigate utilise alors les adresses locales des caméras, comme s’il était chez vous, et aucun port n’est ouvert sur votre box.

# sur le Raspberry Pi / NAS à la maison (ici, le réseau des caméras est 192.168.1.0/24)
echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-tailscale.conf && sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
sudo tailscale up --advertise-routes=192.168.1.0/24
# approuvez la route dans la console d'administration Tailscale, puis sur le serveur cloud :
sudo tailscale up --accept-routes
# Frigate, sur le serveur cloud : la caméra garde son adresse locale
cameras:
  entrance:
    ffmpeg:
      inputs:
        - path: rtsp://frigate:<camera-password>@192.168.1.50:554/stream1
          roles: [detect, record]

La vidéo est chiffrée de bout en bout, la caméra n’est jamais exposée à Internet, et vous pouvez ouvrir la page web de Frigate depuis votre téléphone via le même tailnet. Nous présentons Tailscale plus en détail dans Jouer sur votre serveur cloud de n’importe où avec Moonlight et Tailscale.

Possible : une redirection de port sur la box, avec des limites strictes

Vous pouvez aussi rediriger un port de votre box vers la caméra et donner à Frigate une adresse comme rtsp://user:password@<your-public-ip>:8554/stream1. Cela fonctionne, mais connaissez les risques :

  • Le RTSP n’est généralement pas chiffré. La vidéo, et avec certaines caméras le mot de passe, traversent Internet en clair.
  • Le firmware des caméras bon marché est une cible classique des botnets. Une caméra exposée est scannée en quelques heures.

Si vous choisissez cette voie, ces précautions sont obligatoires :

  • Sur la box, n’autorisez le port redirigé que depuis l’adresse IP du serveur. Nos serveurs ont une adresse IP fixe, et c’est ce qui rend cette solution acceptable. Si votre box ne sait pas filtrer par adresse source, passez plutôt par le VPN.
  • Un mot de passe solide, propre à la caméra, jamais celui par défaut.
  • Du RTSPS (RTSP sur TLS) si la caméra le gère.
  • Un firmware à jour.

Jamais : une caméra ouverte à tout Internet

Une caméra joignable par n’importe qui, avec ou sans mot de passe, c’est ainsi que des vidéos privées finissent sur des sites publics et que des caméras finissent dans des botnets. Ne le faites pas, même « juste pour un test ».

Ce que cela coûte en bande passante et côté juridique

  • Débit montant : chaque caméra envoie son flux en permanence, en général 1 à 4 Mbit/s en 1080p H.264. Nos flux de test faisaient 4 Mbit/s chacun, donc 8 d’entre eux demanderaient 32 Mbit/s en montant. La fibre le supporte ; une ADSL lente, non. Si le débit montant est juste, utilisez le second flux basse résolution de la caméra pour la détection et gardez l’enregistrement en pleine qualité sur la carte SD de la caméra.
  • Données personnelles : la vidéo de personnes est une donnée personnelle. Pour une entreprise qui filme son personnel ou ses clients, le RGPD s’applique (panneaux d’information, durée de conservation limitée, contrat avec l’hébergeur). Nos serveurs sont dans l’UE.

4. Coral et mini PC, ou serveur au mois ?

Coral + mini PC à la maisonServeur cloud avec GPU
Coûtachat unique : un mini PC autour de 150 à 250 €, un Coral USB autour de 60 à 80 €, un disque, plus environ 10 W d’électricité toute l’année14,99 € HT par mois (iGPU Start) ou 29,99 € (iGPU Power)
Sur 3 ansenviron 300 à 400 € avec l’électricité540 € (Start) à 1 080 € (Power) HT
Débit montantaucun, la vidéo reste à la maison1 à 4 Mbit/s par caméra, en permanence
Copie hors sitenon : un cambrioleur peut emporter l’enregistreuroui : les enregistrements sont loin des caméras
Plusieurs sitesun boîtier par site, ou un VPN entre euxun seul Frigate pour tous les sites
Maintenancevotre matériel, votre disque, vos coupures de courantnous faisons tourner le serveur ; vous gérez Frigate

Les prix du Coral et du mini PC sont des prix courants au moment de l’écriture ; vérifiez-les avant d’acheter. Un mini PC Intel récent (N100 et similaires) peut aussi faire tourner OpenVINO sur son propre GPU, sans Coral.

Le matériel à la maison vous convient si vous avez déjà un serveur à la maison, un débit montant faible, ou si vous voulez que la vidéo ne quitte jamais la maison. Un serveur cloud vous convient si vous n’avez pas de serveur à la maison (ou un Raspberry Pi ou un NAS trop faible pour la détection), si vous voulez des enregistrements stockés loin des caméras, si vous gérez plusieurs sites (magasins, bureaux, maison de vacances), ou si vous voulez Frigate et Home Assistant accessibles de partout sans ouvrir votre réseau domestique.

5. Quelle offre ?

Avec le décodage et la détection sur le GPU, Frigate a utilisé environ 1 vCPU pour 8 caméras très animées.

  • iGPU Start (2 vCPU, 8 Go de RAM, Perf 1, 14,99 € HT par mois) : une maison ou un petit commerce avec 1 à 4 caméras, avec Home Assistant à côté.
  • iGPU Power (4 vCPU, 14 Go de RAM, Perf 2 = deux fois la part GPU de Start, 29,99 €) : 4 à 8 caméras, des scènes animées, l’enregistrement sur le serveur, ou plusieurs sites. C’est la taille que nous avons testée.
  • iGPU Pro (6 vCPU, 14 Go, Perf 3, 44,99 €) : plus de caméras, ou Frigate plus d’autres travaux GPU (Immich, transcodage) sur le même serveur.

Sans le GPU, les mêmes 4 vCPU étaient pleins dès 4 caméras : il vous faudrait un serveur bien plus gros pour faire le même travail sur le CPU.

6. La mise en place sur un serveur Linux GPU

Envie d’un serveur prêt à l’emploi ? Demandez-le par e-mail à la commande (contact@linuxgpu.eu) : nous pouvons vous livrer le serveur avec Frigate déjà installé, OpenVINO et VA-API sur le GPU, et Tailscale prêt à se connecter à vos caméras.

Pour le faire vous-même sur Debian 13 avec Docker :

docker run -d --name frigate --restart unless-stopped --shm-size=512m \
  --device /dev/dri \
  -v /srv/frigate/config:/config -v /srv/frigate/media:/media/frigate \
  --tmpfs /tmp/cache:size=1g -p 8971:8971 \
  ghcr.io/blakeblackshear/frigate:stable
# /srv/frigate/config/config.yml
mqtt:
  enabled: false        # ou le broker MQTT de votre Home Assistant
ffmpeg:
  hwaccel_args: preset-vaapi   # décodage sur le GPU
detectors:
  ov:
    type: openvino
    device: GPU                # détection sur le GPU
model:
  width: 300
  height: 300
  input_tensor: nhwc
  input_pixel_format: bgr
  path: /openvino-model/ssdlite_mobilenet_v2.xml
  labelmap_path: /openvino-model/coco_91cl_bkgr.txt
cameras:
  entrance:
    ffmpeg:
      inputs:
        - path: rtsp://frigate:<camera-password>@192.168.1.50:554/stream1
          roles: [detect]
    detect:
      enabled: true
      width: 1280
      height: 720
      fps: 5

Récupérez le mot de passe admin avec docker logs frigate 2>&1 | grep -i password, puis ouvrez https://<server>:8971 (mieux : uniquement via Tailscale). Sur la page Système, le détecteur doit afficher un temps d’inférence de quelques millisecondes et le GPU doit apparaître dans la liste.

Pour Frigate à côté d’Immich sur le même serveur, avec des fichiers Docker Compose, lisez Auto-héberger Immich et Frigate avec OpenVINO sur un VPS GPU.

Essayer

Voir les offres : iGPU Start coûte 14,99 € et iGPU Power 29,99 € HT par mois.