# Emotion Recognition ## Preparation ### Requirements We build the Docker image based on `pytorch/pytorch:1.7.0-cuda11.0-cudnn8-runtime` docker image. The additional dependencies are contained in `requirements.txt`. ### File Structure Extract the dataset and checkpoint files to `./data/`, so the file structure becomes: ``` . +-- data | +-- affectnet | | +-- all_data | | | +-- 1 | | | ... | | | +-- 1349 | | +-- data_training_all.npy | | +-- data_validation_final.npy | +-- checkpoints | +-- ctbc | | +-- all_data | | | +-- Anger | | | ... | | | +-- Surprise | | +-- fold1_training.npy | | ... | | +-- fold5_validation.npy | +-- logs +-- datasets +-- models +-- scripts +-- utils +-- CTBC_baseline_train.py +-- CTBC_hierarchical_train.py +-- README.md ``` All files except `./data/` will be copied when building the Docker images, so the `./data/` folder should be mounted manually when running the Docker container. The trainer will save the latest checkpoint and the checkpoint with the best accuracy to the `./checkpoints/`. The trainer also logs loss and accuracy values to a logfile and TensorBoard files to the `./logs`. ## Command Line Arguments Several important hyperparameter setting that can inputed from command line: ``` --arch = model architecture (default: mobilenet) --dropout = enables dropout before classifier layer --mask_version = mask type for hierachical model --dataset = dataset selection (default: affectnet) --fold = which cross-validation fold, unused for affectnet (default: None) --batch_size = batch size (default: 32) --n_class = number of class (default: 7) --n_epochs = number of epochs --pretrain = model pretraining (default: imagenet), if custom, specify path to the checkpoint using --pretrain_path --pretrain_path = path to checkpoint for pretraining --class_balanced = use Class Balanced Loss --beta = hyperparameters for Class Balanced Loss (ignored if no --class_balanced flag) --data_root = dataset directory --checkpoint_root = path to checkpoint --log_root = path to logs ``` ## Training For example, to train MobileNet model on AffectNet for both 7 and 8 classes, run: ```bash ./scripts/train_affectnet_baseline_mobilenet.sh ``` ## Evaluation For example, to evaluate trained MobileNet model on AffectNet for both 7 and 8 classes, run: ```bash ./scripts/eval_affectnet_baseline_mobilenet.sh ``` # IOS Application ## Preparation ### Requirements We build the application on macOS Catalina The additional dependencies are contained in `requirements.txt`. ### File Structure ``` +-- Swift_App | +-- convert_model | | +-- image_test | | | +-- test_image.jpg | | +-- models | | +-- output | | +-- pytorch_model | | | +-- checkpoint_best.pth | | +-- scripts | | +-- coreml.py | +-- App | | +-- emotion | | | +-- emotion | | | +-- emotion.xcodeproj ``` pytorch model should be mounted to pytorch_model folder manually. The coreML model will save in `./output/`. ## Command Line Arguments Several important hyperparameter setting that can inputed from command line: ``` --arch = model architecture (default: mobilenet) --type = baseline or hierachical model type (default: baseline) --dropout = enables dropout before classifier layer --n_class = number of class (default: 7) --mask_version = mask type for hierachical model --testing_model = enabled for testing --img_path = path to image --checkpoint_root = path to checkpoint ``` ## Convert Pytorch Model to CoreML model To convert the model(should be run on macOS), run: ```bash ./scripts/pth2coreml.sh ``` ## Run App * Open the emotion.xcodeproj using Xcode on macOS. * Run and build the code to the device # Update for subset evaluation Move the `subset.npy` to ctbc folder as shown in below ``` . +-- data | +-- affectnet | | +-- all_data | | | +-- 1 | | | ... | | | +-- 1349 | | +-- data_training_all.npy | | +-- data_validation_final.npy | +-- checkpoints | +-- ctbc | | +-- all_data | | | +-- Anger | | | ... | | | +-- Surprise | | +-- fold1_training.npy | | ... | | +-- fold5_validation.npy | | +-- subset.npy <---------| | +-- logs | +-- datasets | +-- models | +-- scripts | +-- utils | +-- CTBC_baseline_train.py | +-- CTBC_hierarchical_train.py | +-- README.md | +-- subset.npy-------------------| ``` ## Evaluation To evaluate the subset, run: ```bash ./scripts/eval_ctbc_hierarchical_subset.sh ```