<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Computer Vision on Antoine Martin's Blog</title><link>https://martantoine.github.io/tags/computer-vision/</link><description>Recent content in Computer Vision on Antoine Martin's Blog</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sun, 18 Oct 2026 18:28:01 -0700</lastBuildDate><atom:link href="https://martantoine.github.io/tags/computer-vision/index.xml" rel="self" type="application/rss+xml"/><item><title>Bootstrapped Feature Mapper</title><link>https://martantoine.github.io/posts/bootstrapped_feature_mapper/</link><pubDate>Sun, 18 Oct 2026 18:28:01 -0700</pubDate><guid>https://martantoine.github.io/posts/bootstrapped_feature_mapper/</guid><description>&lt;p&gt;Crop perception is hard to scale because agriculture covers a very wide range of crops, and training a reliable model for each one is expensive in data and annotation.&lt;/p&gt;
&lt;p&gt;This project tests whether that cost can be replaced by a minimal amount of user input. The farmer manually labels a few points on as few as 3 frames of their own footage, marking the classes they care about (tomato, weed, eggplant, fruit tree, etc.). These labels bootstrap the classification step by matching against features from a frozen, general-purpose vision model. No training is involved.&lt;/p&gt;
&lt;p&gt;The rest of the pipeline is generic: camera poses, depth estimation and 3D lifting rely on off-the-shelf models and need no retraining for a new crop or field. The output is a 3D point cloud of the labelled class, which is validated against an independent Gaussian splat reconstruction of the same scene.&lt;/p&gt;
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/bootstrapped_feature_mapper/pipeline.drawio.png"
alt=""
loading="lazy"
style="max-width: 100%; height: auto;"&gt;
&lt;/div&gt;
&lt;h2 id="dinov2-features"&gt;DINOv2 Features&lt;/h2&gt;
&lt;p&gt;The default DINOv2 base model already separates tomato plants from their surroundings well. Below, the red cross marks the selected pixel, and the yellow patches are the ones whose features are most similar to it.&lt;/p&gt;
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/bootstrapped_feature_mapper/dino_PCA_similarity.png"
alt=""
loading="lazy"
style="max-width: 100%; height: auto;"&gt;
&lt;/div&gt;
&lt;p&gt;Bonus: I am the proud father of this tomato plant&lt;/p&gt;
&lt;h2 id="reconstructing"&gt;Reconstructing&lt;/h2&gt;
&lt;p&gt;COLMAP gives the camera pose for each frame (left), and Depth Anything 3 gives time-coherent depth (right). Each classified patch is projected into 3D using that frame&amp;rsquo;s pose and depth.&lt;/p&gt;
&lt;div style="display: flex; flex-wrap: wrap; align-items: flex-start; gap: 1rem; justify-content: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/bootstrapped_feature_mapper/camera_path.png"
alt=""
loading="lazy"
style="flex: 1 1 0; min-width: 0; max-width: 100%; height: auto;"&gt;
&lt;img src="https://martantoine.github.io/posts/bootstrapped_feature_mapper/preview_0025.png"
alt=""
loading="lazy"
style="flex: 1 1 0; min-width: 0; max-width: 100%; height: auto;"&gt;
&lt;/div&gt;
&lt;p&gt;The result is a point cloud of the selected class only on top of the magnficient tomato plant:&lt;/p&gt;
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;video controls style="max-width: 100%;"&gt;
&lt;source src="https://martantoine.github.io/posts/bootstrapped_feature_mapper/result.mov" type="video/mp4"&gt;
&lt;/video&gt;
&lt;/div&gt;
&lt;h2 id="results-and-next-steps"&gt;Results and next steps&lt;/h2&gt;
&lt;p&gt;Looking at the 3D output, the main problem is accuracy rather than precision: the extracted points are consistent with each other, but they are not in the right place. Recall is harder to judge by eye, so it is not clear how much of the crop is being missed.&lt;/p&gt;
&lt;p&gt;Before iterating toward a better pipeline, the remaining work for this version is to measure these metrics properly.&lt;/p&gt;</description></item></channel></rss>