Tutorial

How to train model

Adjust the following code from farabio.kernel.py:

import time
from farabio.core.configs import default_cfgs
from farabio.utils.helpers import EasyDict as edict
from farabio.models.classification.class_trainer import ClassTrainer
from farabio.models.classification.transformer_trainer import TransformerTrainer
from farabio.models.segmentation.unet.unet_trainer import UnetTrainer
from farabio.models.segmentation.attunet.attunet_trainer import AttunetTrainer
from farabio.models.superres.srgan.srgan_trainer import SrganTrainer
from farabio.models.translation.cyclegan.cyclegan_trainer import CycleganTrainer
from farabio.models.detection.yolov3.yolo_trainer import YoloTrainer
from farabio.models.detection.faster_rcnn.faster_rcnn_trainer import FasterRCNNTrainer


models = {
    "classification": {
        ("vgg", "resnet", "preactresnet", "googlenet",
         "densenet", "resnext", "mobilenet", "mobilenet2",
         "dpn92", "shufflenet2", "efficientnet", "regnet",
         "simpledla"): ClassTrainer,
    },
    "transformer": {
        "linformer": TransformerTrainer
    },
    "segmentation": {
        "unet": UnetTrainer,
        "attunet": AttunetTrainer,
    },
    "superres": {
        "srgan": SrganTrainer,
    },
    "translation": {    
        "cyclegan": CycleganTrainer,
    },
    "detection": {
        "yolov3": YoloTrainer,
        "faster_rcnn": FasterRCNNTrainer
    }
}


if __name__ == "__main__":
    itime = time.time()

    # Choose from list
    #model = ("classification", "resnet")
    #model = ("transformer", "linformer")
    model = ("segmentation", "unet")

    if model[0] == "classification":
        cfg = default_cfgs[model[0]]
        config = edict(cfg)
        config.arch = model[-1]
        trnr = ClassTrainer(config)
    elif model[0] == "transformer":
        cfg = default_cfgs[model[0]]
        config = edict(cfg)
        trnr = TransformerTrainer(config)
    else:
        cfg = default_cfgs[model[-1]]
        config = edict(cfg)
        trnr = models[model[0]][model[-1]](config)

    if config.mode == 'train':
        trnr.train()
    elif config.mode == 'test':
        trnr.test()
    # elif config.mode == 'detect':
    #     assert model == "yolov3", "detect mode works only for yolo!"
    #     trnr.detect_perform()

    etime = time.time() - itime
    print(f'Complete in {etime // 60}m {etime % 60: .2f}s')

How to use Tensorboard

$ tensorboard --logdir=<DIR-WHERE-TFRECORDS-FILE-STORED> --port 6006

How to train Yolo-v3 on custom dataset

  1. Create custom configuration Yolo:

$ cd farabio/models/detection/yolov3/config/          # Navigate to config dir
$ bash create_custom_model.sh <num-classes>  # Will create custom model 'yolov3-custom.cfg'
  1. Modify the ‘custom.data’ file according to the dataset:

$ cd farabio/models/detection/config/          # Navigate to config dir
$ nano custom.data                           # Change classes, train, valid and names fields
  1. Start YOLO trainer with settings:

$ python kernel.py --mode train --model_def <yolov3-custom.cfg> --data_config <custom.data> --pretrained_weights <darknet53.conv.74>     # Start training
$ python kernel.py --mode <test|detect> --model_def <yolov3-custom.cfg> --data_config <custom.data> --weights_path <weights.pth>         # Start test/detecting