<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Détection D'objets on Boris Dupoux</title><link>https://borisdupoux.com/fr/tags/d%C3%A9tection-dobjets/</link><description>Recent content in Détection D'objets on Boris Dupoux</description><generator>Hugo -- gohugo.io</generator><language>fr</language><lastBuildDate>Thu, 01 Jan 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://borisdupoux.com/fr/tags/d%C3%A9tection-dobjets/index.xml" rel="self" type="application/rss+xml"/><item><title>Analyse vidéo géolocalisée et mesure des distances entre objets</title><link>https://borisdupoux.com/fr/research/video-geolocation/</link><pubDate>Thu, 01 Jan 2026 00:00:00 +0000</pubDate><guid>https://borisdupoux.com/fr/research/video-geolocation/</guid><description>&lt;h2 id="contexte"&gt;&lt;a href="#contexte" class="header-anchor"&gt;&lt;/a&gt;Contexte
&lt;/h2&gt;&lt;p&gt;Les sites industriels sont souvent couverts par des caméras fixes dont les images ne sont consultées qu&amp;rsquo;après un incident et ne produisent aucune donnée exploitable. L&amp;rsquo;objectif était de transformer les caméras existantes, ainsi que des prises de vue ponctuelles par drone, en instrument de mesure : pour chaque objet détecté, une position en latitude/longitude et des distances métriques plutôt qu&amp;rsquo;une boîte en pixels.&lt;/p&gt;
&lt;p&gt;La difficulté tient à trois raisons. Une caméra unique ne donne pas de profondeur, si bien que l&amp;rsquo;échelle de la scène doit être inférée. La méthode de géoréférencement habituelle, une homographie du plan du sol, suppose un sol plat et échoue silencieusement pour les objets surélevés ou les terrains irréguliers. Enfin, la vidéo haute résolution est coûteuse à traiter, et le raccourci courant consistant à réduire l&amp;rsquo;image à 640 px élimine le détail géométrique dont dépendent les positions au sol.&lt;/p&gt;
&lt;h2 id="approche"&gt;&lt;a href="#approche" class="header-anchor"&gt;&lt;/a&gt;Approche
&lt;/h2&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TB
 A["Source vidéo&lt;br/&gt;fichier · RTSP · séquence drone (jusqu'à 3840×2160)"] --&gt; B["Détecteur d'objets en résolution native&lt;br/&gt;détection · segmentation · pose · OBB"]
 A --&gt; C["Modèle de profondeur monoculaire métrique&lt;br/&gt;carte de profondeur"]
 B --&gt; D["Suivi multi-objets&lt;br/&gt;modèle de mouvement + association"]
 B --&gt; E["Profondeur par objet&lt;br/&gt;pixels du masque, rejet des aberrants"]
 C --&gt; E
 E --&gt; F["Lancer de rayon&lt;br/&gt;rayon pixel + profondeur métrique + pose caméra"]
 F --&gt; G["Position WGS84&lt;br/&gt;MNT optionnel pour l'altitude du sol"]
 E --&gt; H["Distances 3D&lt;br/&gt;entre masques · le long des trajectoires"]
 D --&gt; H
 G --&gt; I["Stockage SQLite&lt;br/&gt;détections · pistes · trajectoires GPS"]
 H --&gt; I
 I --&gt; J["Analyses&lt;br/&gt;zones · flux · superposition sur orthophoto"]&lt;/pre&gt;&lt;h2 id="méthodes"&gt;&lt;a href="#m%c3%a9thodes" class="header-anchor"&gt;&lt;/a&gt;Méthodes
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Détection.&lt;/strong&gt; Un détecteur de la famille YOLO, en plusieurs tailles de modèle, dans quatre modes (détection, segmentation, pose, boîtes orientées). L&amp;rsquo;inférence s&amp;rsquo;exécute en résolution native, sans &lt;code&gt;imgsz&lt;/code&gt; imposé. La segmentation est le mode par défaut, car les masques fournissent des échantillons de profondeur plus propres que les boîtes. Les poids PyTorch, ONNX, TensorRT et CoreML sont acceptés (CUDA et Apple MPS).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Profondeur monoculaire.&lt;/strong&gt; Un modèle de profondeur monoculaire métrique prédit une carte de profondeur, rééchantillonnée à la taille de l&amp;rsquo;image. La profondeur de chaque objet est une estimation robuste sur les pixels de son masque, après rejet des valeurs aberrantes. Une étape de validation compare la profondeur prédite à des zones de référence dont la distance est connue, afin de détecter une dérive de calibration.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Géolocalisation par lancer de rayon.&lt;/strong&gt; Un rayon est lancé depuis le centre de la caméra à travers le pixel de l&amp;rsquo;objet et arrêté à la profondeur métrique de celui-ci. Le point obtenu est converti du repère caméra vers un repère local Nord-Est-Bas, puis en WGS84. Contrairement à une homographie, cette méthode ne suppose pas un sol plat. Un MNT optionnel fournit l&amp;rsquo;altitude du sol. Les positions peuvent être superposées à une orthophoto géoréférencée pour un contrôle visuel.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Suivi.&lt;/strong&gt; Un module de suivi multi-objets sur mesure, avec un modèle de mouvement, une association tenant compte de la confiance et une étape de fusion des pistes qui relie les fragments selon des seuils d&amp;rsquo;intervalle, de cap et de vitesse. Lorsque la profondeur est disponible, chaque piste conserve une trajectoire 3D, dont sont déduites la distance parcourue et la vitesse en m/s.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Distances entre objets.&lt;/strong&gt; Fonction consolidée ultérieurement dans une bibliothèque de vision réutilisable. Deux objets segmentés sont rétroprojetés en 3D, et la distance minimale point à point est retournée. Des masques qui se chevauchent sont considérés comme en contact. Une simulation de Monte-Carlo perturbe la profondeur, la focale et les positions des pixels pour fournir un écart-type et un intervalle à 95 %. L&amp;rsquo;appartenance à une zone repose sur la part du masque située dans la zone, avec hystérésis, plutôt que sur un test du point central.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ingénierie.&lt;/strong&gt; La configuration permet une répartition sur deux GPU (détection sur un périphérique, estimation de la profondeur sur l&amp;rsquo;autre), la découverte et l&amp;rsquo;enregistrement de flux RTSP, ainsi que le traitement de plusieurs caméras en parallèle.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="résultats"&gt;&lt;a href="#r%c3%a9sultats" class="header-anchor"&gt;&lt;/a&gt;Résultats
&lt;/h2&gt;&lt;p&gt;Mesures effectuées sur une seule NVIDIA RTX 5090. Le banc d&amp;rsquo;essai de détection ne couvre que la détection et le suivi, profondeur désactivée.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Configuration&lt;/th&gt;
					&lt;th&gt;Vidéo&lt;/th&gt;
					&lt;th&gt;Débit&lt;/th&gt;
					&lt;th&gt;Sortie&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Plus gros détecteur, batch 1&lt;/td&gt;
					&lt;td&gt;3840×2160, 50 fps, 3 301 images&lt;/td&gt;
					&lt;td&gt;5,1 fps&lt;/td&gt;
					&lt;td&gt;320 217 détections, 1 941 pistes&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Plus petit détecteur, batch 1&lt;/td&gt;
					&lt;td&gt;3840×2160, 50 fps&lt;/td&gt;
					&lt;td&gt;13,0 fps&lt;/td&gt;
					&lt;td&gt;158 989 détections, 908 pistes&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Plus gros détecteur, batch 1&lt;/td&gt;
					&lt;td&gt;2304×1296, 15 fps, 5 000 images&lt;/td&gt;
					&lt;td&gt;17,9 fps&lt;/td&gt;
					&lt;td&gt;73 502 détections, 2 706 pistes&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Plus petit détecteur, batch 1&lt;/td&gt;
					&lt;td&gt;2304×1296, 15 fps&lt;/td&gt;
					&lt;td&gt;39,0 fps&lt;/td&gt;
					&lt;td&gt;51 890 détections, 1 499 pistes&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Chaîne complète (détection + profondeur + suivi + stockage)&lt;/td&gt;
					&lt;td&gt;2304×1296, 300 images&lt;/td&gt;
					&lt;td&gt;2,02 fps&lt;/td&gt;
					&lt;td&gt;12,3 détections par image&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Sur l&amp;rsquo;exécution de la chaîne complète, l&amp;rsquo;estimation de la profondeur a pris 117,6 s sur 148,3 s au total (environ 80 %), et la détection 20,9 s. Le goulot d&amp;rsquo;étranglement est l&amp;rsquo;estimation de la profondeur, et non le détecteur. Sur des vidéos 4K, le plus gros détecteur tourne environ dix fois plus lentement que le temps réel. Cela convient à l&amp;rsquo;usage visé, à savoir l&amp;rsquo;analyse d&amp;rsquo;archives enregistrées et non l&amp;rsquo;alerte en direct.&lt;/p&gt;
&lt;h2 id="limites--suite"&gt;&lt;a href="#limites--suite" class="header-anchor"&gt;&lt;/a&gt;Limites &amp;amp; suite
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Aucune précision de géolocalisation n&amp;rsquo;a encore été mesurée par rapport à une vérité terrain levée. L&amp;rsquo;étape de lancer de rayon a été ajoutée après les mesures de temps ci-dessus ; son coût n&amp;rsquo;y est donc pas inclus.&lt;/li&gt;
&lt;li&gt;L&amp;rsquo;échelle métrique dépend du modèle de profondeur ainsi que de la pose et des paramètres intrinsèques de la caméra. Les erreurs d&amp;rsquo;inclinaison ou de focale se répercutent directement sur les positions au sol.&lt;/li&gt;
&lt;li&gt;Le modèle de profondeur prédit à sa propre résolution interne : le détail fin de la profondeur reste limité, même lorsque la détection s&amp;rsquo;exécute en 4K.&lt;/li&gt;
&lt;li&gt;Suite : une étude de précision avec des cibles levées au GNSS, le profilage de la répartition sur deux GPU, et la mesure de la justesse des intervalles de distance Monte-Carlo sur des objets à écartements connus.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="stack-technique"&gt;&lt;a href="#stack-technique" class="header-anchor"&gt;&lt;/a&gt;Stack technique
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Python&lt;/code&gt; · &lt;code&gt;PyTorch&lt;/code&gt; · &lt;code&gt;OpenCV&lt;/code&gt; · &lt;code&gt;NumPy&lt;/code&gt; · &lt;code&gt;SciPy&lt;/code&gt; · &lt;code&gt;pyproj&lt;/code&gt; · &lt;code&gt;rasterio&lt;/code&gt; · &lt;code&gt;SQLite&lt;/code&gt; · &lt;code&gt;CUDA&lt;/code&gt; · &lt;code&gt;Apple MPS&lt;/code&gt;&lt;/p&gt;</description></item></channel></rss>