Qwen2.5-VL-Chord实战指南:多图批量处理+结果Excel导出自动化脚本
Qwen2.5-VL-Chord实战指南多图批量处理结果Excel导出自动化脚本1. 项目简介与核心价值如果你经常需要从大量图片中找出特定的物体比如从几百张产品图中找出所有“红色包装”的商品或者从监控录像截图里定位“戴帽子的人”传统方法要么靠人工一张张看要么得训练专门的检测模型费时费力。今天要介绍的Qwen2.5-VL-Chord视觉定位服务就是来解决这个痛点的。它基于强大的多模态大模型 Qwen2.5-VL你只需要用一句大白话告诉它“找什么”它就能在图片里精准地框出来告诉你具体位置坐标。更棒的是这个服务已经封装成了开箱即用的 Web 界面和 API部署简单调用方便。但官方文档主要讲的是单张图片的交互操作在实际工作中我们往往需要批量处理几十上百张图片并且把结果整理成结构化的表格方便后续分析和报告。所以这篇文章我要带你做两件特别实用的事写一个 Python 脚本实现多张图片的批量自动处理。把每张图片的识别结果找到了几个目标、坐标是什么自动整理并导出到 Excel 文件。学完这篇你就能把 Chord 从一个“玩具”变成真正的生产力工具大幅提升处理图像分析任务的效率。2. 环境准备与快速检查在开始写脚本之前我们得先确保 Chord 服务已经正常跑起来了。按照官方文档它通常通过 Supervisor 管理运行在服务器的某个端口上。2.1 确认服务状态打开你的终端如果是远程服务器就用 SSH 连上去输入以下命令supervisorctl status chord如果一切正常你会看到类似这样的输出chord RUNNING pid 135976, uptime 0:01:34看到RUNNING就说明服务已经在后台欢快地运行了。2.2 找到服务的访问地址Chord 默认会启动一个 Web 界面用 Gradio 做的通常运行在7860端口。你需要知道它的访问地址本地运行直接在浏览器打开http://localhost:7860远程服务器打开http://你的服务器IP地址:7860打开这个页面你应该能看到一个上传图片和输入文字提示的界面。先手动传一张图输入“找到图中的人”测试一下确保功能正常。这是我们后续自动化脚本能工作的基础。2.3 准备你的Python环境我们的批量处理脚本会在本地运行也可以放在服务器上需要安装几个必要的Python库。打开你的命令行创建一个新的虚拟环境推荐避免包冲突然后安装# 创建并激活虚拟环境可选但推荐 python -m venv chord_batch_env source chord_batch_env/bin/activate # Linux/Mac # 或者 chord_batch_env\Scripts\activate # Windows # 安装必要的库 pip install requests pillow openpyxl pandas简单解释一下这几个库是干嘛的requests用来发送HTTP请求和Chord服务的API“对话”。pillow(PIL)Python里处理图片的标准库用来打开、处理图片。openpyxlpandas黄金搭档用来创建、编辑和保存Excel文件。环境准备好我们就可以开始动手写核心脚本了。3. 核心脚本批量处理与Excel导出我把完整的脚本拆解成几个部分并加上详细注释让你能看懂每一行代码的目的。3.1 脚本完整代码创建一个新文件比如叫做batch_process_chord.py然后把下面的代码复制进去。import os import json import time from PIL import Image import requests import pandas as pd from typing import List, Dict, Any, Optional class ChordBatchProcessor: Qwen2.5-VL-Chord 批量图片处理器 功能批量发送图片进行视觉定位并将结果导出到Excel def __init__(self, api_url: str http://localhost:7860): 初始化处理器 Args: api_url: Chord服务的API地址默认是本地7860端口 self.api_url api_url.rstrip(/) # 构建完整的API端点 self.predict_url f{self.api_url}/api/predict def process_single_image(self, image_path: str, prompt: str) - Optional[Dict[str, Any]]: 处理单张图片 Args: image_path: 图片文件路径 prompt: 文本提示词如“找到图中的人” Returns: 包含处理结果的字典失败则返回None try: # 1. 打开并检查图片 with Image.open(image_path) as img: img.verify() # 验证图片完整性 # 重新打开因为verify()会关闭文件 img Image.open(image_path) # 2. 准备请求数据 # 注意这里模拟Gradio接口的格式实际可能需要根据Chord的API调整 files { image: (os.path.basename(image_path), open(image_path, rb), image/jpeg) } data { prompt: prompt } # 3. 发送POST请求到Chord服务 print(f正在处理: {image_path}) response requests.post(self.predict_url, filesfiles, datadata) # 4. 检查响应 if response.status_code 200: result response.json() print(f 处理成功找到 {len(result.get(boxes, []))} 个目标) return { image_path: image_path, prompt: prompt, boxes: result.get(boxes, []), # 边界框列表 text: result.get(text, ), # 模型原始输出文本 image_size: result.get(image_size, (0, 0)) } else: print(f 处理失败状态码: {response.status_code}, 响应: {response.text[:200]}) return None except Exception as e: print(f 处理图片时出错 {image_path}: {str(e)}) return None finally: # 确保文件描述符被关闭 if files in locals(): files[image][1].close() def process_batch(self, image_dir: str, prompt: str, extensions: List[str] [.jpg, .jpeg, .png, .bmp]) - List[Dict[str, Any]]: 批量处理一个目录下的所有图片 Args: image_dir: 图片目录路径 prompt: 统一的文本提示词 extensions: 支持的图片后缀名列表 Returns: 所有图片处理结果的列表 all_results [] # 获取目录下所有图片文件 image_files [] for ext in extensions: image_files.extend([f for f in os.listdir(image_dir) if f.lower().endswith(ext)]) print(f在目录 {image_dir} 中找到 {len(image_files)} 张图片) print(f提示词: {prompt}) print( * 50) # 逐张处理 for i, img_file in enumerate(image_files, 1): img_path os.path.join(image_dir, img_file) print(f[{i}/{len(image_files)}] , end) result self.process_single_image(img_path, prompt) if result: all_results.append(result) # 添加短暂延迟避免对服务器造成过大压力 time.sleep(0.5) print( * 50) print(f批量处理完成成功处理 {len(all_results)}/{len(image_files)} 张图片) return all_results def results_to_dataframe(self, results: List[Dict[str, Any]]) - pd.DataFrame: 将处理结果转换为Pandas DataFrame方便导出Excel Args: results: process_batch返回的结果列表 Returns: 结构化的DataFrame rows [] for result in results: base_info { 图片文件名: os.path.basename(result[image_path]), 提示词: result[prompt], 检测目标数量: len(result[boxes]), 图片宽度: result[image_size][0], 图片高度: result[image_size][1] } # 如果没有检测到目标也记录一行 if not result[boxes]: rows.append({**base_info, 目标序号: 无, x1: , y1: , x2: , y2: }) else: # 每个目标单独一行 for i, box in enumerate(result[boxes], 1): row { **base_info, 目标序号: i, x1: box[0], # 左上角x y1: box[1], # 左上角y x2: box[2], # 右下角x y2: box[3] # 右下角y } rows.append(row) return pd.DataFrame(rows) def export_to_excel(self, df: pd.DataFrame, output_path: str chord_results.xlsx): 将DataFrame导出到Excel文件 Args: df: 包含结果的DataFrame output_path: 输出的Excel文件路径 # 使用Excel写入器可以设置更多格式 with pd.ExcelWriter(output_path, engineopenpyxl) as writer: df.to_excel(writer, sheet_name检测结果, indexFalse) # 获取工作表对象进行格式调整 worksheet writer.sheets[检测结果] # 自动调整列宽简单实现 for column in worksheet.columns: max_length 0 column_letter column[0].column_letter for cell in column: try: if len(str(cell.value)) max_length: max_length len(str(cell.value)) except: pass adjusted_width min(max_length 2, 50) # 最大宽度限制 worksheet.column_dimensions[column_letter].width adjusted_width print(f结果已成功导出到: {output_path}) print(f总记录数: {len(df)} 行) # 主函数使用示例 if __name__ __main__: # 1. 初始化处理器如果Chord服务在别的机器或端口修改这里 processor ChordBatchProcessor(api_urlhttp://localhost:7860) # 改为你的实际地址 # 2. 设置要处理的图片目录和提示词 IMAGE_DIR ./test_images # 你的图片文件夹路径 PROMPT 找到图中的人 # 你的查找目标 # 3. 批量处理图片 print(开始批量处理图片...) results processor.process_batch(IMAGE_DIR, PROMPT) if results: # 4. 转换为DataFrame df processor.results_to_dataframe(results) # 5. 导出到Excel excel_path fchord_results_{time.strftime(%Y%m%d_%H%M%S)}.xlsx processor.export_to_excel(df, excel_path) # 6. 在控制台简单预览一下 print(\n结果预览前5行:) print(df.head()) else: print(没有成功处理任何图片请检查图片路径、提示词和服务状态。)3.2 脚本使用步骤详解现在我来带你一步步跑通这个脚本。第一步准备测试图片在你的电脑上创建一个文件夹比如叫test_images里面放几张包含人物的图片比如从网上下载的合影、街拍图。这是我们的测试素材。第二步修改脚本配置打开刚才创建的batch_process_chord.py文件找到最下面if __name__ __main__:部分修改两个变量IMAGE_DIR ./test_images确保这个路径指向你刚创建的图片文件夹。PROMPT 找到图中的人这是你要查找的目标可以根据图片内容改成“找到图中的汽车”、“定位所有的狗”等。第三步运行脚本在终端里确保你已经在脚本所在的目录并且激活了之前安装好依赖的Python环境然后运行python batch_process_chord.py你会看到脚本开始运行打印出找到的图片数量然后一张张处理显示进度和结果。第四步查看结果脚本运行结束后会在当前文件夹生成一个Excel文件名字类似chord_results_20250415_143022.xlsx时间戳会自动变化。用Excel或WPS打开它你会看到一个结构清晰的表格。3.3 Excel结果文件解读生成的Excel表格大概长这样图片文件名提示词检测目标数量图片宽度图片高度目标序号x1y1x2y2party.jpg找到图中的人5192010801320150420450party.jpg找到图中的人5192010802600200700500street.png找到图中的人212807201100300250600street.png找到图中的人212807202800350950650这个格式非常实用每行一个目标一张图片如果找到5个人就会展开成5行数据每行对应一个人框。关键信息齐全文件名、用的什么提示词、图片尺寸、每个框的精确坐标都有了。直接可用这些数据可以直接用来做统计分析或者导入到其他绘图软件里还原标注框。4. 进阶技巧与实用建议掌握了基础用法后我们来看看如何让这个脚本更强大、更贴合你的实际需求。4.1 处理不同类型的任务脚本里的PROMPT是固定的但实际工作可能需要变化。这里有两种改进思路方案A为每张图片单独设置提示词如果你有一批图片每张要找的东西不一样可以准备一个CSV配置文件。创建一个tasks.csvimage_name,prompt product01.jpg,找到图中的红色瓶子 street_view.png,定位所有的汽车 office.jpg,找到戴眼镜的人修改脚本读取这个CSV文件然后循环处理每一行将图片和对应的提示词传给process_single_image函数。方案B用一张图测试多个提示词有时候你想知道同一个物体用不同说法能不能找到。# 在 process_batch 函数内部可以这样调整 prompts_to_try [找到图中的人, 定位人物, 检测所有人] all_results [] for img_file in image_files: img_path os.path.join(image_dir, img_file) for prompt in prompts_to_try: result self.process_single_image(img_path, prompt) if result: all_results.append(result) time.sleep(0.5)这样最终Excel里会记录下同一张图片在不同提示词下的结果方便你对比哪种描述更准确。4.2 处理API返回格式的差异我提供的脚本假设Chord的API返回格式是{boxes: [...], text: ..., image_size: ...}。这是常见格式但不同版本的Chord服务可能有细微差别。如果运行脚本时发现报错或者Excel里坐标数据是空的很可能是API返回的数据结构不一样。你需要自己探查一下先用浏览器打开Chord的Web界面http://localhost:7860。打开浏览器的“开发者工具”按F12切换到“网络”(Network)标签页。在Web界面上传一张图输入提示词点击分析。在开发者工具的网络请求列表里找到一个类似api/predict的请求点击查看它的“响应”(Response)。仔细看返回的JSON数据长什么样重点关注边界框坐标在哪里。比如你可能发现坐标藏在result[data][0][box]这样的路径里。那么你就需要修改脚本中process_single_image函数里解析结果的那部分代码# 修改前假设的格式 boxes result.get(boxes, []) # 修改后根据实际响应调整 # 例如如果实际返回是 {data: [{box: [x1,y1,x2,y2], ...}]} boxes [item[box] for item in result.get(data, []) if box in item]这就是编程解决实际问题的关键观察、调试、适配。4.3 错误处理与日志完善生产环境用的脚本必须健壮。我们可以在现有基础上增加重试机制网络请求偶尔会失败可以自动重试一两次。def process_single_image_with_retry(self, image_path, prompt, max_retries2): for attempt in range(max_retries): result self.process_single_image(image_path, prompt) if result is not None: return result print(f 第{attempt1}次尝试失败等待1秒后重试...) time.sleep(1) print(f 图片 {image_path} 处理失败已重试{max_retries}次) return None更详细的日志把运行过程记录到文件里方便以后查问题。import logging logging.basicConfig(filenamebatch_process.log, levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s) # 然后在关键步骤用 logging.info(...) 代替 print(...)进度保存如果处理几百张图中途脚本崩溃了难道要重头再来可以每处理完一张就把结果临时保存到一个JSON文件里。下次运行时先加载这个JSON文件跳过已经处理过的图片。5. 总结与扩展思路通过这个实战项目我们不仅学会了如何调用Chord服务的API更重要的是掌握了将AI能力批量化和流程化的思路。这个“单张图片交互 → 批量脚本处理 → 结果结构化导出”的流程可以套用到很多类似的AI服务上。回顾一下我们的成果一个可以一键批量处理文件夹内所有图片的Python类 (ChordBatchProcessor)。一个清晰明了、每行一个检测目标的Excel输出表格。一套遇到API格式变化时的调试和适配方法。你可以继续扩展的方向生成可视化报告用matplotlib或opencv读取原始图片和坐标把框画回去保存成新的标注图和Excel结果一起打包。集成到工作流把这个脚本做成一个命令行工具或者封装成一个简单的Web服务让不熟悉代码的同事也能上传文件夹、下载Excel。性能监控在脚本里记录每张图片的处理耗时统计成功率帮你评估Chord服务的稳定性和速度。多服务对比如果你还在测试其他类似的视觉定位模型可以写一个类似的脚本然后对比它们在同一批测试图上的准确率和速度用数据来做选型决策。技术工具的价值在于解决实际问题。希望这个基于Qwen2.5-VL-Chord的批量处理脚本能真正帮你从繁琐的图片查找工作中解放出来把精力花在更重要的分析和决策上。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

相关新闻

Chandra新手入门:从安装到对话的完整指南

Chandra新手入门:从安装到对话的完整指南

Chandra新手入门:从安装到对话的完整指南 1. 为什么你需要一个本地AI聊天助手? 你有没有过这样的体验:在深夜写方案时卡壳,想找个懂行的人聊聊思路;或者需要快速生成一段产品介绍文案,却反复修改都不满意…

2026/7/7 15:06:08 阅读更多 →
nomic-embed-text-v2-moe GPU算力适配指南:A10/T4/V100显存占用与batch size调优

nomic-embed-text-v2-moe GPU算力适配指南:A10/T4/V100显存占用与batch size调优

nomic-embed-text-v2-moe GPU算力适配指南:A10/T4/V100显存占用与batch size调优 1. 模型简介与部署准备 nomic-embed-text-v2-moe是一款强大的多语言文本嵌入模型,专门擅长多语言检索任务。这个模型有3.05亿参数,支持约100种语言&#xff…

2026/7/7 23:53:56 阅读更多 →
Z-Image-Turbo艺术创作:赛博朋克风格城市景观

Z-Image-Turbo艺术创作:赛博朋克风格城市景观

Z-Image-Turbo艺术创作:赛博朋克风格城市景观 最近在测试Z-Image-Turbo的时候,我特意尝试了赛博朋克这个主题。说实话,一开始没抱太大期望,毕竟很多模型处理这种复杂场景时,要么细节糊成一团,要么色彩搭配…

2026/7/7 12:38:09 阅读更多 →

最新新闻

CentOS 8 yum/dnf 报错排查:3步定位 Failed to download metadata 根因

CentOS 8 yum/dnf 报错排查:3步定位 Failed to download metadata 根因

CentOS 8 yum/dnf 报错排查:3步定位 Failed to download metadata 根因当你在CentOS 8或RHEL系发行版上执行yum或dnf命令时,遇到"Failed to download metadata for repo"这类错误信息,往往意味着系统无法获取软件仓库的元数据。这个…

2026/7/7 23:52:46 阅读更多 →
Ubuntu 22.04 部署 RabbitMQ 4.3:APT 源安装与 5 个关键安全配置

Ubuntu 22.04 部署 RabbitMQ 4.3:APT 源安装与 5 个关键安全配置

Ubuntu 22.04 部署 RabbitMQ 4.3:APT 源安装与 5 个关键安全配置RabbitMQ 作为企业级消息队列中间件,在分布式系统解耦、异步通信和流量削峰等场景中扮演着关键角色。本文将详细介绍在 Ubuntu 22.04 生产环境中通过官方 APT 源部署 RabbitMQ 4.3 的完整流…

2026/7/7 23:52:46 阅读更多 →
Go语言SCP服务安全实践:防御SSH会话固定攻击与安全会话管理

Go语言SCP服务安全实践:防御SSH会话固定攻击与安全会话管理

1. 项目概述与核心挑战最近在重构一个用Go语言写的内部文件传输服务,这个服务大量使用了SCP协议进行服务器间的文件同步。在安全审计的时候,我们重点关注了会话管理部分,特别是如何防御会话固定攻击。这玩意儿在Web开发里是老生常谈了&#x…

2026/7/7 23:52:46 阅读更多 →
计算机毕设 MySQL 8.0 数据库设计避坑:3个常见范式错误与性能优化方案

计算机毕设 MySQL 8.0 数据库设计避坑:3个常见范式错误与性能优化方案

MySQL 8.0数据库设计避坑指南:3个常见范式错误与性能优化实战 在计算机专业毕业设计中,数据库设计往往是决定系统质量的关键环节。许多同学虽然掌握了SQL基础语法,但在实际设计时仍会陷入各种陷阱——要么过度规范化导致查询性能低下&#xf…

2026/7/7 23:48:45 阅读更多 →
Chrome 缓存路径修改 3 种方案对比:mklink、启动参数与注册表,性能影响实测

Chrome 缓存路径修改 3 种方案对比:mklink、启动参数与注册表,性能影响实测

Chrome缓存路径修改三大方案深度评测:从符号链接到注册表调优1. 为什么需要修改Chrome缓存路径?对于长期使用Chrome浏览器的中高级用户来说,系统盘空间告急是个常见痛点。Chrome默认将所有缓存文件存储在C:\Users\[用户名]\AppData\Local\Goo…

2026/7/7 23:48:44 阅读更多 →
JWT 安全实践:3种常见攻击场景(CSRF、XSS、密钥泄露)与防御方案

JWT 安全实践:3种常见攻击场景(CSRF、XSS、密钥泄露)与防御方案

JWT 安全攻防实战:从漏洞利用到防御体系构建1. JWT安全基础与威胁模型JSON Web Token作为现代分布式系统的身份验证支柱,其安全性直接影响整个应用的防御纵深。理解JWT的三大核心组件(Header、Payload、Signature)只是安全实践的起…

2026/7/7 23:46:44 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻