DINOv2 图像分类实战:特征提取、SVM 训练与样本检索

DINOv2 图像分类实战:特征提取、SVM 训练与样本检索
DINOv2 图像分类实战特征提取、SVM 训练与样本检索这篇教程根据我复现 DINOv2 图像分类流程时整理重点演示如何提取 DINOv2 特征、用 SVM 做分类器、并对单张图片进行分类验证。DINOv2 本身更像强特征骨干实际落地时常配合传统分类器或检索方法使用。本文适合把 DINOv2 当作特征提取器来理解。本文会重点跑通以下流程安装依赖并获取分类数据集加载 DINOv2 预训练骨干提取图像 embedding 并训练 SVM对单张样本进行分类预测保存或复用特征用于后续任务如果你正在系统学习目标检测、实例分割、OCR、多目标跟踪或视觉大模型建议收藏本文配套 notebook、示例图片和运行环境说明后续会继续整理。如果环境配置卡住可以在评论区说明具体报错。 文章目录DINOv2 图像分类实战特征提取、SVM 训练与样本检索⚙️ 环境准备 安装依赖 从数据集后台获取分类数据集 加载 DINOv2 模型 提取特征与构建索引️ 训练分类器 单图分类验证 小结 同系列教程汇总⚙️ 环境准备先检查运行环境并安装依赖。建议优先使用带 NVIDIA GPU 的环境避免推理和训练阶段显存不足。importnumpyasnpimporttorchimporttorchvision.transformsasTfromPILimportImageimportosimportcv2importjsonimportglobfromtqdm.notebookimporttqdm 安装依赖YOLOv8 的检测训练直接使用 Ultralytics依赖很轻。!pip install supervision-q 从数据集后台获取分类数据集从数据集后台导出文件夹格式分类数据直接按目录读取即可。importsupervisionassv# 从数据集后台下载分类数据集后使用文件夹结构直接读取。DATASET_DIR/content/dataset# 修改为数据集后台导出的数据集目录projectNonedatasetNonecwdos.getcwd()ROOT_DIRos.path.join(cwd,MIT-Indoor-Scene-Recognition-5/train)labels{}forfolderinos.listdir(ROOT_DIR):forfileinos.listdir(os.path.join(ROOT_DIR,folder)):iffile.endswith(.jpg):full_nameos.path.join(ROOT_DIR,folder,file)labels[full_name]folder fileslabels.keys() 加载 DINOv2 模型DINOv2 作为特征提取器使用不需要额外微调也能得到不错的 embedding。dinov2_vits14torch.hub.load(facebookresearch/dinov2,dinov2_vits14)devicetorch.device(cudaiftorch.cuda.is_available()elsecpu)dinov2_vits14.to(device)transform_imageT.Compose([T.ToTensor(),T.Resize(244),T.CenterCrop(224),T.Normalize([0.5],[0.5])]) 提取特征与构建索引先把所有训练图片转成 embedding再用于后续分类器训练。defload_image(img:str)-torch.Tensor: Load an image and return a tensor that can be used as an input to DINOv2. imgImage.open(img)transformed_imgtransform_image(img)[:3].unsqueeze(0)returntransformed_imgdefcompute_embeddings(files:list)-dict: Create an index that contains all of the images in the specified list of files. all_embeddings{}withtorch.no_grad():fori,fileinenumerate(tqdm(files)):embeddingsdinov2_vits14(load_image(file).to(device))all_embeddings[file]np.array(embeddings[0].cpu().numpy()).reshape(1,-1).tolist()withopen(all_embeddings.json,w)asf:f.write(json.dumps(all_embeddings))returnall_embeddingsembeddingscompute_embeddings(files)️ 训练分类器这里用一个简单的 SVM快速验证 DINOv2 特征的可分性。fromsklearnimportsvm clfsvm.SVC(gammascale)y[labels[file]forfileinfiles]embedding_listlist(embeddings.values())clf.fit(np.array(embedding_list).reshape(-1,384),y) 单图分类验证最后拿一张测试图片检查分类结果是否符合预期。input_fileMIT-Indoor-Scene-Recognition-5/test/elevator/elevator_google_0053_jpg.rf.41487c3b9c1690a5de26ee0218452627.jpgnew_imageload_image(input_file)%matplotlib inline sv.plot_image(imagecv2.imread(input_file),size(8,8))withtorch.no_grad():embeddingdinov2_vits14(new_image.to(device))predictionclf.predict(np.array(embedding[0].cpu()).reshape(1,-1))print()print(Predicted class: prediction[0]) 小结DINOv2 这类特征模型的关键不是复杂训练而是把特征提取得稳定、再搭配一个足够简单且可解释的分类器。这一类 notebook 建议按“先环境、再数据、再单样例、最后批量推理”的顺序复现。遇到报错时优先检查 GPU、依赖版本、数据集目录和模型权重路径。后续我会继续按源项目顺序整理同系列中的目标检测、实例分割、OCR、多目标跟踪和视觉大模型教程。 同系列教程汇总Google Gemini 3.5 Flash 零样本目标检测教程从提示词到可视化结果GLM-OCR 文档识别实战教程从验证码、公式到车牌 OCRRF-DETR ByteTrack 多目标跟踪实战教程从命令行到 Python 视频轨迹可视化SAM 3 图像分割实战教程文本、框和点提示的多种分割方式DINOv2 图像分类实战特征提取、SVM 训练与样本检索-本文