YOLOv5训练流程自动化:Azure坐标转换与PDF转图坐标匹配问题
1. Azure Parser坐标转YOLOv5格式的方法
YOLOv5的标注格式为class_id x_center y_center width height,所有数值是相对于图像宽高的归一化值(0-1范围内),而Azure Parser返回的ROI坐标是基于PDF页面的绝对坐标(通常为用户单位,1单位=1/72英寸,原点在页面左上角,y轴向下),转换步骤如下:
第一步:获取基础数据
从Azure Parser拿到ROI的bounding box数据(格式为[x, y, width, height],x/y是左上角坐标,width/height是ROI的宽高),同时获取对应PDF页面的原生尺寸(pdf_page_width、pdf_page_height,单位为用户单位),以及PDF转图像后的实际图像尺寸(img_width、img_height,单位为像素)。第二步:将Azure坐标转换为图像像素坐标
由于PDF转图像是按dpi缩放的,需先把Azure的用户单位坐标转成图像像素坐标:# 计算比例系数 scale_x = img_width / pdf_page_width scale_y = img_height / pdf_page_height # 转换为像素坐标 x_px = x * scale_x y_px = y * scale_y w_px = width * scale_x h_px = height * scale_y第三步:转换为YOLO归一化格式
基于图像尺寸计算归一化值:# 计算中心坐标的归一化值 x_center = (x_px + w_px / 2) / img_width y_center = (y_px + h_px / 2) / img_height # 计算宽高的归一化值 yolo_width = w_px / img_width yolo_height = h_px / img_height第四步:生成标注行
将上述数值按class_id x_center y_center yolo_width yolo_height格式写入.txt文件,保留6位左右小数即可。
2. 保证PDF转图像后坐标一致的方法
核心是让图像与PDF页面保持严格的比例映射,避免缩放或偏移,推荐两种可靠的实现方式:
方式一:用PyMuPDF(fitz)直接转换
PyMuPDF可以精确控制转换的dpi,生成的图像尺寸与PDF页面严格对应,坐标无偏差:
import fitz # 打开PDF文件 doc = fitz.open("your_input.pdf") # 选择目标页面(示例为第一页) page = doc[0] # 设置转换dpi(常用300,可根据需求调整) dpi = 300 # 创建转换矩阵,1用户单位=1/72英寸,所以dpi/72是缩放系数 mat = fitz.Matrix(dpi/72, dpi/72) # 转换为图像 pix = page.get_pixmap(matrix=mat) # 保存图像 pix.save("page_0.png") # 获取图像尺寸(用于后续坐标转换) img_width = pix.width img_height = pix.height doc.close()
方式二:用pdf2image配合PDF尺寸校准
如果坚持用pdf2image,需先获取PDF页面尺寸,再指定dpi转换,禁止使用自定义size参数:
from pdf2image import convert_from_path import fitz # 先获取PDF页面原生尺寸 doc = fitz.open("your_input.pdf") page = doc[0] pdf_page_width = page.rect.width pdf_page_height = page.rect.height doc.close() # 指定dpi转换图像 dpi = 300 images = convert_from_path("your_input.pdf", dpi=dpi) img = images[0] img_width, img_height = img.size
此时图像尺寸会严格等于pdf_page_width*(dpi/72)和pdf_page_height*(dpi/72),保证坐标比例完全匹配。
注意:如果PDF页面存在旋转,需通过page.rotation获取旋转角度,转换图像时同步旋转(PyMuPDF会自动处理旋转,pdf2image需添加rotation参数),否则坐标会错位。
内容的提问来源于stack exchange,提问作者ritik dubey

