This week, I built and deployed three fastai apps: a braids classifier, a zoysia disease classifier, and a dental payment forecast built from synthetic accounts-receivable data.
I started with the same loop I used for fastai’s “Is it a bird?” lesson. Find a dataset, train a model, test it, then make it usable outside the notebook.
Try the apps: Cornrows classifier | Zoysia classifier | Dental A/R forecast
The braids model reached 96%
I got the idea after finishing the bird classifier. I found about 300 photos with DuckDuckGo, trained the model, and reached about 96% accuracy.
A vision model needs each image to be the same size. Fastai gave me three resize choices: crop, squish, or pad.
Crop could cut the hairstyle out of the frame, so squish and pad worked better in my tests. That choice changed what the model could see before training.
Try the app: Cornrows classifier
The model may learn a shortcut
The braids class came mostly from cornrow searches, while the no_braids class came mostly from shaved-head searches. That split may teach the model to spot hair versus no hair. A 96% score would then say little about whether it can detect braids across a wider set of photos.
I can improve the model by:
Deciding whether the app detects cornrows or braids in general, then matching the labels and search terms to that choice.
Adding harder negative examples, including afros, fades, loose hair, hats, locs, twists, and partly hidden heads.
Varying both classes across gender, skin tone, age, lighting, camera angle, and image quality.
Holding back a test set that never guides training or model choice.
Returning “uncertain” below a threshold set from the validation results.
The zoysia model reached 85%
I then built a harder image model that distinguishes healthy zoysia grass from zoysia with large patch.
Large patch is a disease of warm-season turf caused by the soilborne fungus Rhizoctonia solani. It often appears as round areas of damaged grass with yellow or orange blades near the edge, according to UGA Cooperative Extension.
The best result I reached in the time I had was 85% accuracy. Squish worked best as the resize method.
I plan to add more varied photos and keep working on the score. The next version should also tell large patch from brown or bare spots that are not caused by disease. Later, I want to add dollar spot, rust, and leaf spot.
Try the app: Zoysia classifier
The dental model forecasts payments
A discussion with Ammar, a product manager here in Atlanta, led to the third app. We talked about predictive reporting for dental clients, and I built a prototype around that need.
I used synthetic dental accounts-receivable ledger data to train a fastai model that estimates the chance each balance will be paid within 30 days. Those probabilities feed an expected-cash report, so calibration became part of the model evaluation.
This build required me to define the ledger data model, decide how to test the forecasts, design the interface, and set the rules for human review. The model sits inside a wider workflow that includes the cash report and the review queue.
The app could send selected accounts to a guarded revenue cycle management review queue. A person could check those cases before anyone acts on the model’s output.
Since I trained it on synthetic data, the result is still a prototype. Its results do not tell me how the model would perform on a dental client’s live ledger.
Try the app: Dental A/R forecast
I chose Google Cloud Run
Lesson 2 uses Hugging Face Spaces for deployment. I chose Google Cloud Run because I wanted more control over the apps and wanted to learn how to serve the vision models on CPUs after training them on GPUs.
I built the apps in Cursor and kept the shared setup as a base for future prototypes. I want each build to leave less setup work for the next one.
Next week
I’ll start Lesson 3 and chapter 4 of the book. I also plan to work through:
the Titanic spreadsheet in the course repo

