From d08c2a148a23c2b079bd84e41ce0b284f8e44960 Mon Sep 17 00:00:00 2001 From: Ezra-Yu <1105212286@qq.com> Date: Fri, 4 Mar 2022 14:40:02 +0800 Subject: [PATCH] [Enhance] Enhance vis-pipeline tool. (#604) * enhance vis-pipeline add intermediate imgs * enhance vis-pipeline add intermediate imgs * improve code of vi-pipeline * modify docs for vis-pipeline * Use `mmcv.utils.digit_version` instead of `distutils` * add size info in the bottom * preform adaptive-resize in before concat * add warning info * fix docs * fix lint * fix comment * fix docs Co-authored-by: mzr1996 --- .../tools/visualization/pipeline-concat.jpg | Bin 45505 -> 0 bytes .../tools/visualization/pipeline-original.jpg | Bin 9414 -> 0 bytes .../tools/visualization/pipeline-pipeline.jpg | Bin 19054 -> 0 bytes docs/en/tools/miscellaneous.md | 2 +- docs/en/tools/visualization.md | 77 ++++--- .../tools/visualization/pipeline-concat.jpg | Bin 45505 -> 0 bytes .../tools/visualization/pipeline-original.jpg | Bin 9414 -> 0 bytes .../tools/visualization/pipeline-pipeline.jpg | Bin 19054 -> 0 bytes docs/zh_CN/tools/visualization.md | 103 +++++---- tools/visualizations/vis_pipeline.py | 203 ++++++++++++------ 10 files changed, 241 insertions(+), 144 deletions(-) delete mode 100644 docs/en/_static/image/tools/visualization/pipeline-concat.jpg delete mode 100644 docs/en/_static/image/tools/visualization/pipeline-original.jpg delete mode 100644 docs/en/_static/image/tools/visualization/pipeline-pipeline.jpg delete mode 100644 docs/zh_CN/_static/image/tools/visualization/pipeline-concat.jpg delete mode 100644 docs/zh_CN/_static/image/tools/visualization/pipeline-original.jpg delete mode 100644 docs/zh_CN/_static/image/tools/visualization/pipeline-pipeline.jpg diff --git a/docs/en/_static/image/tools/visualization/pipeline-concat.jpg b/docs/en/_static/image/tools/visualization/pipeline-concat.jpg deleted file mode 100644 index e5e69974b839849b5cd0844b06cbfc90f8380f6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45505 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 diff --git a/docs/en/_static/image/tools/visualization/pipeline-original.jpg b/docs/en/_static/image/tools/visualization/pipeline-original.jpg deleted file mode 100644 index fa23a029ce8fddc3efa4405d354a612981d8308b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9414 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 WZr4)FnmVWHfKjn=|GE}+{C@%2J?EYP diff --git a/docs/en/_static/image/tools/visualization/pipeline-pipeline.jpg b/docs/en/_static/image/tools/visualization/pipeline-pipeline.jpg deleted file mode 100644 index aa7df13b11150ec1428ce37955e3097e66d3eb4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19054 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 P0Du9GJ5tx^$5H>;&>U14 diff --git a/docs/en/tools/miscellaneous.md b/docs/en/tools/miscellaneous.md index 0463b5259b8..4e66d91a5a2 100644 --- a/docs/en/tools/miscellaneous.md +++ b/docs/en/tools/miscellaneous.md @@ -1,4 +1,4 @@ -# MISCELLANEOUS +# Miscellaneous diff --git a/docs/en/tools/visualization.md b/docs/en/tools/visualization.md index a519b972ee6..f224fe68eb0 100644 --- a/docs/en/tools/visualization.md +++ b/docs/en/tools/visualization.md @@ -2,11 +2,10 @@ -- [Visualization](#visualization) - - [Pipeline Visualization](#pipeline-visualization) - - [Learning Rate Schedule Visualization](#learning-rate-schedule-visualization) - - [Class Activation Map Visualization](#class-activation-map-visualization) - - [FAQs](#faqs) +- [Pipeline Visualization](#pipeline-visualization) +- [Learning Rate Schedule Visualization](#learning-rate-schedule-visualization) +- [Class Activation Map Visualization](#class-activation-map-visualization) +- [FAQs](#faqs) ## Pipeline Visualization @@ -14,17 +13,18 @@ ```bash python tools/visualizations/vis_pipeline.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} + [--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}] \ + [--cfg-options ${CFG_OPTIONS}] ``` **Description of all arguments**: @@ -32,48 +32,57 @@ python tools/visualizations/vis_pipeline.py \ - `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 visualize. If not specified, display all images in the dataset. +- `--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, automatically adjust the size of the visualization images. +- `--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). ```{note} -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 `pipeline`, get the transformed pictures. +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. ``` **Examples**: -1. Visualize all the transformed pictures of the `ImageNet` training set and display them in pop-up windows: +1. In **'original'** mode, visualize 100 original pictures in the `CIFAR100` validation set, then display and save them in the `./tmp` folder: - ```shell - python ./tools/visualizations/vis_pipeline.py ./configs/resnet/resnet50_8xb32_in1k.py --show --mode pipeline - ``` + ```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 + ``` -
+
-2. Visualize 10 comparison pictures in the `ImageNet` train set and save them in the `./tmp` folder: +2. In **'transformed'** mode, visualize all the transformed pictures of the `ImageNet` training set and display them in pop-up windows: - ```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 - ``` + ```shell + python ./tools/visualizations/vis_pipeline.py ./configs/resnet/resnet50_8xb32_in1k.py --show --mode transformed + ``` -
+
-3. Visualize 100 original pictures in the `CIFAR100` validation set, then display and save them in the `./tmp` folder: +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: - ```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 - ``` + ```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 + ``` + +
+ +4. In **'pipeline'** mode, visualize all the intermediate pictures in the `ImageNet` train set through the pipeline: + + ```shell + python ./tools/visualizations/vis_pipeline.py configs/swin_transformer/swin_base_224_b16x64_300e_imagenet.py --phase train --adaptive --mode pipeline --show + ``` -
+
## Learning Rate Schedule Visualization diff --git a/docs/zh_CN/_static/image/tools/visualization/pipeline-concat.jpg b/docs/zh_CN/_static/image/tools/visualization/pipeline-concat.jpg deleted file mode 100644 index e5e69974b839849b5cd0844b06cbfc90f8380f6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45505 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 diff --git a/docs/zh_CN/_static/image/tools/visualization/pipeline-original.jpg b/docs/zh_CN/_static/image/tools/visualization/pipeline-original.jpg deleted file mode 100644 index fa23a029ce8fddc3efa4405d354a612981d8308b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9414 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 WZr4)FnmVWHfKjn=|GE}+{C@%2J?EYP diff --git a/docs/zh_CN/_static/image/tools/visualization/pipeline-pipeline.jpg b/docs/zh_CN/_static/image/tools/visualization/pipeline-pipeline.jpg deleted file mode 100644 index aa7df13b11150ec1428ce37955e3097e66d3eb4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19054 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 P0Du9GJ5tx^$5H>;&>U14 diff --git a/docs/zh_CN/tools/visualization.md b/docs/zh_CN/tools/visualization.md index b236da6b794..9caaf24ae2e 100644 --- a/docs/zh_CN/tools/visualization.md +++ b/docs/zh_CN/tools/visualization.md @@ -2,11 +2,10 @@ -- [可视化](#可视化) - - [数据流水线可视化](#数据流水线可视化) - - [学习率策略可视化](#学习率策略可视化) - - [类别激活图可视化](#类别激活图可视化) - - [常见问题](#常见问题) +- [数据流水线可视化](#数据流水线可视化) +- [学习率策略可视化](#学习率策略可视化) +- [类别激活图可视化](#类别激活图可视化) +- [常见问题](#常见问题) @@ -15,17 +14,18 @@ ```bash python tools/visualizations/vis_pipeline.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} + [--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}] \ + [--cfg-options ${CFG_OPTIONS}] ``` **所有参数的说明**: @@ -35,71 +35,80 @@ python tools/visualizations/vis_pipeline.py \ - `--phase`: 可视化数据集的阶段,只能为 `[train, val, test]` 之一,默认为 `train`。 - `--number`: 可视化样本数量。如果没有指定,默认展示数据集的所有图片。 - `--skip-type`: 预设跳过的数据流水线过程。如果没有指定,默认为 `['ToTensor', 'Normalize', 'ImageToTensor', 'Collect']`。 -- `--mode`: 可视化的模式,只能为 `[original, pipeline, concat]` 之一,如果没有指定,默认为 `concat`。 +- `--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)。 ```{note} -1. 如果不指定 `--mode`,默认设置为 `concat`,获取原始图片和预处理后图片拼接的图片;如果 `--mode` 设置为 `original`,则获取原始图片; 如果 `--mode` 设置为 `pipeline`,则获取预处理后的图片。 +1. 如果不指定 `--mode`,默认设置为 `concat`,获取原始图片和预处理后图片拼接的图片;如果 `--mode` 设置为 `original`,则获取原始图片;如果 `--mode` 设置为 `transformed`,则获取预处理后的图片;如果 `--mode` 设置为 `pipeline`,则获得数据流水线所有中间过程图片。 2. 当指定了 `--adaptive` 选项时,会自动的调整尺寸过大和过小的图片,你可以通过设定 `--min-edge-length` 与 `--max-edge-length` 来指定自动调整的图片尺寸。 ``` **示例**: -1. 可视化 `ImageNet` 训练集的所有经过预处理的图片,并以弹窗形式显示: +1. **'original'** 模式,可视化 `CIFAR100` 验证集中的100张原始图片,显示并保存在 `./tmp` 文件夹下: - ```shell - python ./tools/visualizations/vis_pipeline.py ./configs/resnet/resnet50_8xb32_in1k.py --show --mode pipeline - ``` + ```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 + ``` -
+
-2. 可视化 `ImageNet` 训练集的10张原始图片与预处理后图片对比图,保存在 `./tmp` 文件夹下: +2. **'transformed'** 模式,可视化 `ImageNet` 训练集的所有经过预处理的图片,并以弹窗形式显示: - ```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 - ``` + ```shell + python ./tools/visualizations/vis_pipeline.py ./configs/resnet/resnet50_8xb32_in1k.py --show --mode transformed + ``` -
+
-3. 可视化 `CIFAR100` 验证集中的100张原始图片,显示并保存在 `./tmp` 文件夹下: +3. **'concat'** 模式,可视化 `ImageNet` 训练集的10张原始图片与预处理后图片对比图,保存在 `./tmp` 文件夹下: - ```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 - ``` + ```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 + ``` -
+
+ +4. **'pipeline'** 模式,可视化 `ImageNet` 训练集经过数据流水线的过程图像: + + ```shell + python ./tools/visualizations/vis_pipeline.py configs/swin_transformer/swin_base_224_b16x64_300e_imagenet.py --phase train --adaptive --mode pipeline --show + ``` + +
## 学习率策略可视化 ```bash python tools/visualizations/vis_lr.py \ ${CONFIG_FILE} \ - --dataset-size ${Dataset_Size} \ - --ngpus ${NUM_GPUs} - --save-path ${SAVE_PATH} \ - --title ${TITLE} \ - --style ${STYLE} \ - --window-size ${WINDOW_SIZE} - --cfg-options + [--dataset-size ${Dataset_Size}] \ + [--ngpus ${NUM_GPUs}] \ + [--save-path ${SAVE_PATH}] \ + [--title ${TITLE}] \ + [--style ${STYLE}] \ + [--window-size ${WINDOW_SIZE}] \ + [--cfg-options ${CFG_OPTIONS}] \ ``` **所有参数的说明**: - `config` : 模型配置文件的路径。 -- `dataset-size` : 数据集的大小。如果指定,`build_dataset` 将被跳过并使用这个大小作为数据集大小,默认使用 `build_dataset` 所得数据集的大小。 -- `ngpus` : 使用 GPU 的数量。 -- `save-path` : 保存的可视化图片的路径,默认不保存。 -- `title` : 可视化图片的标题,默认为配置文件名。 -- `style` : 可视化图片的风格,默认为 `whitegrid`。 -- `window-size`: 可视化窗口大小,如果没有指定,默认为 `12*7`。如果需要指定,按照格式 `'W*H'`。 -- `cfg-options` : 对配置文件的修改,参考[教程 1:如何编写配置文件](https://mmclassification.readthedocs.io/zh_CN/latest/tutorials/config.html)。 +- `--dataset-size` : 数据集的大小。如果指定,`build_dataset` 将被跳过并使用这个大小作为数据集大小,默认使用 `build_dataset` 所得数据集的大小。 +- `--ngpus` : 使用 GPU 的数量。 +- `--save-path` : 保存的可视化图片的路径,默认不保存。 +- `--title` : 可视化图片的标题,默认为配置文件名。 +- `--style` : 可视化图片的风格,默认为 `whitegrid`。 +- `--window-size`: 可视化窗口大小,如果没有指定,默认为 `12*7`。如果需要指定,按照格式 `'W*H'`。 +- `--cfg-options` : 对配置文件的修改,参考[教程 1:如何编写配置文件](https://mmclassification.readthedocs.io/zh_CN/latest/tutorials/config.html)。 ```{note} diff --git a/tools/visualizations/vis_pipeline.py b/tools/visualizations/vis_pipeline.py index ed64802fbed..ffb9b183c5c 100644 --- a/tools/visualizations/vis_pipeline.py +++ b/tools/visualizations/vis_pipeline.py @@ -1,18 +1,27 @@ # Copyright (c) OpenMMLab. All rights reserved. import argparse +import copy import itertools import os import re import sys +import warnings from pathlib import Path +from typing import List +import cv2 import mmcv import numpy as np from mmcv import Config, DictAction, ProgressBar from mmcls.core import visualization as vis -from mmcls.datasets.builder import build_dataset -from mmcls.datasets.pipelines import Compose +from mmcls.datasets.builder import PIPELINES, build_dataset, build_from_cfg +from mmcls.models.utils import to_2tuple + +# text style +bright_style, reset_style = '\x1b[1m', '\x1b[0m' +red_text, blue_text = '\x1b[31m', '\x1b[34m' +white_background = '\x1b[107m' def parse_args(): @@ -48,11 +57,12 @@ def parse_args(): '--mode', default='concat', type=str, - choices=['original', 'pipeline', 'concat'], + choices=['original', 'transformed', 'concat', 'pipeline'], help='display mode; display original pictures or transformed pictures' - ' or comparison pictures. "original" means show images load from disk;' - ' "pipeline" means to show images after pipeline; "concat" means show ' - 'images stitched by "original" and "pipeline" images. Default concat.') + ' 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 "output" images. ' + '"pipeline" means show all the intermediate images. Default concat.') parser.add_argument( '--show', default=False, @@ -71,7 +81,7 @@ def parse_args(): '"--adaptive" is true. Default 200.') parser.add_argument( '--max-edge-length', - default=1000, + default=800, type=int, help='the max edge length when visualizing images, used when ' '"--adaptive" is true. Default 1000.') @@ -130,7 +140,7 @@ def retrieve_data_cfg(config_path, skip_type, cfg_options, phase): return cfg -def build_dataset_pipeline(cfg, phase): +def build_dataset_pipelines(cfg, phase): """build dataset and pipeline from config. Separate the pipeline except 'LoadImageFromFile' step if @@ -144,43 +154,103 @@ def build_dataset_pipeline(cfg, phase): origin_pipeline = data_cfg.pipeline data_cfg.pipeline = loadimage_pipeline dataset = build_dataset(data_cfg) - pipeline = Compose(origin_pipeline) - - return dataset, pipeline - - -def put_img(board, img, center): - """put a image into a big board image with the anchor center.""" - center_x, center_y = center - img_h, img_w, _ = img.shape - xmin, ymin = int(center_x - img_w // 2), int(center_y - img_h // 2) - board[ymin:ymin + img_h, xmin:xmin + img_w, :] = img - return board - - -def concat(left_img, right_img): - """Concat two pictures into a single big picture, accepts two images with - diffenert shapes.""" - GAP = 10 - left_h, left_w, _ = left_img.shape - right_h, right_w, _ = right_img.shape - # create a big board to contain images with shape (board_h, board_w*2+10) - board_h, board_w = max(left_h, right_h), max(left_w, right_w) - board = np.ones([board_h, 2 * board_w + GAP, 3], np.uint8) * 255 - - put_img(board, left_img, (int(board_w // 2), int(board_h // 2))) - put_img(board, right_img, - (int(board_w // 2) + board_w + GAP // 2, int(board_h // 2))) + pipelines = { + pipeline_cfg['type']: build_from_cfg(pipeline_cfg, PIPELINES) + for pipeline_cfg in origin_pipeline + } + + return dataset, pipelines + + +def prepare_imgs(args, imgs: List[np.ndarray], steps=None): + """prepare the showing picture.""" + ori_shapes = [img.shape for img in imgs] + # adaptive adjustment to rescale pictures + if args.adaptive: + for i, img in enumerate(imgs): + imgs[i] = adaptive_size(img, args.min_edge_length, + args.max_edge_length) + else: + # if src image is too large or too small, + # warning a "--adaptive" message. + for ori_h, ori_w, _ in ori_shapes: + if (args.min_edge_length > ori_h or args.min_edge_length > ori_w + or args.max_edge_length < ori_h + or args.max_edge_length < ori_w): + msg = red_text + msg += 'The visualization picture is too small or too large to' + msg += ' put text information on it, please add ' + msg += bright_style + red_text + white_background + msg += '"--adaptive"' + msg += reset_style + red_text + msg += ' to adaptively rescale the showing pictures' + msg += reset_style + warnings.warn(msg) + + if len(imgs) == 1: + return imgs[0] + else: + return concat_imgs(imgs, steps, ori_shapes) + + +def concat_imgs(imgs, steps, ori_shapes): + """Concat list of pictures into a single big picture, align height here.""" + show_shapes = [img.shape for img in imgs] + show_heights = [shape[0] for shape in show_shapes] + show_widths = [shape[1] for shape in show_shapes] + + max_height = max(show_heights) + text_height = 20 + font_size = 0.5 + pic_horizontal_gap = min(show_widths) // 10 + for i, img in enumerate(imgs): + cur_height = show_heights[i] + pad_height = max_height - cur_height + pad_top, pad_bottom = to_2tuple(pad_height // 2) + # handle instance that the pad_height is an odd number + if pad_height % 2 == 1: + pad_top = pad_top + 1 + pad_bottom += text_height * 3 # keep pxs to put step information text + pad_left, pad_right = to_2tuple(pic_horizontal_gap) + # make border + img = cv2.copyMakeBorder( + img, + pad_top, + pad_bottom, + pad_left, + pad_right, + cv2.BORDER_CONSTANT, + value=(255, 255, 255)) + # put transform phase information in the bottom + imgs[i] = cv2.putText( + img=img, + text=steps[i], + org=(pic_horizontal_gap, max_height + text_height // 2), + fontFace=cv2.FONT_HERSHEY_TRIPLEX, + fontScale=font_size, + color=(255, 0, 0), + lineType=1) + # put image size information in the bottom + imgs[i] = cv2.putText( + img=img, + text=str(ori_shapes[i]), + org=(pic_horizontal_gap, max_height + int(text_height * 1.5)), + fontFace=cv2.FONT_HERSHEY_TRIPLEX, + fontScale=font_size, + color=(255, 0, 0), + lineType=1) + + # Height alignment for concatenating + board = np.concatenate(imgs, axis=1) return board -def adaptive_size(mode, image, min_edge_length, max_edge_length): - """rescale image if image is too small to put text like cifra.""" +def adaptive_size(image, min_edge_length, max_edge_length, src_shape=None): + """rescale image if image is too small to put text like cifar.""" assert min_edge_length >= 0 and max_edge_length >= 0 assert max_edge_length >= min_edge_length - - image_h, image_w, *_ = image.shape - image_w = image_w // 2 if mode == 'concat' else image_w + src_shape = image.shape if src_shape is None else src_shape + image_h, image_w, _ = src_shape if image_h < min_edge_length or image_w < min_edge_length: image = mmcv.imrescale( @@ -191,49 +261,58 @@ def adaptive_size(mode, image, min_edge_length, max_edge_length): return image -def get_display_img(item, pipeline, mode, bgr2rgb): +def get_display_img(args, item, pipelines): """get image to display.""" - if bgr2rgb: + # srcs picture could be in RGB or BGR order due to different backends. + if args.bgr2rgb: item['img'] = mmcv.bgr2rgb(item['img']) src_image = item['img'].copy() - # get transformed picture - if mode in ['pipeline', 'concat']: - item = pipeline(item) - trans_image = item['img'] - trans_image = np.ascontiguousarray(trans_image, dtype=np.uint8) - - if mode == 'concat': - image = concat(src_image, trans_image) - elif mode == 'original': - image = src_image - elif mode == 'pipeline': - image = trans_image + pipeline_images = [src_image] + + # get intermediate images through pipelines + if args.mode in ['transformed', 'concat', 'pipeline']: + for pipeline in pipelines.values(): + item = pipeline(item) + trans_image = copy.deepcopy(item['img']) + trans_image = np.ascontiguousarray(trans_image, dtype=np.uint8) + pipeline_images.append(trans_image) + + # concatenate images to be showed according to mode + if args.mode == 'original': + image = prepare_imgs(args, [src_image], ['src']) + elif args.mode == 'transformed': + image = prepare_imgs(args, [pipeline_images[-1]], ['transformed']) + elif args.mode == 'concat': + steps = ['src', 'transformed'] + image = prepare_imgs(args, [pipeline_images[0], pipeline_images[-1]], + steps) + elif args.mode == 'pipeline': + steps = ['src'] + list(pipelines.keys()) + image = prepare_imgs(args, pipeline_images, steps) + return image def main(): args = parse_args() wind_w, wind_h = args.window_size.split('*') - wind_w, wind_h = int(wind_w), int(wind_h) + wind_w, wind_h = int(wind_w), int(wind_h) # showing windows size cfg = retrieve_data_cfg(args.config, args.skip_type, args.cfg_options, args.phase) - dataset, pipeline = build_dataset_pipeline(cfg, args.phase) + dataset, pipelines = build_dataset_pipelines(cfg, args.phase) CLASSES = dataset.CLASSES display_number = min(args.number, len(dataset)) progressBar = ProgressBar(display_number) with vis.ImshowInfosContextManager(fig_size=(wind_w, wind_h)) as manager: for i, item in enumerate(itertools.islice(dataset, display_number)): - image = get_display_img(item, pipeline, args.mode, args.bgr2rgb) - if args.adaptive: - image = adaptive_size(args.mode, image, args.min_edge_length, - args.max_edge_length) + image = get_display_img(args, item, pipelines) - # dist_path is None as default, means not save pictures + # dist_path is None as default, means not saving pictures dist_path = None if args.output_dir: - # some datasets do not have filename, such as cifar, use id + # some datasets don't have filenames, such as cifar src_path = item.get('filename', '{}.jpg'.format(i)) dist_path = os.path.join(args.output_dir, Path(src_path).name)