我想利用mmsegmentation跑demo文件请问我的命令是什么呢
Создано: 15 апреля 2025 г.
Создано: 15 апреля 2025 г.
我想利用mmsegmentation跑demo文件请问我的命令是什么呢
下面给出一个常见的用 MMSegmentation 跑 demo(推理单张图像)的命令示例,供你参考。假设你已经安装好 mmsegmentation,并且有对应的配置文件和权重文件,可执行命令如下:
bashpython demo/image_demo.py \ demo/demo.png \ configs/segmentor/fcn/fcn_r50-d8_512x512_160k_ade20k.py \ checkpoints/fcn_r50-d8_512x512_160k_ade20k_20200614_215451-9fdf08ef.pth \ --device cuda:0 \ --palette ade20k \ --out-file result.png
demo/demo.png
:这是你要进行推理的输入图像路径。configs/segmentor/fcn/fcn_r50-d8_512x512_160k_ade20k.py
:这是 mmsegmentation 的配置文件路径,你可以根据你使用的模型找到对应的配置文件。checkpoints/fcn_r50-d8_512x512_160k_ade20k_20200614_215451-9fdf08ef.pth
:这是与配置文件对应的模型权重文件。--device cuda:0
:指定使用 GPU(如若没有 GPU,可以改成 cpu
)。--palette ade20k
:指定可视化结果的调色板,可选值视任务和数据集而定,例如 cityscapes
、ade20k
等。--out-file result.png
:推理完成后保存的结果图像文件名。如果你想要在命令行快速查看或者进行可视化选项,可以添加更多参数,例如:
--opacity 0.5
:设置分割结果与原图混合的透明度。--save-dir results/
:设置保存可视化图片的目录(如果你想保存到固定文件夹,而不是单一结果文件)。根据你的实际情况(模型、数据集、配置等)修改命令中相关路径即可。
请根据他的img_demo.py的内容:# Copyright (c) OpenMMLab. All rights reserved.
from argparse import ArgumentParser
from mmengine.model import revert_sync_batchnorm
from mmseg.apis import inference_model, init_model, show_result_pyplot
def main():
parser = ArgumentParser()
parser.add_argument('img', help='Image file')
parser.add_argument('config', help='Config file')
parser.add_argument('checkpoint', help='Checkpoint file')
parser.add_argument('--out-file', default=None, help='Path to output file')
parser.add_argument(
'--device', default='cuda:0', help='Device used for inference')
parser.add_argument(
'--opacity',
type=float,
default=0.5,
help='Opacity of painted segmentation map. In (0, 1] range.')
parser.add_argument(
'--with-labels',
action='store_true',
default=False,
help='Whether to display the class labels.')
parser.add_argument(
'--title', default='result', help='The image identifier.')
args = parser.parse_args()
text# build the model from a config file and a checkpoint file model = init_model(args.config, args.checkpoint, device=args.device) if args.device == 'cpu': model = revert_sync_batchnorm(model) # test a single image result = inference_model(model, args.img) # show the results show_result_pyplot( model, args.img, result, title=args.title, opacity=args.opacity, with_labels=args.with_labels, draw_gt=False, show=False if args.out_file is not None else True, out_file=args.out_file)
if name == 'main':
main()
告诉我他的报错如何解决:(mmsegmentation) a@fuwuqi:/media/a/7E66D8986C7B8B6A/liwei23/mmsegmentation$ python demo/image_demo.py /media/a/7E66D8986C7B8B6A/liwei23/mmsegmentation/demo/000000.png /media/a/7E66D8986C7B8B6A/liwei23/mmsegmentation/configs/pidnet/xuanguashi-s_2xb6-120k_1024x1024-cityscapes.py /media/a/7E66D8986C7B8B6A/liwei23/mmsegmentation/work_dirs/xuanguashi-s_2xb6-120k_1024x1024-cityscapes/iter_120000.pth /media/a/7E66D8986C7B8B6A/liwei23/mmsegmentation/outputs/1.jpg
usage: image_demo.py [-h] [--out-file OUT_FILE] [--device DEVICE] [--opacity OPACITY] [--with-labels] [--title TITLE] img config checkpoint
image_demo.py: error: unrecognized arguments: /media/a/7E66D8986C7B8B6A/liwei23/mmsegmentation/outputs/1.jpg
从报错信息可以看出,脚本 image_demo.py
只接受 3 个位置参数(img
, config
, checkpoint
),而你传入了 4 个位置参数,导致第 4 个路径(输出文件路径)被错误地识别为了未知参数。
根据你的 img_demo.py
源码:
plaintextusage: image_demo.py [-h] [--out-file OUT_FILE] [--device DEVICE] ... [--opacity OPACITY] [--with-labels] [--title TITLE] img config checkpoint
img
config
checkpoint
--out-file
指定的。因此,你的命令需要改为在后面加上 --out-file
,而不是直接放在位置参数中。例如:
bashpython demo/image_demo.py \ /media/a/7E66D8986C7B8B6A/liwei23/mmsegmentation/demo/000000.png \ /media/a/7E66D8986C7B8B6A/liwei23/mmsegmentation/configs/pidnet/xuanguashi-s_2xb6-120k_1024x1024-cityscapes.py \ /media/a/7E66D8986C7B8B6A/liwei23/mmsegmentation/work_dirs/xuanguashi-s_2xb6-120k_1024x1024-cityscapes/iter_120000.pth \ --out-file /media/a/7E66D8986C7B8B6A/liwei23/mmsegmentation/outputs/1.jpg
这样即可解决“unrecognized arguments”的错误。
我现在只有两个类别,轨道区域个非轨道区域,在标注数据时我只标注了轨道,其余按照空白进行训练,但是现在跑demo后,我的轨道区域颜色我不想要现在的紫色,我要红色,而且我不想让他标注除了轨道的空白,怎么处理呢
在 MMSegmentation 中,如果你只有两个类别(例如:0 表示背景、1 表示轨道),而且想要在可视化时只显示“轨道”这个类,且将其渲染为红色(背景不再渲染成默认的紫色),一般可以从以下两个层面来处理:
在你的配置文件(如 xxx.py
)中,通常会有一个关于元信息的字段(在最新版本中常常叫 metainfo
或者写在 dataset_meta
里),其中可以定义数据集的 类别名称(classes)和 调色板(palette)。比如你有两个类别:
可以像下面这样做(仅示例,具体写法请对应你自己的 config 结构):
python# 在 config 中,比如最上方或 model / dataset 下 metainfo = dict( classes=('background', 'track'), # 或者你想要的类别名 # palette 的顺序要和 classes 的顺序一一对应 # 这里将背景指定为 [0, 0, 0] (黑色),轨道指定为 [255, 0, 0] (红色) palette=[[0, 0, 0], [255, 0, 0]] )
这样训练好后,你在推理阶段调用官方自带的可视化接口(例如 show_result_pyplot
)时,就会使用你在 config 中定义的调色板来渲染结果:
如果你不想“可视化背景”,通常有两种思路:
opacity
参数设置将预测结果与原图叠加的透明度。如果想让背景完全不显现,可将背景定义成跟原图一样的“无差别”,但这需要做一些后处理(见下文第 2 种方法)。opacity
来叠加,这样人眼看上去就不会觉得背景被涂上别的颜色。如果你只需要简易地 “轨道区域是红色,其它地方保持原图”,可配合 --opacity
使用。例如:
bashpython demo/image_demo.py \ /path/to/img.jpg \ /path/to/config.py \ /path/to/weight.pth \ --device cuda:0 \ --out-file /path/to/result.jpg \ --opacity 0.5
这样轨道区域会有一个半透明红色的叠加,背景会保留半透明的原图信息。你可通过调节 opacity
(0~1)来控制轨道区域叠加效果的强弱。
如果你需要更灵活地“只涂轨道,完全不涂其它区域”——也就是背景在可视化时直接看原图、不覆盖任何颜色,那么可以自己改写一下推理脚本,比如:
inference_model(model, img)
得到语义分割结果 result
。result
转成一个 mask(背景=0,轨道=1),然后只对 mask == 1
的像素做红色叠加,背景位置保持原图不变。示例(简化版逻辑):
pythonimport cv2 import numpy as np from mmseg.apis import init_model, inference_model model = init_model(config='xxx.py', checkpoint='xxx.pth', device='cuda:0') result = inference_model(model, 'test.jpg') # 获取预测的分割掩码 (一般会在 result.pred_sem_seg 里) pred_mask = result.pred_sem_seg.data[0].cpu().numpy() # shape = [H, W] img = cv2.imread('test.jpg') # BGR img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 如需 RGB 操作 # 想要红色 [255, 0, 0] (注意在 RGB 里是红色) red_color = np.array([255, 0, 0], dtype=np.uint8) # 只对 pred_mask == 1 位置涂红 # 举例:简单叠加 50% 透明度 alpha = 0.5 indices = np.where(pred_mask == 1) img[indices] = img[indices] * (1 - alpha) + red_color * alpha # 保存结果 cv2.imwrite('result.jpg', cv2.cvtColor(img, cv2.COLOR_RGB2BGR))
这样就可以只在“轨道”区域上色,背景区域完全是原图,而且可以自定义任何颜色、任何透明度。
如果你想完全把轨道涂满红色,不需要与原图混合,可以去掉透明度操作,直接:
pythonimg[indices] = red_color
最方便的方法:
classes
和 palette
,并使用官方命令行参数 --out-file
、--opacity
等就能生成半透明可视化结果。此时只要把背景对应的颜色改成你想要的(如黑色 [0, 0, 0]
),轨道对应的颜色改成 [255, 0, 0]
即可。高级自定义方法:
这样便能实现“轨道区域是红色,且对背景不进行额外着色或显示”。