华为昇腾910B拉起MinerU2.5-Pro-2605-1.2B示例
·
推理引擎vllm-ascend 0.18.0
模型下载路径:https://www.modelscope.cn/models/OpenDataLab/MinerU2.5-Pro-2605-1.2B
python -m vllm.entrypoints.openai.api_server \
--port 8000 \
--model /home/usr/MinerU2.5/ \
--trust-remote-code \
--served-model-name MinerU2.5-Pro-2605-1.2B \
--dtype bfloat16 \
--enforce-eager
MinerU2.5推理python脚本
import os
from PIL import Image
from mineru_vl_utils import MinerUClient
import traceback
def process_images_in_folder(folder_path, output_folder=None):
"""
遍历指定文件夹中的图片,使用MinerUClient处理,并将结果保存为同名.md文件
Args:
folder_path: 包含图片的文件夹路径
output_folder: 输出文件夹路径,如果为None则保存到原文件夹
"""
# 初始化客户端
client = MinerUClient(
backend="http-client",
model_name="MinerU2.5-Pro-2605-1.2B",
server_url="http://192.168.0.11:8000",
)
# 支持的图片格式
supported_formats = ('.png', '.jpg', '.jpeg', '.bmp', '.gif', '.tiff', '.webp')
# 获取文件夹中所有支持的图片文件
image_files = [f for f in os.listdir(folder_path)
if f.lower().endswith(supported_formats)]
if not image_files:
print(f"在文件夹 {folder_path} 中没有找到支持的图片文件")
print(f"支持的文件格式: {', '.join(supported_formats)}")
return
print(f"找到 {len(image_files)} 个图片文件")
# 创建输出文件夹(如果指定了且不存在)
if output_folder and not os.path.exists(output_folder):
os.makedirs(output_folder)
print(f"已创建输出文件夹: {output_folder}")
# 处理每个图片文件
for i, image_file in enumerate(image_files, 1):
image_path = os.path.join(folder_path, image_file)
try:
print(f"\n[{i}/{len(image_files)}] 处理中: {image_file}")
# 打开图片
image = Image.open(image_path)
# 调用API提取信息
print(f" 正在调用MinerU API处理...")
extracted_blocks = client.two_step_extract(image)
# 生成输出文件名(与原图片同名,但扩展名为.md)
base_name = os.path.splitext(image_file)[0]
if output_folder:
output_file = os.path.join(output_folder, f"{base_name}.md")
else:
output_file = os.path.join(folder_path, f"{base_name}.md")
# 将结果写入.md文件
with open(output_file, 'w', encoding='utf-8') as f:
# 写入文件头信息
f.write(f"# 图片分析结果: {image_file}\n\n")
f.write(f"**图片路径:** {image_path}\n\n")
f.write(f"**处理时间:** {os.path.getctime(image_path) if os.path.exists(image_path) else '未知'}\n\n")
f.write("---\n\n")
# 写入提取的内容
f.write("## 提取的内容\n\n")
# 根据extracted_blocks的数据类型进行处理
if isinstance(extracted_blocks, str):
# 如果是字符串,直接写入
f.write(extracted_blocks)
elif isinstance(extracted_blocks, list):
# 如果是列表,遍历写入每个块
for idx, block in enumerate(extracted_blocks, 1):
f.write(f"### 块 {idx}\n\n")
f.write(str(block))
f.write("\n\n")
elif hasattr(extracted_blocks, '__dict__'):
# 如果是对象,尝试转换为字典或字符串
try:
f.write(str(extracted_blocks))
except:
f.write("无法序列化对象内容")
else:
# 其他类型
f.write(str(extracted_blocks))
print(f" 结果已保存到: {output_file}")
except Exception as e:
print(f" 处理失败: {image_file}")
print(f" 错误信息: {str(e)}")
# 可选:记录详细错误到日志文件
with open("error_log.txt", "a", encoding="utf-8") as log_file:
log_file.write(f"处理失败: {image_path}\n")
log_file.write(f"错误信息: {str(e)}\n")
log_file.write(f"详细错误:\n{traceback.format_exc()}\n")
log_file.write("-" * 50 + "\n")
print(f"\n处理完成! 共处理了 {len(image_files)} 个文件")
# 批量处理版本,可以指定输入和输出文件夹
def batch_process_images(input_folder, output_folder=None):
"""
批量处理文件夹中的所有图片
Args:
input_folder: 输入文件夹路径
output_folder: 输出文件夹路径,如果为None则保存到原文件夹
"""
process_images_in_folder(input_folder, output_folder)
# 单个图片处理版本(与原功能兼容)
def process_single_image(image_path, output_path=None):
"""
处理单个图片文件
Args:
image_path: 图片文件路径
output_path: 输出文件路径,如果为None则生成同名.md文件
"""
# 初始化客户端
client = MinerUClient(
backend="http-client",
model_name="MinerU2.5-Pro-2605-1.2B",
server_url="http://192.168.0.11:8000",
)
try:
print(f"处理图片: {image_path}")
# 打开图片
image = Image.open(image_path)
# 调用API提取信息
print("正在调用MinerU API处理...")
extracted_blocks = client.two_step_extract(image)
# 确定输出文件路径
if output_path:
output_file = output_path
else:
base_name = os.path.splitext(image_path)[0]
output_file = f"{base_name}.md"
# 将结果写入.md文件
with open(output_file, 'w', encoding='utf-8') as f:
# 写入文件头信息
f.write(f"# 图片分析结果: {os.path.basename(image_path)}\n\n")
f.write(f"**图片路径:** {image_path}\n\n")
f.write("---\n\n")
# 写入提取的内容
f.write("## 提取的内容\n\n")
# 根据extracted_blocks的数据类型进行处理
if isinstance(extracted_blocks, str):
f.write(extracted_blocks)
elif isinstance(extracted_blocks, list):
for idx, block in enumerate(extracted_blocks, 1):
f.write(f"### 块 {idx}\n\n")
f.write(str(block))
f.write("\n\n")
else:
f.write(str(extracted_blocks))
print(f"结果已保存到: {output_file}")
return extracted_blocks
except Exception as e:
print(f"处理失败: {str(e)}")
return None
if __name__ == "__main__":
# 使用示例1:处理整个文件夹
#input_folder = "/home/jovyan/data/"
#output_folder = "/home/jovyan/data/output_mineru/" # 可选,不指定则保存到原文件夹
print("开始批量处理图片...")
# process_images_in_folder(input_folder, output_folder)
# 使用示例2:处理单个图片(与原代码功能相同)
image_path = "/home/jovyan/data/test.png"
process_single_image(image_path)
测试图片test.png
识别结果markdown格式如下:
更多推荐


所有评论(0)