【DINOv3教程3】DINOv3+PCA实现图像前景RGB的可视化【附源码与详解】

发布于:2025-09-07 ⋅ 阅读:(26) ⋅ 点赞:(0)

《博主简介》

小伙伴们好,我是阿旭。
专注于计算机视觉领域,包括目标检测、图像分类、图像分割和目标跟踪等项目开发,提供模型对比实验、答疑辅导等。

《------往期经典推荐------》

一、AI应用软件开发实战专栏【链接】

项目名称 项目名称
1.【人脸识别与管理系统开发 2.【车牌识别与自动收费管理系统开发
3.【手势识别系统开发 4.【人脸面部活体检测系统开发
5.【图片风格快速迁移软件开发 6.【人脸表表情识别系统
7.【YOLOv8多目标识别与自动标注软件开发 8.【基于深度学习的行人跌倒检测系统
9.【基于深度学习的PCB板缺陷检测系统 10.【基于深度学习的生活垃圾分类目标检测系统
11.【基于深度学习的安全帽目标检测系统 12.【基于深度学习的120种犬类检测与识别系统
13.【基于深度学习的路面坑洞检测系统 14.【基于深度学习的火焰烟雾检测系统
15.【基于深度学习的钢材表面缺陷检测系统 16.【基于深度学习的舰船目标分类检测系统
17.【基于深度学习的西红柿成熟度检测系统 18.【基于深度学习的血细胞检测与计数系统
19.【基于深度学习的吸烟/抽烟行为检测系统 20.【基于深度学习的水稻害虫检测与识别系统
21.【基于深度学习的高精度车辆行人检测与计数系统 22.【基于深度学习的路面标志线检测与识别系统
23.【基于深度学习的智能小麦害虫检测识别系统 24.【基于深度学习的智能玉米害虫检测识别系统
25.【基于深度学习的200种鸟类智能检测与识别系统 26.【基于深度学习的45种交通标志智能检测与识别系统
27.【基于深度学习的人脸面部表情识别系统 28.【基于深度学习的苹果叶片病害智能诊断系统
29.【基于深度学习的智能肺炎诊断系统 30.【基于深度学习的葡萄簇目标检测系统
31.【基于深度学习的100种中草药智能识别系统 32.【基于深度学习的102种花卉智能识别系统
33.【基于深度学习的100种蝴蝶智能识别系统 34.【基于深度学习的水稻叶片病害智能诊断系统
35.【基于与ByteTrack的车辆行人多目标检测与追踪系统 36.【基于深度学习的智能草莓病害检测与分割系统
37.【基于深度学习的复杂场景下船舶目标检测系统 38.【基于深度学习的农作物幼苗与杂草检测系统
39.【基于深度学习的智能道路裂缝检测与分析系统 40.【基于深度学习的葡萄病害智能诊断与防治系统
41.【基于深度学习的遥感地理空间物体检测系统 42.【基于深度学习的无人机视角地面物体检测系统
43.【基于深度学习的木薯病害智能诊断与防治系统 44.【基于深度学习的野外火焰烟雾检测系统
45.【基于深度学习的脑肿瘤智能检测系统 46.【基于深度学习的玉米叶片病害智能诊断与防治系统
47.【基于深度学习的橙子病害智能诊断与防治系统 48.【基于深度学习的车辆检测追踪与流量计数系统
49.【基于深度学习的行人检测追踪与双向流量计数系统 50.【基于深度学习的反光衣检测与预警系统
51.【基于深度学习的危险区域人员闯入检测与报警系统 52.【基于深度学习的高密度人脸智能检测与统计系统
53.【基于深度学习的CT扫描图像肾结石智能检测系统 54.【基于深度学习的水果智能检测系统
55.【基于深度学习的水果质量好坏智能检测系统 56.【基于深度学习的蔬菜目标检测与识别系统
57.【基于深度学习的非机动车驾驶员头盔检测系统 58.【太基于深度学习的阳能电池板检测与分析系统
59.【基于深度学习的工业螺栓螺母检测 60.【基于深度学习的金属焊缝缺陷检测系统
61.【基于深度学习的链条缺陷检测与识别系统 62.【基于深度学习的交通信号灯检测识别
63.【基于深度学习的草莓成熟度检测与识别系统 64.【基于深度学习的水下海生物检测识别系统
65.【基于深度学习的道路交通事故检测识别系统 66.【基于深度学习的安检X光危险品检测与识别系统
67.【基于深度学习的农作物类别检测与识别系统 68.【基于深度学习的危险驾驶行为检测识别系统
69.【基于深度学习的维修工具检测识别系统 70.【基于深度学习的维修工具检测识别系统
71.【基于深度学习的建筑墙面损伤检测系统 72.【基于深度学习的煤矿传送带异物检测系统
73.【基于深度学习的老鼠智能检测系统 74.【基于深度学习的水面垃圾智能检测识别系统
75.【基于深度学习的遥感视角船只智能检测系统 76.【基于深度学习的胃肠道息肉智能检测分割与诊断系统
77.【基于深度学习的心脏超声图像间隔壁检测分割与分析系统 78.【基于深度学习的心脏超声图像间隔壁检测分割与分析系统
79.【基于深度学习的果园苹果检测与计数系统 80.【基于深度学习的半导体芯片缺陷检测系统
81.【基于深度学习的糖尿病视网膜病变检测与诊断系统 82.【基于深度学习的运动鞋品牌检测与识别系统
83.【基于深度学习的苹果叶片病害检测识别系统 84.【基于深度学习的医学X光骨折检测与语音提示系统
85.【基于深度学习的遥感视角农田检测与分割系统 86.【基于深度学习的运动品牌LOGO检测与识别系统
87.【基于深度学习的电瓶车进电梯检测与语音提示系统 88.【基于深度学习的遥感视角地面房屋建筑检测分割与分析系统
89.【基于深度学习的医学CT图像肺结节智能检测与语音提示系统 90.【基于深度学习的舌苔舌象检测识别与诊断系统
91.【基于深度学习的蛀牙智能检测与语音提示系统 92.【基于深度学习的皮肤癌智能检测与语音提示系统
93.【基于深度学习的工业压力表智能检测与读数系统

二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~

《------正文------》

引言

两篇文章介绍了如何使用DINOv3进行图像前景分割与一键生成热力图。
【DINOv3教程1-图像分割】使用DINOv3+逻辑回归器进行图像前景分割【附源码】
《【DINOv3教程2-热力图】使用DINOv3直接生成图像热力图【附源码与详解】》

本文将介绍如何利用DINOv3预训练视觉模型对输入图像进行特征提取,并结合一个前景分类器来识别图像中的前景区域。随后,它使用主成分分析(PCA)对前景区域的特征进行降维处理,并将结果可视化为RGB图像。
论文中的示例图如下:
在这里插入图片描述
整体流程包括图像预处理、特征提取、前景检测、PCA降维和结果可视化等步骤。

基本流程介绍

  1. 模型加载与初始化
    • 使用 transformers.AutoModel.from_pretrained 加载本地的DINOv3预训练模型。
    • 从指定路径加载预先训练好的前景分类器(fg_classifier_large.pkl)。【训练方法见教程1】
from transformers import AutoModel
# 加载本地预训练模型
model = AutoModel.from_pretrained(
    r'D:\7studying\DinoV3_Study\dinov3-main\PreModels\dinov3-vitl16-pretrain-sat493m',
    local_files_only=True
)
# print( model)

# 设置保存根目录和训练好的前景逻辑回归模型路径
save_root = '.'
model_path = os.path.join(save_root, "fg_classifier_large.pkl")
# 加载前景分类器模型
with open(model_path, 'rb') as file:
    clf = pickle.load(file)
  1. 图像加载与预处理
    在这里插入图片描述

    • load_image_from_path: 读取并转换图像为RGB格式。
    • resize_transform: 调整图像尺寸至适合模型处理的大小(确保是patch size的整数倍),并返回tensor格式的图像及对应的patch网格尺寸。
# 定义图像处理参数
PATCH_SIZE = 16  # patch大小
IMAGE_SIZE = 1024  # 图像尺寸

# ImageNet标准化参数
IMAGENET_MEAN = (0.485, 0.456, 0.406)
IMAGENET_STD = (0.229, 0.224, 0.225)

# 测试图像路径
image_path = "3.png"


def load_image_from_path(image_path):
    """
    从图片路径加载图像
    参数:
        image_path (str): 图像文件的路径
    返回:
        PIL.Image: RGB格式的图像对象
    """
    return Image.open(image_path).convert("RGB")

# 图像resize变换,调整为patch size的整数倍尺寸
def resize_transform(
        mask_image: Image,  # 输入图像
        image_size: int = IMAGE_SIZE,  # 目标图像尺寸
        patch_size: int = PATCH_SIZE,  # patch大小
) -> torch.Tensor:
    """
    将图像调整为适合模型处理的尺寸
    参数:
        mask_image: 输入的PIL图像
        image_size: 目标图像尺寸
        patch_size: patch大小
    返回:
        tuple: 调整后的tensor图像和网格尺寸(h_patches, w_patches)
    """
    w, h = mask_image.size
    print("image_shape:", mask_image.size)
    h_patches = int(image_size / patch_size)
    w_patches = int((w * image_size) / (h * patch_size))
    target_size = (h_patches * patch_size, w_patches * patch_size)  # (height, width)
    # 大小缩放
    resized_image = TF.resize(mask_image, target_size)
    tensor_image = TF.to_tensor(resized_image)

    # 返回tensor和patch网格尺寸
    return tensor_image, (h_patches, w_patches)



# 加载并预处理图像
image = load_image_from_path(image_path)
image_resized, (h_patches, w_patches) = resize_transform(image)
print("图像尺寸:", image_resized.shape)
print(h_patches, w_patches)
# 对图像进行标准化处理
image_resized_norm = TF.normalize(image_resized, mean=IMAGENET_MEAN, std=IMAGENET_STD)
  1. 特征提取
    • 对图像进行ImageNet标准化处理。
    • 利用DINOv3模型提取图像特征,获取每个patch的特征向量(去除cls token)。
    • 检查并调整特征数量以匹配预期的patch网格尺寸。
# 使用模型提取特征
with torch.inference_mode():
    outputs = model(image_resized_norm.unsqueeze(0))
    # 获取patch特征(去掉cls token)
    patch_features = outputs.last_hidden_state[:, 1:, :]
    #h_patches, w_patches: 48 36
    print("patch_features:", patch_features.shape) #torch.Size([1, 1732, 384])
    #第一个维度[1]:表示批次大小(batchsize),这里为1,因为我们一次只处理一张图像。
    #第二个维度[1732]:表示patch tokens的数量。这是将图像分割成多个patches后得到的patch数量,每个patch对应一个特征向量。在你的例子中,图像被分成了1732个patches。
    #第三个维度[384]:表示每个patch的特征维度,即每个patch的向量表示长度。
    x = patch_features.squeeze().detach().cpu()

    # 检查并调整特征数量以匹配网格尺寸
    expected_patches = h_patches * w_patches
    actual_patches = x.shape[0]

    if actual_patches > expected_patches:
        # 截取前expected_patches个特征
        x = x[:expected_patches, :]
        print(f"测试时截取特征: {actual_patches} -> {expected_patches}")
    elif actual_patches < expected_patches:
        raise ValueError(f"测试时特征数量不足: {actual_patches} < {expected_patches}")

    # 调整维度顺序
    dim = x.shape[-1]
    x = x.view(-1, dim)
  1. 前景检测
    在这里插入图片描述
    • 使用加载的前景分类器预测每个patch属于前景的概率。
    • 对前景概率图应用中值滤波(median filtering)以减少噪声。
    • 可视化原始图像和前景分数图。
# 重新计算图像的网格尺寸
h_patches, w_patches = [int(d / PATCH_SIZE) for d in image_resized.shape[1:]]
print("h_patches, w_patches:",h_patches, w_patches)

# 使用分类器预测前景概率
print(clf.predict_proba(x).shape)  #(1728, 2)
fg_score = clf.predict_proba(x)[:, 1].reshape(h_patches, w_patches)
# 对前景概率图进行中值滤波
fg_score_mf = torch.from_numpy(signal.medfilt2d(fg_score, kernel_size=5))
  1. PCA降维与可视化
    在这里插入图片描述

    • 选择前景概率大于0.5的patches作为前景区域。
    • 使用PCA对前景patches进行3维降维处理。
    • 将所有patches的特征投影到PCA空间,并重塑为图像格式。
    • 应用sigmoid函数增强颜色鲜艳度,并使用前景分数掩码背景。
    • 显示最终的PCA结果图像。
# 选择前景概率大于0.5的patches
foreground_selection = fg_score_mf.view(-1) > 0.5
fg_patches = x[foreground_selection]


# 对前景patches进行PCA降维
pca = PCA(n_components=3, whiten=True)
pca.fit(fg_patches)


# 应用PCA变换并重塑图像
projected_image = torch.from_numpy(pca.transform(x.numpy())).view(h_patches, w_patches, 3)

# 乘以2.0并通过sigmoid函数获得鲜艳的颜色
projected_image = torch.nn.functional.sigmoid(projected_image.mul(2.0)).permute(2, 0, 1)

# 使用前景分数掩码背景
projected_image *= (fg_score_mf.unsqueeze(0) > 0.3)

在这里插入图片描述

总结

本文详细介绍了如何使用DINOv3进行图像前景提取与利用PCA技术将其特征RGB可视化,通过这些步骤,从而提供对图像内容的深入理解。


在这里插入图片描述

好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!


网站公告

今日签到

点亮在社区的每一天
去签到