语义分割给每个像素分配一个类别。使用 Torchvision 的预训练 DeepLabV3,可以先把照片转成类别编号掩码,再核对前景轮廓。它与图片分类不同,也不会把同类的两个人自动分成两个实例。
准备可运行的 CPU 示例
需要匹配的 torch、torchvision、Pillow 和 numpy。准备合法取得的 photo.jpg,优先选择常见人物或物体照片。首次加载默认权重会下载模型。以下流程未在具体图片或设备上实测,不把演示代码当成分割精度承诺。

python -m pip install torch torchvision pillow numpy
从 logits 取得每像素类别
import numpy as np
import torch
from PIL import Image
from torchvision.models.segmentation import (
deeplabv3_resnet50, DeepLabV3_ResNet50_Weights,
)
weights = DeepLabV3_ResNet50_Weights.DEFAULT
model = deeplabv3_resnet50(weights=weights).eval()
image = Image.open("photo.jpg").convert("RGB")
batch = weights.transforms()(image).unsqueeze(0)
with torch.inference_mode():
logits = model(batch)["out"][0]
mask = logits.argmax(dim=0).cpu().numpy().astype(np.uint8)
Image.fromarray(mask).save("class_ids.png")
categories = weights.meta["categories"]
for class_id in np.unique(mask):
print(int(class_id), categories[int(class_id)])
print("输入张量尺寸", tuple(batch.shape), "掩码尺寸", mask.shape)
assert logits.shape[0] == len(categories)
保存为 segment.py 后运行 python segment.py。输出 out 是类别通道的 logits,对类别维做 argmax 得到每个像素的类别编号。不能对图像行列维取最大值,否则会破坏掩码结构。
掩码发黑为什么可能正常
验证时先检查打印的类别编号和名称,再检查 class_ids.png 的像素值,而不是只看图片颜色。类别 ID 数值很小,直接当灰度显示可能接近黑色;这不等于模型没有输出。
为展示可给类别配不同颜色,但应另存可视化副本,不要覆盖 class_ids.png。训练或评估程序需要的是稳定编号;彩色 JPEG 会引入压缩颜色,不能当作类别掩码。
尺寸与适用类别的边界
权重预处理会改变图片尺度,掩码尺寸应与预处理后的空间尺寸核对。要贴回原图,下一步用最近邻方式把类别掩码缩放到原图尺寸,并检查轮廓;不能用平滑插值生成小数类别编号。
默认权重仅覆盖其 categories 中列出的类别。专业缺陷或医学区域不在标签集合中时,不会因换提示词就自动识别;需要另选模型或标注训练。人物边缘、细小物体和遮挡处必须人工复核,类别掩码不是精细透明背景抠图。
资料与适用版本
以下官方资料核对于 2026 年 10 月 1 日;安装和界面以实际使用版本为准。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30665.html