
I fed raw radiance to a hyperspectral crop AI. On a held-out synthetic test, its score fell from 0.887 to 0.373.
An NDVI alert that says only "stressed" leaves a grower unable to choose between nitrogen, irrigation, or an early-tar-spot scout; I built SpectraRx around that decision. In the deliberately broken path of this physics-grounded synthetic demo, the same 424-band spectral CNN falls from 0.887 to 0.373 on its held-out test when I feed it raw top-of-atmosphere radiance instead of corrected surface reflectance.
I did not put that failure in the demo as a party trick. I put it there because a crop-stress score without the conditions that make its input meaningful is an invitation to turn a neat map into a bad field decision. The scenes are synthetic, physics-grounded cubes for one corn crop and geography, not real captures or field guarantees. The point is to make the chain inspectable while the assumptions are visible.

I begin with that single amber NDVI blob because it shows the limit of a detection alert. It is useful as a signal to look closer, but it cannot say whether a 27-meter boom should change a nitrogen rate, whether a water-stress pattern needs inspection, or whether early tar spot should send an agronomist into the field. I wanted the demo to answer the next question, then to show the evidence and the limits of that answer.
You can run the chain at veriprajna.com/demos/hyperspectral-agriculture-ai. The screen does not hide the inconvenient case. It lets me skip atmospheric correction and watch the decision path change.
I learned that calibration changes the object the classifier sees
I used to file atmospheric correction under preparation work. The cube arrives as top-of-atmosphere radiance, and the demo's empirical-line correction turns that into BOA surface reflectance with calibration provenance attached to the scene. That distinction sounded like engineering plumbing until I deliberately bypassed it.
I kept the trained network and its weights fixed. I changed the input path. On the held-out, synthetic physics-grounded test of 1,280 pixels from an unseen cultivar and soil, the result moved from 0.887 macro-F1 to 0.373. That is a measured result for this model and this test, not a statement that every hyperspectral model will fail by the same amount.
I found the contrast more useful than a larger benchmark table because it makes a practical failure concrete. The uncorrected path is not merely noisier input. Raw radiance carries atmospheric and illumination effects into a classifier that was designed to interpret corrected surface reflectance. A network can still return a class and a confidence, but neither is sufficient reason to authorize a prescription.

I made the raw-radiance path visible because an accuracy number by itself leaves out the operational question: what should happen after the system discovers it is on weaker ground? In SpectraRx, the answer is not a universal block. Raw TOA still reaches the classifier in this deliberate test, and the downstream confidence and physics-agreement gates make the uncertainty visible.
I spent time separating that result from a claim that the network has become useless. The classifier is a custom 1-D spectral CNN that reads a full 424-band curve from 400 to 2515 nm. Its normal job is to distinguish healthy, nitrogen-deficient, water-stressed, and early-tar-spot pixels from BOA surface reflectance. The calibration experiment does not change the crop classes, retrain the model, or silently swap in a weaker baseline. It changes one upstream condition and lets the rest of the decision chain show the consequence.
I found that useful because the usual response to a bad score is to ask for another score. In this case I needed a different question: what evidence does the system have for acting after the input has changed? The answer starts with calibration provenance, but it cannot end there. A confidence value is only one signal. The physics-agreement check can abstain when the CNN's class conflicts with the documented feature, such as a nitrogen call without the expected red-edge shift. The inspector also shows the full curve and a band-saliency trace so an operator can compare the model's evidence with documented diagnostics.
I use that inspector as an accountability surface, not a proof of infallibility. For early tar spot, the trace's sampled 530 and 535 nm bins sit nearest the PRI diagnostic near 531 nm. Nitrogen evidence sits in the 680 to 720 nm red-edge range. Water's SWIR features are diagnostic checks rather than claimed top saliency peaks. Those checks make the reasoning available for inspection. They do not transform a synthetic benchmark into a real-field guarantee, and they do not erase the need for scouting when the input path becomes less trustworthy.
I also resisted making the baseline look weak so the failure would appear more dramatic. On the held-out synthetic distribution-shift test, the real Sentinel-2 broadband incumbent reaches 0.69 macro-F1. It is near 1.0 on nitrogen because it has red-edge and SWIR bands. The hyperspectral model reaches 0.887 overall, with its strongest structural advantage in water stress and early tar spot. That is a meaningful comparison, but it still does not decide whether a particular zone should receive a prescription after calibration is skipped. The gate and zone rule exist to answer that later operational question.
I needed the safeguard to change a field action, not just a dashboard color
I was careful not to turn abstention into another vague promise. A hatched pixel means the system is withholding a pixel-level diagnosis when confidence is low, the signature is mixed, or the classifier conflicts with the documented physics feature. The default calibrated seed-7 demo scene shows 20.1% of pixels abstained. That figure is an in-app observation for that scene, not a universal evaluation metric.
I then had to decide what an operator does with a map containing those pixels. A sprayer does not work one pixel at a time. SpectraRx aggregates 5-meter diagnosis pixels into 25-meter management cells using a 27-meter boom profile. The rule is deliberately visible: zones with at least 34% abstained pixels route to ground-truth scouting, while other zones use their non-abstained majority.
I think that rule is where the abstract idea of uncertainty becomes a real workflow. In the skipped-calibration seed-7 scene, 92.2% of pixels abstain and 140 of 144 management zones route to scouting. Four water-stress zones still apply under the zone rule. The system has not proved that the four zones are safe in an open-world sense. It has made its conditions and its routing rule available for review instead of pretending every changed input must yield either a spray or a blank screen.
I also wanted a skeptical remote-sensing reader to see more than the gate. The spectral inspector shows the 424-band curve and an orange band-saliency trace. On early tar spot, the sampled 530 and 535 nm saliency bins sit nearest the PRI diagnostic near 531 nm; nitrogen evidence appears in the 680 to 720 nm red-edge range. For water, the documented SWIR features are diagnostic checks, not claims about the CNN's highest saliency peak. That is an inspectable comparison with documented physics, not proof that the model can never use a spurious cue.
I could not call it a prescription until a boom and an agronomist could use it
I learned that a diagnosis map is still incomplete after the gates do their work. The default calibrated scene has 144 management cells: 21 apply zones, 25 scout zones, and 98 healthy zones at V12. SpectraRx carries the surviving zone decision into a variable-rate prescription. Nitrogen rates follow severity, and fungicide is permitted only in the configured R3 window. The exports are real ISO-XML and GeoJSON formats, while live sensor and farm-management integrations are not implemented in this demo.
I made the downstream record deterministic for the same reason I made the gate visible. The demo generates an EU Farm-to-Fork IPM-style record template from the diagnosis and prescription. It includes zone coordinates, majority-class zone coverage, spectral evidence, alternatives evaluated, recommended product and rate, the R3 deadline, calibration provenance, and a certified-agronomist sign-off line. It is a template for review, not a filed compliance record.

I kept the language model outside this trust path. Signal processing, the trained spectral classifier, deterministic gates, equipment math, and the record template carry the load-bearing decisions. An optional model can render IPM justification prose from facts already computed, with a templated fallback so the demo runs without an API key. It does not decide what a crop needs or whether a zone should scout.
I stopped measuring the product by the classifier alone
I can still care about the classifier. On the held-out synthetic distribution-shift test, SpectraRx records 0.887 macro-F1 against 0.69 for the Sentinel-2 broadband incumbent. The difference is strongest in water stress, 0.97 against 0.63, and early tar spot, 0.77 against 0.61. Nitrogen is near 1.0 for both, which is useful precisely because it leaves the incumbent as a real baseline rather than a strawman.
I do not use those results as a claim about an open field. They cover 1,280 held-out synthetic pixels, one crop, and one geography. A two-season ground-truth library is still needed before anyone can make a real-world accuracy claim. The lesson I draw from the demo is narrower and more practical: a classification score is only one part of a decision system, and it is the part most likely to be quoted without its operating conditions.
I built the calibration failure into SpectraRx because it forces those conditions into view. It shows the input changing, the score falling, the downstream gates surfacing uncertainty, the zone rule routing a scout path, and the prescription record preserving what the operator and reviewer need to inspect. That sequence is the work I want to improve before I chase another decimal point.
And if you would rather see it than read me describe it, here is the whole thing running end to end.
I return to veriprajna.com/demos/hyperspectral-agriculture-ai when I want to test whether the demo is being honest. The useful crop-AI system is the one that can show why a scene became less trustworthy, route that uncertainty to a field action, and leave a record of the decision it did and did not make.


