From 789884bf08b9378be7fb27cd71a6391dee9d3aa2 Mon Sep 17 00:00:00 2001 From: Ezra-Yu <18586273+Ezra-Yu@users.noreply.github.com> Date: Tue, 20 Sep 2022 18:09:05 +0800 Subject: [PATCH] [Refactor] Fix visualization tools. (#1045) * update browse dataset * update images * update tools * update grad_cam * update docs * update tools * update docs --- .../tools/visualization/lr_schedule1.png | Bin 30065 -> 0 bytes .../tools/visualization/lr_schedule2.png | Bin 48176 -> 0 bytes docs/en/user_guides/visualization.md | 138 +++++++++--------- .../tools/visualization/lr_schedule1.png | Bin 30065 -> 0 bytes .../tools/visualization/lr_schedule2.png | Bin 48176 -> 0 bytes docs/zh_CN/user_guides/visualization.md | 127 ++++++++-------- tools/visualizations/browse_dataset.py | 28 +++- tools/visualizations/vis_cam.py | 62 ++------ tools/visualizations/vis_scheduler.py | 21 ++- 9 files changed, 183 insertions(+), 193 deletions(-) delete mode 100644 docs/en/_static/image/tools/visualization/lr_schedule1.png delete mode 100644 docs/en/_static/image/tools/visualization/lr_schedule2.png delete mode 100644 docs/zh_CN/_static/image/tools/visualization/lr_schedule1.png delete mode 100644 docs/zh_CN/_static/image/tools/visualization/lr_schedule2.png diff --git a/docs/en/_static/image/tools/visualization/lr_schedule1.png b/docs/en/_static/image/tools/visualization/lr_schedule1.png deleted file mode 100644 index 31fca35bb525280af6f83b755aef3f2495f07ed2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30065 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 JE;56U{Rxs2h5P^j diff --git a/docs/en/user_guides/visualization.md b/docs/en/user_guides/visualization.md index 1eeea642..dbf3e6f5 100644 --- a/docs/en/user_guides/visualization.md +++ b/docs/en/user_guides/visualization.md @@ -1,134 +1,138 @@ -# Visualization Tools (TODO) +# Visualization Tools -- [Pipeline Visualization](#pipeline-visualization) -- [Learning Rate Schedule Visualization](#learning-rate-schedule-visualization) +- [Browse Dataset](#browse-dataset) +- [Parameter Schedule Visualization](#parameter-schedule-visualization) - [Class Activation Map Visualization](#class-activation-map-visualization) - [FAQs](#faqs) -## Pipeline Visualization +## Browse Dataset ```bash -python tools/visualizations/vis_pipeline.py \ +python tools/visualizations/browse_dataset.py \ ${CONFIG_FILE} \ - [--output-dir ${OUTPUT_DIR}] \ - [--phase ${DATASET_PHASE}] \ - [--number ${BUNBER_IMAGES_DISPLAY}] \ - [--skip-type ${SKIP_TRANSFORM_TYPE}] \ - [--mode ${DISPLAY_MODE}] \ - [--show] \ - [--adaptive] \ - [--min-edge-length ${MIN_EDGE_LENGTH}] \ - [--max-edge-length ${MAX_EDGE_LENGTH}] \ - [--bgr2rgb] \ - [--window-size ${WINDOW_SIZE}] \ + [-o, --output-dir ${OUTPUT_DIR}] \ + [-p, --phase ${DATASET_PHASE}] \ + [-n, --show-number ${NUMBER_IMAGES_DISPLAY}] \ + [-i, --show-interval ${SHOW_INTERRVAL}] \ + [-m, --mode ${DISPLAY_MODE}] \ + [-r, --rescale-factor ${RESCALE_FACTOR}] \ + [-c, --channel-order ${CHANNEL_ORDER}] \ [--cfg-options ${CFG_OPTIONS}] ``` **Description of all arguments**: - `config` : The path of a model config file. -- `--output-dir`: The output path for visualized images. If not specified, it will be set to `''`, which means not to save. -- `--phase`: Phase of visualizing dataset,must be one of `[train, val, test]`. If not specified, it will be set to `train`. -- `--number`: The number of samples to visualized. If not specified, display all images in the dataset. -- `--skip-type`: The pipelines to be skipped. If not specified, it will be set to `['ToTensor', 'Normalize', 'ImageToTensor', 'Collect']`. -- `--mode`: The display mode, can be one of `[original, pipeline, concat]`. If not specified, it will be set to `concat`. -- `--show`: If set, display pictures in pop-up windows. -- `--adaptive`: If set, adaptively resize images for better visualization. -- `--min-edge-length`: The minimum edge length, used when `--adaptive` is set. When any side of the picture is smaller than `${MIN_EDGE_LENGTH}`, the picture will be enlarged while keeping the aspect ratio unchanged, and the short side will be aligned to `${MIN_EDGE_LENGTH}`. If not specified, it will be set to 200. -- `--max-edge-length`: The maximum edge length, used when `--adaptive` is set. When any side of the picture is larger than `${MAX_EDGE_LENGTH}`, the picture will be reduced while keeping the aspect ratio unchanged, and the long side will be aligned to `${MAX_EDGE_LENGTH}`. If not specified, it will be set to 1000. -- `--bgr2rgb`: If set, flip the color channel order of images. -- `--window-size`: The shape of the display window. If not specified, it will be set to `12*7`. If used, it must be in the format `'W*H'`. -- `--cfg-options` : Modifications to the configuration file, refer to [Tutorial 1: Learn about Configs](https://mmclassification.readthedocs.io/en/latest/tutorials/config.html). +- `-o, --output-dir`: The output path for visualized images. If not specified, it will be set to `''`, which means not to save. +- **`-p, --phase`**: Phase of visualizing dataset,must be one of `['train', 'val', 'test']`. If not specified, it will be set to `'train'`. +- **`-n, --show-number`**: The number of samples to visualized. If not specified, display all images in the dataset. +- `--show-interval`: The interval of show (s). +- **`-m, --mode`**: The display mode, can be one of `['original', 'transformed', 'concat', 'pipeline']`. If not specified, it will be set to `'transformed'`. +- **`-r, --rescale-factor`**: The image rescale factor, which is useful if the output is too large or too small. +- `-c, --channel-order`: The channel of the showing images, could be "BGR" or "RGB", If not specified, it will be set to 'BGR'. +- `--cfg-options` : Modifications to the configuration file, refer to [Learn about Configs](./config.md). ```{note} +1. The `-m, --mode` is about display mode, display original pictures or transformed pictures or comparison pictures: +- "original" means show images load from disk; +- "transformed" means to show images after transformed; +- "concat" means show images stitched by "original" and "transformed" images; +- "pipeline" means show all the intermediate images throghout the pipeline. -1. If the `--mode` is not specified, it will be set to `concat` as default, get the pictures stitched together by original pictures and transformed pictures; if the `--mode` is set to `original`, get the original pictures; if the `--mode` is set to `transformed`, get the transformed pictures; if the `--mode` is set to `pipeline`, get all the intermediate images through the pipeline. - -2. When `--adaptive` option is set, images that are too large or too small will be automatically adjusted, you can use `--min-edge-length` and `--max-edge-length` to set the adjust size. +2. The `-r, --rescale-factor` option is set when the label information is too large or too small relative to the picture. For example, when visualizing the CIFAR dataset, since the resolution of the image is very small, `--rescale-factor` can be set to 10. ``` **Examples**: -1. In **'original'** mode, visualize 100 original pictures in the `CIFAR100` validation set, then display and save them in the `./tmp` folder: +1. In **'original'** mode: ```shell -python ./tools/visualizations/vis_pipeline.py configs/resnet/resnet50_8xb16_cifar100.py --phase val --output-dir tmp --mode original --number 100 --show --adaptive --bgr2rgb +python ./tools/visualizations/browse_dataset.py ./configs/resnet/resnet101_8xb16_cifar10.py --phase val --output-dir tmp --mode original --show-number 100 --rescale-factor 10 --channel-order RGB ``` -
+- `--phase val`: Visual validation set, can be simplified to `-p val`; +- `--output-dir tmp`: The visualization results are saved in the "tmp" folder, can be simplified to `-o tmp`; +- `--mode original`: Visualize the original image, can be simplified to `-m original`; +- `--show-number 100`: visualize 100 images, can be simplified to `-n 100`; +- `--rescale-factor`: the image is enlarged by 10 times, can be simplified to `-r 10`; +- `--channel-order RGB`: The channel order of the visualized image is "RGB", can be simplified to `-c RGB`. -2. In **'transformed'** mode, visualize all the transformed pictures of the `ImageNet` training set and display them in pop-up windows: +
+ +2. In **'transformed'** mode: ```shell -python ./tools/visualizations/vis_pipeline.py ./configs/resnet/resnet50_8xb32_in1k.py --show --mode transformed +python ./tools/visualizations/browse_dataset.py ./configs/resnet/resnet50_8xb32_in1k.py -n 100 -r 2 ``` -
+
-3. In **'concat'** mode, visualize 10 pairs of origin and transformed images for comparison in the `ImageNet` train set and save them in the `./tmp` folder: +3. In **'concat'** mode: ```shell -python ./tools/visualizations/vis_pipeline.py configs/swin_transformer/swin_base_224_b16x64_300e_imagenet.py --phase train --output-dir tmp --number 10 --adaptive +python ./tools/visualizations/browse_dataset.py configs/swin_transformer/swin-small_16xb64_in1k.py -n 10 -m concat ``` -
+
-4. In **'pipeline'** mode, visualize all the intermediate pictures in the `ImageNet` train set through the pipeline: +4. In **'pipeline'** mode: ```shell -python ./tools/visualizations/vis_pipeline.py configs/swin_transformer/swin_base_224_b16x64_300e_imagenet.py --phase train --adaptive --mode pipeline --show +python ./tools/visualizations/browse_dataset.py configs/swin_transformer/swin-small_16xb64_in1k.py -m pipeline ``` -
+
-## Learning Rate Schedule Visualization +## Parameter Schedule Visualization ```bash -python tools/visualizations/vis_lr.py \ +python tools/visualizations/vis_scheduler.py \ ${CONFIG_FILE} \ - --dataset-size ${DATASET_SIZE} \ - --ngpus ${NUM_GPUs} - --save-path ${SAVE_PATH} \ - --title ${TITLE} \ - --style ${STYLE} \ - --window-size ${WINDOW_SIZE} - --cfg-options + [-p, --parameter ${PARAMETER_NAME}] \ + [-d, --dataset-size ${DATASET_SIZE}] \ + [-n, --ngpus ${NUM_GPUs}] \ + [-s, --save-path ${SAVE_PATH}] \ + [--title ${TITLE}] \ + [--style ${STYLE}] \ + [--window-size ${WINDOW_SIZE}] \ + [--cfg-options] ``` **Description of all arguments**: -- `config` : The path of a model config file. -- `dataset-size` : The size of the datasets. If set,`build_dataset` will be skipped and `${DATASET_SIZE}` will be used as the size. Default to use the function `build_dataset`. -- `ngpus` : The number of GPUs used in training, default to be 1. -- `save-path` : The learning rate curve plot save path, default not to save. -- `title` : Title of figure. If not set, default to be config file name. -- `style` : Style of plt. If not set, default to be `whitegrid`. -- `window-size`: The shape of the display window. If not specified, it will be set to `12*7`. If used, it must be in the format `'W*H'`. -- `cfg-options` : Modifications to the configuration file, refer to [Tutorial 1: Learn about Configs](https://mmclassification.readthedocs.io/en/latest/tutorials/config.html). +- `config`: The path of a model config file. +- **`-p, --parameter`**: The param to visualize its change curve, choose from "lr" and "momentum". Default to use "lr". +- **`-d, --dataset-size`**: The size of the datasets. If set,`build_dataset` will be skipped and `${DATASET_SIZE}` will be used as the size. Default to use the function `build_dataset`. +- **`-n, --ngpus`**: The number of GPUs used in training, default to be 1. +- **`-s, --save-path`**: The learning rate curve plot save path, default not to save. +- `--title`: Title of figure. If not set, default to be config file name. +- `--style`: Style of plt. If not set, default to be `whitegrid`. +- `--window-size`: The shape of the display window. If not specified, it will be set to `12*7`. If used, it must be in the format `'W*H'`. +- `--cfg-options`: Modifications to the configuration file, refer to [Learn about Configs](./config.md). ```{note} -Loading annotations maybe consume much time, you can directly specify the size of the dataset with `dataset-size` to save time. +Loading annotations maybe consume much time, you can directly specify the size of the dataset with `-d, dataset-size` to save time. ``` **Examples**: ```bash -python tools/visualizations/vis_lr.py configs/resnet/resnet50_b16x8_cifar100.py +python tools/visualizations/vis_scheduler.py configs/resnet/resnet50_b16x8_cifar100.py ``` -
+
When using ImageNet, directly specify the size of ImageNet, as below: ```bash -python tools/visualizations/vis_lr.py configs/repvgg/repvgg-B3g4_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py --dataset-size 1281167 --ngpus 4 --save-path ./repvgg-B3g4_4xb64-lr.jpg +python tools/visualizations/vis_scheduler.py configs/repvgg/repvgg-B3g4_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py --dataset-size 1281167 --ngpus 4 --save-path ./repvgg-B3g4_4xb64-lr.jpg ``` -
+
## Class Activation Map Visualization @@ -180,7 +184,7 @@ python tools/visualizations/vis_cam.py \ - `--aug_smooth` : Whether to use TTA(Test Time Augment) to get CAM. - `--eigen_smooth` : Whether to use the principal component to reduce noise. - `--device` : The computing device used. Default to 'cpu'. -- `--cfg-options` : Modifications to the configuration file, refer to [Tutorial 1: Learn about Configs](https://mmclassification.readthedocs.io/en/latest/tutorials/config.html). +- `--cfg-options` : Modifications to the configuration file, refer to [Learn about Configs](./config.md). ```{note} The argument `--preview-model` can view all network layers names in the given model. It will be helpful if you know nothing about the model layers when setting `--target-layers`. @@ -237,7 +241,7 @@ For example, the `backbone.layer4[-1]` is the same as `backbone.layer4.2` since ```shell python tools/visualizations/vis_cam.py \ demo/dog.jpg \ - configs/mobilenet_v3/mobilenet-v3-large_8xb32_in1k.py \ + configs/mobilenet_v3/mobilenet-v3-large_8xb128_in1k.py \ https://download.openmmlab.com/mmclassification/v0/mobilenet_v3/convert/mobilenet_v3_large-3ea3c186.pth \ --target-layers 'backbone.layer16' \ --method LayerCAM \ diff --git a/docs/zh_CN/_static/image/tools/visualization/lr_schedule1.png b/docs/zh_CN/_static/image/tools/visualization/lr_schedule1.png deleted file mode 100644 index 31fca35bb525280af6f83b755aef3f2495f07ed2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30065 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 JE;56U{Rxs2h5P^j diff --git a/docs/zh_CN/user_guides/visualization.md b/docs/zh_CN/user_guides/visualization.md index 78756525..1610f82a 100644 --- a/docs/zh_CN/user_guides/visualization.md +++ b/docs/zh_CN/user_guides/visualization.md @@ -1,136 +1,141 @@ -# 可视化工具(待更新) +# 可视化工具 -- [数据流水线可视化](#数据流水线可视化) -- [学习率策略可视化](#学习率策略可视化) +- [浏览数据集](#浏览数据集) +- [优化器参数策略可视化](#优化器参数策略可视化) - [类别激活图可视化](#类别激活图可视化) - [常见问题](#常见问题) -## 数据流水线可视化 +## 浏览数据集 ```bash -python tools/visualizations/vis_pipeline.py \ +python tools/visualizations/browse_dataset.py \ ${CONFIG_FILE} \ - [--output-dir ${OUTPUT_DIR}] \ - [--phase ${DATASET_PHASE}] \ - [--number ${BUNBER_IMAGES_DISPLAY}] \ - [--skip-type ${SKIP_TRANSFORM_TYPE}] \ - [--mode ${DISPLAY_MODE}] \ - [--show] \ - [--adaptive] \ - [--min-edge-length ${MIN_EDGE_LENGTH}] \ - [--max-edge-length ${MAX_EDGE_LENGTH}] \ - [--bgr2rgb] \ - [--window-size ${WINDOW_SIZE}] \ + [-o, --output-dir ${OUTPUT_DIR}] \ + [-p, --phase ${DATASET_PHASE}] \ + [-n, --show-number ${NUMBER_IMAGES_DISPLAY}] \ + [-i, --show-interval ${SHOW_INTERRVAL}] \ + [-m, --mode ${DISPLAY_MODE}] \ + [-r, --rescale-factor ${RESCALE_FACTOR}] \ + [-c, --channel-order ${CHANNEL_ORDER}] \ [--cfg-options ${CFG_OPTIONS}] ``` **所有参数的说明**: - `config` : 模型配置文件的路径。 -- `--output-dir`: 保存图片文件夹,如果没有指定,默认为 `''`,表示不保存。 -- `--phase`: 可视化数据集的阶段,只能为 `[train, val, test]` 之一,默认为 `train`。 -- `--number`: 可视化样本数量。如果没有指定,默认展示数据集的所有图片。 -- `--skip-type`: 预设跳过的数据流水线过程。如果没有指定,默认为 `['ToTensor', 'Normalize', 'ImageToTensor', 'Collect']`。 -- `--mode`: 可视化的模式,只能为 `[original, transformed, concat, pipeline]` 之一,如果没有指定,默认为 `concat`。 -- `--show`: 将可视化图片以弹窗形式展示。 -- `--adaptive`: 自动调节可视化图片的大小。 -- `--min-edge-length`: 最短边长度,当使用了 `--adaptive` 时有效。 当图片任意边小于 `${MIN_EDGE_LENGTH}` 时,会保持长宽比不变放大图片,短边对齐至 `${MIN_EDGE_LENGTH}`,默认为200。 -- `--max-edge-length`: 最长边长度,当使用了 `--adaptive` 时有效。 当图片任意边大于 `${MAX_EDGE_LENGTH}` 时,会保持长宽比不变缩小图片,短边对齐至 `${MAX_EDGE_LENGTH}`,默认为1000。 -- `--bgr2rgb`: 将图片的颜色通道翻转。 -- `--window-size`: 可视化窗口大小,如果没有指定,默认为 `12*7`。如果需要指定,按照格式 `'W*H'`。 -- `--cfg-options` : 对配置文件的修改,参考[教程 1:如何编写配置文件](https://mmclassification.readthedocs.io/zh_CN/latest/tutorials/config.html)。 +- `-o, --output-dir`: 保存图片文件夹,如果没有指定,默认为 `''`,表示不保存。 +- **`-p, --phase`**: 可视化数据集的阶段,只能为 `['train', 'val', 'test']` 之一,默认为 `'train'`。 +- **`-n, --show-number`**: 可视化样本数量。如果没有指定,默认展示数据集的所有图片。 +- `-i, --show-interval`: 浏览时,每张图片的停留间隔,单位为秒。 +- **`-m, --mode`**: 可视化的模式,只能为 `['original', 'transformed', 'concat', 'pipeline']` 之一。 默认为`'transformed'`. +- **`-r, --rescale-factor`**: 对可视化图片的放缩倍数,在图片过大或过小时设置。 +- `-c, --channel-order`: 图片的通道顺序,为 `['BGR', 'RGB']` 之一,默认为 `'BGR'`。 +- `--cfg-options` : 对配置文件的修改,参考[学习配置文件](./config.md)。 ```{note} -1. 如果不指定 `--mode`,默认设置为 `concat`,获取原始图片和预处理后图片拼接的图片;如果 `--mode` 设置为 `original`,则获取原始图片;如果 `--mode` 设置为 `transformed`,则获取预处理后的图片;如果 `--mode` 设置为 `pipeline`,则获得数据流水线所有中间过程图片。 +1. `-m, --mode` 用于设置可视化的模式,默认设置为 'transformed'。 +- 如果 `--mode` 设置为 'original',则获取原始图片; +- 如果 `--mode` 设置为 'transformed',则获取预处理后的图片; +- 如果 `--mode` 设置为 'concat',获取原始图片和预处理后图片拼接的图片; +- 如果 `--mode` 设置为 'pipeline',则获得数据流水线所有中间过程图片。 -2. 当指定了 `--adaptive` 选项时,会自动的调整尺寸过大和过小的图片,你可以通过设定 `--min-edge-length` 与 `--max-edge-length` 来指定自动调整的图片尺寸。 +2. `-r, --rescale-factor` 在数据集中图片的分辨率过大或者过小时设置。比如在可视化 CIFAR 数据集时,由于图片的分辨率非常小,可将 `-r, --rescale-factor` 设置为 10。 ``` **示例**: -1. **'original'** 模式,可视化 `CIFAR100` 验证集中的100张原始图片,显示并保存在 `./tmp` 文件夹下: +1. **'original'** 模式 : ```shell -python ./tools/visualizations/vis_pipeline.py configs/resnet/resnet50_8xb16_cifar100.py --phase val --output-dir tmp --mode original --number 100 --show --adaptive --bgr2rgb +python ./tools/visualizations/browse_dataset.py ./configs/resnet/resnet101_8xb16_cifar10.py --phase val --output-dir tmp --mode original --show-number 100 --rescale-factor 10 --channel-order RGB ``` -
+- `--phase val`: 可视化验证集, 可简化为 `-p val`; +- `--output-dir tmp`: 可视化结果保存在 "tmp" 文件夹, 可简化为 `-o tmp`; +- `--mode original`: 可视化原图, 可简化为 `-m original`; +- `--show-number 100`: 可视化100张图,可简化为 `-n 100`; +- `--rescale-factor`: 图像放大10倍,可简化为 `-r 10`; +- `--channel-order RGB`: 可视化图像的通道顺序为 "RGB", 可简化为 `-c RGB`。 -2. **'transformed'** 模式,可视化 `ImageNet` 训练集的所有经过预处理的图片,并以弹窗形式显示: +
+ +2. **'transformed'** 模式 : ```shell -python ./tools/visualizations/vis_pipeline.py ./configs/resnet/resnet50_8xb32_in1k.py --show --mode transformed +python ./tools/visualizations/browse_dataset.py ./configs/resnet/resnet50_8xb32_in1k.py -n 100 -r 2 ``` -
+
-3. **'concat'** 模式,可视化 `ImageNet` 训练集的10张原始图片与预处理后图片对比图,保存在 `./tmp` 文件夹下: +3. **'concat'** 模式 : ```shell -python ./tools/visualizations/vis_pipeline.py configs/swin_transformer/swin_base_224_b16x64_300e_imagenet.py --phase train --output-dir tmp --number 10 --adaptive +python ./tools/visualizations/browse_dataset.py configs/swin_transformer/swin-small_16xb64_in1k.py -n 10 -m concat ``` -
+
-4. **'pipeline'** 模式,可视化 `ImageNet` 训练集经过数据流水线的过程图像: +4. **'pipeline'** 模式 : ```shell -python ./tools/visualizations/vis_pipeline.py configs/swin_transformer/swin_base_224_b16x64_300e_imagenet.py --phase train --adaptive --mode pipeline --show +python ./tools/visualizations/browse_dataset.py configs/swin_transformer/swin-small_16xb64_in1k.py -m pipeline ``` -
+
-## 学习率策略可视化 +## 优化器参数策略可视化 ```bash -python tools/visualizations/vis_lr.py \ +python tools/visualizations/vis_scheduler.py \ ${CONFIG_FILE} \ - [--dataset-size ${Dataset_Size}] \ - [--ngpus ${NUM_GPUs}] \ - [--save-path ${SAVE_PATH}] \ + [-p, --parammeter ${PARAMETER_NAME}] \ + [-d, --dataset-size ${DATASET_SIZE}] \ + [-n, --ngpus ${NUM_GPUs}] \ + [-s, --save-path ${SAVE_PATH}] \ [--title ${TITLE}] \ [--style ${STYLE}] \ [--window-size ${WINDOW_SIZE}] \ - [--cfg-options ${CFG_OPTIONS}] \ + [--cfg-options] ``` **所有参数的说明**: - `config` : 模型配置文件的路径。 -- `--dataset-size` : 数据集的大小。如果指定,`build_dataset` 将被跳过并使用这个大小作为数据集大小,默认使用 `build_dataset` 所得数据集的大小。 -- `--ngpus` : 使用 GPU 的数量。 -- `--save-path` : 保存的可视化图片的路径,默认不保存。 -- `--title` : 可视化图片的标题,默认为配置文件名。 -- `--style` : 可视化图片的风格,默认为 `whitegrid`。 +- **`-p, parameter`**: 可视化参数名,只能为 `["lr", "momentum"]` 之一, 默认为 `"lr"`. +- **`-d, --dataset-size`**: 数据集的大小。如果指定,`build_dataset` 将被跳过并使用这个大小作为数据集大小,默认使用 `build_dataset` 所得数据集的大小。 +- **`-n, --ngpus`**: 使用 GPU 的数量, 默认为1。 +- **`-s, --save-path`**: 保存的可视化图片的路径,默认不保存。 +- `--title`: 可视化图片的标题,默认为配置文件名。 +- `--style`: 可视化图片的风格,默认为 `whitegrid`。 - `--window-size`: 可视化窗口大小,如果没有指定,默认为 `12*7`。如果需要指定,按照格式 `'W*H'`。 -- `--cfg-options` : 对配置文件的修改,参考[教程 1:如何编写配置文件](https://mmclassification.readthedocs.io/zh_CN/latest/tutorials/config.html)。 +- `--cfg-options`: 对配置文件的修改,参考[学习配置文件](./config.md)。 ```{note} -部分数据集在解析标注阶段比较耗时,可直接将 `dataset-size` 指定数据集的大小,以节约时间。 +部分数据集在解析标注阶段比较耗时,可直接将 `-d, dataset-size` 指定数据集的大小,以节约时间。 ``` **示例**: ```bash -python tools/visualizations/vis_lr.py configs/resnet/resnet50_b16x8_cifar100.py +python tools/visualizations/vis_scheduler.py configs/resnet/resnet50_b16x8_cifar100.py ``` -
+
当数据集为 ImageNet 时,通过直接指定数据集大小来节约时间,并保存图片: ```bash -python tools/visualizations/vis_lr.py configs/repvgg/repvgg-B3g4_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py --dataset-size 1281167 --ngpus 4 --save-path ./repvgg-B3g4_4xb64-lr.jpg +python tools/visualizations/vis_scheduler.py configs/repvgg/repvgg-B3g4_4xb64-autoaug-lbs-mixup-coslr-200e_in1k.py --dataset-size 1281167 --ngpus 4 --save-path ./repvgg-B3g4_4xb64-lr.jpg ``` -
+
## 类别激活图可视化 @@ -182,7 +187,7 @@ python tools/visualizations/vis_cam.py \ - `--num-extra-tokens`: `ViT` 类网络的额外的 tokens 通道数,默认使用主干网络的 `num_extra_tokens`。 - `--aug-smooth`:是否使用测试时增强 - `--device`:使用的计算设备,如果不设置,默认为'cpu'。 -- `--cfg-options`:对配置文件的修改,参考[教程 1:如何编写配置文件](https://mmclassification.readthedocs.io/zh_CN/latest/tutorials/config.html)。 +- `--cfg-options`:对配置文件的修改,参考[学习配置文件](./config.md)。 ```{note} 在指定 `--target-layers` 时,如果不知道模型有哪些网络层,可使用命令行添加 `--preview-model` 查看所有网络层名称; @@ -237,7 +242,7 @@ python tools/visualizations/vis_cam.py \ ```shell python tools/visualizations/vis_cam.py \ demo/dog.jpg \ - configs/mobilenet_v3/mobilenet-v3-large_8xb32_in1k.py \ + configs/mobilenet_v3/mobilenet-v3-large_8xb128_in1k.py \ https://download.openmmlab.com/mmclassification/v0/mobilenet_v3/convert/mobilenet_v3_large-3ea3c186.pth \ --target-layers 'backbone.layer16' \ --method LayerCAM \ diff --git a/tools/visualizations/browse_dataset.py b/tools/visualizations/browse_dataset.py index 6af99368..99245e7a 100644 --- a/tools/visualizations/browse_dataset.py +++ b/tools/visualizations/browse_dataset.py @@ -8,10 +8,10 @@ import mmcv import numpy as np from mmengine.config import Config, DictAction from mmengine.dataset import Compose +from mmengine.utils import ProgressBar from mmengine.visualization import Visualizer from mmcls.datasets.builder import build_dataset -from mmcls.registry import VISUALIZERS from mmcls.utils import register_all_modules from mmcls.visualization import ClsVisualizer from mmcls.visualization.cls_visualizer import _get_adaptive_scale @@ -22,12 +22,14 @@ def parse_args(): parser.add_argument('config', help='train config file path') parser.add_argument( '--output-dir', + '-o', default=None, type=str, help='If there is no display interface, you can save it.') parser.add_argument('--not-show', default=False, action='store_true') parser.add_argument( '--phase', + '-p', default='train', type=str, choices=['train', 'test', 'val'], @@ -35,6 +37,7 @@ def parse_args(): ' Defaults to "train".') parser.add_argument( '--show-number', + '-n', type=int, default=sys.maxsize, help='number of images selected to visualize, must bigger than 0. if ' @@ -42,11 +45,13 @@ def parse_args(): 'dataset; default "sys.maxsize", show all images in dataset') parser.add_argument( '--show-interval', + '-i', type=float, default=2, help='the interval of show (s)') parser.add_argument( '--mode', + '-m', default='transformed', type=str, choices=['original', 'transformed', 'concat', 'pipeline'], @@ -58,9 +63,17 @@ def parse_args(): 'Defaults to "transformed".') parser.add_argument( '--rescale-factor', + '-r', type=float, help='image rescale factor, which is useful if the output is too ' 'large or too small.') + parser.add_argument( + '--channel-order', + '-c', + default='BGR', + choices=['BGR', 'RGB'], + help='The channel order of the showing images, could be "BGR" ' + 'or "RGB", Defaults to "BGR".') parser.add_argument( '--cfg-options', nargs='+', @@ -168,12 +181,13 @@ def main(): intermediate_imgs) # init visualizer - visualizer: ClsVisualizer = VISUALIZERS.build(cfg.visualizer) + cfg.visualizer.pop('type') + visualizer = ClsVisualizer(**cfg.visualizer) visualizer.dataset_meta = dataset.metainfo # init visualization image number display_number = min(args.show_number, len(dataset)) - progress_bar = mmcv.ProgressBar(display_number) + progress_bar = ProgressBar(display_number) for i, item in zip(range(display_number), dataset): rescale_factor = args.rescale_factor @@ -195,11 +209,11 @@ def main(): intermediate_imgs.clear() - data_sample = item['data_sample'].numpy() + data_sample = item['data_samples'].numpy() # get filename from dataset or just use index as filename - if hasattr(item['data_sample'], 'img_path'): - filename = osp.basename(item['data_sample'].img_path) + if hasattr(item['data_samples'], 'img_path'): + filename = osp.basename(item['data_samples'].img_path) else: # some dataset have not image path filename = f'{i}.jpg' @@ -209,7 +223,7 @@ def main(): visualizer.add_datasample( filename, - image[..., ::-1], + image if args.channel_order == 'RGB' else image[..., ::-1], data_sample, rescale_factor=rescale_factor, show=not args.not_show, diff --git a/tools/visualizations/vis_cam.py b/tools/visualizations/vis_cam.py index a1fcadac..83241cae 100644 --- a/tools/visualizations/vis_cam.py +++ b/tools/visualizations/vis_cam.py @@ -8,13 +8,14 @@ from pathlib import Path import mmcv import numpy as np -from mmcv import Config, DictAction -from mmcv.utils import to_2tuple +from mmcv.transforms import Compose +from mmengine.config import Config, DictAction +from mmengine.utils import to_2tuple from torch.nn import BatchNorm1d, BatchNorm2d, GroupNorm, LayerNorm from mmcls import digit_version from mmcls.apis import init_model -from mmcls.datasets.pipelines import Compose +from mmcls.utils import register_all_modules try: from pytorch_grad_cam import (EigenCAM, EigenGradCAM, GradCAM, @@ -26,9 +27,6 @@ except ImportError: raise ImportError('Please run `pip install "grad-cam>=1.3.6"` to install ' '3rd party package pytorch_grad_cam.') -# set of transforms, which just change data format, not change the pictures -FORMAT_TRANSFORMS_SET = {'ToTensor', 'Normalize', 'ImageToTensor', 'Collect'} - # Supported grad-cam type map METHOD_MAP = { 'gradcam': GradCAM, @@ -159,56 +157,16 @@ def build_reshape_transform(model, args): return _reshape_transform -def apply_transforms(img_path, pipeline_cfg): - """Apply transforms pipeline and get both formatted data and the image - without formatting.""" - data = dict(img_info=dict(filename=img_path), img_prefix=None) - - def split_pipeline_cfg(pipeline_cfg): - """to split the transfoms into image_transforms and - format_transforms.""" - image_transforms_cfg, format_transforms_cfg = [], [] - if pipeline_cfg[0]['type'] != 'LoadImageFromFile': - pipeline_cfg.insert(0, dict(type='LoadImageFromFile')) - for transform in pipeline_cfg: - if transform['type'] in FORMAT_TRANSFORMS_SET: - format_transforms_cfg.append(transform) - else: - image_transforms_cfg.append(transform) - return image_transforms_cfg, format_transforms_cfg - - image_transforms, format_transforms = split_pipeline_cfg(pipeline_cfg) - image_transforms = Compose(image_transforms) - format_transforms = Compose(format_transforms) - - intermediate_data = image_transforms(data) - inference_img = copy.deepcopy(intermediate_data['img']) - format_data = format_transforms(intermediate_data) - - return format_data, inference_img - - -class MMActivationsAndGradients(ActivationsAndGradients): - """Activations and gradients manager for mmcls models.""" - - def __call__(self, x): - self.gradients = [] - self.activations = [] - return self.model( - x, return_loss=False, softmax=False, post_process=False) - - def init_cam(method, model, target_layers, use_cuda, reshape_transform): """Construct the CAM object once, In order to be compatible with mmcls, here we modify the ActivationsAndGradients object.""" - GradCAM_Class = METHOD_MAP[method.lower()] cam = GradCAM_Class( model=model, target_layers=target_layers, use_cuda=use_cuda) # Release the original hooks in ActivationsAndGradients to use - # MMActivationsAndGradients. + # ActivationsAndGradients. cam.activations_and_grads.release() - cam.activations_and_grads = MMActivationsAndGradients( + cam.activations_and_grads = ActivationsAndGradients( cam.model, cam.target_layers, reshape_transform) return cam @@ -306,6 +264,7 @@ def main(): if args.cfg_options is not None: cfg.merge_from_dict(args.cfg_options) + register_all_modules() # build the model from a config file and a checkpoint file model = init_model(cfg, args.checkpoint, device=args.device) if args.preview_model: @@ -314,7 +273,10 @@ def main(): return # apply transform and perpare data - data, src_img = apply_transforms(args.img, cfg.data.test.pipeline) + transforms = Compose(cfg.test_dataloader.dataset.pipeline) + data = transforms({'img_path': args.img}) + src_img = copy.deepcopy(data['inputs']).numpy().transpose(1, 2, 0) + data = model.data_preprocessor(data, False) # build target layers if args.target_layers: @@ -344,7 +306,7 @@ def main(): # calculate cam grads and show|save the visualization image grayscale_cam = cam( - data['img'].unsqueeze(0), + data['inputs'].unsqueeze(0), targets, eigen_smooth=args.eigen_smooth, aug_smooth=args.aug_smooth) diff --git a/tools/visualizations/vis_scheduler.py b/tools/visualizations/vis_scheduler.py index 0375d616..87d076dc 100644 --- a/tools/visualizations/vis_scheduler.py +++ b/tools/visualizations/vis_scheduler.py @@ -76,22 +76,30 @@ def parse_args(): description='Visualize a Dataset Pipeline') parser.add_argument('config', help='config file path') parser.add_argument( - '--param', + '-p', + '--parameter', type=str, default='lr', choices=['lr', 'momentum'], - help='The param to visualize its change curve, choose from' + help='The parameter to visualize its change curve, choose from' '"lr" and "momentum". Defaults to "lr".') parser.add_argument( + '-d', '--dataset-size', type=int, help='The size of the dataset. If specify, `build_dataset` will ' 'be skipped and use this size as the dataset size.') parser.add_argument( + '-n', '--ngpus', type=int, default=1, help='The number of GPUs used in training.') + parser.add_argument( + '-s', + '--save-path', + type=Path, + help='The learning rate curve plot save path') parser.add_argument( '--log-level', default='WARNING', @@ -100,10 +108,6 @@ def parse_args(): parser.add_argument('--title', type=str, help='title of figure') parser.add_argument( '--style', type=str, default='whitegrid', help='style of plt') - parser.add_argument( - '--save-path', - type=Path, - help='The learning rate curve plot save path') parser.add_argument('--not-show', default=False, action='store_true') parser.add_argument( '--window-size', @@ -166,6 +170,7 @@ def simulate_train(data_loader, cfg, by_epoch): param_record_hook = ParamRecordHook(by_epoch=by_epoch) default_hooks = dict( param_scheduler=cfg.default_hooks['param_scheduler'], + runtime_info=None, timer=None, logger=None, checkpoint=None, @@ -246,12 +251,12 @@ def main(): # simulation training process lr_list, momentum_list = simulate_train(data_loader, cfg, by_epoch) - if args.param == 'lr': + if args.parameter == 'lr': param_list = lr_list else: param_list = momentum_list - param_name = 'Learning Rate' if args.param == 'lr' else 'Momentum' + param_name = 'Learning Rate' if args.parameter == 'lr' else 'Momentum' plot_curve(param_list, args, param_name, len(data_loader), by_epoch) if args.save_path: