推理引擎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格式如下:
在这里插入图片描述

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐