vseasky / yolo-for-k210

Yolo-for-k210
171 stars 75 forks source link

Yolo-for-k210

vseasky/yolo-for-k210

教程

riscv-k210

环境配置

  1. 常规版本
  1. 30显卡系列

准备数据集

  1. 推荐使用Vott工具对数据集进行标注,导出为PascalVoc格式。
  2. 案例 VOC 数据集存储于 /train-image/VOCdevkit,你可以修改为自定义数据集路径为 /train-image/your_img

    数据集结构

readme.png

  1. 运行make-train.py脚本,会按照7:2:1的比例,分配为训练集、验证集、测试集文件(pscalvoc.txt、train.txt、val.txt、test.txt),同时会自动检测并删除不成对的多余文件。
cd ./train-image
wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
wget https://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar
wget https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar
# 解压文件
tar xf VOCtrainval_11-May-2012.tar
tar xf VOCtrainval_06-Nov-2007.tar
tar xf VOCtest_06-Nov-2007.tar
# 合并数据集
cd VOCdevkit/
mv ./VOC2007/* ./
cp -r ./VOC2012/* ./
rm -rf VOC2007
rm -rf VOC2012
# 使用VOC数据集
python make-train.py ./VOCdevkit
# 使用自定义数据集
python make-train.py ./your_img
  1. 数据集预处理 voc_label.py

image.png

# 使用VOC数据集
python voc_label.py
cat  VOCdevkit_train.txt VOCdevkit_val.txt> train.txt   #Linux使用此命令
# type VOCdevkit_train.txt VOCdevkit_val.txt> train.txt #windowns使用此命令
# 使用自定义数据集
python voc_label.py
cat  your_img_train.txt your_img_val.txt> train.txt     #Linux使用此命令
# type your_img_train.txt your_img_val.txt> train.txt   #windowns使用此命令
  1. 检查 txt 文件内容是否正确,文件内容为图片路径。

  2. JPEGImages 路径和 Annotations 合并到一个NPY 文件中。

python make_voc_list.py train.txt data/voc_img_ann.npy

image.png

修改配置文件

你可以直接在 Makefile 编辑默认配置,又或者在 make 操作时传入参数。

image.png

生成 Anchors

加载Annotations生成 Anchors (LOW 和 HIGH 视数据集的分布而定):

# make anchors # 使用默认参数
make anchors DATASET=voc ANCNUM=3 LOW="0.0 0.0" HIGH="1.0 1.0" # 更改自定义参数

当你成功的时候,你会看到这样以下内容:

Figure_2.png

image.png

注:结果是随机的。当你有错误时,就重新运行它。

如果要使用自定义数据集,只需修改脚本并生成 data/{your_img}_img_ann.npy,然后使用 make anchors DATASET=your_img。更多选项请参见 python ./make_anchor_list.py -h

如果要更改输出层的数目,则应修改 OUTSIZE 在 Makefile

下载预训练模型

你必须下载您想要训练的模型权重,因为默认情况下会加载训练前的权重。把文件放进./data 目录。

MODEL DEPTHMUL Url Url
yolo_mobilev1 0.5 google drive weiyun
yolo_mobilev1 0.75 google drive weiyun
yolo_mobilev1 1.0 google drive weiyun
yolo_mobilev2 0.5 google drive weiyun
yolo_mobilev2 0.75 google drive weiyun
yolo_mobilev2 1.0 google drive weiyun
tiny_yolo google drive weiyun
yolo google drive weiyun

训练

使用 Mobileenet 时,需要指定 DEPTHMUL 参数。 使用 tiny yolo 或 yolo 你不需要设定 DEPTHMUL.

  1. 设置并开始训练:MODE-LDEPTHMUL
make train MODEL=yolo_mobilev1 DEPTHMUL=0.75 MAXEP=10 ILR=0.001 DATASET=voc CLSNUM=20 IAA=False BATCH=16

image.png

使用 Ctrl+C 停止训练,它将自动在日志目录中保存权重和模型。
  1. 设置为继续训练:CKPT
make train MODEL=yolo_mobilev1 DEPTHMUL=0.75 MAXEP=10 ILR=0.0005 DATASET=voc CLSNUM=20 IAA=False BATCH=16 CKPT=log/xxxxxxxxx/yolo_model.h5
  1. 设置为启用数据增强:IAA
make train MODEL=xxxx DEPTHMUL=xx MAXEP=10 ILR=0.0001 DATASET=voc CLSNUM=20 IAA=True BATCH=16 CKPT=log/xxxxxxxxx/yolo_model.h5
  1. 使用 tensorboard:
tensorboard --logdir log

注意:更多选项请参阅与python ./keras_train.py -h

推理

  1. 使用自己训练的模型
make inference MODEL=yolo_mobilev1 DEPTHMUL=0.75 CLSNUM=20 CKPT=log/xxxxxx/yolo_model.h5 IMG=data/input/people.jpg
  1. 你可以尝试我的模型:
make inference MODEL=yolo_mobilev1 DEPTHMUL=0.75 CKPT=asset/yolo_model.h5 IMG=data/input/people.jpg

people.png

make inference MODEL=yolo_mobilev1 DEPTHMUL=0.75 CKPT=asset/yolo_model.h5 IMG=data/input/dog.jpg

dog_res.jpg

注:由于 anchors 是随机生成的,如果您的结果与上面的图像不同,你只需要加载这个模型并继续训练一段时间。

更多选项请参见python ./keras_inference.py -h

修剪模型

make train MODEL=xxxx MAXEP=1 ILR=0.001 DATASET=voc CLSNUM=20 BATCH=16 PRUNE=True CKPT=log/xxxxxx/yolo_model.h5 END_EPOCH=1

训练结束时,将模型保存为 log/xxxxxx/yolo_prune_model.h5.

Freeze

toco --output_file data/tflite/mobile_yolo.tflite --keras_model_file log/xxxxxx/yolo_model.h5

现在你有了 mobile_yolo.tflite

转换 Kmodel

请参考 nncase v0.1.0-RC5 example

  1. NNCase Converter v0.1.0 RC5
./nncase/0.1.0/ncc --version
./nncase/0.1.0/ncc data/tflite/mobile_yolo.tflite mobile_yolo_v3.kmodel -i tflite -o k210model --dataset nncase-images

将 Kmodel 部署到 K210

这是一个完整的解决方案,底层的硬件和软件部署请参考 vseasky/riscv-k210

IMG_8355.JPG

IMG_8355.JPG

IMG_8351.JPG

常见问题&FAQ

参考

zhen8838/K210_Yolo_framework

2020/7/5 21:04:35