Skip to content

Commit

Permalink
modify finetune tutorial
Browse files Browse the repository at this point in the history
  • Loading branch information
yuedongli1 committed Aug 11, 2023
1 parent f8845cf commit 1697215
Show file tree
Hide file tree
Showing 6 changed files with 92 additions and 357 deletions.
2 changes: 1 addition & 1 deletion demo/predict.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ def infer(args):
)
if args.save_result:
save_path = os.path.join(args.save_dir, "detect_results")
draw_result(args.image_path, result_dict, args.data.names, save_path=save_path)
draw_result(args.image_path, result_dict, args.data.names, is_coco_dataset=is_coco_dataset, save_path=save_path)

logger.info("Infer completed.")

Expand Down
14 changes: 7 additions & 7 deletions docs/zh/how_to_guides/data_preparation.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@
```
其中train.txt文件每行对应单张图片的相对路径,例如:
```
./images/train/00000000.jpg
./images/train/00000001.jpg
./images/train/00000002.jpg
./images/train/00000003.jpg
./images/train/00000004.jpg
./images/train/00000005.jpg
./images/train2017/00000000.jpg
./images/train2017/00000001.jpg
./images/train2017/00000002.jpg
./images/train2017/00000003.jpg
./images/train2017/00000004.jpg
./images/train2017/00000005.jpg
```
labels下的train2017文件夹下的txt文件为相应图片的标注信息,支持detect和segment两种格式。

Expand All @@ -50,7 +50,7 @@ segment格式:每行第一个数据为类别id,后续为两两成对的归
49 0.716891 0.0519583 0.683766 0.0103958 0.611688 0.0051875 0.568828 0.116875 0.590266 0.15325 0.590266 0.116875 0.613641 0.0857083 0.631172 0.0857083 0.6565 0.083125 0.679875 0.0883125 0.691563 0.0961042 0.711031 0.0649375
```
instances_val.json为coco格式的验证集标注,可直接调用coco api用于map的计算。
instances_val2017.json为coco格式的验证集标注,可直接调用coco api用于map的计算。

训练&推理时,需修改`configs/coco.yaml`中的`train_set`,`val_set`,`test_set`为真实数据路径

Expand Down
98 changes: 79 additions & 19 deletions examples/finetune_SHWD/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,52 +20,112 @@
├── 000000.jpg
└── 000002.jpg
```
其中,ImageSets/Main文件下的txt文件中每行代表相应子集中单张图片不含后缀的文件名,例如
Annotations文件夹下的xml文件为每张图片的标注信息,主要内容如下
```
000002
000005
000019
000022
000027
000034
<annotation>
<folder>JPEGImages</folder>
<filename>000377.jpg</filename>
<path>F:\baidu\VOC2028\JPEGImages\000377.jpg</path>
<source>
<database>Unknown</database>
</source>
<size>
<width>750</width>
<height>558</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>hat</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>142</xmin>
<ymin>388</ymin>
<xmax>177</xmax>
<ymax>426</ymax>
</bndbox>
</object>
```
其中包含多个object, object中的name为类别名称,xmin, ymin, xmax, ymax则为检测框左上角和右下角的坐标。

MindYOLO支持的数据集格式为YOLO格式,详情可参考[数据准备](../../docs/zh/how_to_guides/data_preparation.md)

由于MindYOLO在验证阶段选用图片名称作为image_id,因此图片名称只能为数值类型,而不能为字符串类型,还需要对图片进行改名。对SHWD数据集格式的转换包含如下步骤:
* 将图片复制到相应的路径下并改名
* 在根目录下相应的txt文件中写入该图片的相对路径
* 解析xml文件,在相应路径下生成对应的txt标注文件
* 验证集还需生成最终的json文件

详细实现可参考[convert_shwd2yolo.py](./convert_shwd2yolo.py)运行方式如下:
详细实现可参考[convert_shwd2yolo.py](./convert_shwd2yolo.py)运行方式如下:

```shell
python examples/finetune_SHWD/convert_shwd2yolo.py --root_dir /path_to_shwd/SHWD
```

运行以上命令将在不改变原数据集的前提下,在同级目录生成yolo格式的SHWD数据集。

#### 预训练模型文件转换
#### 编写yaml配置文件
配置文件主要包含数据集、数据增强、loss、optimizer、模型结构涉及的相应参数,由于MindYOLO提供yaml文件继承机制,可只将需要调整的参数编写为yolov7-tiny_shwd.yaml,并继承MindYOLO提供的原生yaml文件即可,其内容如下:
```
__BASE__: [
'../../configs/yolov7/yolov7-tiny.yaml',
]

per_batch_size: 16 # 16 * 8 = 128
img_size: 640 # image sizes
weight: ./yolov7-tiny_pretrain.ckpt
strict_load: False
log_interval: 10

data:
dataset_name: shwd
train_set: ./SHWD/train.txt
val_set: ./SHWD/val.txt
test_set: ./SHWD/val.txt
nc: 2
# class names
names: [ 'person', 'hat' ]

optimizer:
lr_init: 0.001 # initial learning rate
```
* ```__BASE__```为一个列表,表示继承的yaml文件所在路径,可以继承多个yaml文件
* per_batch_size和img_size分别表示单卡上的batch_size和数据处理图片采用的图片尺寸
* weight为上述提到的预训练模型的文件路径,strict_load表示丢弃shape不一致的参数
* log_interval表示日志打印间隔
* data字段下全部为数据集相关参数,其中dataset_name为自定义数据集名称,train_set、val_set、test_set分别为保存训练集、验证集、测试集图片路径的txt文件路径,nc为类别数量,names为类别名称
* optimizer字段下的lr_init为经过warm_up之后的初始化学习率,此处相比默认参数缩小了10倍
由于SHWD数据集只有7000+张图片,选择yolov7-tiny进行该数据集的训练,可下载MindYOLO提供的在coco数据集上训练好的[模型文件](https://github.com/mindspore-lab/mindyolo/blob/master/MODEL_ZOO.md)作为预训练模型。由于coco数据集含有80种物体类别,SHWD数据集只有两类,模型的最后一层head层输出与类别数nc有关,因此需将预训练模型文件的最后一层去掉, 可参考[convert_yolov7-tiny_pretrain_ckpt.py](./convert_yolov7-tiny_pretrain_ckpt.py)。运行方式如下:
参数继承关系和参数说明可参考[configuration_CN.md](../../tutorials/configuration_CN.md)
```shell
python examples/finetune_SHWD/convert_yolov7-tiny_pretrain_ckpt.py
```
#### 下载预训练模型
可选用MindYOLO提供的[MODEL_ZOO](../../MODEL_ZOO.md)作为自定义数据集的预训练模型,预训练模型在COCO数据集上已经有较好的精度表现,相比从头训练,加载预训练模型一般会拥有更快的收敛速度以及更高的最终精度,并且大概率能避免初始化不当导致的梯度消失、梯度爆炸等问题。
自定义数据集类别数通常与COCO数据集不一致,MindYOLO中各模型的检测头head结构跟数据集类别数有关,直接将预训练模型导入可能会因为shape不一致而导入失败,可以在yaml配置文件中设置strict_load参数为False,MindYOLO将自动舍弃shape不一致的参数,并抛出该module参数并未导入的告警
#### 模型微调(Finetune)
简要的训练流程可参考[finetune_shwd.py](./finetune_shwd.py)

由于SHWD训练集只有约6000张图片,选用yolov7-tiny模型进行训练。
* 在多卡NPU/GPU上进行分布式模型训练,以8卡为例:
```shell
mpirun --allow-run-as-root -n 8 python examples/finetune_SHWD/finetune_shwd.py --config ./examples/finetune_SHWD/yolov7-tiny_shwd.yaml --is_parallel True
mpirun --allow-run-as-root -n 8 python train.py --config ./examples/finetune_SHWD/yolov7-tiny_shwd.yaml --is_parallel True
```

* 在单卡NPU/GPU/CPU上训练模型:

```shell
python examples/finetune_SHWD/finetune_shwd.py --config ./examples/finetune_SHWD/yolov7-tiny_shwd.yaml
python train.py --config ./examples/finetune_SHWD/yolov7-tiny_shwd.yaml
```
*注意:直接用yolov7-tiny默认参数在SHWD数据集上训练,可取得AP50 87.0的精度。将lr_init参数由0.01改为0.001,即可实现ap50为89.2的精度结果。*

*注意:直接用yolov7-tiny默认coco参数在SHWD数据集上训练,可取得AP50 87.0的精度。将lr_init参数由0.01改为0.001,即可实现ap50为89.2的精度结果。*
#### 可视化推理
使用/demo/predict.py即可用训练好的模型进行可视化推理,运行方式如下:

```shell
python demo/predict.py --config ./examples/finetune_SHWD/yolov7-tiny_shwd.yaml --weight=/path_to_ckpt/WEIGHT.ckpt --image_path /path_to_image/IMAGE.jpg
```
推理效果如下:
<div align=center>
<img width='600' src="https://github.com/yuedongli1/images/raw/master/00006630.jpg"/>
</div>
15 changes: 0 additions & 15 deletions examples/finetune_SHWD/convert_yolov7-tiny_pretrain_ckpt.py

This file was deleted.

153 changes: 0 additions & 153 deletions examples/finetune_SHWD/finetune_shwd.py

This file was deleted.

Loading

0 comments on commit 1697215

Please sign in to comment.