I trained a compact CNN for 43 traffic sign classes, then built an inference path using OpenCV preprocessing.
The biggest win came from enforcing identical preprocessing between training and inference—small inconsistencies were the dominant error source.
If you deploy on-device, treat input handling as part of the model, not glue code.