<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Vision 3D on Boris Dupoux</title><link>https://borisdupoux.com/fr/categories/vision-3d/</link><description>Recent content in Vision 3D on Boris Dupoux</description><generator>Hugo -- gohugo.io</generator><language>fr</language><lastBuildDate>Thu, 01 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://borisdupoux.com/fr/categories/vision-3d/index.xml" rel="self" type="application/rss+xml"/><item><title>De la vidéo tournée à la main à la photogrammétrie et au Gaussian Splatting</title><link>https://borisdupoux.com/fr/research/photogrammetry-splatting/</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate><guid>https://borisdupoux.com/fr/research/photogrammetry-splatting/</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 intérieurs sont souvent documentés avec une caméra sur stabilisateur
tenue à la main plutôt qu&amp;rsquo;avec un scanner de qualité topographique. L&amp;rsquo;objectif était
de transformer ces vidéos en livrables 3D exploitables (nuage dense, maillage texturé,
orthovues en plan et en élévation, scène Gaussian Splatting et exports web légers),
sans aucune étape manuelle entre la captation et le résultat.
La chaîne de traitement s&amp;rsquo;exécute nativement sous Windows sur une RTX 5090 (Blackwell, sm_120)
&lt;strong&gt;partagée avec d&amp;rsquo;autres charges GPU de longue durée&lt;/strong&gt; ; elle ne doit donc jamais les préempter.&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["inbox/projet/vidéos + fichier GO"] --&gt; B["Extraction d'images clés&lt;br/&gt;recouvrement par flot optique + netteté"]
 B --&gt; C["SfM COLMAP 4.2.1&lt;br/&gt;SIFT, mapper global"]
 C --&gt; D{"Contrôle qualité : enregistrement, reprojection,&lt;br/&gt;continuité de trajectoire"}
 D -- échec --&gt; C2["Repli : mapper incrémental"] --&gt; D
 D -- succès --&gt; E["OpenMVS 2.4 (build sm_120)&lt;br/&gt;densification, maillage, raffinement, texture"]
 E --&gt; F["Alignement ortho&lt;br/&gt;gravité, sol par RANSAC, lacet Manhattan"]
 F --&gt; G["Rendus Blender&lt;br/&gt;orthos, axonométries, orbite"]
 E --&gt; H["Entraînement gsplat&lt;br/&gt;stratégie MCMC ou par défaut"]
 G --&gt; I["Exports web&lt;br/&gt;Potree, GLB, SOG"]
 H --&gt; I
 I --&gt; J["outbox : livrables, report.json, STATUS"]&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;Sélection d&amp;rsquo;images clés guidée par le recouvrement.&lt;/strong&gt; Un suivi KLT associé à une
similitude estimée par RANSAC évalue le recouvrement avec la dernière image clé. Une
image est émise lorsque le recouvrement descend sous 0,80, que le suivi est perdu ou
qu&amp;rsquo;une limite de temps est atteinte. Le candidat le plus net (variance du laplacien)
est celui retenu.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SfM avec contrôle qualité explicite.&lt;/strong&gt; Le mapper global de COLMAP est rapide mais non
déterministe. Lors des essais, il a produit des reconstructions qui satisfaisaient les
critères d&amp;rsquo;enregistrement et de reprojection tout en étant géométriquement incohérentes.
Un contrôle de continuité de trajectoire (sauts supérieurs à 25 fois le pas médian de la
caméra) déclenche un repli automatique sur le mapper incrémental. En dessous de 20 points
par image, l&amp;rsquo;étape échoue.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fiabilisation du MVS.&lt;/strong&gt; Le binaire Windows officiel d&amp;rsquo;OpenMVS ne contient que des
noyaux sm_89 ; il a donc été recompilé pour sm_120. La ROI objet est désactivée pour
les pièces car elle rognait le nuage. Le raffinement est abandonné lorsqu&amp;rsquo;il diverge,
et le nivellement des coutures (qui noircissait des faces) est désactivé.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Orthovues prêtes pour la métrique.&lt;/strong&gt; L&amp;rsquo;axe vertical est déduit des orientations des
caméras. Un plan de sol estimé par RANSAC fixe z = 0 et un histogramme des azimuts des
normales aux murs (modulo 90°) fixe le lacet Manhattan. Une référence optionnelle à deux
points fixe l&amp;rsquo;échelle. La transformation 4×4 est conservée afin d&amp;rsquo;être réappliquée au
maillage et au splat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gaussian Splatting.&lt;/strong&gt; gsplat 1.6.0 a été compilé pour sm_120 avec CUDA 13 sous
MSVC, ce qui a nécessité des correctifs locaux. L&amp;rsquo;entraînement utilise la stratégie MCMC
avec un budget de gaussiennes et se replie sur la stratégie 3DGS par défaut lorsque MCMC diverge.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exploitation.&lt;/strong&gt; Les projets démarrent en mode dossier surveillé dès qu&amp;rsquo;un fichier GO
apparaît. Les étapes peuvent être reprises ou refaites. Une garde GPU attend qu&amp;rsquo;une
quantité suffisante de VRAM soit libre pendant une période stable, sérialise les étapes
GPU via un fichier verrou et enregistre le pic de VRAM par étape dans &lt;code&gt;report.json&lt;/code&gt;.
Un contrôle qualité dégradé produit un statut &lt;code&gt;DONE_WITH_ALERTS&lt;/code&gt; plutôt qu&amp;rsquo;un succès silencieux.&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;Premier déploiement réel : cinq emplacements dans un showroom commercial, une vidéo 4K
tournée à la main par emplacement, traitée sans intervention en environ 30 minutes par emplacement.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Emplacement&lt;/th&gt;
					&lt;th&gt;Images&lt;/th&gt;
					&lt;th&gt;SfM enregistrées / points / reproj.&lt;/th&gt;
					&lt;th&gt;Nuage dense&lt;/th&gt;
					&lt;th&gt;PSNR / SSIM du splat&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;1&lt;/td&gt;
					&lt;td&gt;116&lt;/td&gt;
					&lt;td&gt;116/116 · 21 458 · 1,49 px&lt;/td&gt;
					&lt;td&gt;1,40 M&lt;/td&gt;
					&lt;td&gt;23,2 / 0,86&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2&lt;/td&gt;
					&lt;td&gt;103&lt;/td&gt;
					&lt;td&gt;103/103 · 18 972 · 1,75 px&lt;/td&gt;
					&lt;td&gt;1,23 M&lt;/td&gt;
					&lt;td&gt;20,6 / 0,81&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;3&lt;/td&gt;
					&lt;td&gt;47&lt;/td&gt;
					&lt;td&gt;47/47 · 13 167 · 1,17 px&lt;/td&gt;
					&lt;td&gt;1,26 M&lt;/td&gt;
					&lt;td&gt;23,1 / 0,86&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;4&lt;/td&gt;
					&lt;td&gt;121&lt;/td&gt;
					&lt;td&gt;121/121 · 11 970 · 1,34 px&lt;/td&gt;
					&lt;td&gt;1,99 M&lt;/td&gt;
					&lt;td&gt;21,9 / 0,85 (stratégie par défaut)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;5&lt;/td&gt;
					&lt;td&gt;64&lt;/td&gt;
					&lt;td&gt;64/64 · 12 106 · 1,48 px&lt;/td&gt;
					&lt;td&gt;0,91 M&lt;/td&gt;
					&lt;td&gt;21,8 / 0,83&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Toutes les images ont été enregistrées pour chaque emplacement. L&amp;rsquo;erreur de reprojection était de 1,17–1,75 px.&lt;/li&gt;
&lt;li&gt;Pics de VRAM mesurés : SIFT +1,3 Go, appariement +1,6 Go, texturation +0,5 Go,
Blender +5,4 Go, et splatting avec 3 M de gaussiennes à 1920 px +25,2 Go.&lt;/li&gt;
&lt;li&gt;Le build OpenMVS sm_120 a densifié le test de validation rapide synthétique en 17 s. Le repli
CPU a pris environ 40 min.&lt;/li&gt;
&lt;li&gt;L&amp;rsquo;analyse des métadonnées a révélé des vitesses d&amp;rsquo;obturation de 1/50–1/100 s (environ
14 px de flou de bougé en 4K) ainsi qu&amp;rsquo;une sensibilité ISO et une balance des blancs
automatiques. La compensation d&amp;rsquo;exposition de gsplat (&lt;code&gt;ppisp&lt;/code&gt;) n&amp;rsquo;a apporté aucun gain
(PSNR 20,5 contre 20,6). La limite de qualité tient à la captation, pas au solveur.&lt;/li&gt;
&lt;/ul&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;Un PSNR d&amp;rsquo;à peine plus de 20 reflète le flou de bougé et l&amp;rsquo;exposition automatique. Le
protocole de captation impose désormais une vitesse d&amp;rsquo;obturation de 1/250–1/500 s, une
exposition et une balance des blancs verrouillées, ainsi qu&amp;rsquo;un passage dédié au sol.&lt;/li&gt;
&lt;li&gt;La fusion de vidéos provenant d&amp;rsquo;emplacements différents a provoqué de faux appariements
et un modèle incohérent ; chaque emplacement est donc traité séparément.&lt;/li&gt;
&lt;li&gt;Les sols carrelés sombres et brillants se reconstruisent mal. L&amp;rsquo;alignement Manhattan
n&amp;rsquo;est pas encore fiable en présence de mobilier et de vitrages.&lt;/li&gt;
&lt;li&gt;Les étapes CPU constituent le goulot d&amp;rsquo;étranglement sur une machine virtuelle à 4 vCPU.&lt;/li&gt;
&lt;li&gt;Prévu : comparaison avec une suite de photogrammétrie commerciale sur les mêmes images,
et nouvel essai du raffinement de maillage avec le build sm_120.&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 3.11&lt;/code&gt; · &lt;code&gt;OpenCV&lt;/code&gt; · &lt;code&gt;Open3D&lt;/code&gt; · &lt;code&gt;NumPy&lt;/code&gt; · &lt;code&gt;COLMAP 4.2.1&lt;/code&gt; · &lt;code&gt;OpenMVS 2.4&lt;/code&gt; · &lt;code&gt;gsplat 1.6.0&lt;/code&gt; · &lt;code&gt;PyTorch 2.14 (CUDA 13)&lt;/code&gt; · &lt;code&gt;Blender 5.2&lt;/code&gt; · &lt;code&gt;FFmpeg&lt;/code&gt; · &lt;code&gt;PotreeConverter&lt;/code&gt; · &lt;code&gt;glTF-Transform&lt;/code&gt; · &lt;code&gt;splat-transform&lt;/code&gt;&lt;/p&gt;</description></item><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>