A fab inspects wafers with a 16x16 greyscale sensor and needs each image sorted into clean, scratch, particle, or edge ring. Every image has been normalised, so brightness tells you nothing: the classes differ only in where the bright pixels sit relative to each other. You will build the feature extractor by hand, one convolution at a time, and prove that a flat view of the same pixels cannot do the job.
Establish the class balance and check whether global intensity separates the classes.
Implement survey_images(train_df) returning a dict with:
mean_by_class comes back as four zeros and std_by_class as four ones, because every image was standardised before it reached you. intensity_separates is False, and that is the whole setup: there is no brightness cue to find, so whatever you build has to read shape.
Evaluated server-side against a hidden test set.