The best picture was already on the machine
My plant started showing its sex last week. The camera saw it. The screen didn’t, and neither did the model. Three resizes were the reason.
The plant in my tent is from regular seed, which means it’s roughly a coin flip whether it’s female or male. That matters. A male’s pollen ruins every female in range, and once a pollen sac opens you can’t undo it. So the first pistils, the small white hairs at a node, are the news every grower is waiting for. They say female, and they say it early.
The box I’ve been building watches that plant with a camera that shoots 4608 pixels across. Last week I looked at the dashboard and said the photos looked out of focus. They should have been showing pistils by then.
The focus was fine. The pixels were being thrown away.
Resize one: the display copy. The camera sends a copy capped at 1152 pixels on the long edge. That’s a quarter of what the sensor captured. Fine for “how big is the plant.” Useless for a hair-thin pistil.
Resize two: the one nobody saw. The camera was also sending a full-resolution 1536-pixel crop of the top of the plant, every hour, since 9/17. The hub classified each one and deleted it. The best picture of that plant passed through the machine every hour and nobody ever saw it. Now it’s kept, and it’s on the dashboard.
Resize three: the model’s input. I wrote the pistil detector by copying the pollen-sac detector next to it, input size and all. That one shrinks the whole crop to 320 pixels, which is right for a pollen sac, since those are centimeters across. For a pistil it’s a 4.8× shrink, and the pistils are simply gone from what the model receives. You can see it above. The existing growth-stage classifier makes the same point: it looked at four of those crops with pistils plainly in them and answered “vegetative,” 99.99999997% sure.
Copying the neighbor looked like consistency. It was actually copying the neighbor’s assumptions about how big the thing it’s looking for is.
The fix was to stop shrinking: score the crop at native resolution in 320-pixel windows. My first grid was wrong too. 1536 divides neatly into five windows at a 304-pixel step, which looks tidy. But a step of 304 in a 320 window means two windows only overlap by 16 pixels, and a pistil cluster with its calyx is 80 to 100 pixels. On the real crop, the one cluster sat across both seams. Part of it was in four windows and all of it was in none. A step of 152 overlaps by 168. A tidy grid isn’t the same as a correct one. Pick the step from the size of what you must keep whole.
Where it stands: pistils were confirmed by the grower on 9/21 at a node on the main stem, 15 days after the flip. It’s a female. The detector is not built yet. The training pictures are the hourly crops that used to get deleted.
Two things I’d say to teams dealing with vision AI on commodity hardware, and I’m telling myself again:
- When a picture looks soft, count the resizes between the sensor and the screen before you touch the lens.
- If your pipeline produces a better artifact than the one on screen, that’s a bug, not a nice-to-have.
First published on LinkedIn, 29 September 2026: the article. The detector has been built since. What it did on its first day is the next post.
Also read: The camera called it female, ten days late · Trained on close-ups, served whole plants