This repository is part of a program for previewing your own dyeing on mobile device. To do this, you need to separate the hair from the head. And we have to use as light model as MobileNet to use in mobile device in real time. So we borrowed the model structure from the following article.
Real-time deep hair matting on mobile devices
This model MobileNet + SegNet.
To do semantic segmentation they transform MobileNet like SegNet.
And add additional loss function to capture fine hair texture.
pip install -r requirements.txt
IOU (%) | inference speed (ms) | model size (MB) | |
---|---|---|---|
version1 (MobilenetV1) | 92.48 | 370 | 15.61 |
quatization version 1 | 85.82 | 154 | 4.40 |
version2 (MobilenetV2) | 93.21 | 377 | 15.27 |
quantization version 2 | 92.82 | 133 | 6.82 |
if you don't apply layer fusion some part, you can get better performance
(delete part on model1
delete part on model2)
IOU (%) | inference speed (ms) | model size (MB) | |
---|---|---|---|
version1 (MobilenetV1) | 92.48 | 370 | 15.61 |
quantization version 1 | 91.51 | 175 | 4.40 |
version2 (MobilenetV2) | 93.21 | 377 | 15.27 |
quantization version 2 | 92.90 | 155 | 6.88 |
make directory like this
dataset
|__ images
|
|__ masks
expected image name
The name of the expected image pair is:
- dataset/images/1.jpg
|
- dataset/masks/1.jpg
/dataset
/images
/1.jpg
/2.jpg
/3.jpg
...
/masks
/1.jpg
/2.jpg
/3.jpg
...
after 200 epoch, add other commented augmentation and remove resize
(dataloader/dataloader.py)
There are modelv1 and modelv2 whose backbone are mobilenetv1 and mobilenetv2 each other. Default is mobilenetv2
python main.py --num_epoch [NUM_EPOCH] --model_version [1~2]
If you want to quantize model
python main.py --num_epoch [NUM_EPOCH] --model_version [1~2] --quantize
Or if you want to resume model training
python main.py --num_epoch [NUM_EPOCH] --model_version [1~2] --resume
python main.py --num_epoch [NUM_EPOCH] --model_version [1~2] --model_path [MODEL_PATH]
python webcam.py --model_path [MODEL_PATH]
if you want to use quantized model
python webcam.py --model_path [MODEL_PATH] --quantize
All you have to do is copy ./model and use it
ex)
import torch
from models import quantized_modelv2
quantize = False
device = torch.device("cuda:0" if torch.cuda.is_available() and not quantize else "cpu")
quantized_modelv2(pretrained=True, device=device).to(device)
The dependency libraries in the container can be found in the release notes.
docker pull nvcr.io/nvidia/tensorrt:<xx.xx>-py<x>
docker run --gpus all -it --rm -v local_dir:container_dir nvcr.io/nvidia/tensorrt:<xx.xx>-py<x>
pip install -r requirements.txt
pip install torch-tensorrt -f https://github.com/pytorch/TensorRT/releases
python torch2tensorrt.py -model_version [1~2]
IOU (%) | inference speed (ms) | model size (MB) | |
---|---|---|---|
version1 (MobilenetV1) | 92.48 | 49 | 15.61 |
TensorRT on version1 | 92.48 | 5 | 15.61 |
version2 (MobilenetV2) | 93.21 | 72 | 15.27 |
TensorRT on version2 | 93.21 | 8 | 0.495 |