CLIP-GmP-ViT-L-14图文匹配工具代码实例:扩展支持JSON批量测试与CSV导出

发布时间:2026/7/2 18:02:15

CLIP-GmP-ViT-L-14图文匹配工具代码实例:扩展支持JSON批量测试与CSV导出 CLIP-GmP-ViT-L-14图文匹配工具代码实例扩展支持JSON批量测试与CSV导出你是不是也遇到过这样的场景手里有一堆图片想看看它们和哪些文字描述最匹配或者想批量测试一个模型在不同图片和文字组合下的表现手动一张张上传、一个个输入文本不仅效率低下结果还散落在各处难以整理和分析。今天要介绍的就是这样一个能帮你解决这些问题的工具。它基于强大的CLIP-GmP-ViT-L-14模型不仅能让你在网页上轻松点几下就完成图文匹配测试还新增了两个超级实用的功能支持JSON文件批量导入测试数据以及将匹配结果一键导出为CSV文件。简单来说它从一个好用的“单次测试工具”升级成了一个能处理“批量任务”和“数据导出”的效率神器。无论你是想快速验证模型效果还是需要系统性地评估大量数据这个工具都能让你事半功倍。1. 工具升级从手动测试到批量处理原来的工具已经很好用了上传一张图输入几个描述词马上就能看到哪个词和图片最配。但对于需要处理大量数据的研究、开发或者测试工作来说这还远远不够。想象一下如果你有100张商品图片和对应的10个候选描述用老方法你得操作1000次100张图 * 10次输入/张。这显然不现实。这次升级的核心就是解决“批量”和“导出”这两个痛点JSON批量测试你可以提前准备好一个JSON文件里面按格式写好所有要测试的图片路径和对应的文本描述列表。工具一次读取自动完成所有匹配计算。CSV结果导出所有匹配结果不再是“看一眼就过”而是可以完整地保存到CSV表格里。你可以用Excel打开进行排序、筛选、制作图表做进一步的分析。这样一来工具的定位就清晰了它既是快速验证创意的“玩具”也是支撑严肃数据工作的“生产力工具”。2. 环境准备与快速启动使用这个工具非常简单几乎不需要什么复杂的配置。我们一步步来。2.1 安装必要的软件包首先确保你的电脑上已经安装了Python建议3.8或以上版本。然后打开终端命令行用pip安装下面这几个必需的包pip install torch torchvision pip install transformers pip install streamlit pip install Pillow pip install pandas简单解释一下torchPyTorch深度学习框架CLIP模型运行的基础。transformersHugging Face的库里面包含了CLIP模型我们直接调用就行省去自己下载模型的麻烦。streamlit用来构建我们看到的那个网页界面写很少的代码就能做出交互效果。Pillow用来处理图片比如打开图片、调整尺寸。pandas新增的依赖用来处理数据表格特别是生成CSV文件。2.2 获取并运行工具代码工具的所有代码都写在一个Python文件里比如我们把它命名为clip_batch_tool.py。你可以直接复制下面的完整代码保存成这个文件。import streamlit as st import torch from PIL import Image from transformers import CLIPProcessor, CLIPModel import json import pandas as pd import os # 设置页面标题和布局 st.set_page_config(page_titleCLIP图文匹配测试工具 (批量版), layoutwide) st.title(️ CLIP-GmP-ViT-L-14 图文匹配测试工具) st.markdown(支持单张图片测试、**JSON文件批量测试**并可将结果**导出为CSV**。) # 使用缓存加载模型避免每次点击都重新加载 st.cache_resource def load_model(): 加载CLIP模型和处理器 try: model CLIPModel.from_pretrained(openai/clip-vit-large-patch14) processor CLIPProcessor.from_pretrained(openai/clip-vit-large-patch14) return model, processor except Exception as e: st.error(f模型加载失败: {e}) return None, None model, processor load_model() # 初始化session state用于存储历史结果 if batch_results not in st.session_state: st.session_state.batch_results [] # 在侧边栏创建功能选择选项卡 st.sidebar.header(功能选择) app_mode st.sidebar.radio( 请选择操作模式:, [单张图片测试, JSON文件批量测试] ) # 功能一单张图片测试模式 if app_mode 单张图片测试: st.header(单张图片测试) st.markdown(上传一张图片并输入多个文本描述用英文逗号分隔。) col1, col2 st.columns(2) with col1: # 图片上传区域 uploaded_file st.file_uploader(上传一张测试图片, type[jpg, jpeg, png]) if uploaded_file is not None: image Image.open(uploaded_file).convert(RGB) # 限制显示宽度避免图片过大 st.image(image, caption已上传的图片, width300) else: st.info(请上传一张JPG或PNG格式的图片。) image None with col2: # 文本输入区域 default_texts a dog, a cat, a car, a tree, a person text_input st.text_area( 输入几个可能的描述用英文逗号分隔:, valuedefault_texts, height150, help例如: a dog, a cat, a car, a sunny day, a building ) # 开始匹配按钮 if st.button(开始匹配, typeprimary) and image is not None and text_input.strip(): with st.spinner(正在计算图片与文本的相似度...): try: # 处理文本输入按逗号分割并去除空格 texts [t.strip() for t in text_input.split(,) if t.strip()] # 使用CLIP处理器准备输入 inputs processor(texttexts, imagesimage, return_tensorspt, paddingTrue) # 模型推理 with torch.no_grad(): outputs model(**inputs) # 计算相似度分数 (image-text) logits_per_image outputs.logits_per_image probs logits_per_image.softmax(dim1) # 将结果转换为易读的格式 results [] for text, prob in zip(texts, probs[0]): results.append({ 文本描述: text, 匹配度: round(prob.item() * 100, 2) }) # 按匹配度降序排序 results.sort(keylambda x: x[匹配度], reverseTrue) # 清空之前可能存在的旧结果 st.session_state.batch_results [] # 将本次结果存入session state用于后续导出 for res in results: st.session_state.batch_results.append({ 图片: uploaded_file.name, 文本描述: res[文本描述], 匹配度(%): res[匹配度] }) # 展示结果 st.subheader(匹配结果按匹配度降序排列:) for res in results: # 用进度条直观展示匹配度 st.progress(res[匹配度] / 100.0) st.write(f**{res[文本描述]}** — {res[匹配度]}%) except Exception as e: st.error(f计算过程中出错: {e}) elif image is None: st.warning(请先上传一张图片。) elif not text_input.strip(): st.warning(请输入至少一个文本描述。) # 功能二JSON文件批量测试模式 elif app_mode JSON文件批量测试: st.header(JSON文件批量测试) st.markdown( 在此模式下您可以上传一个JSON文件其中包含多组测试数据。 工具将自动读取并计算所有图片与对应文本描述的匹配度。 ) # JSON格式说明 with st.expander( JSON文件格式说明): st.code( [ { image_path: 图片的本地绝对路径或相对路径, candidate_texts: [描述1, 描述2, 描述3, ...] }, { image_path: 另一张图片的路径, candidate_texts: [描述A, 描述B, ...] } // ... 更多测试项 ] , languagejson) st.markdown(**注意**: image_path 必须是工具可以访问到的本地文件路径。) # JSON文件上传 uploaded_json st.file_uploader(上传JSON测试文件, type[json]) if uploaded_json is not None: try: # 读取并解析JSON test_data json.load(uploaded_json) st.success(f成功读取JSON文件包含 {len(test_data)} 组测试数据。) # 预览前几条数据 with st.expander(预览测试数据前3项): st.json(test_data[:3]) # 开始批量测试按钮 if st.button(开始批量测试, typeprimary): # 清空之前的结果 st.session_state.batch_results [] progress_bar st.progress(0) status_text st.empty() total_tasks len(test_data) for idx, task in enumerate(test_data): image_path task.get(image_path) candidate_texts task.get(candidate_texts, []) # 更新进度 progress (idx 1) / total_tasks progress_bar.progress(progress) status_text.text(f正在处理第 {idx1}/{total_tasks} 项: {image_path}) # 检查数据格式 if not image_path or not candidate_texts: st.warning(f第{idx1}项数据格式不完整已跳过。) continue # 检查图片文件是否存在 if not os.path.exists(image_path): st.warning(f图片文件不存在: {image_path}已跳过。) continue try: # 加载图片 image Image.open(image_path).convert(RGB) # 使用CLIP处理器准备输入 inputs processor(textcandidate_texts, imagesimage, return_tensorspt, paddingTrue) # 模型推理 with torch.no_grad(): outputs model(**inputs) # 计算相似度分数 logits_per_image outputs.logits_per_image probs logits_per_image.softmax(dim1) # 处理并存储结果 for text, prob in zip(candidate_texts, probs[0]): match_score round(prob.item() * 100, 2) st.session_state.batch_results.append({ 图片: os.path.basename(image_path), 文本描述: text, 匹配度(%): match_score, 原始图片路径: image_path }) except Exception as e: st.error(f处理图片时出错 {image_path}: {e}) continue progress_bar.empty() status_text.text(f批量测试完成共处理 {len(st.session_state.batch_results)} 条匹配结果。) # 显示批量结果摘要 if st.session_state.batch_results: st.subheader(批量测试结果摘要) # 转换为DataFrame便于显示 df_summary pd.DataFrame(st.session_state.batch_results) # 取每个图片匹配度最高的结果 top_results df_summary.loc[df_summary.groupby(图片)[匹配度(%)].idxmax()] st.dataframe(top_results[[图片, 文本描述, 匹配度(%)]]) except json.JSONDecodeError: st.error(上传的文件不是有效的JSON格式请检查文件内容。) except Exception as e: st.error(f处理JSON文件时发生错误: {e}) # 结果导出功能区始终显示只要有结果 if st.session_state.batch_results: st.sidebar.markdown(---) st.sidebar.header(结果导出) # 显示当前结果统计 st.sidebar.info(f当前共有 **{len(st.session_state.batch_results)}** 条匹配结果。) # 结果预览 with st.sidebar.expander(预览结果前5条): if st.session_state.batch_results: preview_df pd.DataFrame(st.session_state.batch_results[:5]) st.dataframe(preview_df[[图片, 文本描述, 匹配度(%)]]) # 导出为CSV if st.sidebar.button( 导出结果为CSV, typesecondary): df_to_export pd.DataFrame(st.session_state.batch_results) # 生成CSV数据 csv_data df_to_export.to_csv(indexFalse).encode(utf-8) # 提供下载按钮 st.sidebar.download_button( label点击下载CSV文件, datacsv_data, file_nameclip_match_results.csv, mimetext/csv, ) st.sidebar.success(CSV文件已准备就绪请点击上方按钮下载。) # 清空结果按钮 if st.sidebar.button(清空所有结果, typesecondary): st.session_state.batch_results [] st.sidebar.success(结果已清空。) st.rerun() # 页脚信息 st.sidebar.markdown(---) st.sidebar.markdown(### 关于) st.sidebar.info( **工具特性**: - 基于 CLIP-GmP-ViT-L-14 模型 - 纯本地运行无需网络 - 支持单张测试与批量测试 - 结果可导出为CSV **使用提示**: - 批量测试时请确保JSON中的图片路径正确 - 匹配度基于Softmax计算总和为100% )保存好文件后打开终端进入到这个文件所在的目录运行下面这条命令streamlit run clip_batch_tool.py稍等几秒钟你会看到终端输出一个本地网络地址通常是http://localhost:8501。用浏览器打开这个地址就能看到工具的界面了。3. 核心功能详解与使用工具界面很简洁主要分为两大块左边的功能选择区和右边的主操作区。我们分别看看两种模式怎么用。3.1 单张图片测试快速验证想法这个模式适合当你有一个新想法想快速验证一下CLIP模型会怎么理解某张图片时使用。操作步骤很简单选择模式在左边栏确保选中“单张图片测试”。上传图片在右边区域点击“上传一张测试图片”按钮从电脑里选一张图支持JPG和PNG格式。输入描述在下面的文本框里输入你想到的可能描述。注意要用英文逗号隔开比如a cute dog, a black cat, a red car, a sunny park。开始匹配点击蓝色的“开始匹配”按钮。几秒钟后结果就会显示出来。每个描述旁边会有一个进度条和一个百分比数字数字越大表示模型认为图片和这个描述越匹配。结果会自动从高到低排序一眼就能看出哪个描述“赢”了。举个例子你上传一张狗的照片输入“a dog, a cat, a car, a tree”。结果很可能是“a dog”匹配度最高比如95%“a cat”可能也有一点点分比如4%而“a car”和“a tree”几乎为0。这很直观地展示了CLIP的理解能力。3.2 JSON批量测试处理大量任务这是本次升级的重头戏。当你需要测试几十、上百甚至更多的图片时手动操作是不可行的。批量测试模式就是为此而生。关键在于准备一个格式正确的JSON文件。点击界面上的“JSON文件格式说明”可以看到详细的格式要求。简单来说这个JSON文件是一个列表列表里的每个元素代表一组测试。每组测试包含两个信息image_path图片在你电脑上的路径。candidate_texts一个列表里面是这张图片所有待测试的文本描述。一个简单的JSON文件例子[ { image_path: C:/Users/YourName/Pictures/dog1.jpg, candidate_texts: [a dog, a cat, an animal] }, { image_path: ./test_images/car1.png, candidate_texts: [a car, a vehicle, a bicycle, a red object] } ]使用步骤选择模式在左边栏切换到“JSON文件批量测试”。上传JSON文件点击上传按钮选择你准备好的JSON文件。开始测试点击“开始批量测试”按钮。接下来工具会自动完成所有工作读取JSON、按顺序加载每一张图片、计算它与所有候选描述的匹配度。界面上会有一个进度条让你清楚知道处理到第几项了。所有结果都会默默地被收集起来。3.3 结果导出让数据为你所用无论你是用单张模式还是批量模式只要产生了匹配结果它们都会被临时保存起来。这时注意看左边栏的下方会出现一个“结果导出”区域。这里会显示你当前有多少条结果还可以预览前几条。最重要的功能是那个“导出结果为CSV”按钮。点击它然后点击出现的“点击下载CSV文件”按钮一个名为clip_match_results.csv的文件就会下载到你的电脑。用Excel或任何表格软件打开它你会看到整齐的三列数据图片文件名、文本描述、匹配度(%)。有了这个CSV文件你可以排序按匹配度从高到低排快速找出最匹配的案例。筛选只看某一张图片的所有结果或者只看匹配度高于某个阈值的结果。分析计算平均匹配度、统计模型在不同类别图片上的表现等。存档保存测试记录方便后续回顾或报告。如果你开始新的测试想清空旧结果点一下“清空所有结果”按钮就行。4. 工具背后的原理CLIP模型如何工作这个工具用起来简单但背后的CLIP模型却很强大。理解它的基本原理能帮你更好地使用和解读结果。CLIPContrastive Language-Image Pre-training是OpenAI提出的一种模型它的核心思想是让模型学会图片和文字在同一个语义空间里的联系。你可以把它想象成学习一门外语。一开始图片和文字是两种不同的“语言”。通过大量的训练看数以亿计的图片-文字对CLIP模型逐渐学会了图片编码把一张图片转换成一组有意义的数字向量这组数字代表了图片的“含义”。文本编码把一段文字描述也转换成另一组数字向量代表文字的“含义”。对比学习如果一张图片和一段文字在训练时是配对的比如一张猫的图片和“a cat”这句话那么模型就调整参数让它们转换出来的两组数字非常“接近”。如果不配对就让它们的数字“远离”。当我们使用这个工具时流程是这样的你上传一张图片输入几个文本。工具内部的CLIP模型分别把图片和每一个文本都转换成它们对应的“含义向量”。工具计算图片向量和每一个文本向量之间的“距离”或“相似度”。这个相似度分数就是模型认为它们配对的概率。最后通过一个Softmax函数把所有文本的相似度分数转换成百分比保证它们的总和是100%。这个百分比就是最终展示的“匹配度”。所以你看到的“匹配度85%”并不是一个绝对的分数而是模型在给定的几个选项中认为该选项正确的相对概率。如果你换一组选项百分比分布会完全不同。5. 总结这个升级版的CLIP图文匹配工具在保留原有直观、易用特点的基础上通过增加JSON批量测试和CSV结果导出功能极大地扩展了它的应用场景和实用性。对于初学者和好奇者“单张图片测试”模式提供了一个零门槛的窗口让你可以即时与先进的AI模型互动直观感受跨模态理解的神奇。对于开发者、研究者或需要处理数据的人“批量测试”和“导出”功能将工具变成了一个严肃的生产力组件。你可以设计系统的测试用例自动化地收集大量数据并导出进行深入分析。工具的代码结构清晰完全本地运行保护了你的数据隐私。无论是嵌入到更大的项目中还是作为独立的测试工具它都能很好地完成任务。下次当你需要评估一组图片和文字的关联性或者只是想看看AI是如何“看”世界的不妨打开这个工具试试。从一张图片的快速验证到一个数据集的批量分析它都能成为你得力的助手。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

相关新闻