Python CLIP 实现文搜图
作者:追风剑情 发布于:2026-5-28 18:13 分类:AI
"""
Chinese-CLIP 文搜图(中文查询)完整示例
- 使用本地 OFA-Sys/chinese-clip-vit-base-patch16 模型
- ChromaDB 余弦距离检索
- 国内镜像加速下载
"""
# ==================== 0. 设置镜像(必须在导入 transformers 之前) ====================
import os
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
# ==================== 1. 导入依赖 ====================
import torch
import numpy as np
from PIL import Image
from transformers import ChineseCLIPProcessor, ChineseCLIPModel
import chromadb
# ==================== 2. 加载 CLIP 模型 ====================
device = "cuda" if torch.cuda.is_available() else "cpu"
model_name = "OFA-Sys/chinese-clip-vit-base-patch16"
model = ChineseCLIPModel.from_pretrained(model_name).to(device)
processor = ChineseCLIPProcessor.from_pretrained(model_name)
model.eval()
print(f"模型加载完成,设备: {device}")
# ==================== 3. 特征提取函数(使用底层 API,稳定可靠) ====================
def get_image_embedding(image_path):
"""返回归一化的 512 维图像特征向量 (list)"""
image = Image.open(image_path).convert("RGB")
inputs = processor(images=image, return_tensors="pt").to(device)
with torch.no_grad():
# 视觉模型提取特征
vision_outputs = model.vision_model(pixel_values=inputs['pixel_values'])
# 取 [CLS] 标记(第一个 token),与文本处理保持一致
cls_token = vision_outputs.last_hidden_state[:, 0, :] # [1, hidden_size]
# 通过 visual_projection 映射到 512 维
image_features = model.visual_projection(cls_token)
# L2 归一化
image_features = image_features / image_features.norm(p=2, dim=-1, keepdim=True)
return image_features[0].cpu().numpy().tolist()
def get_text_embedding(text):
"""返回归一化的 512 维文本特征向量 (list)"""
inputs = processor(text=text, return_tensors="pt", padding=True).to(device)
with torch.no_grad():
# 1. 获取文本模型的原始输出
text_outputs = model.text_model(**inputs)
# 2. 取 [CLS] 标记的隐藏状态(第一个 token)
# last_hidden_state shape: [batch_size, seq_len, hidden_size]
cls_token = text_outputs.last_hidden_state[:, 0, :] # [1, hidden_size]
# 3. 通过 text_projection 层映射到 512 维
text_features = model.text_projection(cls_token)
# L2 归一化
text_features = text_features / text_features.norm(p=2, dim=-1, keepdim=True)
return text_features[0].cpu().numpy().tolist()
# ==================== 4. 初始化 ChromaDB(余弦距离) ====================
client = chromadb.PersistentClient(path="./chroma_clip_cn_data")
collection = client.get_or_create_collection(
name="clip_images_cn",
metadata={"hnsw:space": "cosine"}
)
# 清空旧数据(如果有)
if collection.count() > 0:
collection.delete(ids=collection.get()["ids"])
print("已清空旧集合")
# ==================== 5. 准备图片数据 ====================
image_files = ["cat.png", "dog.png", "car.png"]
image_descriptions = [
"一只毛茸茸的可爱猫咪,坐在柔软的垫子上",
"一只快乐的狗在阳光明媚的公园里玩接球游戏,尾巴摇来摇去",
"一辆现代红色汽车在风景优美的沿海公路上行驶"
]
ids = []
embeddings = []
metadatas = []
print("\n正在提取图片特征...")
for i, img_file in enumerate(image_files):
if not os.path.exists(img_file):
print(f"❌ 文件不存在: {img_file}")
continue
emb = get_image_embedding(img_file)
ids.append(f"img_{i+1}")
embeddings.append(emb)
metadatas.append({"filename": img_file, "description": image_descriptions[i]})
print(f"✅ {img_file} -> 维度 {len(emb)}, 范数 {np.linalg.norm(emb):.6f}")
# 存入 ChromaDB
collection.add(ids=ids, embeddings=embeddings, metadatas=metadatas)
print(f"\n✅ 成功存入 {collection.count()} 张图片\n")
# ==================== 6. 文搜图查询函数 ====================
def search_text_to_image(query_text, n_results=3):
print(f"查询文本: \"{query_text}\"")
query_vec = get_text_embedding(query_text)
results = collection.query(
query_embeddings=[query_vec],
n_results=n_results,
include=["metadatas", "distances"]
)
print("搜索结果(距离值越小越相似):")
for i, (meta, dist) in enumerate(zip(results["metadatas"][0], results["distances"][0])):
# 核心修改:直接使用 distance 进行排序,这就是最正确的用法
print(f" {i+1}. {meta['filename']} (余弦距离: {dist:.4f}) - {meta['description']}")
print()
# ==================== 7. 测试查询 ====================
if __name__ == "__main__":
search_text_to_image("一只长胡须的毛茸茸动物")
search_text_to_image("摇尾巴的四条腿朋友")
search_text_to_image("公路上行驶的轿车")
标签: AI
日历
最新文章
随机文章
热门文章
分类
存档
- 2026年5月(29)
- 2026年4月(7)
- 2026年3月(15)
- 2026年2月(3)
- 2026年1月(6)
- 2025年12月(1)
- 2025年11月(1)
- 2025年9月(3)
- 2025年7月(4)
- 2025年6月(5)
- 2025年5月(1)
- 2025年4月(5)
- 2025年3月(4)
- 2025年2月(3)
- 2025年1月(1)
- 2024年12月(5)
- 2024年11月(5)
- 2024年10月(5)
- 2024年9月(3)
- 2024年8月(3)
- 2024年7月(11)
- 2024年6月(3)
- 2024年5月(9)
- 2024年4月(10)
- 2024年3月(11)
- 2024年2月(24)
- 2024年1月(12)
- 2023年12月(3)
- 2023年11月(9)
- 2023年10月(7)
- 2023年9月(2)
- 2023年8月(7)
- 2023年7月(9)
- 2023年6月(6)
- 2023年5月(7)
- 2023年4月(11)
- 2023年3月(6)
- 2023年2月(11)
- 2023年1月(8)
- 2022年12月(2)
- 2022年11月(4)
- 2022年10月(10)
- 2022年9月(2)
- 2022年8月(13)
- 2022年7月(7)
- 2022年6月(11)
- 2022年5月(18)
- 2022年4月(29)
- 2022年3月(5)
- 2022年2月(6)
- 2022年1月(8)
- 2021年12月(5)
- 2021年11月(3)
- 2021年10月(4)
- 2021年9月(9)
- 2021年8月(14)
- 2021年7月(8)
- 2021年6月(5)
- 2021年5月(2)
- 2021年4月(3)
- 2021年3月(7)
- 2021年2月(2)
- 2021年1月(8)
- 2020年12月(7)
- 2020年11月(2)
- 2020年10月(6)
- 2020年9月(9)
- 2020年8月(10)
- 2020年7月(9)
- 2020年6月(18)
- 2020年5月(4)
- 2020年4月(25)
- 2020年3月(38)
- 2020年1月(21)
- 2019年12月(13)
- 2019年11月(29)
- 2019年10月(44)
- 2019年9月(17)
- 2019年8月(18)
- 2019年7月(25)
- 2019年6月(25)
- 2019年5月(17)
- 2019年4月(10)
- 2019年3月(36)
- 2019年2月(35)
- 2019年1月(28)
- 2018年12月(30)
- 2018年11月(22)
- 2018年10月(4)
- 2018年9月(7)
- 2018年8月(13)
- 2018年7月(13)
- 2018年6月(6)
- 2018年5月(5)
- 2018年4月(13)
- 2018年3月(5)
- 2018年2月(3)
- 2018年1月(8)
- 2017年12月(35)
- 2017年11月(17)
- 2017年10月(16)
- 2017年9月(17)
- 2017年8月(20)
- 2017年7月(34)
- 2017年6月(17)
- 2017年5月(15)
- 2017年4月(32)
- 2017年3月(8)
- 2017年2月(2)
- 2017年1月(5)
- 2016年12月(14)
- 2016年11月(26)
- 2016年10月(12)
- 2016年9月(25)
- 2016年8月(32)
- 2016年7月(14)
- 2016年6月(21)
- 2016年5月(17)
- 2016年4月(13)
- 2016年3月(8)
- 2016年2月(8)
- 2016年1月(18)
- 2015年12月(13)
- 2015年11月(15)
- 2015年10月(12)
- 2015年9月(18)
- 2015年8月(21)
- 2015年7月(35)
- 2015年6月(13)
- 2015年5月(9)
- 2015年4月(4)
- 2015年3月(5)
- 2015年2月(4)
- 2015年1月(13)
- 2014年12月(7)
- 2014年11月(5)
- 2014年10月(4)
- 2014年9月(8)
- 2014年8月(16)
- 2014年7月(26)
- 2014年6月(22)
- 2014年5月(28)
- 2014年4月(15)
友情链接
- Unity官网
- Unity圣典
- Unity在线手册
- Unity中文手册(圣典)
- Unity官方中文论坛
- Unity游戏蛮牛用户文档
- Unity下载存档
- Unity引擎源码下载
- Unity服务
- Unity Ads
- wiki.unity3d
- Visual Studio Code官网
- SenseAR开发文档
- MSDN
- C# 参考
- C# 编程指南
- .NET Framework类库
- .NET 文档
- .NET 开发
- WPF官方文档
- uLua
- xLua
- SharpZipLib
- Protobuf-net
- Protobuf.js
- OpenSSL
- OPEN CASCADE
- JSON
- MessagePack
- C在线工具
- 游戏蛮牛
- GreenVPN
- 聚合数据
- 热云
- 融云
- 腾讯云
- 腾讯开放平台
- 腾讯游戏服务
- 腾讯游戏开发者平台
- 腾讯课堂
- 微信开放平台
- 腾讯实时音视频
- 腾讯即时通信IM
- 微信公众平台技术文档
- 白鹭引擎官网
- 白鹭引擎开放平台
- 白鹭引擎开发文档
- FairyGUI编辑器
- PureMVC-TypeScript
- 讯飞开放平台
- 亲加通讯云
- Cygwin
- Mono开发者联盟
- Scut游戏服务器引擎
- KBEngine游戏服务器引擎
- Photon游戏服务器引擎
- 码云
- SharpSvn
- 腾讯bugly
- 4399原创平台
- 开源中国
- Firebase
- Firebase-Admob-Unity
- google-services-unity
- Firebase SDK for Unity
- Google-Firebase-SDK
- AppsFlyer SDK
- android-repository
- CQASO
- Facebook开发者平台
- gradle下载
- GradleBuildTool下载
- Android Developers
- Google中国开发者
- AndroidDevTools
- Android社区
- Android开发工具
- Google Play Games Services
- Google商店
- Google APIs for Android
- 金钱豹VPN
- TouchSense SDK
- MakeHuman
- Online RSA Key Converter
- Windows UWP应用
- Visual Studio For Unity
- Open CASCADE Technology
- 慕课网
- 阿里云服务器ECS
- 在线免费文字转语音系统
- AI Studio
- 网云穿
- 百度网盘开放平台
- 迅捷画图
- 菜鸟工具
- [CSDN] 程序员研修院
- 华为人脸识别
- 百度AR导航导览SDK
- 海康威视官网
- 海康开放平台
- 海康SDK下载
- git download
- Open CASCADE
- CascadeStudio
- OpenClaw中文社区
- three.js manual
- SVG官方文档
交流QQ群
-
Flash游戏设计: 86184192
Unity游戏设计: 171855449
游戏设计订阅号







