YHD2018 AI

preparation

install dependencies

$ pipenv install

increase image file

$ pipenv run python increase_img.py
# OR
$ pipenv run python increase_img.py --start_class 7
# OR
$ pipenv run python increase_img.py --start_class 7 --end_class 12

add annotation

$ python /path/to/bboxtool.py ./train_data ./cfg/labels.txt

edit model config

  • classes はクラス数。
  • filtersの計算式は filters=(クラス数+5)*3 で計算する。

Yolo v3 tiny

$ set -x; \
  export CLASS_NUM=9; \
  export CFG_TRAIN=cfg/yolov3-tiny.train.cfg; \
  export CFG_PREDI=cfg/yolov3-tiny.predict.cfg; \
  export FILTERS=`expr \( $CLASS_NUM + 5 \) \* 3`; \
  cp cfg/yolov3-tiny.template.cfg ${CFG_TRAIN}; \
    sed -i.bak 's/^batch=64/batch=32/g' ${CFG_TRAIN}; \
    sed -i.bak 's/^classes=80/classes='${CLASS_NUM}'/g' ${CFG_TRAIN}; \
    sed -i.bak 's/^filters=255/filters='${FILTERS}'/g' ${CFG_TRAIN}; \
  cp cfg/yolov3-tiny.template.cfg cfg/${CFG_PREDI}; \
    sed -i.bak 's/^batch=64/batch=1/g' cfg/${CFG_PREDI}; \
    sed -i.bak 's/^subdivisions=16/subdivisions=1/g' ${CFG_PREDI}; \
    sed -i.bak 's/^classes=80/classes='${CLASS_NUM}'/g' ${CFG_PREDI}; \
    sed -i.bak 's/^filters=255/filters='${FILTERS}'/g' ${CFG_PREDI}; \
  rm ${CFG_TRAIN}.bak; \
  rm ${CFG_PREDI}.bak

Yolo v2 tiny

$ set -x; \
  export CLASS_NUM=9; \
  export CFG_TRAIN=cfg/yolov2-tiny.train.cfg; \
  export CFG_PREDI=cfg/yolov2-tiny.predict.cfg; \
  export FILTERS=`expr \( $CLASS_NUM + 5 \) \* 3`; \
  cp cfg/yolov3-tiny.template.cfg ${CFG_TRAIN}; \
    sed -i.bak 's/^## {BATCH_PARAM} ##/batch=32/g' ${CFG_TRAIN}; \
    sed -i.bak 's/^## {SUBDIVISION_PARAM} ##/subdivisions=16/g' ${CFG_PREDI}; \
    sed -i.bak 's/^## {CLASSES_PARAM} ##/classes='${CLASS_NUM}'/g' ${CFG_TRAIN}; \
    sed -i.bak 's/^## {FILTERS_PARAM} ##/filters='${FILTERS}'/g' ${CFG_TRAIN}; \
  cp cfg/yolov3-tiny.template.cfg  ${CFG_PREDI}; \
    sed -i.bak 's/^## {BATCH_PARAM} ##/batch=1/g' ${CFG_PREDI}; \
    sed -i.bak 's/^## {SUBDIVISION_PARAM} ##/subdivisions=1/g' ${CFG_PREDI}; \
    sed -i.bak 's/^## {CLASSES_PARAM} ##/classes='${CLASS_NUM}'/g' ${CFG_PREDI}; \
    sed -i.bak 's/^## {FILTERS_PARAM} ##/filters='${FILTERS}'/g' ${CFG_PREDI}; \
  rm ${CFG_TRAIN}.bak; \
  rm ${CFG_PREDI}.bak

make dataset file

$ set -x; \
  export CLASS_NUM=9; \
  export FILE_DB=cfg/dataset.txt; \
  export FILE_LBL=cfg/labels.txt; \
cat << EOT > ${FILE_DB}
classes=${CLASS_NUM}
train = temp/train/index.txt 
backup=backup/
labels=${FILE_LBL}
names=${FILE_LBL}
EOT

prep for fine tune

Download default weights file for yolov3-tiny:

https://pjreddie.com/media/files/yolov3-tiny.weights

Get Pre-trained weights for fine tune

Get pre-trained weights yolov3-tiny.conv.15 using command:

./darknet partial cfg/yolov3-tiny.cfg yolov3-tiny.weights yolov3-tiny.conv.15 15
mv yolov3-tiny.conv.15 ../

ref.
https://github.com/AlexeyAB/darknet#how-to-train-tiny-yolo-to-detect-your-custom-objects

Get pre-trained weights for yolov2-tiny

$ wget https://pjreddie.com/media/files/darknet19_448.conv.23

ref. https://pjreddie.com/darknet/yolov2/

exec training

docker run \
    --name yhd2018ai \
    --runtime=nvidia \
    -v $PWD:/opt/kby \
    -it fkmy/nvidia-docker-darknet:latest

yolo v3 tiny

In container

$ cd /opt/kby
$ ./prep.sh
$ export PATH=/opt/darknet:$PATH
$ darknet detector train \
    cfg/dataset.txt \
    cfg/yolov3-tiny.train.cfg \
    yolov3-tiny.conv.15

yolo v2 tiny

In container

$ cd /opt/kby
$ ./prep.sh
$ export PATH=/opt/darknet:$PATH
$ darknet detector train \
    cfg/dataset.txt \
    cfg/yolov2-tiny.train.cfg \
    darknet19_448.conv.23

prediction

darknet/cfg/kby.data を作成

classes=28
train = temp/train/index.txt 
valid = temp/val/index.txt 
labels = /Users/fkmy/git/yhd2018-ai/darknet/data/names.list
backup = backup/

darknet detector test を実行

$ cd darknet
$ ./darknet detector test cfg/kby.data ../cfg/yolov3.predict.cfg ../yolov3_50000.weights /Users/fkmy/git/yhd2018-ai/darknet/samples/theai20182nd/OR_IMG_8805.jpg

Keras yolo

conver darknet weights to keras model

# yolo3(original)
$ cd keras-yolo3
$ wget https://pjreddie.com/media/files/yolov3.weights
$ pipenv run python3 convert.py yolov3.cfg yolov3.weights model_data/yolo.h5
# tiny-yolo3
$ wget https://pjreddie.com/media/files/yolov3-tiny.weights
$ pipenv run python3 convert.py yolov3-tiny.cfg yolov3-tiny.weights model_data/yolo-tiny.h5

run detect

$ pipenv run python3 run_yolo3.py
$ pipenv run python3 run_yolo3tiny.py

refs