The project started as a rescue. A pipeline for grading maxillary canine impaction severity from CBCT had stalled: it trained, it produced numbers, and the numbers were not good enough to trust. I inherited it, took it apart, and rebuilt it around a simple idea. If I want a model to grade the way a radiologist grades, I should let it look the way a radiologist looks.
Grading is not classification
The first thing I got wrong was treating severity as a set of unrelated labels. Mild, moderate, and severe are not three separate buckets. They sit in order, and the distance between mild and severe is larger than the distance between mild and moderate. A plain classification loss does not know that. It will happily call a mild case severe and treat that as no worse than calling it moderate.
The fix was an ordinal loss. I moved the model to CORAL, which frames the problem as a series of yes-or-no thresholds: is this at least moderate, is this at least severe. The prediction respects the order because the order is built into the objective. On its own that change did more for the honest errors than anything else. When the model was wrong after that, it was usually wrong by one step, which is also how two readers disagree.
Looking the way a reader looks
A radiologist does not grade an impaction from one slice. You scroll. You check the axial for the position of the crown against the roots of the neighbors, you swing to the coronal for the vertical height, you use the sagittal to judge angulation. The severity lives in the relationship between those views, not in any single one.
So I stopped feeding the network one image. The rebuilt pipeline uses a DenseNet-121 backbone and fuses several CBCT-derived views of the same tooth before it makes a call. That is the part I am proudest of, because it is the part that mirrors the actual clinical act. As far as I can tell it is the first study to apply multi-view CBCT fusion to this problem. The multi-view model landed at 87.5 percent three-class accuracy and 0.953 AUC on five-fold stratified group cross-validation. The single-view versions never got close.
The disagreement
There was a case where I graded moderate and the model insisted on severe. My first instinct was that the model was overreaching. I went back to the volume to build my argument against it and found the argument against me instead. The crown was closer to the lateral incisor root than I had credited on my first pass, and on the view I had skimped on the contact was real. The model had weighted the view I underused.
I want to be careful about the lesson here, because it is easy to tell this story as the machine beating the human. That is not what happened. The model was right on that case because the training data encoded the judgment of readers who were more careful than I was in that moment. It caught my lapse, not my expertise. The value was not that it knew more than a radiologist. It was that it did not get tired, or anchor on the first view, or decide halfway through that it already knew the answer.
What I kept
Two things carried over into everything I have built since. First, when the label has an order, put the order in the loss. It is a small change with an outsized effect on which mistakes the model is allowed to make, and which mistakes it makes are what a clinician actually cares about. Second, if you want a model to earn a reader’s trust, let it work the case the way the reader does. Fusion was not a trick to bump a metric. It was the closest I could get the architecture to the reasoning I do at the workstation.
The manuscript is in preparation. The bigger result, for me, was learning to treat the model as a second reader with different failure modes than mine, rather than a replacement for the read. That framing is why I still read the scans myself.