完整教程:【DINOv3教程1-图像分割】使用DINOv3+逻辑回归器进行图像前景分割【附源码】

《博主简介》

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

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

一、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是Meta于2025年8月推出的第三代自监督视觉基础模型,其核心优势在于:​首次证明了自监督学习模型能在图像分类、目标检测、语义分割等超过60项视觉任务上全面超越弱监督和专业模型​
,并且仅需单一冻结的骨干网络无需微调即可实现多任务高性能,极大提升了推理效率和部署灵活性​。

本文将详细介绍如何使用最新的DINOv3模型搭配逻辑回归器进行图像前景分割,包含完整步骤与代码说明,基本流程如下:

  1. 特征学习:利用DINOv3预训练模型提取图像patch的高级特征
  2. 数据准备:将图像和mask对齐,准备训练数据
  3. 模型训练:使用逻辑回归将特征映射到前景/背景标签
  4. 模型验证:通过交叉验证选择最佳参数
  5. 应用部署:保存模型并用于新图像的前景分割

这种方法的优势在于利用了DINOv3强大的自监督学习能力,无需大量标注数据就能获得高质量的视觉特征表示

1. 导入必要的库和模块

import io
import os
import pickle
import tarfile
import urllib
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import average_precision_score
from sklearn.linear_model import LogisticRegression
import torch
import torchvision.transforms.functional as TF
from tqdm import tqdm
from transformers import AutoModel

这些库分别用于:

  • 文件操作和数据处理(io, os, pickle等)
  • 图像处理(PIL, torchvision)
  • 数值计算和科学计算(numpy, scipy)
  • 机器学习(sklearn)
  • 深度学习(torch)
  • 进度显示(tqdm)
  • 模型加载(transformers)

2. 加载DINOv3预训练模型

model = AutoModel.from_pretrained(
r'D:\7studying\DinoV3_Study\dinov3-main\PreModels\dinov3-vits16-pretrain-lvd1689m',
local_files_only=True
)

加载本地的DINOv3预训练视觉Transformer模型,该模型已经学习了丰富的视觉特征表示。这里加载的是dinov3-vits16-pretrain-lvd1689m模型。

3. 数据加载和预处理

def load_images_from_path(base_path):
images = []
for name in os.listdir(base_path):
image_path = os.path.join(base_path, name)
image = Image.open(image_path)
images.append(image)
return images
images = load_images_from_path(r'D:\7studying\DinoV3_Study\dinov3-main\datasets\data1\images')
labels = load_images_from_path(r'D:\7studying\DinoV3_Study\dinov3-main\datasets\data1\masks')

加载图像和对应的mask标签数据,用于训练前景分割模型。
在这里插入图片描述

4. 数据可视化

# 显示第一张图像及其mask、前景和背景
data_to_show = [image, mask, foreground, background]
data_labels = ["Image", "Mask", "Foreground", "Background"]
plt.figure(figsize=(16, 4), dpi=300)
for i in range(len(data_to_show)):
plt.subplot(1, len(data_to_show), i + 1)
plt.imshow(data_to_show[i])
plt.axis('off')
plt.title(data_labels[i], fontsize=12)

可视化展示原始图像、mask标签、前景和背景,帮助理解数据。
在这里插入图片描述

5. 图像预处理函数

def resize_transform(mask_image, image_size=768, patch_size=16):
w, h = 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)
resized_image = TF.resize(mask_image, target_size)
tensor_image = TF.to_tensor(resized_image)
return tensor_image, (h_patches, w_patches)

将图像调整为适合ViT模型处理的尺寸,确保图像尺寸能被patch大小(16)整除。
在这里插入图片描述

在这里插入图片描述

6. 特征提取和训练数据准备

with torch.inference_mode():
for i in tqdm(range(n_images), desc="Processing images"):
# 1. 加载mask并量化
mask_i = labels[i].split()[-1]
mask_i_resized, (h_patches, w_patches) = resize_transform(mask_i)
with torch.no_grad():
mask_i_quantized = patch_quant_filter(mask_i_resized).squeeze().view(-1).detach().cpu()
# 2. 加载并预处理图像
image_i = images[i].convert('RGB')
image_i_resized,_ = resize_transform(image_i)
image_i_resized = TF.normalize(image_i_resized, mean=IMAGENET_MEAN, std=IMAGENET_STD)
image_i_resized = image_i_resized.unsqueeze(0)
# 3. 使用DINOv3提取特征
outputs = model(image_i_resized)
patch_features = outputs.last_hidden_state[:, 1:, :]  # 去掉cls token
# 4. 确保特征和标签数量一致
if actual_patches > expected_patches:
patch_features = patch_features[:, :expected_patches, :]

这是整个流程的核心部分:

  1. Mask处理:将mask图像量化为patch级别的标签
  2. 图像预处理:调整图像大小并进行标准化
  3. 特征提取:使用DINOv3模型提取每个patch的特征表示
  4. 数据对齐:确保特征向量和标签数量一致

7. 数据过滤和准备

# keeping only the patches that have clear positive or negative label
idx = (ys < 0.01) | (ys > 0.99)
  xs = xs[idx]
  ys = ys[idx]
  image_index = image_index[idx]

只保留标签非常明确(接近0或1)的patch,过滤掉模糊的中间值,提高训练质量。

8. 模型训练和验证

# 使用留一法交叉验证寻找最佳参数
cs = np.logspace(-7, 0, 8)
scores = np.zeros((n_images, len(cs)))
for i in range(n_images):
# 留一法:用除第i张图像外的所有图像训练,用第i张图像验证
train_selection = image_index != float(i)
fold_x = xs[train_selection].numpy()
fold_y = (ys[train_selection] > 0).long().numpy()
val_x = xs[~train_selection].numpy()
val_y = (ys[~train_selection] > 0).long().numpy()
for j, c in enumerate(cs):
# 训练逻辑回归分类器
clf = LogisticRegression(random_state=0, C=c, max_iter=10000).fit(fold_x, fold_y)
output = clf.predict_proba(val_x)
precision, recall, thresholds = precision_recall_curve(val_y, output[:, 1])
s = average_precision_score(val_y, output[:, 1])
scores[i, j] = s

使用留一法交叉验证训练逻辑回归器,寻找最佳的正则化参数C。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9. 最终模型训练和保存

由上图可以看出c=1.0时,模型性能最佳,这里直接取c=1.0,进行LogisticRegression回归器的模型训练;

# 使用最佳参数训练最终模型
clf = LogisticRegression(random_state=0, C=1.0, max_iter=100000, verbose=2).fit(xs.numpy(), (ys > 0).long().numpy())
# 保存模型
with open(model_path, "wb") as f:
pickle.dump(clf, f)

使用所有数据训练最终的前景分割分类器,并将其保存到磁盘。

10. 测试和可视化

# 对测试图像进行预测
with torch.inference_mode():
outputs = model(test_image_normalized.unsqueeze(0))
patch_features = outputs.last_hidden_state[:, 1:, :]
x = patch_features.squeeze().detach().cpu()
# 使用训练好的分类器预测前景概率
fg_score = clf.predict_proba(x)[:, 1].reshape(h_patches, w_patches)
fg_score_mf = torch.from_numpy(signal.medfilt2d(fg_score, kernel_size=3))
# 可视化结果
plt.figure(figsize=(9, 3), dpi=300)
plt.subplot(1, 3, 1)
plt.imshow(test_image_resized.permute(1, 2, 0))
plt.title('input image')
plt.subplot(1, 3, 2)
plt.imshow(fg_score)
plt.title('foreground score')
plt.subplot(1, 3, 3)
plt.imshow(fg_score_mf)
plt.title('+ median filter')

对新图像进行前景分割预测,并可视化结果,包括原始图像、前景得分图和经过中值滤波平滑的结果。
在这里插入图片描述

总结

这种方法的优势在于利用了DINOv3强大的自监督学习能力,无需大量标注数据就能获得高质量的视觉特征表示。
如果感觉不错的小伙伴,感谢你们的点赞关注。后续还会出一些其他的使用案例~


在这里插入图片描述

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

posted @ 2025-11-05 08:15  yangykaifa  阅读(0)  评论(0)    收藏  举报