Skip to content

academicBuilt during my engineering degreeJune 2026

Deep learning: a three-stage vision pipeline

Sort, repair, describe: three models in cascade, trained end to end, with the complete pipeline running in an interactive demo.

  • Python 3.10
  • TensorFlow / Keras
  • InceptionV3
  • LSTM
  • Bahdanau attention
  • Docker

Try the demo

What it is

A pipeline, not a model: sort what can be described, repair what can be repaired, then describe.

What was hard

Three models to train, and one constraint tying them together: denoising a clean image damages it, so you have to know before you act.

What it proves

The captioner reaches the practical ceiling of its architecture family, and the whole pipeline can be watched running.

A five-person project, within the deep learning block of the engineering programme. The client is fictional: an image archive to describe automatically.

Describing an archive of damaged images

A heterogeneous image archive to describe automatically. Photographs, but also diagrams, scanned text and drawings, in uneven condition. Describing a damaged image yields a damaged description; describing a diagram as though it were a photograph yields an absurd one.

Repairing only what needs it

The denoiser had to run only on images that needed it: denoising a clean image degrades it. That required a noise detector upstream rather than blanket processing.

Three numerical targets were set in advance, before any experiment. Two were not met, and the Limits section says so rather than burying it in a footnote.

Three models in cascade

Three-stage vision chain

One gate, then two treatments

  1. Image
    of any kind
  2. Stage 1, sort
    photograph, or not?
    Rejected: never goes further
    hence recall before precision
  3. Stage 2, denoise
    and only when needed
  4. Stage 3, describe
    a caption, word by word
An image enters through a gate deciding whether it is a photograph. What passes is denoised, then described by a captioning model. An image rejected at the first stage never goes further: that gate's recall therefore matters more than its precision.

Three stages in cascade, each one’s output shaping the next one’s input.

Stage 1: sort. A convolutional network trained from scratch separates photographs from non-photographs. Anything that is not a photograph is dropped, with its probability, and never goes further down the chain.

Stage 2: denoise, but only where needed. A detector measures how much neighbouring pixels disagree, a quantity noise drives up, against a threshold calibrated at start-up. Above the threshold the image is judged noisy and goes through a convolutional autoencoder; below it, the image continues untouched.

Stage 3: describe. A frozen InceptionV3 encoder produces a feature grid, projected and then read by a recurrent decoder with Bahdanau attention. Generation uses beam search with a length penalty.

constraint met

The noise detector catches every noisy image in the test set. The price is measured and accepted: one clean image in twenty is denoised needlessly.

The best model is not the one I kept

Measuring the measurement noise before comparing anything. Before ranking five architectures, the same model was retrained with three different seeds to establish the gap below which two results are indistinguishable: 0.04dBvalidation setMeasurement noise between seeds: 0.04 dB (validation set, n = 3).. Without that threshold, ranking close models is reading noise.

The best model was not the one I kept. Five architectures were compared under an equal protocol: same data, same noise, same budget. The U-Net wins. The convolutional autoencoder that was kept sits 1.39dBtest setPSNR gap between the model kept and the best one: 1.39 dB (test set, n = 148). below it, with 112,579parametersproductionSize of the denoising model that was kept: 112,579 parameters (production). and a markedly lower inference cost. The gap is well above the measurement noise. It is real, and deliberately accepted.

This is not a concession. In a three-stage pipeline where denoising is only an intermediate step, a mid-chain quality gain that does not improve the final description does not justify its cost. The only criterion that counts is what reaches stage 3.

An idea tested and dropped. A sharpening post-process applied after denoising looked like it should improve the output. Once measured, it degrades PSNR. It was removed. That is the only thing to do with a hypothesis that fails the measurement, but it is only useful if you took the trouble to measure before deciding.

documented trade-off

Five architectures compared under an equal protocol; the retained model is deliberately less capable than the best one, at a markedly lower cost.

documented trade-off

Sharpening post-process tested after denoising, then dropped because it degrades the measurement instead of improving it.

What the pipeline produces

Every number below is measured on test sets held out from training, and each carries its method.

Stage 1. The headline number says almost nothing. With the negative class three times larger, a classifier that always predicted “non-photograph” would already reach 0.7547accuracytest setAccuracy of a classifier that learns nothing: 0.7547 accuracy (test set, n = 6111). accuracy; the model reaches 0.7766accuracytest setOut of a hundred images, seventy-eight land on the right side. Compare that with the seventy-five a model always answering "non-photo" would get: the real gain is three points., two points above. The AUC, 0.8892AUCtest setRuns from 0.5 to 1: 0.5 is pure chance, 1 is perfect. At 0.89 the sorter almost always puts a photograph ahead of a non-photograph when shown both., establishes that it did learn something. But the task only becomes legible once the errors are broken down by type of non-photograph.

It is not one task but four, of wildly unequal difficulty. Scanned text and drawings are separated without a single error: 0% errortest setError rate on scanned text: 0 % error (test set, n = 1500).. Diagrams are moderately difficult. Paintings, however, are classified as photographs in 0.796error ratetest setError rate on paintings, before targeted correction: 0.796 error rate (test set, n = 1500). of cases, with an average confidence of 0.63probabilitytest setMean "photo" probability assigned to paintings: 0.63 probability (test set, n = 1500).: the model is not hesitating, it is confidently wrong. The global binary metric is therefore an average over a trivial problem and an unsolved one, and it hides both. What this classifier can do is reject text; what it cannot do is tell a photograph from a painting.

No published reference combines the three characteristics of this task: heterogeneous negative class, training without transfer, three-to-one imbalance. Work on photograph versus painting reports far better numbers, 95.7% accuracy (fine-tuned ResNet50)(Scientific Reports, 2026, not comparable)95.7% accuracy (fine-tuned ResNet50) · Scientific Reports, 2026 · Binary classification of photograph versus painting, two homogeneous classes, on a Kaggle dataset whose size could not be verified. · pretrained · comparable: no, A homogeneous negative class, paintings only, where ours mixes paintings, diagrams, drawings and text; and a backbone pretrained on ImageNet where our network starts from scratch. for instance, but it sets two homogeneous classes against each other and starts from a pretrained backbone (a methodological reference, not a single figure(Kornblith, Shlens and Le, 2019, not comparable)a methodological reference, not a single figure · Kornblith, Shlens and Le, 2019 · A general study of transfer from ImageNet to twelve image classification datasets. · not applicable · comparable: no, Does not address our task. Cited to establish that transfer outperforms training from scratch, which justifies not comparing the two regimes.). The trivial floor therefore remains the only solid reference.

Stage 2. Here too the number alone is not enough, and two floors bracket it. The untreated noisy image sits at 12.0125dBtest setThe starting point: at 12 decibels the noisy image is unrecognisable. That is the bar any treatment has to clear.. A median filter, with no learning whatsoever, reaches 18.22dBtest setWhat a three-line classic filter reaches, with nothing learned at all. A trained model that did not beat it would be pointless.: that is the bar a learned model has to clear to justify its existence. The model that was kept reaches 24.428dBtest setA decibel scale: below 15 the image is unrecognisable, around 20 it becomes readable again, past 30 the eye sees no noise at all. The denoiser takes the image from 12 to 24. and 0.6769SSIMtest setRuns from 0 to 1: at 0 the structure is lost, at 1 the image matches the original exactly. Noise drops it to 0.14, the denoiser lifts it back to 0.68. structural similarity.

A third comparison point says more than the other two: a dense autoencoder, tested under the same protocol, tops out at 13.42dBtest setPSNR of a dense autoencoder: 13.42 dB (test set, n = 148)., below the median filter, with 686 times more parameters than the convolutional model eventually kept. On this task convolution is not a refinement, it is a precondition. The test set, however, holds only one hundred and forty-eight images, with no confidence interval estimated.

Stage 3, and this is the page’s result. Captioning reaches 0.2291BLEU-4test setRuns from 0 to 1, but nobody comes near 1: two people describing the same photo do not use the same words. Above 0.22 is good, and this family of models tops out around 0.24. and 0.6003CIDErtest setRuns from 0 to about 1.2 on this dataset. Above 0.5, the generated captions use the words people judged important when describing the image. on four thousand COCO val2017 images, a set the model never saw. Beam search gives a clear gain over greedy decoding, which tops out at 0.1867BLEU-4test setBLEU-4 of the captioning, greedy decoding: 0.1867 BLEU-4 (test set, n = 4000)..

That number needs its reference point, without which it means nothing: the chosen architecture family, a frozen convolutional encoder followed by a recurrent decoder with attention, tops out in practice at 0.24BLEU-4test setThe best published score for this family of architecture. The project's model sits a hair below it, meaning further progress would come from changing architecture, not from tuning. on this set. The model is therefore within a few thousandths of what its architecture allows, and what still separates it from that ceiling comes from the architecture choice, not from tuning.

The demo shows the whole pipeline at work on twelve freely licensed images, unfiltered.

Where it falls apart

The model collapses outside its training distribution, and the demo shows it. On five images whose subjects are absent from the COCO categories, 5out of 5 imagestest setWrong captions outside the training distribution: 5 out of 5 images (test set, n = 5). are wrong. The failure mode is specific: the model falls back on the nearest COCO scene for any unfamiliar image. On 3out of 5 imagestest setImages with no person described as containing one: 3 out of 5 images (test set, n = 5)., it describes people where none are present: the desert becomes a beach, an aurora a group of people, a painting a gathering by the water.

Five images are not an evaluation set. This illustrates the failure mode; it does not measure an error rate.

Stage 1 caps the whole pipeline, and the F1 was hiding it. Recall on the photograph class is 0.8746recalltest setGenuine photographs the sorter lets through: 0.8746 recall (test set, n = 1499). against a precision of only 0.5269precisiontest setPrecision on the photo class: 0.5269 precision (test set, n = 1499).: the gate catches most photographs but lets through almost as many non-photographs. And stage 1 is a gate, not a corrective filter: the 12.5%test setPhotographs wrongly rejected by the gate: 12.5 % (test set, n = 1499). of photographs wrongly rejected are neither denoised nor described, nothing downstream flags them, and stage 1’s recall therefore puts a hard cap on what stage 3 can process, however good stage 3 may be.

The targeted correction traded recall for precision, in the wrong direction. Hard negative mining moved the error rate on paintings from 0.796error ratetest setError rate on paintings, before targeted correction: 0.796 error rate (test set, n = 1500). to 0.647error ratetest setError rate on paintings, after targeted correction: 0.647 error rate (test set, n = 1500)., but the error rate on photographs from 0.046error ratetest setPhotographs wrongly rejected, before targeted correction: 0.046 error rate (test set, n = 1499). to 0.125error ratetest setPhotographs wrongly rejected, after targeted correction: 0.125 error rate (test set, n = 1499)., and the AUC edged down, from 0.8908AUCtest setAUC before targeted correction: 0.8908 AUC (test set, n = 6111). to its final value. On a gate those two movements do not cancel out: a painting wrongly accepted gets a useless caption, a photograph wrongly rejected disappears. The gain was measured on the binary metric, not on the pipeline’s objective.

Inference cost rules out real-time use. One caption takes 5,126msproductionGenerating one caption on CPU: 5,126 ms (production, n = 12). on CPU, plus 643msproductionFeature extraction on CPU: 643 ms (production, n = 12). of feature extraction. The demo is therefore served statically: the result is identical, computed once.

Beam search settings were chosen on validation, not on test. The protocol is sound, but the selection remains a human choice, not an automatic setting a third party could verify.

The original dataset is not redistributable, which prevents anyone from replaying the training exactly. The demo images had to be replaced with freely licensed ones for that reason.

If I started over

I would evaluate outside the distribution from the start, not at the end. The result that taught me most about this model is none of the test metrics. It is the demo. All the project’s measurements were made on data drawn from the same distribution as training, and they only say how the model behaves on what it already knows.

An out-of-distribution control set, even a few dozen hand-picked images, would have taken half a day and would have been the most informative number in the project. It did not exist, and that is a methodological omission, not a lack of time.

I would measure the whole pipeline, not each stage in isolation. The chain is run end to end on the real dataset, and you can watch stage 1 discard non-photographs, but that is a demonstration, not a measurement. No number says what sorting and denoising contribute to the final description quality, which is the only question that justifies a cascade architecture. Two decisions suffered for it: the denoising trade-off, settled on cost because it could not be settled on effect, and above all the targeted correction of stage 1, optimised on a binary metric blind to the fact that recall caps everything downstream.

I would start from a pretrained sorting encoder. Training stage 1 from scratch was a defensible pedagogical choice; it is also the most likely reason the target was missed. Transfer from an existing model would have cost less and returned more.

Evidence

documented trade-offFive denoising architectures compared on equal terms; the convolutional autoencoder is kept at 1.39 dB below the U-Net, for a markedly lower training and inference cost.documented trade-offA sharpening post-process tested after denoising, then abandoned: it degrades the PSNR instead of improving it.constraint metA noise detector with no learning involved, threshold calibrated at start-up: it catches every noisy image in the test set, at the cost of one clean image in twenty sent to denoising for nothing.reproducible artefactSeeds fixed and determinism variables set before the framework is imported, with a containerised development environment holding GPU access.reproducible artefactA replayable static demo: twelve freely licensed images run through the trained model, with the complete result published unfiltered.

Numbers and method

36 numbers and how each one was measured
AI models trained, linked into a single pipeline
3modelsproductionAn image goes in and three AIs hand it along: sort it, clean it, then write the sentence that describes it.The project's three deliverables: a classifier sorting photo from non-photo, a denoiser that repairs, a captioner that describes. Each one's output shapes the next one's input, and the full pipeline runs in the demo.
Models trained and compared to pick the final three
30models comparedproductionBehind the three models that made the cut, about thirty others were trained and compared under the same protocol before being set aside.Counted cell by cell across the three notebooks: nine classifiers in deliverable 1's final table, twenty denoisers in deliverable 2 (architectures, depths, augmentations, seeds), one captioner in deliverable 3. Four auto-encoder pre-trainings on top bring the total to thirty-four training runs.
Noisy images caught by the detector before repair
100%test setBefore repairing anything the pipeline checks first: not one noisy test image slips through the net.Measured while calibrating the threshold in deliverable 3: on the test images, every noisy version lands on the right side of the threshold, and 95% of clean images stay on theirs.It detects noise, not blur: a blurry image would be judged clean. And 5% of clean, highly textured images are sent to denoising by mistake.
Accuracy of the photo / non-photo sort
0.7766accuracytest setOut of a hundred images, seventy-eight land on the right side. Compare that with the seventy-five a model always answering "non-photo" would get: the real gain is three points.Stratified 70/15/15 split over 40,736 images (28,515 training, 6,110 validation, 6,111 test). CNN trained from scratch, evaluated once on the test set and never reopened afterwards.To be read against the trivial baseline: a classifier always predicting "non-photo" would already reach 0.7547 on this set. Accuracy is therefore not the number to focus on here.
The sorter's knack for putting photos first, scored from 0 to 1
0.8892AUCtest setRuns from 0.5 to 1: 0.5 is pure chance, 1 is perfect. At 0.89 the sorter almost always puts a photograph ahead of a non-photograph when shown both.Area under the ROC curve on the same test set as the accuracy, stratified 70/15/15 split.
Accuracy of a classifier that learns nothing
0.7547accuracytest set · computedShare of the majority class in the test set: 4,612 non-photos out of 6,111 images. That is the score a model always predicting "non-photo" would reach. The split being stratified, the proportion is identical across all three subsets.Such a model has an AUC of 0.5 and an F1 of zero on the photo class: it catches no photograph at all.
F1 on the photo class
0.6576F1test setF1 computed on the photo class alone, which holds 1,499 of the 6,111 test images. That is the class the chain has to catch.An F1 at this level means real photographs are lost further down the chain, and non-photos are wrongly let through.
Genuine photographs the sorter lets through
0.8746recalltest set · computedDerived exactly from the numbers the notebook publishes, namely accuracy 0.7766 and F1 0.6576 over 6,111 images including 1,499 photos. The confusion matrix in whole numbers admits a single compatible solution: 1,311 photographs found, 188 missed.The notebook does not publish this value directly: it is reconstructed, not read off. The derivation is exact, but it depends on the two published values being rounded to four decimals.
Precision on the photo class
0.5269precisiontest set · computedDerived from the same confusion matrix as the recall: 1,311 photographs correctly identified out of 2,488 images classified as "photo".Barely better than a coin toss: 1,177 non-photos get through the gate. The F1 of 0.6576 hides this asymmetry entirely.
Photographs wrongly rejected by the gate
12.5%test set · computed188 photographs out of 1,499 are classified "non-photo" and therefore never enter the chain. Derived from the same confusion matrix.Nothing downstream reports these losses: they are silent.
Error rate on scanned text
0% errortest setErrors of the binary classifier broken down by the original class of the negative. Not one of the 1,500 scanned texts is taken for a photograph. Same result on the 211 drawings.
Error rate on paintings, before targeted correction
0.796error ratetest setShare of the 1,500 paintings classified as "photo" by the best binary model before hard negative mining. The mean probability it assigns to the photo class on those images is 0.630: the model is wrong with confidence.This sub-population carries almost all of the errors; the overall binary metric hides it completely.
Mean "photo" probability assigned to paintings
0.63probabilitytest setMean probability of the photo class assigned to the 1,500 paintings in the test set by the best binary model, before targeted correction.Above the decision threshold: the model is not wrong while hesitating, it is wrong with confidence.
Error rate on paintings, after targeted correction
0.647error ratetest setThe same measurement after one round of hard negative mining, weighting the misclassified training examples, 84.7% of which were paintings.
Photographs wrongly rejected, before targeted correction
0.046error ratetest setShare of the 1,499 photographs classified "non-photo" before hard negative mining, that is a recall of 0.954 on the photo class.
Photographs wrongly rejected, after targeted correction
0.125error ratetest setThe same measurement after hard negative mining. The error rate on the photo class is multiplied by 2.7, and that is the price paid for the gain on paintings.On a gate, this degradation is not the mirror image of the improvement: a rejected photograph vanishes from the chain, whereas an accepted painting merely receives a useless caption.
AUC before targeted correction
0.8908AUCtest setAUC of the best binary model before hard negative mining, on the same test set. Hard negative mining lowers it slightly.
Calibration error after temperature scaling
0.0902ECEtest setExpected Calibration Error after fitting a single temperature scalar on the logits. Optimal temperature found: 1.024, which is very nearly the identity. ECE before: 0.0906.The gain is 0.0004, which is nil in practice. The step establishes that the model was already roughly calibrated, not that it improved anything.
Image quality after denoising, in decibels
24.428dBtest setA decibel scale: below 15 the image is unrecognisable, around 20 it becomes readable again, past 30 the eye sees no noise at all. The denoiser takes the image from 12 to 24.Convolutional autoencoder, Gaussian noise of standard deviation 0.3 added to the clean images, mean PSNR computed over the test set.A test set of only 148 images: no confidence interval around this value was estimated.
PSNR of the noisy image, untreated
12.0125dBtest setThe starting point: at 12 decibels the noisy image is unrecognisable. That is the bar any treatment has to clear.Same protocol and same set as the denoised measurement, but measured on the noisy image as-is. Serves as the low reference.
PSNR of the median filter, with no learning
18.22dBtest setWhat a three-line classic filter reaches, with nothing learned at all. A trained model that did not beat it would be pointless.A 3x3 median filter applied to the noisy image, with no learning and no fitted parameter. Convention in the field: a learned model that fails to beat this floor contributes nothing.
PSNR of a dense autoencoder
13.42dBtest setAutoencoder with dense layers, 77,254,208 parameters, same training protocol as the other candidates.Below the median filter despite having 686 times more parameters than the convolutional model that was kept: the demonstration that convolution is not a refinement but a necessity for this task.
Measurement noise between seeds
0.04dBvalidation setStandard deviation of the validation PSNR obtained by retraining the same model with three different seeds. Establishes the threshold below which two results cannot be told apart.
Size of the denoising model that was kept
112,579parametersproductionNumber of trainable parameters in the final convolutional autoencoder, for an inference time of 0.65 ms per image.
PSNR gap between the model kept and the best one
1.39dBtest setPSNR difference between the convolutional autoencoder that was kept and the U-Net, compared on equal terms: same test set, same noise, same training budget. The U-Net is better; the model kept sits below it.The U-Net has roughly twice as many parameters; the quality gap is paid for in training and inference cost.
Image structure recovered after denoising, from 0 to 1
0.6769SSIMtest setRuns from 0 to 1: at 0 the structure is lost, at 1 the image matches the original exactly. Noise drops it to 0.14, the denoiser lifts it back to 0.68.Mean structural similarity over the test set, same protocol as the PSNR measurement.Measured on only 148 images, with no confidence interval estimated.
Human-written captions read during training
616.8kcaptionstraining setTo learn how to describe an image, the model read more than six hundred thousand sentences written by people about a hundred and eighteen thousand photos. That volume is what gives it its vocabulary and its way of turning a phrase.Count of the training corpus loaded for captioning: the entire COCO 2017 set, that is 118,287 photographs each described by five different people.This is a training volume, not a result: it says what the model read, never what it is worth. The scores measured on images it never saw say that, and they sit further down this page.
Four-word runs shared with the human captions
0.2291BLEU-4test setRuns from 0 to 1, but nobody comes near 1: two people describing the same photo do not use the same words. Above 0.22 is good, and this family of models tops out around 0.24.Beam search of width 5, length penalty 0.8, trigram repetition blocked. Evaluated on 4,000 images from COCO val2017 against their five reference captions.Beam width and length penalty were tuned on validation, not on test, and the selection protocol remains my own choice, not an automatic search a third party could verify.
Practical ceiling of this architecture family
0.24BLEU-4test set · computedThe best published score for this family of architecture. The project's model sits a hair below it, meaning further progress would come from changing architecture, not from tuning.A reference point recorded in the deliverable's notebook: the best BLEU-4 the chosen architecture family reaches, a frozen convolutional encoder followed by a recurrent decoder with attention, on the complete COCO set and after long training. It comes from that family's founding literature, not from a measurement made here.An order of magnitude, not an exact value: publications do not all report the same evaluation protocol, and some scale the score by a hundred.
How close the generated captions come to the human-written ones
0.6003CIDErtest setRuns from 0 to about 1.2 on this dataset. Above 0.5, the generated captions use the words people judged important when describing the image.Same protocol and same set as the BLEU-4: beam of width 5 over 4,000 images from COCO val2017.
BLEU-4 of the captioning, greedy decoding
0.1867BLEU-4test setGreedy decoding, same set and same references as the beam search measurement. Serves as the comparison point that isolates what the beam contributes.
Validation loss that was kept
2.6375lossvalidation setThe number used as referee to stop training at the right moment: the lower it goes, the better the model guesses the next word on images it has never seen.Best epoch selected by early stopping, on the validation loss. Trained on the full COCO 2017 set.A validation metric, not a result: it served to pick the epoch, it does not measure final quality.
Wrong captions outside the training distribution
5out of 5 imagestest setFive freely licensed images of subjects absent from the COCO categories, run once through the model, with no selection. Verdict established by visually comparing the image with the caption produced. Three of these images were replaced on 2026-08-25: the previous ones were visually ambiguous, and the difficulty came from the image rather than from the subject being absent from COCO. The romanesco left this set the same day: broccoli is a COCO category, so the subject was not out of distribution.Five images are not an evaluation set: this illustrates the failure mode, it does not measure an error rate.
Images with no person described as containing one
3out of 5 imagestest setCount, across the five out-of-distribution images, of captions mentioning people when the image contains none. The count is unchanged after three images were replaced: the new aurora also produces a person hallucination.
Generating one caption on CPU
5,126msproductionMean over the twelve demo images, one run, TensorFlow 2.20 on CPU only, beam search of width 5. Timed around the generation alone, feature extraction excluded.A second run gave 4,560 ms, a gap of roughly 12%: the value depends on machine load and was not averaged over several runs.
Feature extraction on CPU
643msproductionMean over the twelve demo images, one run. Forward pass of InceptionV3 on an image resized to 299 x 299, CPU only.

External references

5 results published by others

Results published by others. The "comparable" column states whether the reference covers the same task and the same training regime: a neighbouring but different reference cannot be compared.

  • Visual perception based deep learning transformers for classifying paintings and photographs through feature extractionScientific Reports, 2026, Binary classification of photograph versus painting, two homogeneous classes, on a Kaggle dataset whose size could not be verified.95.7% accuracy (fine-tuned ResNet50) · pretrainedNot comparable · A homogeneous negative class, paintings only, where ours mixes paintings, diagrams, drawings and text; and a backbone pretrained on ImageNet where our network starts from scratch.
  • Paintings vs Photos Classification Using Deep LearningIEEE, 2024, Binary classification of photograph versus painting.about 95% accuracy · training regime not verifiedNot comparable · Full text unavailable: the figure comes from a search-engine summary and the training regime could not be established. Not comparable, and not to be treated as a solid reference.
  • Compare the performance of the models in art classificationPLOS ONE, 2021, Classification of artworks by artist, style and genre on Painting-91, WikiArt and MultitaskPainting100K; seven architectures compared, pretrained and from scratch.71.27% (artist) and 78.22% (style), EfficientNet-B3 · pretrainedNot comparable · A different task: identifying an artist or a style, not separating photograph from non-photograph. Kept for one reason only: it explicitly compares pretraining against training from scratch on art images.
  • Do Better ImageNet Models Transfer Better?Kornblith, Shlens and Le, 2019, A general study of transfer from ImageNet to twelve image classification datasets.a methodological reference, not a single figure · not applicableNot comparable · Does not address our task. Cited to establish that transfer outperforms training from scratch, which justifies not comparing the two regimes.
  • A Comparative Study of Custom CNNs, Pre-trained Models, and Transfer Learning Across Multiple Visual DatasetsAkhand, 2026, A controlled comparison between an in-house CNN trained from scratch, a frozen pretrained extractor, and transfer, across five real image datasets."transfer learning consistently gives the best performance; the in-house CNN offers an appealing efficiency-accuracy trade-off" · trained from scratchNot comparable · Datasets and tasks unrelated to the photo / non-photo sort. Cited for the training regime, the only thing they have in common.