## Objective Inspired by Vishnu's excellent [Marvel Character classifier](https://notebookse.jarvislabs.ai/jY5fsv-S9jKoQQrgd1dsoJuCDt6pTg6ZjBpNK9afxLIGInQv4OlHVuTMHqOPh2LU/), this model is designed to thwart adversarial attacks by DC fans who can only dream of their characters being brought into the superior Marvel universe. ## Dataset The dataset is composed of roughly 200 Marvel and 200 DC character images fetched from https://duckduckgo.com/ using the code in Jeremy Howard's ['Is it a bird? Creating a model from your own data'](https://www.kaggle.com/code/jhoward/is-it-a-bird-creating-a-model-from-your-own-data) Kaggle notebook. ## Training With minimal modifications to our `DataBlock` and parameters passed to fastai's `vision_learner`, this model demonstrates how we can turn the multi-classification example Jeremy presented in session 1 of the 2022 fastai course into a regression task. These changes include: 1. Creating a labeling function that returns a float, 0.0 if it is a DC character and 1.0 if it is a Marvel character ```python def is_marvel(img): return 1. if img.parent.name.lower().startswith("marvel") else 0. ``` 2. Updating our `DataBlock`to use a `RegressionBlock` for our targets, and then assigning our labeling function above to the `get_y` argument. ```python blocks=(ImageBlock, RegressionBlock) ``` 3. Updating our call to `vision_learner` to use a regression friendly metric like RMSE, as well as specifying a `y_range` to constrain our predictions to the expected range of between 0 and 1. ```python learn = vision_learner(dls, resnet18, metrics=rmse, y_range=(0, 1)) ``` We'll start with a pre-trained `ResNet18` model which we'll train by calling `Learner.fine_tune()` and a learning rate of `1e-3`. This will train the classification head of the model (e.g., it will update the completely randomized weights dedicated to predicting a value) for 1 epoch, and then train all the model weights for 3 epochs. The final results of this process are included below. Training the classification head only: | epoch | train_loss | valid_loss | rmse | time | |-------|---------------|---------------|---------------|-------| | 0 | 0.344505 | 0.324276 | 0.569452 | 00:02 | Training the entire model: | epoch | train_loss | valid_loss | rmse | time | |-------|---------------|---------------|---------------|-------| | 0 | 0.303813 | 0.292256 | 0.540607 | 00:02 | | 1 | 0.250147 | 0.272003 | 0.521539 | 00:01 | | 2 | 0.223758 | 0.270610 | 0.520202 | 00:01 | ## Examples Example Marvel and DC character images from the dataset above are provided as examples for this demo. Feel free to upload your own Marvel, DC, and/or whatever else images to see whether you got a hero worth rooting for (or one to avoid).