From 8fd26024f8eb8740588833ba4fcf0ce88a234931 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Mon, 21 Nov 2022 11:18:16 +0800 Subject: [PATCH 01/73] Add doc --- docs/zh_cn/user_guides/custom_dataset.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/zh_cn/user_guides/custom_dataset.md diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md new file mode 100644 index 000000000..8c27489ea --- /dev/null +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -0,0 +1 @@ +# 自定义数据集 From f343d51d526e61563e997e116d348bb99d283875 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Mon, 21 Nov 2022 14:42:14 +0800 Subject: [PATCH 02/73] Add doc --- docs/zh_cn/user_guides/custom_dataset.md | 168 ++++++++++++++++++++++- docs/zh_cn/user_guides/index.rst | 1 + 2 files changed, 168 insertions(+), 1 deletion(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 8c27489ea..bfa653124 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -1 +1,167 @@ -# 自定义数据集 +# 自定义数据集训练部署 + +本章节会介绍从 用户自己的图片数据集 到 最终进行训练 的整体流程。打标签使用的软件是 [labelme](https://github.com/wkentaro/labelme) +流程步骤概览如下: + +1. 打标签 +2. 使用脚本转换成 COCO 数据集格式 +3. 数据集切分 +4. 根据数据集内容新建 config 文件 +5. 训练 +6. 测试 +7. 部署 + +下面详细介绍每一步。 + +## 1. 打标签 + +通常,打标签有2种方法: + +- 辅助 + 人工打标签 +- 纯人工打标签 + +## 1.1 辅助 + 人工打标签 + +辅助打标签的原理是用已有模型进行推理,将得出的推理信息保存为打标签软件的标签文件格式。 + +**Tips**:如果已有模型没有新数据集的类,可以先人工打100张左右的图片标签,训练个初始模型,然后再进行辅助打标签。 + +人工操作打标签软件加载生成好的标签文件,只需要检查每张图片的目标是否标准,以及是否有漏掉的目标。 + +【辅助 + 人工打标签】这种方式可以节省很多时间和精力,达到降本提速的目的。 + +下面会分别介绍其过程: + +### 1.1.1 辅助打标签 + +MMYOLO 提供模型推理生成 labelme 格式标签文件的脚本 `demo/image_demo.py`,具体用法如下: + +```shell +image_demo.py img \ + config \ + checkpoint + [-h] \ + [--out-dir OUT_DIR] \ + [--device DEVICE] \ + [--show] \ + [--deploy] \ + [--score-thr SCORE_THR] \ + [--to-labelme] +``` + +其中: + +- `img`: 图片的路径,支持文件夹、文件、URL; +- `config`:用到的模型 config 文件路径; +- `checkpoint`:用到的模型权重文件路径; +- `--out-dir`:推理结果输出到指定目录下,默认为 `./output`,当 `--show` 参数存在时,不保存检测结果; +- `--device`:使用的计算资源,包括 `CUDA`, `CPU` 等,默认为 `cuda:0`; +- `--show`:使用该参数表示在屏幕上显示检测结果,默认为 `False`; +- `--deploy`:是否切换成 deploy 模式; +- `--score-thr`:置信度阈值,默认为 `0.3`; +- `--to-labelme`:是否导出 `labelme` 格式的标签文件,不可以与 `--show` 参数同时存在 + +eg. + +```shell +python demo/image_demo.py \ + /data/cat/images \ + configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \ + work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \ + --out-dir /data/cat/labels \ + --to-labelme +``` + +生成的标签文件会在 `--out-dir` 中: + +```shell +. +└── $OUT_DIR + ├── image1.json + ├── image1.json + └── ... +``` + +### 1.1.2 人工打标签 + +本教程使用的打标签软件是 [labelme](https://github.com/wkentaro/labelme) + +- 安装 labelme + +```shell +pip install labelme +``` + +- 启动 labelme + +```shell +labelme ${图片文件夹路径(即上一步的图片文件夹)} \ + --output ${label文件所处的文件夹路径(即上一步的 --out-dir)} \ + --autosave \ + --nodata +``` + +eg. + +```shell +labelme /data/cat/images --output /data/cat/labels --autosave --nodata +``` + +输入命令之后 labelme 就会启动,然后进行标签检查即可。 + +## 1.2 人工打标签 + +步骤和 【1.1.2 人工打标签】 相同,只是这里是直接打标签,没有预先生成的标签。 + +## 2. 使用脚本转换成 COCO 数据集格式 + +### 2.1 使用脚本转换 + +MMYOLO 提供脚本将 labelme 的标签转换为 COCO 标签 + +```shell +python tools/dataset_converters/labelme2coco.py ${图片文件夹} \ + --label-dir ${标签文件夹位置} \ + --output ${输出COCO数据集json路径} +``` + +### 2.2 检查转换的 COCO 标签 + +```shell +python tools/analysis_tools/browse_coco_json.py './data/coco/' \ + --ann_file 'annotations/instances_train2017.json' \ + --img_dir 'train2017' \ + --disp-all +``` + +关于 `tools/analysis_tools/browse_coco_json.py` 的更多用法请参考 [可视化 COCO 标签](useful_tools.md)。 + +## 3. 数据集切分 + +## 4. 根据数据集内容新建 config 文件 + +- 修改 config data_root +- data_prefix +- 根据 classes.txt 配置 metainfo=metainfo,num_classes +- 根据自己的GPU情况,修改 train_batch_size_per_gpu, base_lr +- 推荐使用 nGPU x 4 的 train_num_workers +- 设置 pretrain 的文件路径 or URL + +## 5. 训练 + +使用 YOLOv5s 作为例子: + +```shell +python tools/train.py configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py +``` + +## 6. 推理查看 + +```shell +python demo/image_demo.py /data/cat_split/test \ + configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \ + work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/last.pth \ + --out-dir /data/cat_split/test_output +``` + +## 7. 部署 diff --git a/docs/zh_cn/user_guides/index.rst b/docs/zh_cn/user_guides/index.rst index a814669c3..d5122fded 100644 --- a/docs/zh_cn/user_guides/index.rst +++ b/docs/zh_cn/user_guides/index.rst @@ -24,5 +24,6 @@ MMYOLO 在 `Model Zoo `_ .. toctree:: :maxdepth: 1 + custom_dataset.md visualization.md useful_tools.md From 54f7d181fb9d74bdc9c87df6b6c32f56cad08c87 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Mon, 21 Nov 2022 15:49:41 +0800 Subject: [PATCH 03/73] Add doc --- docs/zh_cn/user_guides/custom_dataset.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index bfa653124..a6f2916d0 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -1,4 +1,4 @@ -# 自定义数据集训练部署 +# 自定义数据集 训练+部署 全流程 本章节会介绍从 用户自己的图片数据集 到 最终进行训练 的整体流程。打标签使用的软件是 [labelme](https://github.com/wkentaro/labelme) 流程步骤概览如下: From b054dcb9fe322b6f0496a5b3bd8b5e8e889694e6 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Mon, 21 Nov 2022 17:10:40 +0800 Subject: [PATCH 04/73] Add doc --- docs/zh_cn/user_guides/custom_dataset.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index a6f2916d0..ae4f5a99b 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -109,6 +109,8 @@ labelme /data/cat/images --output /data/cat/labels --autosave --nodata 输入命令之后 labelme 就会启动,然后进行标签检查即可。 +**注意:打标签的时候务必使用 `rectangle`** + ## 1.2 人工打标签 步骤和 【1.1.2 人工打标签】 相同,只是这里是直接打标签,没有预先生成的标签。 From 923e1c269b5a227b427ce6565478b5ebc1c88f8f Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Tue, 22 Nov 2022 09:43:17 +0800 Subject: [PATCH 05/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index ae4f5a99b..b55d6cb8d 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -122,18 +122,17 @@ labelme /data/cat/images --output /data/cat/labels --autosave --nodata MMYOLO 提供脚本将 labelme 的标签转换为 COCO 标签 ```shell -python tools/dataset_converters/labelme2coco.py ${图片文件夹} \ +python tools/dataset_converters/labelme2coco.py ${图片文件夹路径} \ --label-dir ${标签文件夹位置} \ --output ${输出COCO数据集json路径} ``` ### 2.2 检查转换的 COCO 标签 +使用下面的命令可以将 COCO 的标签在图片上进行显示,这一步可以验证刚刚转换是否有问题: ```shell -python tools/analysis_tools/browse_coco_json.py './data/coco/' \ - --ann_file 'annotations/instances_train2017.json' \ - --img_dir 'train2017' \ - --disp-all +python tools/analysis_tools/browse_coco_json.py --img_dir ${图片文件夹路径} \ + --ann_file ${输出COCO数据集json路径} ``` 关于 `tools/analysis_tools/browse_coco_json.py` 的更多用法请参考 [可视化 COCO 标签](useful_tools.md)。 From 6d8f1ea7119023e4502f60e6116a52cd4b2a8b6c Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Tue, 22 Nov 2022 09:43:44 +0800 Subject: [PATCH 06/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index b55d6cb8d..465e8e20c 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -131,8 +131,8 @@ python tools/dataset_converters/labelme2coco.py ${图片文件夹路径} \ 使用下面的命令可以将 COCO 的标签在图片上进行显示,这一步可以验证刚刚转换是否有问题: ```shell -python tools/analysis_tools/browse_coco_json.py --img_dir ${图片文件夹路径} \ - --ann_file ${输出COCO数据集json路径} +python tools/analysis_tools/browse_coco_json.py --img-dir ${图片文件夹路径} \ + --ann-file ${输出COCO数据集json路径} ``` 关于 `tools/analysis_tools/browse_coco_json.py` 的更多用法请参考 [可视化 COCO 标签](useful_tools.md)。 From e11e2ba1e3f2ba0a9021e23b02dac5a85028826d Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 23 Nov 2022 19:30:10 +0800 Subject: [PATCH 07/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 27 +++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 465e8e20c..1587aa88f 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -5,7 +5,7 @@ 1. 打标签 2. 使用脚本转换成 COCO 数据集格式 -3. 数据集切分 +3. 数据集划分 4. 根据数据集内容新建 config 文件 5. 训练 6. 测试 @@ -122,22 +122,39 @@ labelme /data/cat/images --output /data/cat/labels --autosave --nodata MMYOLO 提供脚本将 labelme 的标签转换为 COCO 标签 ```shell -python tools/dataset_converters/labelme2coco.py ${图片文件夹路径} \ +python tools/dataset_converters/labelme2coco.py --img-dir ${图片文件夹路径} \ --label-dir ${标签文件夹位置} \ - --output ${输出COCO数据集json路径} + --out ${输出COC标签json路径} ``` ### 2.2 检查转换的 COCO 标签 使用下面的命令可以将 COCO 的标签在图片上进行显示,这一步可以验证刚刚转换是否有问题: + ```shell python tools/analysis_tools/browse_coco_json.py --img-dir ${图片文件夹路径} \ - --ann-file ${输出COCO数据集json路径} + --ann-file ${COCO标签json路径} ``` 关于 `tools/analysis_tools/browse_coco_json.py` 的更多用法请参考 [可视化 COCO 标签](useful_tools.md)。 -## 3. 数据集切分 +## 3. 数据集划分 + +```shell +python tools/analysis_tools/browse_coco_json.py --json ${COCO标签json路径} \ + --out-dir ${划分标签json保存路径} \ + --ratio ${划分比例} \ + [--shuffle] \ + [--seed ${划分的随机种子}] +``` + +其中: + +- `--ratio`:划分的比例,如果只设置了2个,则划分为 `trainval + test`,如果设置为 3 个,则划分为 `train + val + test`。支持两种格式:整数和小数: + - 小数:划分为比例,但是**全部比例加起来必须等于 `1`**。例子: `--ratio 0.8 0.1 0.1` or `--ratio 0.8 0.2` + - 整数:按比分进行划分,代码中会进行归一化之后划分数据集。例子: `--ratio 2 1 1`(代码里面会转换成 `0.5 0.25 0.25`) or `--ratio 3 1`(代码里面会转换成 `0.75 0.25`) +- `--shuffle`: 是否打乱数据集再进行划分; +- `--seed`:可以设定划分的随机种子,不设置的话自动生成随机种子。 ## 4. 根据数据集内容新建 config 文件 From e835ef97040e67b80de5a9be8fcccf24123af2c6 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 23 Nov 2022 19:51:44 +0800 Subject: [PATCH 08/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 82 ++++++++++++++++++++++-- 1 file changed, 76 insertions(+), 6 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 1587aa88f..f83602563 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -158,12 +158,82 @@ python tools/analysis_tools/browse_coco_json.py --json ${COCO标签json路径} \ ## 4. 根据数据集内容新建 config 文件 -- 修改 config data_root -- data_prefix -- 根据 classes.txt 配置 metainfo=metainfo,num_classes -- 根据自己的GPU情况,修改 train_batch_size_per_gpu, base_lr -- 推荐使用 nGPU x 4 的 train_num_workers -- 设置 pretrain 的文件路径 or URL +确保数据集目录是这样的: + +```shell +. +└── $DATA_ROOT + ├── annotations + │ ├── train.json # or trainval.json + │ ├── val.json # optional + │ └── test.json + ├── images + │ ├── a.jpg + │ ├── b.png + │ └── ... + └── ... +``` + +因为是我们自定义的数据集,所以我们需要自己重写 config 中的部分信息,概览如下: + +```python +_base_ = './yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py' + +data_root = '/path/to/data_root' # 数据集目录的绝对路径 +checkpoint = 'https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth' + +train_batch_size_per_gpu = 8 # 根据自己的GPU情况,修改 batch size +train_num_workers = 4 # 推荐使用 train_num_workers = nGPU x 4 +val_batch_size_per_gpu = 2 # val 时候的 bs ,根据实际调整即可 +val_num_workers = 2 + +base_lr = _base_.base_lr / 4 # 根据自己的GPU情况,修改 base_lr,修改的比例是 base_lr_default * (your_bs / default_bs) + +num_classes=1 +metainfo = dict( # 根据类别信息,设置 metainfo + CLASSES=('cat'), + PALETTE=[(220, 20, 60)] # 画图时候的颜色,随便设置即可 +) + +model = dict( + backbone=dict(init_cfg=dict(type='Pretrained', checkpoint=checkpoint)), + bbox_head=dict(head_module=dict(num_classes=num_classes))) + +train_dataloader = dict( + batch_size=train_batch_size_per_gpu, + num_workers=train_num_workers, + dataset=dict( + metainfo=metainfo, + data_root=data_root, + ann_file='annotations/trainval.json', + data_prefix=dict(img='images/'))) + +val_dataloader = dict( + batch_size=val_batch_size_per_gpu, + num_workers=val_num_workers, + dataset=dict( + metainfo=metainfo, + data_root=data_root, + ann_file='annotations/trainval.json', + data_prefix=dict(img='images/'))) + +test_dataloader = dict( + batch_size=val_batch_size_per_gpu, + num_workers=val_num_workers, + dataset=dict( + metainfo=metainfo, + data_root=data_root, + ann_file='annotations/test.json', + data_prefix=dict(img='images/'))) + +val_evaluator = dict( + type='mmdet.CocoMetric', + ann_file=data_root + '/annotations/test.json') + +test_evaluator = val_evaluator + +optim_wrapper = dict(optimizer=dict(type='AdamW', lr=base_lr, weight_decay=0.05)) +``` ## 5. 训练 From 7a792bb6335c65749e95d251fa7faeb183f046b9 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 23 Nov 2022 19:53:47 +0800 Subject: [PATCH 09/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index f83602563..e2351fcc1 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -174,12 +174,14 @@ python tools/analysis_tools/browse_coco_json.py --json ${COCO标签json路径} \ └── ... ``` -因为是我们自定义的数据集,所以我们需要自己重写 config 中的部分信息,概览如下: +因为是我们自定义的数据集,所以我们需要自己重写 config 中的部分信息,我们在 configs 目录下新建 `my_yolov5_s_config.py`,添加以下内容: ```python _base_ = './yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py' data_root = '/path/to/data_root' # 数据集目录的绝对路径 + +# checkpoint 可以指定本地路径或者 URL,这里设置了 URL checkpoint = 'https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth' train_batch_size_per_gpu = 8 # 根据自己的GPU情况,修改 batch size From 9579daaa1ff952be0525d875812cbe79670d3449 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 23 Nov 2022 19:54:46 +0800 Subject: [PATCH 10/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index e2351fcc1..bcb931695 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -234,7 +234,7 @@ val_evaluator = dict( test_evaluator = val_evaluator -optim_wrapper = dict(optimizer=dict(type='AdamW', lr=base_lr, weight_decay=0.05)) +optim_wrapper = dict(optimizer=dict(lr=base_lr)) ``` ## 5. 训练 From 5bd1844fd9f8f8afdc6c05d6741f8528488d4c07 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 23 Nov 2022 19:54:59 +0800 Subject: [PATCH 11/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index bcb931695..e435500bd 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -186,7 +186,7 @@ checkpoint = 'https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncb train_batch_size_per_gpu = 8 # 根据自己的GPU情况,修改 batch size train_num_workers = 4 # 推荐使用 train_num_workers = nGPU x 4 -val_batch_size_per_gpu = 2 # val 时候的 bs ,根据实际调整即可 +val_batch_size_per_gpu = 2 # val 时候的 batch size ,根据实际调整即可 val_num_workers = 2 base_lr = _base_.base_lr / 4 # 根据自己的GPU情况,修改 base_lr,修改的比例是 base_lr_default * (your_bs / default_bs) From 330c28e63ef4631fa77bb5400643dc185352b8ce Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 23 Nov 2022 19:56:46 +0800 Subject: [PATCH 12/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index e435500bd..47f0b821f 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -235,6 +235,11 @@ val_evaluator = dict( test_evaluator = val_evaluator optim_wrapper = dict(optimizer=dict(lr=base_lr)) + +# 设置间隔多少个 epoch 保存模型,以及保存模型最多几个,`save_best` 是另外保存最佳模型(推荐) +default_hooks = dict( + checkpoint=dict( + type='CheckpointHook', interval=1, max_keep_ckpts=5, save_best='auto')) ``` ## 5. 训练 From f1fc9917d4c87bb1da6ce07a1e0940b2bf049786 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 23 Nov 2022 19:59:45 +0800 Subject: [PATCH 13/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 47f0b821f..05c369d18 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -179,7 +179,9 @@ python tools/analysis_tools/browse_coco_json.py --json ${COCO标签json路径} \ ```python _base_ = './yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py' +max_epochs = 200 # 训练的最大 epoch data_root = '/path/to/data_root' # 数据集目录的绝对路径 +work_dir = './work_dirs/my_yolov5_s_config-xxx' # 结果保存的路径 # checkpoint 可以指定本地路径或者 URL,这里设置了 URL checkpoint = 'https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth' @@ -197,6 +199,8 @@ metainfo = dict( # 根据类别信息,设置 metainfo PALETTE=[(220, 20, 60)] # 画图时候的颜色,随便设置即可 ) +train_cfg = dict(max_epochs=max_epochs) + model = dict( backbone=dict(init_cfg=dict(type='Pretrained', checkpoint=checkpoint)), bbox_head=dict(head_module=dict(num_classes=num_classes))) @@ -247,7 +251,7 @@ default_hooks = dict( 使用 YOLOv5s 作为例子: ```shell -python tools/train.py configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py +python tools/train.py configs/my_yolov5_s_config.py ``` ## 6. 推理查看 From d1bc8714fc07cbc717ef6a8653bdea62f8033985 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 23 Nov 2022 20:01:34 +0800 Subject: [PATCH 14/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 05c369d18..433603abf 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -248,7 +248,7 @@ default_hooks = dict( ## 5. 训练 -使用 YOLOv5s 作为例子: +使用下面命令进行启动训练: ```shell python tools/train.py configs/my_yolov5_s_config.py @@ -257,10 +257,10 @@ python tools/train.py configs/my_yolov5_s_config.py ## 6. 推理查看 ```shell -python demo/image_demo.py /data/cat_split/test \ - configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \ - work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/last.pth \ - --out-dir /data/cat_split/test_output +python demo/image_demo.py /path/to/test/images \ + configs/my_yolov5_s_config.py \ + ./work_dirs/my_yolov5_s_config-xxx/last.pth \ + --out-dir /path/to/test/images_output ``` ## 7. 部署 From c311aa9b8e875ba785bc4d34400b0e689e31340b Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 23 Nov 2022 20:02:06 +0800 Subject: [PATCH 15/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 433603abf..7c146656a 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -8,7 +8,7 @@ 3. 数据集划分 4. 根据数据集内容新建 config 文件 5. 训练 -6. 测试 +6. 推理 7. 部署 下面详细介绍每一步。 @@ -254,7 +254,7 @@ default_hooks = dict( python tools/train.py configs/my_yolov5_s_config.py ``` -## 6. 推理查看 +## 6. 推理 ```shell python demo/image_demo.py /path/to/test/images \ From d4ba83375a05839720563d1c9da6c68dcce7b654 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 23 Nov 2022 20:04:28 +0800 Subject: [PATCH 16/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 7c146656a..8180c3819 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -1,4 +1,4 @@ -# 自定义数据集 训练+部署 全流程 +# 自定义数据集 打标签+训练+测试+部署 全流程 本章节会介绍从 用户自己的图片数据集 到 最终进行训练 的整体流程。打标签使用的软件是 [labelme](https://github.com/wkentaro/labelme) 流程步骤概览如下: From 71a96f9c149c290111776f801831d35e848e7b67 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 23 Nov 2022 20:23:10 +0800 Subject: [PATCH 17/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 8180c3819..85af59342 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -1,4 +1,4 @@ -# 自定义数据集 打标签+训练+测试+部署 全流程 +# 自定义数据集 标注+训练+测试+部署 全流程 本章节会介绍从 用户自己的图片数据集 到 最终进行训练 的整体流程。打标签使用的软件是 [labelme](https://github.com/wkentaro/labelme) 流程步骤概览如下: From b7939d41a758dfd7b8f43fa3767f75d217d8cce7 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 23 Nov 2022 20:23:48 +0800 Subject: [PATCH 18/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 85af59342..52fcca665 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -124,7 +124,7 @@ MMYOLO 提供脚本将 labelme 的标签转换为 COCO 标签 ```shell python tools/dataset_converters/labelme2coco.py --img-dir ${图片文件夹路径} \ --label-dir ${标签文件夹位置} \ - --out ${输出COC标签json路径} + --out ${输出 COCO 标签json路径} ``` ### 2.2 检查转换的 COCO 标签 @@ -133,7 +133,7 @@ python tools/dataset_converters/labelme2coco.py --img-dir ${图片文件夹路 ```shell python tools/analysis_tools/browse_coco_json.py --img-dir ${图片文件夹路径} \ - --ann-file ${COCO标签json路径} + --ann-file ${COCO 标签json路径} ``` 关于 `tools/analysis_tools/browse_coco_json.py` 的更多用法请参考 [可视化 COCO 标签](useful_tools.md)。 @@ -141,8 +141,8 @@ python tools/analysis_tools/browse_coco_json.py --img-dir ${图片文件夹路 ## 3. 数据集划分 ```shell -python tools/analysis_tools/browse_coco_json.py --json ${COCO标签json路径} \ - --out-dir ${划分标签json保存路径} \ +python tools/analysis_tools/browse_coco_json.py --json ${COCO 标签 json 路径} \ + --out-dir ${划分标签 json 保存路径} \ --ratio ${划分比例} \ [--shuffle] \ [--seed ${划分的随机种子}] From e6dd6f1371d7af8637ce5fd2a569ef666b075425 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 23 Nov 2022 20:32:48 +0800 Subject: [PATCH 19/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 52fcca665..879db4762 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -174,14 +174,14 @@ python tools/analysis_tools/browse_coco_json.py --json ${COCO 标签 json 路径 └── ... ``` -因为是我们自定义的数据集,所以我们需要自己重写 config 中的部分信息,我们在 configs 目录下新建 `my_yolov5_s_config.py`,添加以下内容: +因为是我们自定义的数据集,所以我们需要自己重写 config 中的部分信息,我们在 configs 目录下新建一个子集的 config 文件,这个 config 继承的是 `yolov5_s-v61_syncbn_8xb16-300e_coco.py`,数据集中的类是猫,`bs=8`,`200epoch`,可以命令为 `yolov5_s-v61_syncbn_fast_1xb8-200e_cat.py`,添加以下内容: ```python _base_ = './yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py' max_epochs = 200 # 训练的最大 epoch data_root = '/path/to/data_root' # 数据集目录的绝对路径 -work_dir = './work_dirs/my_yolov5_s_config-xxx' # 结果保存的路径 +work_dir = './work_dirs/yolov5_s-v61_syncbn_fast_1xb8-200e_cat' # 结果保存的路径 # checkpoint 可以指定本地路径或者 URL,这里设置了 URL checkpoint = 'https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth' @@ -251,7 +251,7 @@ default_hooks = dict( 使用下面命令进行启动训练: ```shell -python tools/train.py configs/my_yolov5_s_config.py +python tools/train.py configs/yolov5_s-v61_syncbn_fast_1xb8-200e_cat.py ``` ## 6. 推理 @@ -259,7 +259,7 @@ python tools/train.py configs/my_yolov5_s_config.py ```shell python demo/image_demo.py /path/to/test/images \ configs/my_yolov5_s_config.py \ - ./work_dirs/my_yolov5_s_config-xxx/last.pth \ + ./work_dirs/yolov5_s-v61_syncbn_fast_1xb8-200e_cat/last.pth \ --out-dir /path/to/test/images_output ``` From 5dcd923a02e8a407533f932186408fbb7ef63a9d Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Sat, 26 Nov 2022 14:38:34 +0800 Subject: [PATCH 20/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 34 ++++++++++++------------ 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 879db4762..481e34318 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -1,9 +1,9 @@ # 自定义数据集 标注+训练+测试+部署 全流程 -本章节会介绍从 用户自己的图片数据集 到 最终进行训练 的整体流程。打标签使用的软件是 [labelme](https://github.com/wkentaro/labelme) +本章节会介绍从 用户自己的图片数据集 到 最终进行训练 的整体流程。标注使用的软件是 [labelme](https://github.com/wkentaro/labelme) 流程步骤概览如下: -1. 打标签 +1. 数据集标注 2. 使用脚本转换成 COCO 数据集格式 3. 数据集划分 4. 根据数据集内容新建 config 文件 @@ -13,26 +13,26 @@ 下面详细介绍每一步。 -## 1. 打标签 +## 1. 数据集标注 -通常,打标签有2种方法: +通常,标注有 2 种方法: -- 辅助 + 人工打标签 -- 纯人工打标签 +- 辅助 + 人工标注 +- 纯人工标注 -## 1.1 辅助 + 人工打标签 +## 1.1 辅助 + 人工标注 -辅助打标签的原理是用已有模型进行推理,将得出的推理信息保存为打标签软件的标签文件格式。 +辅助标注的原理是用已有模型进行推理,将得出的推理信息保存为标注软件的标签文件格式。 -**Tips**:如果已有模型没有新数据集的类,可以先人工打100张左右的图片标签,训练个初始模型,然后再进行辅助打标签。 +**Tips**:如果已有模型没有新数据集的类,可以先人工打100张左右的图片标签,训练个初始模型,然后再进行辅助标注。 -人工操作打标签软件加载生成好的标签文件,只需要检查每张图片的目标是否标准,以及是否有漏掉的目标。 +人工操作标注软件加载生成好的标签文件,只需要检查每张图片的目标是否标准,以及是否有漏掉的目标。 -【辅助 + 人工打标签】这种方式可以节省很多时间和精力,达到降本提速的目的。 +【辅助 + 人工标注】这种方式可以节省很多时间和精力,达到降本提速的目的。 下面会分别介绍其过程: -### 1.1.1 辅助打标签 +### 1.1.1 辅助标注 MMYOLO 提供模型推理生成 labelme 格式标签文件的脚本 `demo/image_demo.py`,具体用法如下: @@ -82,9 +82,9 @@ python demo/image_demo.py \ └── ... ``` -### 1.1.2 人工打标签 +### 1.1.2 人工标注 -本教程使用的打标签软件是 [labelme](https://github.com/wkentaro/labelme) +本教程使用的标注软件是 [labelme](https://github.com/wkentaro/labelme) - 安装 labelme @@ -109,11 +109,11 @@ labelme /data/cat/images --output /data/cat/labels --autosave --nodata 输入命令之后 labelme 就会启动,然后进行标签检查即可。 -**注意:打标签的时候务必使用 `rectangle`** +**注意:标注的时候务必使用 `rectangle`** -## 1.2 人工打标签 +## 1.2 人工标注 -步骤和 【1.1.2 人工打标签】 相同,只是这里是直接打标签,没有预先生成的标签。 +步骤和 【1.1.2 人工标注】 相同,只是这里是直接标注,没有预先生成的标签。 ## 2. 使用脚本转换成 COCO 数据集格式 From 8f5d4e6051868db64e23e5990aff46e5767a5592 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Sat, 26 Nov 2022 14:48:00 +0800 Subject: [PATCH 21/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 481e34318..e426538bc 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -1,6 +1,6 @@ # 自定义数据集 标注+训练+测试+部署 全流程 -本章节会介绍从 用户自己的图片数据集 到 最终进行训练 的整体流程。标注使用的软件是 [labelme](https://github.com/wkentaro/labelme) +本章节会介绍从 用户自定义图片数据集标注 到 最终进行训练和部署 的整体流程。标注使用的软件是 [labelme](https://github.com/wkentaro/labelme) 流程步骤概览如下: 1. 数据集标注 @@ -17,14 +17,14 @@ 通常,标注有 2 种方法: -- 辅助 + 人工标注 -- 纯人工标注 +- 软件或者算法辅助 + 人工修正标签 +- 仅人工打标签 -## 1.1 辅助 + 人工标注 +## 1.1 软件或者算法辅助 + 人工修正标签 辅助标注的原理是用已有模型进行推理,将得出的推理信息保存为标注软件的标签文件格式。 -**Tips**:如果已有模型没有新数据集的类,可以先人工打100张左右的图片标签,训练个初始模型,然后再进行辅助标注。 +**Tips**:如果已有模型典型的如 COCO 预训练模型没有你自定义新数据集的类别,建议先人工打 100 张左右的图片标签,训练个初始模型,然后再进行辅助打标签。 人工操作标注软件加载生成好的标签文件,只需要检查每张图片的目标是否标准,以及是否有漏掉的目标。 @@ -32,7 +32,7 @@ 下面会分别介绍其过程: -### 1.1.1 辅助标注 +### 1.1.1 软件或者算法辅助 MMYOLO 提供模型推理生成 labelme 格式标签文件的脚本 `demo/image_demo.py`,具体用法如下: @@ -111,7 +111,7 @@ labelme /data/cat/images --output /data/cat/labels --autosave --nodata **注意:标注的时候务必使用 `rectangle`** -## 1.2 人工标注 +## 1.2 仅人工打标签 步骤和 【1.1.2 人工标注】 相同,只是这里是直接标注,没有预先生成的标签。 @@ -151,7 +151,7 @@ python tools/analysis_tools/browse_coco_json.py --json ${COCO 标签 json 路径 其中: - `--ratio`:划分的比例,如果只设置了2个,则划分为 `trainval + test`,如果设置为 3 个,则划分为 `train + val + test`。支持两种格式:整数和小数: - - 小数:划分为比例,但是**全部比例加起来必须等于 `1`**。例子: `--ratio 0.8 0.1 0.1` or `--ratio 0.8 0.2` + - 小数:划分为比例。**如果加起来不为 1 ,则脚本对自动进行归一化修正**。例子: `--ratio 0.8 0.1 0.1` or `--ratio 0.8 0.2` - 整数:按比分进行划分,代码中会进行归一化之后划分数据集。例子: `--ratio 2 1 1`(代码里面会转换成 `0.5 0.25 0.25`) or `--ratio 3 1`(代码里面会转换成 `0.75 0.25`) - `--shuffle`: 是否打乱数据集再进行划分; - `--seed`:可以设定划分的随机种子,不设置的话自动生成随机种子。 From 7774ed17b0b968dfe6331037aa85dbf2a5db9b51 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Sat, 26 Nov 2022 14:50:41 +0800 Subject: [PATCH 22/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index e426538bc..6b509734b 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -109,7 +109,10 @@ labelme /data/cat/images --output /data/cat/labels --autosave --nodata 输入命令之后 labelme 就会启动,然后进行标签检查即可。 -**注意:标注的时候务必使用 `rectangle`** +**注意:标注的时候务必使用 `rectangle` (如下图)** +
+rectangle +
## 1.2 仅人工打标签 From 433a098ea66397b6a602e982af77f5e2dc19c748 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Sat, 26 Nov 2022 14:54:28 +0800 Subject: [PATCH 23/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 6b509734b..6460faa51 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -61,7 +61,16 @@ image_demo.py img \ - `--score-thr`:置信度阈值,默认为 `0.3`; - `--to-labelme`:是否导出 `labelme` 格式的标签文件,不可以与 `--show` 参数同时存在 -eg. +例子: + +这里使用 YOLOv5-s 作为例子来进行辅助标注,先下载 YOLOv5-s 的权重: +```shell +mkdir work_dirs && cd work_dirs +wget https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth +cd ../ +``` + +执行辅助标注: ```shell python demo/image_demo.py \ From d02ae735cff8fe3654703b6ce11a164f8f91a1b3 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Sat, 26 Nov 2022 14:55:12 +0800 Subject: [PATCH 24/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 6460faa51..1504f1fc1 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -196,7 +196,7 @@ data_root = '/path/to/data_root' # 数据集目录的绝对路径 work_dir = './work_dirs/yolov5_s-v61_syncbn_fast_1xb8-200e_cat' # 结果保存的路径 # checkpoint 可以指定本地路径或者 URL,这里设置了 URL -checkpoint = 'https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth' +checkpoint = './work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth' train_batch_size_per_gpu = 8 # 根据自己的GPU情况,修改 batch size train_num_workers = 4 # 推荐使用 train_num_workers = nGPU x 4 From bd315e1d0f17bb34f909864bda77976174143c9b Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Sat, 26 Nov 2022 15:00:39 +0800 Subject: [PATCH 25/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 1504f1fc1..cf9e8d0c9 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -110,7 +110,12 @@ labelme ${图片文件夹路径(即上一步的图片文件夹)} \ --nodata ``` -eg. +其中: +- `--output`:labelme 标注文件保存路径,如果该路径下已经存在部分图片的标注文件,则会进行加载; +- `--autosave`:标注文件自动保存,会略去一些繁琐的保存步骤; +- `--nodata`:每张图片的标注文件中不保存图片的 base64 编码,设置了这个 flag 会大大减少标注文件的大小。 + +例子: ```shell labelme /data/cat/images --output /data/cat/labels --autosave --nodata From 00ffb347225a7cda87bdcecf978722fa7657f027 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Sat, 26 Nov 2022 15:08:08 +0800 Subject: [PATCH 26/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index cf9e8d0c9..6a8667c04 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -64,6 +64,7 @@ image_demo.py img \ 例子: 这里使用 YOLOv5-s 作为例子来进行辅助标注,先下载 YOLOv5-s 的权重: + ```shell mkdir work_dirs && cd work_dirs wget https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth @@ -111,6 +112,7 @@ labelme ${图片文件夹路径(即上一步的图片文件夹)} \ ``` 其中: + - `--output`:labelme 标注文件保存路径,如果该路径下已经存在部分图片的标注文件,则会进行加载; - `--autosave`:标注文件自动保存,会略去一些繁琐的保存步骤; - `--nodata`:每张图片的标注文件中不保存图片的 base64 编码,设置了这个 flag 会大大减少标注文件的大小。 @@ -124,6 +126,7 @@ labelme /data/cat/images --output /data/cat/labels --autosave --nodata 输入命令之后 labelme 就会启动,然后进行标签检查即可。 **注意:标注的时候务必使用 `rectangle` (如下图)** +
rectangle
From c327ad655793ae48266ee4348e6bfb3ab520224d Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Sat, 26 Nov 2022 15:15:24 +0800 Subject: [PATCH 27/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 58 ++++++++++++------------ 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 6a8667c04..41aff1aaf 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -1,15 +1,14 @@ # 自定义数据集 标注+训练+测试+部署 全流程 -本章节会介绍从 用户自定义图片数据集标注 到 最终进行训练和部署 的整体流程。标注使用的软件是 [labelme](https://github.com/wkentaro/labelme) -流程步骤概览如下: +本章节会介绍从 用户自定义图片数据集标注 到 最终进行训练和部署 的整体流程。流程步骤概览如下: -1. 数据集标注 -2. 使用脚本转换成 COCO 数据集格式 -3. 数据集划分 +1. 数据集标注:`demo/image_demo.py` + [labelme](https://github.com/wkentaro/labelme) +2. 使用脚本转换成 COCO 数据集格式:`tools/dataset_converters/labelme2coco.py` +3. 数据集划分:`tools/misc/coco_split.py` 4. 根据数据集内容新建 config 文件 -5. 训练 -6. 推理 -7. 部署 +5. 训练:`tools/train.py` +6. 推理:`demo/image_demo.py` +7. 部署: 下面详细介绍每一步。 @@ -37,16 +36,16 @@ MMYOLO 提供模型推理生成 labelme 格式标签文件的脚本 `demo/image_demo.py`,具体用法如下: ```shell -image_demo.py img \ - config \ - checkpoint - [-h] \ - [--out-dir OUT_DIR] \ - [--device DEVICE] \ - [--show] \ - [--deploy] \ - [--score-thr SCORE_THR] \ - [--to-labelme] +python demo/image_demo.py img \ + config \ + checkpoint + [-h] \ + [--out-dir OUT_DIR] \ + [--device DEVICE] \ + [--show] \ + [--deploy] \ + [--score-thr SCORE_THR] \ + [--to-labelme] ``` 其中: @@ -74,12 +73,11 @@ cd ../ 执行辅助标注: ```shell -python demo/image_demo.py \ - /data/cat/images \ - configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \ - work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \ - --out-dir /data/cat/labels \ - --to-labelme +python demo/image_demo.py /data/cat/images \ + configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \ + work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \ + --out-dir /data/cat/labels \ + --to-labelme ``` 生成的标签文件会在 `--out-dir` 中: @@ -161,16 +159,16 @@ python tools/analysis_tools/browse_coco_json.py --img-dir ${图片文件夹路 ## 3. 数据集划分 ```shell -python tools/analysis_tools/browse_coco_json.py --json ${COCO 标签 json 路径} \ - --out-dir ${划分标签 json 保存路径} \ - --ratio ${划分比例} \ - [--shuffle] \ - [--seed ${划分的随机种子}] +python tools/misc/coco_split.py --json ${COCO 标签 json 路径} \ + --out-dir ${划分标签 json 保存路径} \ + --ratios ${划分比例} \ + [--shuffle] \ + [--seed ${划分的随机种子}] ``` 其中: -- `--ratio`:划分的比例,如果只设置了2个,则划分为 `trainval + test`,如果设置为 3 个,则划分为 `train + val + test`。支持两种格式:整数和小数: +- `--ratios`:划分的比例,如果只设置了2个,则划分为 `trainval + test`,如果设置为 3 个,则划分为 `train + val + test`。支持两种格式:整数和小数: - 小数:划分为比例。**如果加起来不为 1 ,则脚本对自动进行归一化修正**。例子: `--ratio 0.8 0.1 0.1` or `--ratio 0.8 0.2` - 整数:按比分进行划分,代码中会进行归一化之后划分数据集。例子: `--ratio 2 1 1`(代码里面会转换成 `0.5 0.25 0.25`) or `--ratio 3 1`(代码里面会转换成 `0.75 0.25`) - `--shuffle`: 是否打乱数据集再进行划分; From c1544f7b2c3eae90f0c1a5b94ef408664b038023 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Sat, 26 Nov 2022 15:43:58 +0800 Subject: [PATCH 28/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 58 +++++++++++++++++++----- 1 file changed, 46 insertions(+), 12 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 41aff1aaf..14332204d 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -33,18 +33,18 @@ ### 1.1.1 软件或者算法辅助 -MMYOLO 提供模型推理生成 labelme 格式标签文件的脚本 `demo/image_demo.py`,具体用法如下: +MMYOLO 提供的模型推理脚本 `demo/image_demo.py` 设置 `--to-labelme` 可以生成 labelme 格式标签文件,具体用法如下: ```shell python demo/image_demo.py img \ config \ checkpoint - [-h] \ [--out-dir OUT_DIR] \ [--device DEVICE] \ [--show] \ [--deploy] \ [--score-thr SCORE_THR] \ + [--class-name CLASS_NAME] [--to-labelme] ``` @@ -70,7 +70,11 @@ wget https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8x cd ../ ``` -执行辅助标注: +执行辅助标注有 2 种情况: +1. 标注文件保存所有推理出来的类 +2. 标注文件只保存 cat、dog 两类 + +- 标注文件保存所有推理出来的类: ```shell python demo/image_demo.py /data/cat/images \ @@ -80,6 +84,17 @@ python demo/image_demo.py /data/cat/images \ --to-labelme ``` +- 标注文件只保存 `cat`、`dog` 两类: + +```shell +python demo/image_demo.py /data/cat/images \ + configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \ + work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \ + --out-dir /data/cat/labels \ + --class-name cat dog \ + --to-labelme +``` + 生成的标签文件会在 `--out-dir` 中: ```shell @@ -141,8 +156,24 @@ MMYOLO 提供脚本将 labelme 的标签转换为 COCO 标签 ```shell python tools/dataset_converters/labelme2coco.py --img-dir ${图片文件夹路径} \ - --label-dir ${标签文件夹位置} \ + --labels-dir ${标签文件夹位置} \ --out ${输出 COCO 标签json路径} + [--class-id-txt] +``` + +其中: +`--class-id-txt`:是数据集 [id class_name] 的 `.txt` 文件: +- 如果不指定,则脚本会自动生成,生成在 `--out` 同级的目录中,保存文件名为 `class_with_id.txt`; +- 如果指定,脚本仅会进行读取但不会新增或者覆盖,同时,脚本里面还会判断是否存在 `.txt` 中其他的类,如果出现了会报错提示,届时,请用户检查 `.txt` 文件并加入新的类及其 `id`。 + +`.txt` 文件的例子如下( `id` 可以和 COCO 一样,从 `1` 开始): + +```text +1 cat +2 dog +3 bicycle +4 motorcycle + ``` ### 2.2 检查转换的 COCO 标签 @@ -160,7 +191,7 @@ python tools/analysis_tools/browse_coco_json.py --img-dir ${图片文件夹路 ```shell python tools/misc/coco_split.py --json ${COCO 标签 json 路径} \ - --out-dir ${划分标签 json 保存路径} \ + --out-dir ${划分标签 json 保存根路径} \ --ratios ${划分比例} \ [--shuffle] \ [--seed ${划分的随机种子}] @@ -168,11 +199,11 @@ python tools/misc/coco_split.py --json ${COCO 标签 json 路径} \ 其中: -- `--ratios`:划分的比例,如果只设置了2个,则划分为 `trainval + test`,如果设置为 3 个,则划分为 `train + val + test`。支持两种格式:整数和小数: - - 小数:划分为比例。**如果加起来不为 1 ,则脚本对自动进行归一化修正**。例子: `--ratio 0.8 0.1 0.1` or `--ratio 0.8 0.2` +- `--ratios`:划分的比例,如果只设置了 2 个,则划分为 `trainval + test`,如果设置为 3 个,则划分为 `train + val + test`。支持两种格式 —— 整数、小数: - 整数:按比分进行划分,代码中会进行归一化之后划分数据集。例子: `--ratio 2 1 1`(代码里面会转换成 `0.5 0.25 0.25`) or `--ratio 3 1`(代码里面会转换成 `0.75 0.25`) + - 小数:划分为比例。**如果加起来不为 1 ,则脚本会进行自动归一化修正**。例子: `--ratio 0.8 0.1 0.1` or `--ratio 0.8 0.2` - `--shuffle`: 是否打乱数据集再进行划分; -- `--seed`:可以设定划分的随机种子,不设置的话自动生成随机种子。 +- `--seed`:设定划分的随机种子,不设置的话自动生成随机种子。 ## 4. 根据数据集内容新建 config 文件 @@ -192,16 +223,19 @@ python tools/misc/coco_split.py --json ${COCO 标签 json 路径} \ └── ... ``` -因为是我们自定义的数据集,所以我们需要自己重写 config 中的部分信息,我们在 configs 目录下新建一个子集的 config 文件,这个 config 继承的是 `yolov5_s-v61_syncbn_8xb16-300e_coco.py`,数据集中的类是猫,`bs=8`,`200epoch`,可以命令为 `yolov5_s-v61_syncbn_fast_1xb8-200e_cat.py`,添加以下内容: +因为是我们自定义的数据集,所以我们需要自己重写 config 中的部分信息,我们在 configs 目录下新建一个子集的 config 文件。 +这个 config 继承的是 `yolov5_s-v61_syncbn_8xb16-300e_coco.py`,假设数据集中的类是猫,`batch size = 8`,`200 epoch`,可以将其命名为 `yolov5_s-v61_syncbn_fast_1xb8-200e_cat.py`,并在其里面添加以下内容: ```python _base_ = './yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py' max_epochs = 200 # 训练的最大 epoch data_root = '/path/to/data_root' # 数据集目录的绝对路径 -work_dir = './work_dirs/yolov5_s-v61_syncbn_fast_1xb8-200e_cat' # 结果保存的路径 -# checkpoint 可以指定本地路径或者 URL,这里设置了 URL +# 结果保存的路径,如果同个 config 只是修改了部分参数,修改这个变量就可以将新的训练文件保存到其他地方 +work_dir = './work_dirs/yolov5_s-v61_syncbn_fast_1xb8-200e_cat' + +# checkpoint 可以指定本地路径或者 URL,设置了 URL 会自动进行下载,因为上面已经下载过,我们这里设置本地路径 checkpoint = './work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth' train_batch_size_per_gpu = 8 # 根据自己的GPU情况,修改 batch size @@ -277,7 +311,7 @@ python tools/train.py configs/yolov5_s-v61_syncbn_fast_1xb8-200e_cat.py ```shell python demo/image_demo.py /path/to/test/images \ configs/my_yolov5_s_config.py \ - ./work_dirs/yolov5_s-v61_syncbn_fast_1xb8-200e_cat/last.pth \ + ./work_dirs/yolov5_s-v61_syncbn_fast_1xb8-200e_cat/yolov5_s-v61_syncbn_fast_1xb8-200e_cat/last.pth \ --out-dir /path/to/test/images_output ``` From 1de441b655040235a311bfba9f00d335ec60c039 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Sat, 26 Nov 2022 15:50:16 +0800 Subject: [PATCH 29/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 14332204d..ae53080b3 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -71,6 +71,7 @@ cd ../ ``` 执行辅助标注有 2 种情况: + 1. 标注文件保存所有推理出来的类 2. 标注文件只保存 cat、dog 两类 @@ -162,7 +163,8 @@ python tools/dataset_converters/labelme2coco.py --img-dir ${图片文件夹路 ``` 其中: -`--class-id-txt`:是数据集 [id class_name] 的 `.txt` 文件: +`--class-id-txt`:是数据集 `id class_name` 的 `.txt` 文件: + - 如果不指定,则脚本会自动生成,生成在 `--out` 同级的目录中,保存文件名为 `class_with_id.txt`; - 如果指定,脚本仅会进行读取但不会新增或者覆盖,同时,脚本里面还会判断是否存在 `.txt` 中其他的类,如果出现了会报错提示,届时,请用户检查 `.txt` 文件并加入新的类及其 `id`。 From b114365a23b4788e52afea62e8b6902d5d20d2e3 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Sat, 26 Nov 2022 15:51:52 +0800 Subject: [PATCH 30/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index ae53080b3..f1f298888 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -2,17 +2,17 @@ 本章节会介绍从 用户自定义图片数据集标注 到 最终进行训练和部署 的整体流程。流程步骤概览如下: -1. 数据集标注:`demo/image_demo.py` + [labelme](https://github.com/wkentaro/labelme) +1. 使用 [labelme](https://github.com/wkentaro/labelme) 进行数据集标注:`demo/image_demo.py` + labelme 2. 使用脚本转换成 COCO 数据集格式:`tools/dataset_converters/labelme2coco.py` 3. 数据集划分:`tools/misc/coco_split.py` 4. 根据数据集内容新建 config 文件 5. 训练:`tools/train.py` 6. 推理:`demo/image_demo.py` -7. 部署: +7. 部署 下面详细介绍每一步。 -## 1. 数据集标注 +## 1. 使用 labelme 进行数据集标注 通常,标注有 2 种方法: From 99de6ef6abeea75a0993742c011967af763da298 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Sat, 26 Nov 2022 15:57:47 +0800 Subject: [PATCH 31/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index f1f298888..20f6c925a 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -240,6 +240,8 @@ work_dir = './work_dirs/yolov5_s-v61_syncbn_fast_1xb8-200e_cat' # checkpoint 可以指定本地路径或者 URL,设置了 URL 会自动进行下载,因为上面已经下载过,我们这里设置本地路径 checkpoint = './work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth' +resume = False # 继续训练的时候使用 + train_batch_size_per_gpu = 8 # 根据自己的GPU情况,修改 batch size train_num_workers = 4 # 推荐使用 train_num_workers = nGPU x 4 val_batch_size_per_gpu = 2 # val 时候的 batch size ,根据实际调整即可 @@ -317,4 +319,12 @@ python demo/image_demo.py /path/to/test/images \ --out-dir /path/to/test/images_output ``` +**Tips**:如果推理结果不理想,这里举例 2 中情况: + +1. 欠拟合: + 需要先判断是不是训练 epoch 不够导致的欠拟合,如果是训练不够,则修改 config 文件里面的 `resume = ./work_dirs/yolov5_s-v61_syncbn_fast_1xb8-200e_cat/yolov5_s-v61_syncbn_fast_1xb8-200e_cat/last.pth` 来最后的模型继续训练。 + +2. 数据集优化: + 如果 epoch 加上去了还是不行,可以对数据集进行增加,同时加上不断修改标注来优化,然后重新进行训练。 + ## 7. 部署 From 69a7afc9129a595a0eea81f75207631ea4f13a9f Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Sat, 26 Nov 2022 16:09:28 +0800 Subject: [PATCH 32/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 20f6c925a..9e714575e 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -65,9 +65,8 @@ python demo/image_demo.py img \ 这里使用 YOLOv5-s 作为例子来进行辅助标注,先下载 YOLOv5-s 的权重: ```shell -mkdir work_dirs && cd work_dirs -wget https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth -cd ../ +mkdir work_dirs +wget https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth -P ./work_dirs ``` 执行辅助标注有 2 种情况: @@ -92,7 +91,7 @@ python demo/image_demo.py /data/cat/images \ configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \ work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \ --out-dir /data/cat/labels \ - --class-name cat dog \ + --class-name cat \ --to-labelme ``` From 84bfc0643a75a8a3af41a61822236fd9fe320852 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Sat, 26 Nov 2022 16:09:40 +0800 Subject: [PATCH 33/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 9e714575e..13ce0829e 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -91,7 +91,7 @@ python demo/image_demo.py /data/cat/images \ configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \ work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \ --out-dir /data/cat/labels \ - --class-name cat \ + --class-name cat dog \ --to-labelme ``` From ac4ce5b68d1349bbbd9707e70ef57a3ecbeb3b63 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Sat, 26 Nov 2022 17:55:52 +0800 Subject: [PATCH 34/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 51 ++++++++++++++---------- tools/dataset_converters/labelme2coco.py | 2 +- tools/misc/coco_split.py | 2 +- 3 files changed, 31 insertions(+), 24 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 13ce0829e..944e2d69c 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -136,9 +136,9 @@ labelme ${图片文件夹路径(即上一步的图片文件夹)} \ labelme /data/cat/images --output /data/cat/labels --autosave --nodata ``` -输入命令之后 labelme 就会启动,然后进行标签检查即可。 +输入命令之后 labelme 就会启动,然后进行标签检查即可。如果 labelme 启动失败,命令行输入 `export QT_DEBUG_PLUGINS=1` 查看具体缺少什么库,安装一下即可。 -**注意:标注的时候务必使用 `rectangle` (如下图)** +**注意:标注的时候务必使用 `rectangle`,快捷键 `Ctrl + R`(如下图)**
rectangle @@ -224,14 +224,14 @@ python tools/misc/coco_split.py --json ${COCO 标签 json 路径} \ └── ... ``` -因为是我们自定义的数据集,所以我们需要自己重写 config 中的部分信息,我们在 configs 目录下新建一个子集的 config 文件。 +因为是我们自定义的数据集,所以我们需要自己重写 config 中的部分信息,我们在 configs 目录下新建一个新的目录 `custom_dataset`,同时新建 config 文件。 这个 config 继承的是 `yolov5_s-v61_syncbn_8xb16-300e_coco.py`,假设数据集中的类是猫,`batch size = 8`,`200 epoch`,可以将其命名为 `yolov5_s-v61_syncbn_fast_1xb8-200e_cat.py`,并在其里面添加以下内容: ```python -_base_ = './yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py' +_base_ = '../yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py' -max_epochs = 200 # 训练的最大 epoch -data_root = '/path/to/data_root' # 数据集目录的绝对路径 +max_epochs = 200 # 训练的最大 epoch +data_root = '/path/to/data_root/' # 数据集目录的绝对路径 # 结果保存的路径,如果同个 config 只是修改了部分参数,修改这个变量就可以将新的训练文件保存到其他地方 work_dir = './work_dirs/yolov5_s-v61_syncbn_fast_1xb8-200e_cat' @@ -239,22 +239,29 @@ work_dir = './work_dirs/yolov5_s-v61_syncbn_fast_1xb8-200e_cat' # checkpoint 可以指定本地路径或者 URL,设置了 URL 会自动进行下载,因为上面已经下载过,我们这里设置本地路径 checkpoint = './work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth' -resume = False # 继续训练的时候使用 +resume = False # 继续训练的时候使用 -train_batch_size_per_gpu = 8 # 根据自己的GPU情况,修改 batch size -train_num_workers = 4 # 推荐使用 train_num_workers = nGPU x 4 +train_batch_size_per_gpu = 32 # 根据自己的 GPU 情况修改 batch size,YOLOv5-s 默认为 16 * 8 +train_num_workers = 4 # 推荐使用 train_num_workers = nGPU x 4 val_batch_size_per_gpu = 2 # val 时候的 batch size ,根据实际调整即可 val_num_workers = 2 -base_lr = _base_.base_lr / 4 # 根据自己的GPU情况,修改 base_lr,修改的比例是 base_lr_default * (your_bs / default_bs) +save_epoch_intervals = 2 # 每 interval 轮迭代进行一次保存一次权重 -num_classes=1 -metainfo = dict( # 根据类别信息,设置 metainfo +# 根据自己的 GPU 情况,修改 base_lr,修改的比例是 base_lr_default * (your_bs / default_bs) +base_lr = _base_.base_lr / 4 + +num_classes = 1 +metainfo = dict( # 根据 class_with_id.txt 类别信息,设置 metainfo CLASSES=('cat'), - PALETTE=[(220, 20, 60)] # 画图时候的颜色,随便设置即可 + PALETTE=[(220, 20, 60)] # 画图时候的颜色,随便设置即可 ) -train_cfg = dict(max_epochs=max_epochs) +train_cfg = dict( + max_epochs=max_epochs, + val_begin=1, # 第几个epoch后验证 + val_interval=save_epoch_intervals # 每 val_interval 轮迭代进行一次测试评估 +) model = dict( backbone=dict(init_cfg=dict(type='Pretrained', checkpoint=checkpoint)), @@ -287,18 +294,18 @@ test_dataloader = dict( ann_file='annotations/test.json', data_prefix=dict(img='images/'))) -val_evaluator = dict( - type='mmdet.CocoMetric', - ann_file=data_root + '/annotations/test.json') - +val_evaluator = dict(ann_file=data_root + 'annotations/trainval.json') test_evaluator = val_evaluator optim_wrapper = dict(optimizer=dict(lr=base_lr)) -# 设置间隔多少个 epoch 保存模型,以及保存模型最多几个,`save_best` 是另外保存最佳模型(推荐) default_hooks = dict( - checkpoint=dict( - type='CheckpointHook', interval=1, max_keep_ckpts=5, save_best='auto')) + # 设置间隔多少个 epoch 保存模型,以及保存模型最多几个,`save_best` 是另外保存最佳模型(推荐) + checkpoint=dict(type='CheckpointHook', interval=save_epoch_intervals, + max_keep_ckpts=5, save_best='auto'), + # logger 输出的间隔 + logger=dict(type='LoggerHook', interval=5) +) ``` ## 5. 训练 @@ -306,7 +313,7 @@ default_hooks = dict( 使用下面命令进行启动训练: ```shell -python tools/train.py configs/yolov5_s-v61_syncbn_fast_1xb8-200e_cat.py +python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb8-200e_cat.py ``` ## 6. 推理 diff --git a/tools/dataset_converters/labelme2coco.py b/tools/dataset_converters/labelme2coco.py index 9893959da..94e46e166 100644 --- a/tools/dataset_converters/labelme2coco.py +++ b/tools/dataset_converters/labelme2coco.py @@ -28,7 +28,7 @@ files to `class_with_id.json`. class_with_id.txt example, each line is "id class_name": - ```txt + ```text 1 cat 2 dog 3 bicycle diff --git a/tools/misc/coco_split.py b/tools/misc/coco_split.py index 1b8da4bd1..8ce70349b 100644 --- a/tools/misc/coco_split.py +++ b/tools/misc/coco_split.py @@ -61,7 +61,7 @@ def split_coco_dataset(coco_json_path: str, save_dir: str, ratios: list, train_image_num = len(coco_image_ids) - val_image_num - test_image_num print('Split info: ====== \n' f'Train ratio = {ratio_train}, number = {train_image_num}\n' - f'Val ratio = {ratio_val}, number ={val_image_num}\n' + f'Val ratio = {ratio_val}, number = {val_image_num}\n' f'Test ratio = {ratio_test}, number = {test_image_num}') seed = int(seed) From 76eb0f55cb805cc16ae89da047c3c1b3f00130a8 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Sat, 26 Nov 2022 18:12:26 +0800 Subject: [PATCH 35/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 944e2d69c..89fbbec25 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -225,16 +225,16 @@ python tools/misc/coco_split.py --json ${COCO 标签 json 路径} \ ``` 因为是我们自定义的数据集,所以我们需要自己重写 config 中的部分信息,我们在 configs 目录下新建一个新的目录 `custom_dataset`,同时新建 config 文件。 -这个 config 继承的是 `yolov5_s-v61_syncbn_8xb16-300e_coco.py`,假设数据集中的类是猫,`batch size = 8`,`200 epoch`,可以将其命名为 `yolov5_s-v61_syncbn_fast_1xb8-200e_cat.py`,并在其里面添加以下内容: +这个 config 继承的是 `yolov5_s-v61_syncbn_8xb16-300e_coco.py`,假设数据集中的类是 `cat`,我的显卡训练 YOLOv5 最大可以 `batch size = 32`,训练 `50 epoch`,可以将其命名为 `yolov5_s-v61_syncbn_fast_1xb32-50e_cat.py`,并在其里面添加以下内容: ```python _base_ = '../yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py' -max_epochs = 200 # 训练的最大 epoch +max_epochs = 50 # 训练的最大 epoch data_root = '/path/to/data_root/' # 数据集目录的绝对路径 # 结果保存的路径,如果同个 config 只是修改了部分参数,修改这个变量就可以将新的训练文件保存到其他地方 -work_dir = './work_dirs/yolov5_s-v61_syncbn_fast_1xb8-200e_cat' +work_dir = './work_dirs/yolov5_s-v61_syncbn_fast_1xb32-50e_cat' # checkpoint 可以指定本地路径或者 URL,设置了 URL 会自动进行下载,因为上面已经下载过,我们这里设置本地路径 checkpoint = './work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth' @@ -259,7 +259,7 @@ metainfo = dict( # 根据 class_with_id.txt 类别信息,设置 metainfo train_cfg = dict( max_epochs=max_epochs, - val_begin=1, # 第几个epoch后验证 + val_begin=10, # 第几个epoch后验证 val_interval=save_epoch_intervals # 每 val_interval 轮迭代进行一次测试评估 ) @@ -313,7 +313,13 @@ default_hooks = dict( 使用下面命令进行启动训练: ```shell -python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb8-200e_cat.py +python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-50e_cat.py +``` + +下面是 `1 x 3080Ti`, `batch size = 32`,训练 `50 epoch`,得出来的精度: + +```shell + ``` ## 6. 推理 From daee753b7c56d32a21df2f1d7e141d054b32302d Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Sat, 26 Nov 2022 18:14:29 +0800 Subject: [PATCH 36/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 89fbbec25..810fcae59 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -249,7 +249,7 @@ val_num_workers = 2 save_epoch_intervals = 2 # 每 interval 轮迭代进行一次保存一次权重 # 根据自己的 GPU 情况,修改 base_lr,修改的比例是 base_lr_default * (your_bs / default_bs) -base_lr = _base_.base_lr / 4 +base_lr = _base_.base_lr / 4 num_classes = 1 metainfo = dict( # 根据 class_with_id.txt 类别信息,设置 metainfo @@ -301,7 +301,7 @@ optim_wrapper = dict(optimizer=dict(lr=base_lr)) default_hooks = dict( # 设置间隔多少个 epoch 保存模型,以及保存模型最多几个,`save_best` 是另外保存最佳模型(推荐) - checkpoint=dict(type='CheckpointHook', interval=save_epoch_intervals, + checkpoint=dict(type='CheckpointHook', interval=save_epoch_intervals, max_keep_ckpts=5, save_best='auto'), # logger 输出的间隔 logger=dict(type='LoggerHook', interval=5) From ba1239432b6cedd815fdefbf7701898a54e95e71 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Sat, 26 Nov 2022 18:56:05 +0800 Subject: [PATCH 37/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 810fcae59..51e8f7e1c 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -304,7 +304,7 @@ default_hooks = dict( checkpoint=dict(type='CheckpointHook', interval=save_epoch_intervals, max_keep_ckpts=5, save_best='auto'), # logger 输出的间隔 - logger=dict(type='LoggerHook', interval=5) + logger=dict(type='LoggerHook', interval=2) ) ``` From cf6edcd90141123ba3d1850576600dbff73a4216 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Sun, 27 Nov 2022 14:03:08 +0800 Subject: [PATCH 38/73] Improve config --- configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py b/configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py index 4a56b492f..51376b649 100644 --- a/configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py +++ b/configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py @@ -19,6 +19,9 @@ # persistent_workers must be False if num_workers is 0. persistent_workers = True +# Base learning rate for optim_wrapper +base_lr = 0.01 + # only on Val batch_shapes_cfg = dict( type='BatchShapePolicy', @@ -199,7 +202,7 @@ type='OptimWrapper', optimizer=dict( type='SGD', - lr=0.01, + lr=base_lr, momentum=0.937, weight_decay=0.0005, nesterov=True, From 700b864fc43ad0ea8e72d766a60f51c1bf5f0be9 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Sun, 27 Nov 2022 22:21:44 +0800 Subject: [PATCH 39/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 35 +++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 51e8f7e1c..d5a1dd3ff 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -316,10 +316,43 @@ default_hooks = dict( python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-50e_cat.py ``` -下面是 `1 x 3080Ti`, `batch size = 32`,训练 `50 epoch`,得出来的精度: +下面是 `1 x 3080Ti`, `batch size = 32`,训练 `300 epoch`,得出来的精度: ```shell + Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.959 + Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.999 + Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.999 + Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000 + Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000 + Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.959 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.875 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.972 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.972 + Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000 + Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000 + Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.972 + +bbox_mAP_copypaste: 0.959 0.999 0.999 -1.000 -1.000 0.959 +Epoch(val) [300][65/65] coco/bbox_mAP: 0.9590 coco/bbox_mAP_50: 0.9990 coco/bbox_mAP_75: 0.9990 coco/bbox_mAP_s: -1.0000 coco/bbox_mAP_m: -1.0000 coco/bbox_mAP_l: 0.9590 +``` +最佳精度 `bbox_mAP_epoch_266.pth`: +```shell + Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.965 + Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.999 + Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.999 + Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000 + Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000 + Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.965 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.876 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.975 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.975 + Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000 + Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000 + Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.975 + +bbox_mAP_copypaste: 0.965 0.999 0.999 -1.000 -1.000 0.965 +Epoch(val) [268][65/65] coco/bbox_mAP: 0.9650 coco/bbox_mAP_50: 0.9990 coco/bbox_mAP_75: 0.9990 coco/bbox_mAP_s: -1.0000 coco/bbox_mAP_m: -1.0000 coco/bbox_mAP_l: 0.9650 ``` ## 6. 推理 From 28671c2b04e616e1560f77bd6490a6d156953160 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Sun, 27 Nov 2022 22:28:19 +0800 Subject: [PATCH 40/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 35 +++++++++++++++--------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index d5a1dd3ff..0010a3d63 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -225,23 +225,23 @@ python tools/misc/coco_split.py --json ${COCO 标签 json 路径} \ ``` 因为是我们自定义的数据集,所以我们需要自己重写 config 中的部分信息,我们在 configs 目录下新建一个新的目录 `custom_dataset`,同时新建 config 文件。 -这个 config 继承的是 `yolov5_s-v61_syncbn_8xb16-300e_coco.py`,假设数据集中的类是 `cat`,我的显卡训练 YOLOv5 最大可以 `batch size = 32`,训练 `50 epoch`,可以将其命名为 `yolov5_s-v61_syncbn_fast_1xb32-50e_cat.py`,并在其里面添加以下内容: +这个 config 继承的是 `yolov5_s-v61_syncbn_8xb16-300e_coco.py`,假设数据集中的类是 `cat`,我的显卡训练 YOLOv5 最大可以 `batch size = 32`,训练 `300 epoch`,可以将其命名为 `yolov5_s-v61_syncbn_fast_1xb32-300e_cat.py`,并在其里面添加以下内容: ```python _base_ = '../yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py' -max_epochs = 50 # 训练的最大 epoch +max_epochs = 300 # 训练的最大 epoch data_root = '/path/to/data_root/' # 数据集目录的绝对路径 # 结果保存的路径,如果同个 config 只是修改了部分参数,修改这个变量就可以将新的训练文件保存到其他地方 -work_dir = './work_dirs/yolov5_s-v61_syncbn_fast_1xb32-50e_cat' +work_dir = './work_dirs/yolov5_s-v61_syncbn_fast_1xb32-300e_cat' # checkpoint 可以指定本地路径或者 URL,设置了 URL 会自动进行下载,因为上面已经下载过,我们这里设置本地路径 checkpoint = './work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth' resume = False # 继续训练的时候使用 -train_batch_size_per_gpu = 32 # 根据自己的 GPU 情况修改 batch size,YOLOv5-s 默认为 16 * 8 +train_batch_size_per_gpu = 32 # 根据自己的GPU情况,修改 batch size,YOLOv5-s 默认为 16 * 8 train_num_workers = 4 # 推荐使用 train_num_workers = nGPU x 4 val_batch_size_per_gpu = 2 # val 时候的 batch size ,根据实际调整即可 val_num_workers = 2 @@ -271,10 +271,18 @@ train_dataloader = dict( batch_size=train_batch_size_per_gpu, num_workers=train_num_workers, dataset=dict( - metainfo=metainfo, - data_root=data_root, - ann_file='annotations/trainval.json', - data_prefix=dict(img='images/'))) + _delete_=True, + type='RepeatDataset', + times=10, # 数据量太少的话,可以使用 RepeatDataset 来增量数据,这里设置 10 是 10 倍 + dataset=dict( + type=_base_.dataset_type, + data_root=data_root, + metainfo=metainfo, + ann_file='annotations/trainval.json', + data_prefix=dict(img='images/'), + filter_cfg=dict(filter_empty_gt=False, min_size=32), + pipeline=_base_.train_pipeline) + )) val_dataloader = dict( batch_size=val_batch_size_per_gpu, @@ -313,7 +321,7 @@ default_hooks = dict( 使用下面命令进行启动训练: ```shell -python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-50e_cat.py +python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-300e_cat.py ``` 下面是 `1 x 3080Ti`, `batch size = 32`,训练 `300 epoch`,得出来的精度: @@ -336,7 +344,8 @@ bbox_mAP_copypaste: 0.959 0.999 0.999 -1.000 -1.000 0.959 Epoch(val) [300][65/65] coco/bbox_mAP: 0.9590 coco/bbox_mAP_50: 0.9990 coco/bbox_mAP_75: 0.9990 coco/bbox_mAP_s: -1.0000 coco/bbox_mAP_m: -1.0000 coco/bbox_mAP_l: 0.9590 ``` -最佳精度 `bbox_mAP_epoch_266.pth`: +最佳精度 `bbox_mAP_epoch_266.pth`: + ```shell Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.965 Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.999 @@ -350,7 +359,7 @@ Epoch(val) [300][65/65] coco/bbox_mAP: 0.9590 coco/bbox_mAP_50: 0.9990 coco/b Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000 Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000 Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.975 - + bbox_mAP_copypaste: 0.965 0.999 0.999 -1.000 -1.000 0.965 Epoch(val) [268][65/65] coco/bbox_mAP: 0.9650 coco/bbox_mAP_50: 0.9990 coco/bbox_mAP_75: 0.9990 coco/bbox_mAP_s: -1.0000 coco/bbox_mAP_m: -1.0000 coco/bbox_mAP_l: 0.9650 ``` @@ -360,14 +369,14 @@ Epoch(val) [268][65/65] coco/bbox_mAP: 0.9650 coco/bbox_mAP_50: 0.9990 coco/b ```shell python demo/image_demo.py /path/to/test/images \ configs/my_yolov5_s_config.py \ - ./work_dirs/yolov5_s-v61_syncbn_fast_1xb8-200e_cat/yolov5_s-v61_syncbn_fast_1xb8-200e_cat/last.pth \ + ./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-300e_cat/best_coco/bbox_mAP_epoch_268.pth \ --out-dir /path/to/test/images_output ``` **Tips**:如果推理结果不理想,这里举例 2 中情况: 1. 欠拟合: - 需要先判断是不是训练 epoch 不够导致的欠拟合,如果是训练不够,则修改 config 文件里面的 `resume = ./work_dirs/yolov5_s-v61_syncbn_fast_1xb8-200e_cat/yolov5_s-v61_syncbn_fast_1xb8-200e_cat/last.pth` 来最后的模型继续训练。 + 需要先判断是不是训练 epoch 不够导致的欠拟合,如果是训练不够,则修改 config 文件里面的 `max_epochs`,同时,设置 `resume = ./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-300e_cat/last_checkpoint` 来最后的模型继续训练。 2. 数据集优化: 如果 epoch 加上去了还是不行,可以对数据集进行增加,同时加上不断修改标注来优化,然后重新进行训练。 From 7cf32ac424fdde31cd56317b56d0ae20a12e2cf6 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Mon, 28 Nov 2022 09:59:49 +0800 Subject: [PATCH 41/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 0010a3d63..4589d35c9 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -382,3 +382,5 @@ python demo/image_demo.py /path/to/test/images \ 如果 epoch 加上去了还是不行,可以对数据集进行增加,同时加上不断修改标注来优化,然后重新进行训练。 ## 7. 部署 + +详见[部署文档](../../../projects/easydeploy/README_zh-CN.md) From f44ea6675b05b8a4716309b4c4704891cf823234 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Mon, 28 Nov 2022 23:13:20 +0800 Subject: [PATCH 42/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 101 ++++++++++++++++------- 1 file changed, 72 insertions(+), 29 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 4589d35c9..f63df4192 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -2,24 +2,65 @@ 本章节会介绍从 用户自定义图片数据集标注 到 最终进行训练和部署 的整体流程。流程步骤概览如下: -1. 使用 [labelme](https://github.com/wkentaro/labelme) 进行数据集标注:`demo/image_demo.py` + labelme -2. 使用脚本转换成 COCO 数据集格式:`tools/dataset_converters/labelme2coco.py` -3. 数据集划分:`tools/misc/coco_split.py` -4. 根据数据集内容新建 config 文件 -5. 训练:`tools/train.py` -6. 推理:`demo/image_demo.py` -7. 部署 +1. 数据集准备 +2. 使用 [labelme](https://github.com/wkentaro/labelme) 进行数据集标注:`demo/image_demo.py` + labelme +3. 使用脚本转换成 COCO 数据集格式:`tools/dataset_converters/labelme2coco.py` +4. 数据集划分:`tools/misc/coco_split.py` +5. 根据数据集内容新建 config 文件 +6. 训练:`tools/train.py` +7. 推理:`demo/image_demo.py` +8. 部署 下面详细介绍每一步。 -## 1. 使用 labelme 进行数据集标注 +## 1. 数据集准备 + +- 如果自己没有数据集,可以使用本教程提供的一个 Cat 数据集,下载命令: +```shell +mkdir data +wget https://download.openmmlab.com/xxx.tar -P ./data +cd data +tar -xvf xxx.tar +``` + +该文件的目录结构是: + +```shell +. +└── $DATA_ROOT + ├── images + │ ├── image1.jpg + │ ├── image2.png + │ └── ... + ├── labels + │ ├── image1.json + │ ├── image2.json + │ └── ... + ├── annotations + │ ├── trainval.json + │ └── test.json + └── ... +``` + +- 如有已经有数据,可以将其组成下面的结构 + +```shell +. +└── cat + └── images + ├── image1.jpg + ├── image2.png + └── ... +``` + +## 2. 使用 labelme 进行数据集标注 通常,标注有 2 种方法: - 软件或者算法辅助 + 人工修正标签 - 仅人工打标签 -## 1.1 软件或者算法辅助 + 人工修正标签 +## 2.1 软件或者算法辅助 + 人工修正标签 辅助标注的原理是用已有模型进行推理,将得出的推理信息保存为标注软件的标签文件格式。 @@ -31,7 +72,7 @@ 下面会分别介绍其过程: -### 1.1.1 软件或者算法辅助 +### 2.1.1 软件或者算法辅助 MMYOLO 提供的模型推理脚本 `demo/image_demo.py` 设置 `--to-labelme` 可以生成 labelme 格式标签文件,具体用法如下: @@ -105,7 +146,7 @@ python demo/image_demo.py /data/cat/images \ └── ... ``` -### 1.1.2 人工标注 +### 2.1.2 人工标注 本教程使用的标注软件是 [labelme](https://github.com/wkentaro/labelme) @@ -144,13 +185,13 @@ labelme /data/cat/images --output /data/cat/labels --autosave --nodata rectangle
-## 1.2 仅人工打标签 +## 2.2 仅人工打标签 步骤和 【1.1.2 人工标注】 相同,只是这里是直接标注,没有预先生成的标签。 -## 2. 使用脚本转换成 COCO 数据集格式 +## 3. 使用脚本转换成 COCO 数据集格式 -### 2.1 使用脚本转换 +### 3.1 使用脚本转换 MMYOLO 提供脚本将 labelme 的标签转换为 COCO 标签 @@ -177,7 +218,7 @@ python tools/dataset_converters/labelme2coco.py --img-dir ${图片文件夹路 ``` -### 2.2 检查转换的 COCO 标签 +### 3.2 检查转换的 COCO 标签 使用下面的命令可以将 COCO 的标签在图片上进行显示,这一步可以验证刚刚转换是否有问题: @@ -188,7 +229,7 @@ python tools/analysis_tools/browse_coco_json.py --img-dir ${图片文件夹路 关于 `tools/analysis_tools/browse_coco_json.py` 的更多用法请参考 [可视化 COCO 标签](useful_tools.md)。 -## 3. 数据集划分 +## 4. 数据集划分 ```shell python tools/misc/coco_split.py --json ${COCO 标签 json 路径} \ @@ -206,7 +247,7 @@ python tools/misc/coco_split.py --json ${COCO 标签 json 路径} \ - `--shuffle`: 是否打乱数据集再进行划分; - `--seed`:设定划分的随机种子,不设置的话自动生成随机种子。 -## 4. 根据数据集内容新建 config 文件 +## 5. 根据数据集内容新建 config 文件 确保数据集目录是这样的: @@ -218,23 +259,23 @@ python tools/misc/coco_split.py --json ${COCO 标签 json 路径} \ │ ├── val.json # optional │ └── test.json ├── images - │ ├── a.jpg - │ ├── b.png + │ ├── image1.jpg + │ ├── image1.png │ └── ... └── ... ``` 因为是我们自定义的数据集,所以我们需要自己重写 config 中的部分信息,我们在 configs 目录下新建一个新的目录 `custom_dataset`,同时新建 config 文件。 -这个 config 继承的是 `yolov5_s-v61_syncbn_8xb16-300e_coco.py`,假设数据集中的类是 `cat`,我的显卡训练 YOLOv5 最大可以 `batch size = 32`,训练 `300 epoch`,可以将其命名为 `yolov5_s-v61_syncbn_fast_1xb32-300e_cat.py`,并在其里面添加以下内容: +这个 config 继承的是 `yolov5_s-v61_syncbn_8xb16-300e_coco.py`,以本教程提供的数据集中的类 `cat`为例(如果是自己的数据集,可以自定义类型的总称),我的显卡训练 YOLOv5-s 最大可以 `batch size = 32`,训练 `200 epoch`,可以将其命名为 `yolov5_s-v61_syncbn_fast_1xb32-200e_cat.py`,并在其里面添加以下内容: ```python _base_ = '../yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py' -max_epochs = 300 # 训练的最大 epoch +max_epochs = 200 # 训练的最大 epoch data_root = '/path/to/data_root/' # 数据集目录的绝对路径 # 结果保存的路径,如果同个 config 只是修改了部分参数,修改这个变量就可以将新的训练文件保存到其他地方 -work_dir = './work_dirs/yolov5_s-v61_syncbn_fast_1xb32-300e_cat' +work_dir = './work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat' # checkpoint 可以指定本地路径或者 URL,设置了 URL 会自动进行下载,因为上面已经下载过,我们这里设置本地路径 checkpoint = './work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth' @@ -316,12 +357,12 @@ default_hooks = dict( ) ``` -## 5. 训练 +## 6. 训练 使用下面命令进行启动训练: ```shell -python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-300e_cat.py +python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-200e_cat.py ``` 下面是 `1 x 3080Ti`, `batch size = 32`,训练 `300 epoch`,得出来的精度: @@ -364,23 +405,25 @@ bbox_mAP_copypaste: 0.965 0.999 0.999 -1.000 -1.000 0.965 Epoch(val) [268][65/65] coco/bbox_mAP: 0.9650 coco/bbox_mAP_50: 0.9990 coco/bbox_mAP_75: 0.9990 coco/bbox_mAP_s: -1.0000 coco/bbox_mAP_m: -1.0000 coco/bbox_mAP_l: 0.9650 ``` -## 6. 推理 +## 7. 推理 + +使用最佳的模型进行推理,下面命令中的最佳模型路劲是 `./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat/best_coco/bbox_mAP_epoch_268.pth`,请用户自行修改为自己训练的最佳模型路径。 ```shell python demo/image_demo.py /path/to/test/images \ - configs/my_yolov5_s_config.py \ - ./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-300e_cat/best_coco/bbox_mAP_epoch_268.pth \ + ./configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-200e_cat.py \ + ./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat/best_coco/bbox_mAP_epoch_268.pth \ --out-dir /path/to/test/images_output ``` **Tips**:如果推理结果不理想,这里举例 2 中情况: 1. 欠拟合: - 需要先判断是不是训练 epoch 不够导致的欠拟合,如果是训练不够,则修改 config 文件里面的 `max_epochs`,同时,设置 `resume = ./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-300e_cat/last_checkpoint` 来最后的模型继续训练。 + 需要先判断是不是训练 epoch 不够导致的欠拟合,如果是训练不够,则修改 config 文件里面的 `max_epochs`,同时,设置 `resume = ./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat/last_checkpoint` 来最后的模型继续训练。 2. 数据集优化: 如果 epoch 加上去了还是不行,可以对数据集进行增加,同时加上不断修改标注来优化,然后重新进行训练。 -## 7. 部署 +## 8. 部署 详见[部署文档](../../../projects/easydeploy/README_zh-CN.md) From 3253f4b197544dc50c06513a98d25208296c8079 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Mon, 28 Nov 2022 23:30:55 +0800 Subject: [PATCH 43/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 7 ++----- tools/misc/download_dataset.py | 8 ++++++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index f63df4192..dea61227f 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -17,13 +17,10 @@ - 如果自己没有数据集,可以使用本教程提供的一个 Cat 数据集,下载命令: ```shell -mkdir data -wget https://download.openmmlab.com/xxx.tar -P ./data -cd data -tar -xvf xxx.tar +python tools/misc/download_dataset.py --dataset-name cat --save-dir ./data --unzip --delete ``` -该文件的目录结构是: +会自动下载到 `./data/cat` 文件夹中,该文件的目录结构是: ```shell . diff --git a/tools/misc/download_dataset.py b/tools/misc/download_dataset.py index 5d4776b09..7d1c64d82 100644 --- a/tools/misc/download_dataset.py +++ b/tools/misc/download_dataset.py @@ -91,10 +91,14 @@ def main(): balloon=[ # src link: https://github.com/matterport/Mask_RCNN/releases/download/v2.1/balloon_dataset.zip # noqa 'https://download.openmmlab.com/mmyolo/data/balloon_dataset.zip' - ]) + ], + cat=[ + 'https://download.openmmlab.com/mmyolo/data/cat_dataset.zip' # noqa + ], + ) url = data2url.get(args.dataset_name, None) if url is None: - print('Only support COCO, VOC, balloon,and LVIS now!') + print('Only support COCO, VOC, balloon, cat and LVIS now!') return download( url, From 4f668d5fa868f95ae13f9641fa836d86868c8738 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Mon, 28 Nov 2022 23:31:58 +0800 Subject: [PATCH 44/73] Improve doc --- docs/zh_cn/user_guides/yolov5_tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh_cn/user_guides/yolov5_tutorial.md b/docs/zh_cn/user_guides/yolov5_tutorial.md index 2cd7ccf68..20a24cbd9 100644 --- a/docs/zh_cn/user_guides/yolov5_tutorial.md +++ b/docs/zh_cn/user_guides/yolov5_tutorial.md @@ -30,7 +30,7 @@ mim install -v -e . 本文选取不到 40MB 大小的 balloon 气球数据集作为 MMYOLO 的学习数据集。 ```shell -python tools/misc/download_dataset.py --dataset-name balloon --save-dir data --unzip +python tools/misc/download_dataset.py --dataset-name balloon --save-dir data --unzip python tools/dataset_converters/balloon2coco.py ``` From a6b8a2d72b6da8c5ab77e8cabc930de850b0148a Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Mon, 28 Nov 2022 23:52:31 +0800 Subject: [PATCH 45/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index dea61227f..51aa0d259 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -16,6 +16,7 @@ ## 1. 数据集准备 - 如果自己没有数据集,可以使用本教程提供的一个 Cat 数据集,下载命令: + ```shell python tools/misc/download_dataset.py --dataset-name cat --save-dir ./data --unzip --delete ``` From 022406ec7dbcdf74b1b564cd5069c4c162f46c17 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Tue, 29 Nov 2022 09:47:17 +0800 Subject: [PATCH 46/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 46 ++++++++++++------------ 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 51aa0d259..d70e895f0 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -363,54 +363,54 @@ default_hooks = dict( python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-200e_cat.py ``` -下面是 `1 x 3080Ti`, `batch size = 32`,训练 `300 epoch`,得出来的精度: +下面是 `1 x 3080Ti`, `batch size = 32`,训练 `200 epoch`,得出来的精度: ```shell - Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.959 - Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.999 - Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.999 + Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.938 + Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 1.000 + Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 1.000 Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000 Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000 - Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.959 - Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.875 - Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.972 - Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.972 + Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.938 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.857 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.954 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.954 Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000 Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000 - Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.972 + Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.954 -bbox_mAP_copypaste: 0.959 0.999 0.999 -1.000 -1.000 0.959 -Epoch(val) [300][65/65] coco/bbox_mAP: 0.9590 coco/bbox_mAP_50: 0.9990 coco/bbox_mAP_75: 0.9990 coco/bbox_mAP_s: -1.0000 coco/bbox_mAP_m: -1.0000 coco/bbox_mAP_l: 0.9590 +bbox_mAP_copypaste: 0.938 1.000 1.000 -1.000 -1.000 0.938 +Epoch(val) [200][58/58] coco/bbox_mAP: 0.9380 coco/bbox_mAP_50: 1.0000 coco/bbox_mAP_75: 1.0000 coco/bbox_mAP_s: -1.0000 coco/bbox_mAP_m: -1.0000 coco/bbox_mAP_l: 0.9380 ``` 最佳精度 `bbox_mAP_epoch_266.pth`: ```shell - Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.965 - Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.999 - Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.999 + Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.942 + Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 1.000 + Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 1.000 Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000 Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000 - Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.965 - Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.876 - Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.975 - Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.975 + Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.942 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.861 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.959 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.959 Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000 Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000 - Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.975 + Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.959 -bbox_mAP_copypaste: 0.965 0.999 0.999 -1.000 -1.000 0.965 -Epoch(val) [268][65/65] coco/bbox_mAP: 0.9650 coco/bbox_mAP_50: 0.9990 coco/bbox_mAP_75: 0.9990 coco/bbox_mAP_s: -1.0000 coco/bbox_mAP_m: -1.0000 coco/bbox_mAP_l: 0.9650 +bbox_mAP_copypaste: 0.942 1.000 1.000 -1.000 -1.000 0.942 +Epoch(val) [198][58/58] coco/bbox_mAP: 0.9420 coco/bbox_mAP_50: 1.0000 coco/bbox_mAP_75: 1.0000 coco/bbox_mAP_s: -1.0000 coco/bbox_mAP_m: -1.0000 coco/bbox_mAP_l: 0.9420 ``` ## 7. 推理 -使用最佳的模型进行推理,下面命令中的最佳模型路劲是 `./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat/best_coco/bbox_mAP_epoch_268.pth`,请用户自行修改为自己训练的最佳模型路径。 +使用最佳的模型进行推理,下面命令中的最佳模型路劲是 `./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat/best_coco/bbox_mAP_epoch_198.pth`,请用户自行修改为自己训练的最佳模型路径。 ```shell python demo/image_demo.py /path/to/test/images \ ./configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-200e_cat.py \ - ./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat/best_coco/bbox_mAP_epoch_268.pth \ + ./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat/best_coco/bbox_mAP_epoch_198.pth \ --out-dir /path/to/test/images_output ``` From 381567191888806d7f1b24618c497a6eb12c0dab Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Tue, 29 Nov 2022 10:04:38 +0800 Subject: [PATCH 47/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index d70e895f0..976ba1b27 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -123,17 +123,19 @@ python demo/image_demo.py /data/cat/images \ --to-labelme ``` -- 标注文件只保存 `cat`、`dog` 两类: +- 标注文件只保存 `cat` 一类: ```shell python demo/image_demo.py /data/cat/images \ configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \ work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \ --out-dir /data/cat/labels \ - --class-name cat dog \ + --class-name cat\ --to-labelme ``` +**Tips**:如果你的数据集有多类,可以 `--class-name class1 class2` 这样子输入。 + 生成的标签文件会在 `--out-dir` 中: ```shell @@ -264,7 +266,7 @@ python tools/misc/coco_split.py --json ${COCO 标签 json 路径} \ ``` 因为是我们自定义的数据集,所以我们需要自己重写 config 中的部分信息,我们在 configs 目录下新建一个新的目录 `custom_dataset`,同时新建 config 文件。 -这个 config 继承的是 `yolov5_s-v61_syncbn_8xb16-300e_coco.py`,以本教程提供的数据集中的类 `cat`为例(如果是自己的数据集,可以自定义类型的总称),我的显卡训练 YOLOv5-s 最大可以 `batch size = 32`,训练 `200 epoch`,可以将其命名为 `yolov5_s-v61_syncbn_fast_1xb32-200e_cat.py`,并在其里面添加以下内容: +这个 config 继承的是 `yolov5_s-v61_syncbn_8xb16-300e_coco.py`,以本教程提供的数据集中的类 `cat` 为例(如果是自己的数据集,可以自定义类型的总称),我的显卡训练 YOLOv5-s 最大可以 `batch size = 32`,训练 `200 epoch`,可以将其命名为 `yolov5_s-v61_syncbn_fast_1xb32-200e_cat.py`,并在其里面添加以下内容: ```python _base_ = '../yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py' From 948c31a4dbd1781d886704c99cd44c63eb9ab1dd Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Tue, 29 Nov 2022 11:39:03 +0800 Subject: [PATCH 48/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 99 +++++++++++++++++------- 1 file changed, 71 insertions(+), 28 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 976ba1b27..3b19e9582 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -40,7 +40,7 @@ python tools/misc/download_dataset.py --dataset-name cat --save-dir ./data --unz └── ... ``` -- 如有已经有数据,可以将其组成下面的结构 +- 如你已经有数据,可以将其组成下面的结构 ```shell . @@ -101,40 +101,28 @@ python demo/image_demo.py img \ 例子: -这里使用 YOLOv5-s 作为例子来进行辅助标注,先下载 YOLOv5-s 的权重: +这里使用 YOLOv5-s 作为例子来进行辅助标注刚刚下载的 `cat` 数据集,先下载 YOLOv5-s 的权重: ```shell mkdir work_dirs wget https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth -P ./work_dirs ``` -执行辅助标注有 2 种情况: - -1. 标注文件保存所有推理出来的类 -2. 标注文件只保存 cat、dog 两类 - -- 标注文件保存所有推理出来的类: +由于 COCO 80 类数据集中已经包括了 `cat` 这一类,因此我们可以直接加载 COCO 预训练权重进行辅助标注。 ```shell python demo/image_demo.py /data/cat/images \ configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \ work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \ --out-dir /data/cat/labels \ + --class-name cat \ --to-labelme ``` -- 标注文件只保存 `cat` 一类: - -```shell -python demo/image_demo.py /data/cat/images \ - configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \ - work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \ - --out-dir /data/cat/labels \ - --class-name cat\ - --to-labelme -``` +**Tips**: -**Tips**:如果你的数据集有多类,可以 `--class-name class1 class2` 这样子输入。 +- 如果你的数据集需要标注多类,可以采用类似 `--class-name class1 class2` 格式输入; +- 如果全部输出,则删掉 `--class-name` 这个 flag 即可全部类都输出。 生成的标签文件会在 `--out-dir` 中: @@ -266,7 +254,15 @@ python tools/misc/coco_split.py --json ${COCO 标签 json 路径} \ ``` 因为是我们自定义的数据集,所以我们需要自己重写 config 中的部分信息,我们在 configs 目录下新建一个新的目录 `custom_dataset`,同时新建 config 文件。 -这个 config 继承的是 `yolov5_s-v61_syncbn_8xb16-300e_coco.py`,以本教程提供的数据集中的类 `cat` 为例(如果是自己的数据集,可以自定义类型的总称),我的显卡训练 YOLOv5-s 最大可以 `batch size = 32`,训练 `200 epoch`,可以将其命名为 `yolov5_s-v61_syncbn_fast_1xb32-200e_cat.py`,并在其里面添加以下内容: + +关于新的 config 的命名: + +- 这个 config 继承的是 `yolov5_s-v61_syncbn_8xb16-300e_coco.py`; +- 训练的类以本教程提供的数据集中的类 `cat` 为例(如果是自己的数据集,可以自定义类型的总称); +- 本教程测试的显卡型号是 1 x 3080Ti 12G 显存,电脑内存 32G,可以训练 YOLOv5-s 最大批次是 `batch size = 32`(详细机器资料可见附录); +- 训练轮次是 `200 epoch`。 + +综上所述:可以将其命名为 `yolov5_s-v61_syncbn_1xb32-200e_cat.py`,并在其里面添加以下内容: ```python _base_ = '../yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py' @@ -275,7 +271,7 @@ max_epochs = 200 # 训练的最大 epoch data_root = '/path/to/data_root/' # 数据集目录的绝对路径 # 结果保存的路径,如果同个 config 只是修改了部分参数,修改这个变量就可以将新的训练文件保存到其他地方 -work_dir = './work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat' +work_dir = './work_dirs/yolov5_s-v61_syncbn_1xb32-200e_cat' # checkpoint 可以指定本地路径或者 URL,设置了 URL 会自动进行下载,因为上面已经下载过,我们这里设置本地路径 checkpoint = './work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth' @@ -362,7 +358,7 @@ default_hooks = dict( 使用下面命令进行启动训练: ```shell -python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-200e_cat.py +python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_1xb32-200e_cat.py ``` 下面是 `1 x 3080Ti`, `batch size = 32`,训练 `200 epoch`,得出来的精度: @@ -407,23 +403,70 @@ Epoch(val) [198][58/58] coco/bbox_mAP: 0.9420 coco/bbox_mAP_50: 1.0000 coco/b ## 7. 推理 -使用最佳的模型进行推理,下面命令中的最佳模型路劲是 `./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat/best_coco/bbox_mAP_epoch_198.pth`,请用户自行修改为自己训练的最佳模型路径。 +使用最佳的模型进行推理,下面命令中的最佳模型路劲是 `./work_dirs/yolov5_s-v61_syncbn_1xb32-200e_cat/best_coco/bbox_mAP_epoch_198.pth`,请用户自行修改为自己训练的最佳模型路径。 ```shell python demo/image_demo.py /path/to/test/images \ - ./configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-200e_cat.py \ - ./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat/best_coco/bbox_mAP_epoch_198.pth \ + ./configs/custom_dataset/yolov5_s-v61_syncbn_1xb32-200e_cat.py \ + ./work_dirs/yolov5_s-v61_syncbn_1xb32-200e_cat/best_coco/bbox_mAP_epoch_198.pth \ --out-dir /path/to/test/images_output ``` -**Tips**:如果推理结果不理想,这里举例 2 中情况: +**Tips**:如果推理结果不理想,这里举例 2 种情况: 1. 欠拟合: - 需要先判断是不是训练 epoch 不够导致的欠拟合,如果是训练不够,则修改 config 文件里面的 `max_epochs`,同时,设置 `resume = ./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat/last_checkpoint` 来最后的模型继续训练。 + 需要先判断是不是训练 epoch 不够导致的欠拟合,如果是训练不够,则修改 config 文件里面的 `max_epochs`,重新进行训练。 2. 数据集优化: - 如果 epoch 加上去了还是不行,可以对数据集进行增加,同时加上不断修改标注来优化,然后重新进行训练。 + 如果 epoch 加上去了还是不行,可以增加数据集数量,同时可以重新检查并优化数据集的标注,然后重新进行训练。 ## 8. 部署 详见[部署文档](../../../projects/easydeploy/README_zh-CN.md) + +## 附录 + +### 1. 本教程训练机器的详细环境的资料如下: + +```shell +sys.platform: linux +Python: 3.9.13 | packaged by conda-forge | (main, May 27 2022, 16:58:50) [GCC 10.3.0] +CUDA available: True +numpy_random_seed: 2147483648 +GPU 0: NVIDIA GeForce RTX 3080 Ti +CUDA_HOME: /usr/local/cuda +NVCC: Cuda compilation tools, release 11.5, V11.5.119 +GCC: gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0 +PyTorch: 1.10.0 +PyTorch compiling details: PyTorch built with: + - GCC 7.3 + - C++ Version: 201402 + - Intel(R) oneAPI Math Kernel Library Version 2021.4-Product Build 20210904 for Intel(R) 64 architecture applications + - Intel(R) MKL-DNN v2.2.3 (Git Hash 7336ca9f055cf1bfa13efb658fe15dc9b41f0740) + - OpenMP 201511 (a.k.a. OpenMP 4.5) + - LAPACK is enabled (usually provided by MKL) + - NNPACK is enabled + - CPU capability usage: AVX2 + - CUDA Runtime 11.3 + - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60; + -gencode;arch=compute_61,code=sm_61;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode; + arch=compute_80,code=sm_80;-gencode;arch=compute_86,code=sm_86;-gencode;arch=compute_37,code=compute_37 + - CuDNN 8.2 + - Magma 2.5.2 + - Build settings: BLAS_INFO=mkl, BUILD_TYPE=Release, CUDA_VERSION=11.3, CUDNN_VERSION=8.2.0, CXX_COMPILER=/opt/rh/devtoolset-7/root/usr/bin/c++, + CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_KINETO -DUSE_FBGEMM -DUSE_QNNPACK + -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DSYMBOLICATE_MOBILE_DEBUG_HANDLE -DEDGE_PROFILER_USE_KINETO -O2 -fPIC -Wno-narrowing -Wall -Wextra + -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter + -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing + -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast + -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format + -Wno-stringop-overflow, LAPACK_INFO=mkl, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, TORCH_VERSION=1.10.0, USE_CUDA=ON, USE_CUDNN=ON, + USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, + +TorchVision: 0.11.0 +OpenCV: 4.6.0 +MMEngine: 0.3.1 +MMCV: 2.0.0rc3 +MMDetection: 3.0.0rc3 +MMYOLO: 0.1.3+3815671 +``` From 4191bff6e59ed9874e3a24f75eaf782812b7250c Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Tue, 29 Nov 2022 11:51:53 +0800 Subject: [PATCH 49/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 3b19e9582..1d624552f 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -257,21 +257,21 @@ python tools/misc/coco_split.py --json ${COCO 标签 json 路径} \ 关于新的 config 的命名: -- 这个 config 继承的是 `yolov5_s-v61_syncbn_8xb16-300e_coco.py`; +- 这个 config 继承的是 `yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py`; - 训练的类以本教程提供的数据集中的类 `cat` 为例(如果是自己的数据集,可以自定义类型的总称); - 本教程测试的显卡型号是 1 x 3080Ti 12G 显存,电脑内存 32G,可以训练 YOLOv5-s 最大批次是 `batch size = 32`(详细机器资料可见附录); - 训练轮次是 `200 epoch`。 -综上所述:可以将其命名为 `yolov5_s-v61_syncbn_1xb32-200e_cat.py`,并在其里面添加以下内容: +综上所述:可以将其命名为 `yolov5_s-v61_syncbn_fast_1xb32-200e_cat.py`,并在其里面添加以下内容: ```python -_base_ = '../yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py' +_base_ = '../yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py' max_epochs = 200 # 训练的最大 epoch data_root = '/path/to/data_root/' # 数据集目录的绝对路径 # 结果保存的路径,如果同个 config 只是修改了部分参数,修改这个变量就可以将新的训练文件保存到其他地方 -work_dir = './work_dirs/yolov5_s-v61_syncbn_1xb32-200e_cat' +work_dir = './work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat' # checkpoint 可以指定本地路径或者 URL,设置了 URL 会自动进行下载,因为上面已经下载过,我们这里设置本地路径 checkpoint = './work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth' @@ -349,7 +349,7 @@ default_hooks = dict( checkpoint=dict(type='CheckpointHook', interval=save_epoch_intervals, max_keep_ckpts=5, save_best='auto'), # logger 输出的间隔 - logger=dict(type='LoggerHook', interval=2) + logger=dict(type='LoggerHook', interval=5) ) ``` @@ -358,10 +358,10 @@ default_hooks = dict( 使用下面命令进行启动训练: ```shell -python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_1xb32-200e_cat.py +python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-200e_cat.py ``` -下面是 `1 x 3080Ti`, `batch size = 32`,训练 `200 epoch`,得出来的精度: +下面是 `1 x 3080Ti`、`batch size = 32`,训练 `200 epoch` 得出来的精度(详细机器资料可见附录): ```shell Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.938 @@ -403,12 +403,12 @@ Epoch(val) [198][58/58] coco/bbox_mAP: 0.9420 coco/bbox_mAP_50: 1.0000 coco/b ## 7. 推理 -使用最佳的模型进行推理,下面命令中的最佳模型路劲是 `./work_dirs/yolov5_s-v61_syncbn_1xb32-200e_cat/best_coco/bbox_mAP_epoch_198.pth`,请用户自行修改为自己训练的最佳模型路径。 +使用最佳的模型进行推理,下面命令中的最佳模型路劲是 `./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat/best_coco/bbox_mAP_epoch_198.pth`,请用户自行修改为自己训练的最佳模型路径。 ```shell python demo/image_demo.py /path/to/test/images \ - ./configs/custom_dataset/yolov5_s-v61_syncbn_1xb32-200e_cat.py \ - ./work_dirs/yolov5_s-v61_syncbn_1xb32-200e_cat/best_coco/bbox_mAP_epoch_198.pth \ + ./configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-200e_cat.py \ + ./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat/best_coco/bbox_mAP_epoch_198.pth \ --out-dir /path/to/test/images_output ``` From 8ab6a709c7e85248f800788d5e11b1b6594acd4c Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Tue, 29 Nov 2022 11:58:54 +0800 Subject: [PATCH 50/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 1d624552f..9884e8012 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -415,7 +415,7 @@ python demo/image_demo.py /path/to/test/images \ **Tips**:如果推理结果不理想,这里举例 2 种情况: 1. 欠拟合: - 需要先判断是不是训练 epoch 不够导致的欠拟合,如果是训练不够,则修改 config 文件里面的 `max_epochs`,重新进行训练。 + 需要先判断是不是训练 epoch 不够导致的欠拟合,如果是训练不够,则修改 config 文件里面的 `max_epochs` 和 `work_dir` 参数,或者根据上面的命名方式新建一个 config 文件,重新进行训练。 2. 数据集优化: 如果 epoch 加上去了还是不行,可以增加数据集数量,同时可以重新检查并优化数据集的标注,然后重新进行训练。 From 6866dba7aaf70da2402b29f547b1d7388ecb90e1 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Tue, 29 Nov 2022 12:11:01 +0800 Subject: [PATCH 51/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 9884e8012..f72e69a13 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -422,7 +422,18 @@ python demo/image_demo.py /path/to/test/images \ ## 8. 部署 -详见[部署文档](../../../projects/easydeploy/README_zh-CN.md) +MMYOLO 提供两种部署方式: + +1. [MMDeploy](https://github.com/open-mmlab/mmdeploy) 框架进行部署 +2. 使用 `projects/easydeploy` 进行部署 + +### 8.1 MMDeploy 框架进行部署 + +详见[YOLOv5 部署全流程说明](https://mmyolo.readthedocs.io/zh_CN/latest/deploy/yolov5_deployment.html) + +### 8.2 使用 `projects/easydeploy` 进行部署 + +Coming soon... ## 附录 From 116463eb121dd1f1d15bdca9d4b687dadcf0534d Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Tue, 29 Nov 2022 12:20:08 +0800 Subject: [PATCH 52/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 46 ++++++++++++------------ 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index f72e69a13..167a0596f 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -15,7 +15,7 @@ ## 1. 数据集准备 -- 如果自己没有数据集,可以使用本教程提供的一个 Cat 数据集,下载命令: +- 如果自己没有数据集,可以使用本教程提供的一个 `cat` 数据集,下载命令: ```shell python tools/misc/download_dataset.py --dataset-name cat --save-dir ./data --unzip --delete @@ -55,16 +55,16 @@ python tools/misc/download_dataset.py --dataset-name cat --save-dir ./data --unz 通常,标注有 2 种方法: -- 软件或者算法辅助 + 人工修正标签 -- 仅人工打标签 +- 软件或者算法辅助 + 人工修正 label +- 仅人工标注 -## 2.1 软件或者算法辅助 + 人工修正标签 +## 2.1 软件或者算法辅助 + 人工修正 label -辅助标注的原理是用已有模型进行推理,将得出的推理信息保存为标注软件的标签文件格式。 +辅助标注的原理是用已有模型进行推理,将得出的推理信息保存为标注软件 label 文件格式。 -**Tips**:如果已有模型典型的如 COCO 预训练模型没有你自定义新数据集的类别,建议先人工打 100 张左右的图片标签,训练个初始模型,然后再进行辅助打标签。 +**Tips**:如果已有模型典型的如 COCO 预训练模型没有你自定义新数据集的类别,建议先人工打 100 张左右的图片 label,训练个初始模型,然后再进行辅助标注。 -人工操作标注软件加载生成好的标签文件,只需要检查每张图片的目标是否标准,以及是否有漏掉的目标。 +人工操作标注软件加载生成好的 label 文件,只需要检查每张图片的目标是否标准,以及是否有漏掉的目标。 【辅助 + 人工标注】这种方式可以节省很多时间和精力,达到降本提速的目的。 @@ -72,7 +72,7 @@ python tools/misc/download_dataset.py --dataset-name cat --save-dir ./data --unz ### 2.1.1 软件或者算法辅助 -MMYOLO 提供的模型推理脚本 `demo/image_demo.py` 设置 `--to-labelme` 可以生成 labelme 格式标签文件,具体用法如下: +MMYOLO 提供的模型推理脚本 `demo/image_demo.py` 设置 `--to-labelme` 可以生成 labelme 格式 label 文件,具体用法如下: ```shell python demo/image_demo.py img \ @@ -97,7 +97,7 @@ python demo/image_demo.py img \ - `--show`:使用该参数表示在屏幕上显示检测结果,默认为 `False`; - `--deploy`:是否切换成 deploy 模式; - `--score-thr`:置信度阈值,默认为 `0.3`; -- `--to-labelme`:是否导出 `labelme` 格式的标签文件,不可以与 `--show` 参数同时存在 +- `--to-labelme`:是否导出 `labelme` 格式的 label 文件,不可以与 `--show` 参数同时存在 例子: @@ -124,7 +124,7 @@ python demo/image_demo.py /data/cat/images \ - 如果你的数据集需要标注多类,可以采用类似 `--class-name class1 class2` 格式输入; - 如果全部输出,则删掉 `--class-name` 这个 flag 即可全部类都输出。 -生成的标签文件会在 `--out-dir` 中: +生成的 label 文件会在 `--out-dir` 中: ```shell . @@ -165,7 +165,7 @@ labelme ${图片文件夹路径(即上一步的图片文件夹)} \ labelme /data/cat/images --output /data/cat/labels --autosave --nodata ``` -输入命令之后 labelme 就会启动,然后进行标签检查即可。如果 labelme 启动失败,命令行输入 `export QT_DEBUG_PLUGINS=1` 查看具体缺少什么库,安装一下即可。 +输入命令之后 labelme 就会启动,然后进行 label 检查即可。如果 labelme 启动失败,命令行输入 `export QT_DEBUG_PLUGINS=1` 查看具体缺少什么库,安装一下即可。 **注意:标注的时候务必使用 `rectangle`,快捷键 `Ctrl + R`(如下图)** @@ -173,20 +173,20 @@ labelme /data/cat/images --output /data/cat/labels --autosave --nodata rectangle -## 2.2 仅人工打标签 +## 2.2 仅人工标注 -步骤和 【1.1.2 人工标注】 相同,只是这里是直接标注,没有预先生成的标签。 +步骤和 【1.1.2 人工标注】 相同,只是这里是直接标注,没有预先生成的 label 。 ## 3. 使用脚本转换成 COCO 数据集格式 ### 3.1 使用脚本转换 -MMYOLO 提供脚本将 labelme 的标签转换为 COCO 标签 +MMYOLO 提供脚本将 labelme 的 label 转换为 COCO label ```shell python tools/dataset_converters/labelme2coco.py --img-dir ${图片文件夹路径} \ - --labels-dir ${标签文件夹位置} \ - --out ${输出 COCO 标签json路径} + --labels-dir ${label 文件夹位置} \ + --out ${输出 COCO label json路径} [--class-id-txt] ``` @@ -206,22 +206,22 @@ python tools/dataset_converters/labelme2coco.py --img-dir ${图片文件夹路 ``` -### 3.2 检查转换的 COCO 标签 +### 3.2 检查转换的 COCO label -使用下面的命令可以将 COCO 的标签在图片上进行显示,这一步可以验证刚刚转换是否有问题: +使用下面的命令可以将 COCO 的 label 在图片上进行显示,这一步可以验证刚刚转换是否有问题: ```shell python tools/analysis_tools/browse_coco_json.py --img-dir ${图片文件夹路径} \ - --ann-file ${COCO 标签json路径} + --ann-file ${COCO label json路径} ``` -关于 `tools/analysis_tools/browse_coco_json.py` 的更多用法请参考 [可视化 COCO 标签](useful_tools.md)。 +关于 `tools/analysis_tools/browse_coco_json.py` 的更多用法请参考 [可视化 COCO label](useful_tools.md)。 ## 4. 数据集划分 ```shell -python tools/misc/coco_split.py --json ${COCO 标签 json 路径} \ - --out-dir ${划分标签 json 保存根路径} \ +python tools/misc/coco_split.py --json ${COCO label json 路径} \ + --out-dir ${划分 label json 保存根路径} \ --ratios ${划分比例} \ [--shuffle] \ [--seed ${划分的随机种子}] @@ -433,7 +433,7 @@ MMYOLO 提供两种部署方式: ### 8.2 使用 `projects/easydeploy` 进行部署 -Coming soon... +详见[部署文档](https://github.com/PeterH0323/mmyolo/blob/6866dba7aaf70da2402b29f547b1d7388ecb90e1/projects/easydeploy/README_zh-CN.md) ## 附录 From d855ad2054d811ea647ceb7d53cd143581f3bf61 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Tue, 29 Nov 2022 12:26:42 +0800 Subject: [PATCH 53/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 167a0596f..7bc754ad5 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -381,7 +381,7 @@ bbox_mAP_copypaste: 0.938 1.000 1.000 -1.000 -1.000 0.938 Epoch(val) [200][58/58] coco/bbox_mAP: 0.9380 coco/bbox_mAP_50: 1.0000 coco/bbox_mAP_75: 1.0000 coco/bbox_mAP_s: -1.0000 coco/bbox_mAP_m: -1.0000 coco/bbox_mAP_l: 0.9380 ``` -最佳精度 `bbox_mAP_epoch_266.pth`: +最佳精度 `bbox_mAP_epoch_198.pth`: ```shell Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.942 From bd5c02120121b4c386b457553eaeb7057dc1f085 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Tue, 29 Nov 2022 12:32:17 +0800 Subject: [PATCH 54/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 26 +++++++++++++----------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 7bc754ad5..e387ab3d4 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -459,20 +459,22 @@ PyTorch compiling details: PyTorch built with: - NNPACK is enabled - CPU capability usage: AVX2 - CUDA Runtime 11.3 - - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60; - -gencode;arch=compute_61,code=sm_61;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode; - arch=compute_80,code=sm_80;-gencode;arch=compute_86,code=sm_86;-gencode;arch=compute_37,code=compute_37 + - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode; + arch=compute_60,code=sm_60;-gencode;arch=compute_61,code=sm_61;-gencode;arch=compute_70,code=sm_70; + -gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80;-gencode; + arch=compute_86,code=sm_86;-gencode;arch=compute_37,code=compute_37 - CuDNN 8.2 - Magma 2.5.2 - - Build settings: BLAS_INFO=mkl, BUILD_TYPE=Release, CUDA_VERSION=11.3, CUDNN_VERSION=8.2.0, CXX_COMPILER=/opt/rh/devtoolset-7/root/usr/bin/c++, - CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_KINETO -DUSE_FBGEMM -DUSE_QNNPACK - -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DSYMBOLICATE_MOBILE_DEBUG_HANDLE -DEDGE_PROFILER_USE_KINETO -O2 -fPIC -Wno-narrowing -Wall -Wextra - -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter - -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing - -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast - -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format - -Wno-stringop-overflow, LAPACK_INFO=mkl, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, TORCH_VERSION=1.10.0, USE_CUDA=ON, USE_CUDNN=ON, - USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, + - Build settings: BLAS_INFO=mkl, BUILD_TYPE=Release, CUDA_VERSION=11.3, CUDNN_VERSION=8.2.0, + CXX_COMPILER=/opt/rh/devtoolset-7/root/usr/bin/c++, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden + -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_KINETO -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK + -DSYMBOLICATE_MOBILE_DEBUG_HANDLE -DEDGE_PROFILER_USE_KINETO -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type + -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare + -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls + -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized + -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, LAPACK_INFO=mkl, PERF_WITH_AVX=1, + PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, TORCH_VERSION=1.10.0, USE_CUDA=ON, USE_CUDNN=ON, USE_EXCEPTION_PTR=1, + USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, TorchVision: 0.11.0 OpenCV: 4.6.0 From 51b562ec7067f1ae62dec4fdcebad250abe2e7fb Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Tue, 29 Nov 2022 12:35:08 +0800 Subject: [PATCH 55/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index e387ab3d4..31040a28c 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -468,13 +468,14 @@ PyTorch compiling details: PyTorch built with: - Build settings: BLAS_INFO=mkl, BUILD_TYPE=Release, CUDA_VERSION=11.3, CUDNN_VERSION=8.2.0, CXX_COMPILER=/opt/rh/devtoolset-7/root/usr/bin/c++, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_KINETO -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK - -DSYMBOLICATE_MOBILE_DEBUG_HANDLE -DEDGE_PROFILER_USE_KINETO -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type - -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare - -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls - -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized - -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, LAPACK_INFO=mkl, PERF_WITH_AVX=1, - PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, TORCH_VERSION=1.10.0, USE_CUDA=ON, USE_CUDNN=ON, USE_EXCEPTION_PTR=1, - USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, + -DSYMBOLICATE_MOBILE_DEBUG_HANDLE -DEDGE_PROFILER_USE_KINETO -O2 -fPIC -Wno-narrowing -Wall -Wextra + -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas + -Wno-sign-compare -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic + -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new + -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format + -Wno-stringop-overflow, LAPACK_INFO=mkl, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, + TORCH_VERSION=1.10.0, USE_CUDA=ON, USE_CUDNN=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, + USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, TorchVision: 0.11.0 OpenCV: 4.6.0 From 0ecb8d69f0d6eb37b70746472e0870b10f760454 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Tue, 29 Nov 2022 12:37:39 +0800 Subject: [PATCH 56/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 31040a28c..560a46097 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -186,7 +186,7 @@ MMYOLO 提供脚本将 labelme 的 label 转换为 COCO label ```shell python tools/dataset_converters/labelme2coco.py --img-dir ${图片文件夹路径} \ --labels-dir ${label 文件夹位置} \ - --out ${输出 COCO label json路径} + --out ${输出 COCO label json 路径} [--class-id-txt] ``` @@ -212,7 +212,7 @@ python tools/dataset_converters/labelme2coco.py --img-dir ${图片文件夹路 ```shell python tools/analysis_tools/browse_coco_json.py --img-dir ${图片文件夹路径} \ - --ann-file ${COCO label json路径} + --ann-file ${COCO label json 路径} ``` 关于 `tools/analysis_tools/browse_coco_json.py` 的更多用法请参考 [可视化 COCO label](useful_tools.md)。 @@ -403,7 +403,7 @@ Epoch(val) [198][58/58] coco/bbox_mAP: 0.9420 coco/bbox_mAP_50: 1.0000 coco/b ## 7. 推理 -使用最佳的模型进行推理,下面命令中的最佳模型路劲是 `./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat/best_coco/bbox_mAP_epoch_198.pth`,请用户自行修改为自己训练的最佳模型路径。 +使用最佳的模型进行推理,下面命令中的最佳模型路径是 `./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat/best_coco/bbox_mAP_epoch_198.pth`,请用户自行修改为自己训练的最佳模型路径。 ```shell python demo/image_demo.py /path/to/test/images \ From f24bb3d87d61786af2a5ad3465871737c6023645 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Tue, 29 Nov 2022 17:38:58 +0800 Subject: [PATCH 57/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 560a46097..6ca69ffc7 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -26,20 +26,22 @@ python tools/misc/download_dataset.py --dataset-name cat --save-dir ./data --unz ```shell . └── $DATA_ROOT - ├── images + ├── images # 图片文件 │ ├── image1.jpg │ ├── image2.png │ └── ... - ├── labels + ├── labels # labelme 标注文件 │ ├── image1.json │ ├── image2.json │ └── ... - ├── annotations + ├── annotations # 数据集划分的 COCO 文件 │ ├── trainval.json │ └── test.json - └── ... + └── class_with_id.txt # id + class_name 文件 ``` +**Tips**:这个数据集可以直接训练,如果您想体验整个流程的话,可以将 `images` 文件夹**以外的**其余文件都删除。 + - 如你已经有数据,可以将其组成下面的结构 ```shell From ffa944ae1b6eb55fa70c13a975a64b9c6b7b12e5 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Tue, 29 Nov 2022 18:23:20 +0800 Subject: [PATCH 58/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 6ca69ffc7..9ca4271e3 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -35,8 +35,9 @@ python tools/misc/download_dataset.py --dataset-name cat --save-dir ./data --unz │ ├── image2.json │ └── ... ├── annotations # 数据集划分的 COCO 文件 - │ ├── trainval.json - │ └── test.json + │ ├── annotations_all.json # 全量数据的 COCO label 文件 + │ ├── trainval.json # 划分比例 80% 的数据 + │ └── test.json # 划分比例 20% 的数据 └── class_with_id.txt # id + class_name 文件 ``` From 5fa975a3b350825aa5ef8252ddcf3c367d0e914e Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Tue, 29 Nov 2022 18:52:47 +0800 Subject: [PATCH 59/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 9ca4271e3..6cea1fd3e 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -18,14 +18,14 @@ - 如果自己没有数据集,可以使用本教程提供的一个 `cat` 数据集,下载命令: ```shell -python tools/misc/download_dataset.py --dataset-name cat --save-dir ./data --unzip --delete +python tools/misc/download_dataset.py --dataset-name cat --save-dir ./data/cat --unzip --delete ``` 会自动下载到 `./data/cat` 文件夹中,该文件的目录结构是: ```shell . -└── $DATA_ROOT +└── ./data/cat ├── images # 图片文件 │ ├── image1.jpg │ ├── image2.png @@ -47,7 +47,7 @@ python tools/misc/download_dataset.py --dataset-name cat --save-dir ./data --unz ```shell . -└── cat +└── $DATA_ROOT └── images ├── image1.jpg ├── image2.png @@ -114,10 +114,10 @@ wget https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8x 由于 COCO 80 类数据集中已经包括了 `cat` 这一类,因此我们可以直接加载 COCO 预训练权重进行辅助标注。 ```shell -python demo/image_demo.py /data/cat/images \ +python demo/image_demo.py ./data/cat/images \ configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \ work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \ - --out-dir /data/cat/labels \ + --out-dir ./data/cat/labels \ --class-name cat \ --to-labelme ``` @@ -165,7 +165,7 @@ labelme ${图片文件夹路径(即上一步的图片文件夹)} \ 例子: ```shell -labelme /data/cat/images --output /data/cat/labels --autosave --nodata +labelme ./data/cat/images --output ./data/cat/labels --autosave --nodata ``` 输入命令之后 labelme 就会启动,然后进行 label 检查即可。如果 labelme 启动失败,命令行输入 `export QT_DEBUG_PLUGINS=1` 查看具体缺少什么库,安装一下即可。 @@ -271,7 +271,7 @@ python tools/misc/coco_split.py --json ${COCO label json 路径} \ _base_ = '../yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py' max_epochs = 200 # 训练的最大 epoch -data_root = '/path/to/data_root/' # 数据集目录的绝对路径 +data_root = './data/cat/' # 数据集目录的绝对路径 # 结果保存的路径,如果同个 config 只是修改了部分参数,修改这个变量就可以将新的训练文件保存到其他地方 work_dir = './work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat' @@ -409,10 +409,10 @@ Epoch(val) [198][58/58] coco/bbox_mAP: 0.9420 coco/bbox_mAP_50: 1.0000 coco/b 使用最佳的模型进行推理,下面命令中的最佳模型路径是 `./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat/best_coco/bbox_mAP_epoch_198.pth`,请用户自行修改为自己训练的最佳模型路径。 ```shell -python demo/image_demo.py /path/to/test/images \ +python demo/image_demo.py ./data/cat/images \ ./configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-200e_cat.py \ ./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat/best_coco/bbox_mAP_epoch_198.pth \ - --out-dir /path/to/test/images_output + --out-dir ./data/cat/pred_images ``` **Tips**:如果推理结果不理想,这里举例 2 种情况: From 57cd4bb85a259f4d23198f0da50749122eef7ef4 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Tue, 29 Nov 2022 18:56:56 +0800 Subject: [PATCH 60/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 6cea1fd3e..68bd0f7f6 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -2,7 +2,7 @@ 本章节会介绍从 用户自定义图片数据集标注 到 最终进行训练和部署 的整体流程。流程步骤概览如下: -1. 数据集准备 +1. 数据集准备:`tools/misc/download_dataset.py` 2. 使用 [labelme](https://github.com/wkentaro/labelme) 进行数据集标注:`demo/image_demo.py` + labelme 3. 使用脚本转换成 COCO 数据集格式:`tools/dataset_converters/labelme2coco.py` 4. 数据集划分:`tools/misc/coco_split.py` @@ -115,8 +115,8 @@ wget https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8x ```shell python demo/image_demo.py ./data/cat/images \ - configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \ - work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \ + ./configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \ + ./work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \ --out-dir ./data/cat/labels \ --class-name cat \ --to-labelme From 2eafead8e9e25db8a0eada49ceeeb98c8bfb7c73 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Tue, 29 Nov 2022 21:45:54 +0800 Subject: [PATCH 61/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 34 ++++++++++++------------ 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 68bd0f7f6..030dbad66 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -367,41 +367,41 @@ python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-200e 下面是 `1 x 3080Ti`、`batch size = 32`,训练 `200 epoch` 得出来的精度(详细机器资料可见附录): ```shell - Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.938 + Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.936 Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 1.000 Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 1.000 Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000 Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000 - Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.938 - Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.857 - Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.954 - Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.954 + Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.936 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.856 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.953 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.953 Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000 Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000 - Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.954 + Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.953 -bbox_mAP_copypaste: 0.938 1.000 1.000 -1.000 -1.000 0.938 -Epoch(val) [200][58/58] coco/bbox_mAP: 0.9380 coco/bbox_mAP_50: 1.0000 coco/bbox_mAP_75: 1.0000 coco/bbox_mAP_s: -1.0000 coco/bbox_mAP_m: -1.0000 coco/bbox_mAP_l: 0.9380 +bbox_mAP_copypaste: 0.936 1.000 1.000 -1.000 -1.000 0.936 +Epoch(val) [200][58/58] coco/bbox_mAP: 0.9360 coco/bbox_mAP_50: 1.0000 coco/bbox_mAP_75: 1.0000 coco/bbox_mAP_s: -1.0000 coco/bbox_mAP_m: -1.0000 coco/bbox_mAP_l: 0.9360 ``` -最佳精度 `bbox_mAP_epoch_198.pth`: +最佳精度 `bbox_mAP_epoch_190.pth`: ```shell - Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.942 + Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.936 Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 1.000 Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 1.000 Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000 Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000 - Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.942 - Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.861 - Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.959 - Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.959 + Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.936 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.859 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.952 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.952 Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000 Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000 - Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.959 + Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.952 -bbox_mAP_copypaste: 0.942 1.000 1.000 -1.000 -1.000 0.942 -Epoch(val) [198][58/58] coco/bbox_mAP: 0.9420 coco/bbox_mAP_50: 1.0000 coco/bbox_mAP_75: 1.0000 coco/bbox_mAP_s: -1.0000 coco/bbox_mAP_m: -1.0000 coco/bbox_mAP_l: 0.9420 +bbox_mAP_copypaste: 0.936 1.000 1.000 -1.000 -1.000 0.936 +Epoch(val) [190][58/58] coco/bbox_mAP: 0.9360 coco/bbox_mAP_50: 1.0000 coco/bbox_mAP_75: 1.0000 coco/bbox_mAP_s: -1.0000 coco/bbox_mAP_m: -1.0000 coco/bbox_mAP_l: 0.9360 ``` ## 7. 推理 From 38f58789b7ff2ddc523080c1470a2311ec032866 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 30 Nov 2022 15:18:12 +0800 Subject: [PATCH 62/73] Improve doc config --- docs/zh_cn/user_guides/custom_dataset.md | 60 ++++++++++-------------- 1 file changed, 24 insertions(+), 36 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 030dbad66..fabb9dd12 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -273,17 +273,16 @@ _base_ = '../yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py' max_epochs = 200 # 训练的最大 epoch data_root = './data/cat/' # 数据集目录的绝对路径 -# 结果保存的路径,如果同个 config 只是修改了部分参数,修改这个变量就可以将新的训练文件保存到其他地方 +# 结果保存的路径,可以省略,省略保存的文件名位于 work_dirs 下 config 同名的文件夹中 +# 如果同个 config 只是修改了部分参数,修改这个变量就可以将新的训练文件保存到其他地方 work_dir = './work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat' # checkpoint 可以指定本地路径或者 URL,设置了 URL 会自动进行下载,因为上面已经下载过,我们这里设置本地路径 -checkpoint = './work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth' +load_from = './work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth' -resume = False # 继续训练的时候使用 - -train_batch_size_per_gpu = 32 # 根据自己的GPU情况,修改 batch size,YOLOv5-s 默认为 16 * 8 +train_batch_size_per_gpu = 32 # 根据自己的GPU情况,修改 batch size,YOLOv5-s 默认为 8卡 * 16bs train_num_workers = 4 # 推荐使用 train_num_workers = nGPU x 4 -val_batch_size_per_gpu = 2 # val 时候的 batch size ,根据实际调整即可 +val_batch_size_per_gpu = 1 # val 时候的 batch size ,根据实际调整即可 val_num_workers = 2 save_epoch_intervals = 2 # 每 interval 轮迭代进行一次保存一次权重 @@ -293,19 +292,22 @@ base_lr = _base_.base_lr / 4 num_classes = 1 metainfo = dict( # 根据 class_with_id.txt 类别信息,设置 metainfo - CLASSES=('cat'), + CLASSES=('cat',), PALETTE=[(220, 20, 60)] # 画图时候的颜色,随便设置即可 ) train_cfg = dict( max_epochs=max_epochs, - val_begin=10, # 第几个epoch后验证 + val_begin=10, # 第几个epoch后验证,这里设置 10 是因为前 10 个 epoch 精度不高,测试意义不大,故跳过 val_interval=save_epoch_intervals # 每 val_interval 轮迭代进行一次测试评估 ) model = dict( - backbone=dict(init_cfg=dict(type='Pretrained', checkpoint=checkpoint)), - bbox_head=dict(head_module=dict(num_classes=num_classes))) + bbox_head=dict( + head_module=dict(num_classes=num_classes), + loss_cls=dict(loss_weight=0.5 * (num_classes / 80 * 3 / _base_.num_det_layers)) + ) +) train_dataloader = dict( batch_size=train_batch_size_per_gpu, @@ -352,39 +354,19 @@ default_hooks = dict( checkpoint=dict(type='CheckpointHook', interval=save_epoch_intervals, max_keep_ckpts=5, save_best='auto'), # logger 输出的间隔 - logger=dict(type='LoggerHook', interval=5) + logger=dict(type='LoggerHook', interval=10) ) ``` ## 6. 训练 -使用下面命令进行启动训练: +使用下面命令进行启动训练(大约训练 8 个小时): ```shell python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-200e_cat.py ``` -下面是 `1 x 3080Ti`、`batch size = 32`,训练 `200 epoch` 得出来的精度(详细机器资料可见附录): - -```shell - Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.936 - Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 1.000 - Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 1.000 - Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000 - Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000 - Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.936 - Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.856 - Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.953 - Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.953 - Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000 - Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000 - Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.953 - -bbox_mAP_copypaste: 0.936 1.000 1.000 -1.000 -1.000 0.936 -Epoch(val) [200][58/58] coco/bbox_mAP: 0.9360 coco/bbox_mAP_50: 1.0000 coco/bbox_mAP_75: 1.0000 coco/bbox_mAP_s: -1.0000 coco/bbox_mAP_m: -1.0000 coco/bbox_mAP_l: 0.9360 -``` - -最佳精度 `bbox_mAP_epoch_190.pth`: +下面是 `1 x 3080Ti`、`batch size = 32`,训练 `200 epoch` 最佳精度权重 `work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat/best_coco/bbox_mAP_epoch_190.pth` 得出来的精度(详细机器资料可见附录): ```shell Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.936 @@ -406,15 +388,19 @@ Epoch(val) [190][58/58] coco/bbox_mAP: 0.9360 coco/bbox_mAP_50: 1.0000 coco/b ## 7. 推理 -使用最佳的模型进行推理,下面命令中的最佳模型路径是 `./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat/best_coco/bbox_mAP_epoch_198.pth`,请用户自行修改为自己训练的最佳模型路径。 +使用最佳的模型进行推理,下面命令中的最佳模型路径是 `./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat/best_coco/bbox_mAP_epoch_190.pth`,请用户自行修改为自己训练的最佳模型路径。 ```shell python demo/image_demo.py ./data/cat/images \ ./configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-200e_cat.py \ - ./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat/best_coco/bbox_mAP_epoch_198.pth \ + ./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat/best_coco/bbox_mAP_epoch_190.pth \ --out-dir ./data/cat/pred_images ``` +
+推理图片 +
+ **Tips**:如果推理结果不理想,这里举例 2 种情况: 1. 欠拟合: @@ -436,7 +422,9 @@ MMYOLO 提供两种部署方式: ### 8.2 使用 `projects/easydeploy` 进行部署 -详见[部署文档](https://github.com/PeterH0323/mmyolo/blob/6866dba7aaf70da2402b29f547b1d7388ecb90e1/projects/easydeploy/README_zh-CN.md) +详见[部署文档](https://github.com/open-mmlab/mmyolo/blob/dev/projects/easydeploy/README_zh-CN.md) + +TODO: 下个版本会完善这个部分... ## 附录 From 81560ac08a501614fcadea1058145ca68e089664 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 30 Nov 2022 15:30:25 +0800 Subject: [PATCH 63/73] Improve doc config --- docs/zh_cn/user_guides/custom_dataset.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index fabb9dd12..83cf92307 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -282,8 +282,6 @@ load_from = './work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_08470 train_batch_size_per_gpu = 32 # 根据自己的GPU情况,修改 batch size,YOLOv5-s 默认为 8卡 * 16bs train_num_workers = 4 # 推荐使用 train_num_workers = nGPU x 4 -val_batch_size_per_gpu = 1 # val 时候的 batch size ,根据实际调整即可 -val_num_workers = 2 save_epoch_intervals = 2 # 每 interval 轮迭代进行一次保存一次权重 @@ -327,8 +325,6 @@ train_dataloader = dict( )) val_dataloader = dict( - batch_size=val_batch_size_per_gpu, - num_workers=val_num_workers, dataset=dict( metainfo=metainfo, data_root=data_root, @@ -336,8 +332,6 @@ val_dataloader = dict( data_prefix=dict(img='images/'))) test_dataloader = dict( - batch_size=val_batch_size_per_gpu, - num_workers=val_num_workers, dataset=dict( metainfo=metainfo, data_root=data_root, From 71d0f592a8e61437c3a9626214de7e92ea7e8c89 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 30 Nov 2022 15:38:31 +0800 Subject: [PATCH 64/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 83cf92307..e9fa65e24 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -263,19 +263,19 @@ python tools/misc/coco_split.py --json ${COCO label json 路径} \ - 这个 config 继承的是 `yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py`; - 训练的类以本教程提供的数据集中的类 `cat` 为例(如果是自己的数据集,可以自定义类型的总称); - 本教程测试的显卡型号是 1 x 3080Ti 12G 显存,电脑内存 32G,可以训练 YOLOv5-s 最大批次是 `batch size = 32`(详细机器资料可见附录); -- 训练轮次是 `200 epoch`。 +- 训练轮次是 `100 epoch`。 -综上所述:可以将其命名为 `yolov5_s-v61_syncbn_fast_1xb32-200e_cat.py`,并在其里面添加以下内容: +综上所述:可以将其命名为 `yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py`,并在其里面添加以下内容: ```python _base_ = '../yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py' -max_epochs = 200 # 训练的最大 epoch +max_epochs = 100 # 训练的最大 epoch data_root = './data/cat/' # 数据集目录的绝对路径 # 结果保存的路径,可以省略,省略保存的文件名位于 work_dirs 下 config 同名的文件夹中 # 如果同个 config 只是修改了部分参数,修改这个变量就可以将新的训练文件保存到其他地方 -work_dir = './work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat' +work_dir = './work_dirs/yolov5_s-v61_syncbn_fast_1xb32-100e_cat' # checkpoint 可以指定本地路径或者 URL,设置了 URL 会自动进行下载,因为上面已经下载过,我们这里设置本地路径 load_from = './work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth' @@ -357,10 +357,10 @@ default_hooks = dict( 使用下面命令进行启动训练(大约训练 8 个小时): ```shell -python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-200e_cat.py +python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py ``` -下面是 `1 x 3080Ti`、`batch size = 32`,训练 `200 epoch` 最佳精度权重 `work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat/best_coco/bbox_mAP_epoch_190.pth` 得出来的精度(详细机器资料可见附录): +下面是 `1 x 3080Ti`、`batch size = 32`,训练 `100 epoch` 最佳精度权重 `work_dirs/yolov5_s-v61_syncbn_fast_1xb32-100e_cat/best_coco/bbox_mAP_epoch_190.pth` 得出来的精度(详细机器资料可见附录): ```shell Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.936 @@ -382,12 +382,12 @@ Epoch(val) [190][58/58] coco/bbox_mAP: 0.9360 coco/bbox_mAP_50: 1.0000 coco/b ## 7. 推理 -使用最佳的模型进行推理,下面命令中的最佳模型路径是 `./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat/best_coco/bbox_mAP_epoch_190.pth`,请用户自行修改为自己训练的最佳模型路径。 +使用最佳的模型进行推理,下面命令中的最佳模型路径是 `./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-100e_cat/best_coco/bbox_mAP_epoch_190.pth`,请用户自行修改为自己训练的最佳模型路径。 ```shell python demo/image_demo.py ./data/cat/images \ - ./configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-200e_cat.py \ - ./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-200e_cat/best_coco/bbox_mAP_epoch_190.pth \ + ./configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py \ + ./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-100e_cat/best_coco/bbox_mAP_epoch_190.pth \ --out-dir ./data/cat/pred_images ``` From 74ba37208cef3308c0619ad55d476714790d92a0 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 30 Nov 2022 15:39:15 +0800 Subject: [PATCH 65/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index e9fa65e24..d6c96a8fb 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -331,12 +331,7 @@ val_dataloader = dict( ann_file='annotations/trainval.json', data_prefix=dict(img='images/'))) -test_dataloader = dict( - dataset=dict( - metainfo=metainfo, - data_root=data_root, - ann_file='annotations/test.json', - data_prefix=dict(img='images/'))) +test_dataloader = val_dataloader val_evaluator = dict(ann_file=data_root + 'annotations/trainval.json') test_evaluator = val_evaluator From 891583fb1f05ce97097fe58b56d6cca7d82a5aeb Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 30 Nov 2022 16:01:05 +0800 Subject: [PATCH 66/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index d6c96a8fb..2d8bd0d5f 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -349,7 +349,7 @@ default_hooks = dict( ## 6. 训练 -使用下面命令进行启动训练(大约训练 8 个小时): +使用下面命令进行启动训练(训练大约需要 5 个小时): ```shell python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py From f6d23d2e8852b35b19cda7df7554e177613afd6d Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 30 Nov 2022 16:16:06 +0800 Subject: [PATCH 67/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 2d8bd0d5f..88b548eb0 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -313,7 +313,7 @@ train_dataloader = dict( dataset=dict( _delete_=True, type='RepeatDataset', - times=10, # 数据量太少的话,可以使用 RepeatDataset 来增量数据,这里设置 10 是 10 倍 + times=5, # 数据量太少的话,可以使用 RepeatDataset 来增量数据,这里设置 5 是 5 倍 dataset=dict( type=_base_.dataset_type, data_root=data_root, @@ -349,7 +349,7 @@ default_hooks = dict( ## 6. 训练 -使用下面命令进行启动训练(训练大约需要 5 个小时): +使用下面命令进行启动训练(训练大约需要 2.5 个小时): ```shell python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py From 518057c5cb4c6aaf66203a52449d954be4b496e9 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 30 Nov 2022 18:35:22 +0800 Subject: [PATCH 68/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 88b548eb0..19303760d 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -355,39 +355,39 @@ default_hooks = dict( python tools/train.py configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py ``` -下面是 `1 x 3080Ti`、`batch size = 32`,训练 `100 epoch` 最佳精度权重 `work_dirs/yolov5_s-v61_syncbn_fast_1xb32-100e_cat/best_coco/bbox_mAP_epoch_190.pth` 得出来的精度(详细机器资料可见附录): +下面是 `1 x 3080Ti`、`batch size = 32`,训练 `100 epoch` 最佳精度权重 `work_dirs/yolov5_s-v61_syncbn_fast_1xb32-100e_cat/best_coco/bbox_mAP_epoch_100.pth` 得出来的精度(详细机器资料可见附录): ```shell - Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.936 + Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.950 Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 1.000 Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 1.000 Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000 Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000 - Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.936 - Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.859 - Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.952 - Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.952 + Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.950 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.869 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.964 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.964 Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000 Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000 - Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.952 + Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.964 -bbox_mAP_copypaste: 0.936 1.000 1.000 -1.000 -1.000 0.936 -Epoch(val) [190][58/58] coco/bbox_mAP: 0.9360 coco/bbox_mAP_50: 1.0000 coco/bbox_mAP_75: 1.0000 coco/bbox_mAP_s: -1.0000 coco/bbox_mAP_m: -1.0000 coco/bbox_mAP_l: 0.9360 +bbox_mAP_copypaste: 0.950 1.000 1.000 -1.000 -1.000 0.950 +Epoch(val) [100][116/116] coco/bbox_mAP: 0.9500 coco/bbox_mAP_50: 1.0000 coco/bbox_mAP_75: 1.0000 coco/bbox_mAP_s: -1.0000 coco/bbox_mAP_m: -1.0000 coco/bbox_mAP_l: 0.9500 ``` ## 7. 推理 -使用最佳的模型进行推理,下面命令中的最佳模型路径是 `./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-100e_cat/best_coco/bbox_mAP_epoch_190.pth`,请用户自行修改为自己训练的最佳模型路径。 +使用最佳的模型进行推理,下面命令中的最佳模型路径是 `./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-100e_cat/best_coco/bbox_mAP_epoch_100.pth`,请用户自行修改为自己训练的最佳模型路径。 ```shell python demo/image_demo.py ./data/cat/images \ ./configs/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py \ - ./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-100e_cat/best_coco/bbox_mAP_epoch_190.pth \ + ./work_dirs/yolov5_s-v61_syncbn_fast_1xb32-100e_cat/best_coco/bbox_mAP_epoch_100.pth \ --out-dir ./data/cat/pred_images ```
-推理图片 +推理图片
**Tips**:如果推理结果不理想,这里举例 2 种情况: From 0a182b1011e50655350434c8919e22a8ea21ebb1 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 30 Nov 2022 18:37:58 +0800 Subject: [PATCH 69/73] Improve doc --- docs/en/user_guides/custom_dataset.md | 4 ++++ docs/en/user_guides/index.rst | 1 + 2 files changed, 5 insertions(+) create mode 100644 docs/en/user_guides/custom_dataset.md diff --git a/docs/en/user_guides/custom_dataset.md b/docs/en/user_guides/custom_dataset.md new file mode 100644 index 000000000..7a59c14e0 --- /dev/null +++ b/docs/en/user_guides/custom_dataset.md @@ -0,0 +1,4 @@ +# The whole process of custom dataset annotation+training+testing+deployment + +Coming soon. +Please refer to [chinese documentation](../../zh_cn/user_guides/custom_dataset.md) diff --git a/docs/en/user_guides/index.rst b/docs/en/user_guides/index.rst index 830d6d93e..0981ae036 100644 --- a/docs/en/user_guides/index.rst +++ b/docs/en/user_guides/index.rst @@ -24,5 +24,6 @@ Useful Tools .. toctree:: :maxdepth: 1 + custom_dataset.md visualization.md useful_tools.md From 6ccb6e800b51c6a744dd630d7ba4e846eaeecedd Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 30 Nov 2022 18:40:39 +0800 Subject: [PATCH 70/73] Improve doc --- docs/en/user_guides/custom_dataset.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/user_guides/custom_dataset.md b/docs/en/user_guides/custom_dataset.md index 7a59c14e0..205564aaf 100644 --- a/docs/en/user_guides/custom_dataset.md +++ b/docs/en/user_guides/custom_dataset.md @@ -1,4 +1,4 @@ # The whole process of custom dataset annotation+training+testing+deployment -Coming soon. +Coming soon. Please refer to [chinese documentation](../../zh_cn/user_guides/custom_dataset.md) From da304bbff9ed168d0e8858d50ad5c3045ceb407d Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 30 Nov 2022 18:47:23 +0800 Subject: [PATCH 71/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 19303760d..12cfafc48 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -256,7 +256,7 @@ python tools/misc/coco_split.py --json ${COCO label json 路径} \ └── ... ``` -因为是我们自定义的数据集,所以我们需要自己重写 config 中的部分信息,我们在 configs 目录下新建一个新的目录 `custom_dataset`,同时新建 config 文件。 +因为是我们自定义的数据集,所以我们需要自己新建一个 config 并加入需要修改的部分信息,在 configs 目录下新建一个新的目录 `custom_dataset`,同时新建 config 文件。 关于新的 config 的命名: @@ -274,10 +274,10 @@ max_epochs = 100 # 训练的最大 epoch data_root = './data/cat/' # 数据集目录的绝对路径 # 结果保存的路径,可以省略,省略保存的文件名位于 work_dirs 下 config 同名的文件夹中 -# 如果同个 config 只是修改了部分参数,修改这个变量就可以将新的训练文件保存到其他地方 +# 如果某个 config 只是修改了部分参数,修改这个变量就可以将新的训练文件保存到其他地方 work_dir = './work_dirs/yolov5_s-v61_syncbn_fast_1xb32-100e_cat' -# checkpoint 可以指定本地路径或者 URL,设置了 URL 会自动进行下载,因为上面已经下载过,我们这里设置本地路径 +# load_from 可以指定本地路径或者 URL,设置了 URL 会自动进行下载,因为上面已经下载过,我们这里设置本地路径 load_from = './work_dirs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth' train_batch_size_per_gpu = 32 # 根据自己的GPU情况,修改 batch size,YOLOv5-s 默认为 8卡 * 16bs From a7145a81b34cef9491c722dbb449a0a59cb8106d Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 30 Nov 2022 18:51:18 +0800 Subject: [PATCH 72/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 12cfafc48..fb9e69027 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -303,6 +303,8 @@ train_cfg = dict( model = dict( bbox_head=dict( head_module=dict(num_classes=num_classes), + + # loss_cls 会根据 class 的数量动态调整,但是单个 class 的时候,loss_cls 恒为 0 loss_cls=dict(loss_weight=0.5 * (num_classes / 80 * 3 / _base_.num_det_layers)) ) ) From 74b4c0f1f37b08ec244edafce54a26164d88d35b Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 30 Nov 2022 18:54:24 +0800 Subject: [PATCH 73/73] Improve doc --- docs/zh_cn/user_guides/custom_dataset.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index fb9e69027..a96a42c9b 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -256,7 +256,7 @@ python tools/misc/coco_split.py --json ${COCO label json 路径} \ └── ... ``` -因为是我们自定义的数据集,所以我们需要自己新建一个 config 并加入需要修改的部分信息,在 configs 目录下新建一个新的目录 `custom_dataset`,同时新建 config 文件。 +因为是我们自定义的数据集,所以我们需要自己新建一个 config 并加入需要修改的部分信息。 关于新的 config 的命名: @@ -265,7 +265,9 @@ python tools/misc/coco_split.py --json ${COCO label json 路径} \ - 本教程测试的显卡型号是 1 x 3080Ti 12G 显存,电脑内存 32G,可以训练 YOLOv5-s 最大批次是 `batch size = 32`(详细机器资料可见附录); - 训练轮次是 `100 epoch`。 -综上所述:可以将其命名为 `yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py`,并在其里面添加以下内容: +综上所述:可以将其命名为 `yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py`。 + +我们可以在 configs 目录下新建一个新的目录 `custom_dataset`,同时在里面新建该 config 文件,并添加以下内容: ```python _base_ = '../yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py' @@ -304,7 +306,7 @@ model = dict( bbox_head=dict( head_module=dict(num_classes=num_classes), - # loss_cls 会根据 class 的数量动态调整,但是单个 class 的时候,loss_cls 恒为 0 + # loss_cls 会根据 num_classes 动态调整,但是 num_classes = 1 的时候,loss_cls 恒为 0 loss_cls=dict(loss_weight=0.5 * (num_classes / 80 * 3 / _base_.num_det_layers)) ) )