使用本地 VLM 注释图片
In [ ]
已复制!
%pip install -q docling[vlm] ipython
%pip install -q docling[vlm] ipython
Note: you may need to restart the kernel to use updated packages.
In [1]
已复制!
from docling.datamodel.base_models import InputFormat
from docling.datamodel.pipeline_options import PdfPipelineOptions
from docling.document_converter import DocumentConverter, PdfFormatOption
from docling.datamodel.base_models import InputFormat from docling.datamodel.pipeline_options import PdfPipelineOptions from docling.document_converter import DocumentConverter, PdfFormatOption
In [2]
已复制!
# The source document
DOC_SOURCE = "https://arxiv.org/pdf/2501.17887"
# 源文档 DOC_SOURCE = "https://arxiv.org/pdf/2501.17887"
使用 Granite Vision 描述图片¶
本节将本地运行 ibm-granite/granite-vision-3.1-2b-preview 模型来描述文档中的图片。
In [3]
已复制!
from docling.datamodel.pipeline_options import granite_picture_description
pipeline_options = PdfPipelineOptions()
pipeline_options.do_picture_description = True
pipeline_options.picture_description_options = (
granite_picture_description # <-- the model choice
)
pipeline_options.picture_description_options.prompt = (
"Describe the image in three sentences. Be consise and accurate."
)
pipeline_options.images_scale = 2.0
pipeline_options.generate_picture_images = True
converter = DocumentConverter(
format_options={
InputFormat.PDF: PdfFormatOption(
pipeline_options=pipeline_options,
)
}
)
doc = converter.convert(DOC_SOURCE).document
from docling.datamodel.pipeline_options import granite_picture_description pipeline_options = PdfPipelineOptions() pipeline_options.do_picture_description = True pipeline_options.picture_description_options = ( granite_picture_description # <-- 模型选择 ) pipeline_options.picture_description_options.prompt = ( "用三句话描述图片。请简洁准确。" ) pipeline_options.images_scale = 2.0 pipeline_options.generate_picture_images = True converter = DocumentConverter( format_options={ InputFormat.PDF: PdfFormatOption( pipeline_options=pipeline_options, ) } ) doc = converter.convert(DOC_SOURCE).document
Using a slow image processor as `use_fast` is unset and a slow processor was saved with this model. `use_fast=True` will be the default behavior in v4.48, even if the model was saved with a slow processor. This will result in minor differences in outputs. You'll still be able to use a slow processor with `use_fast=False`.
Loading checkpoint shards: 0%| | 0/2 [00:00<?, ?it/s]
In [4]
已复制!
from docling_core.types.doc.document import PictureDescriptionData
from IPython import display
html_buffer = []
# display the first 5 pictures and their captions and annotations:
for pic in doc.pictures[:5]:
html_item = (
f"<h3>Picture <code>{pic.self_ref}</code></h3>"
f'<img src="{pic.image.uri!s}" /><br />'
f"<h4>Caption</h4>{pic.caption_text(doc=doc)}<br />"
)
for annotation in pic.annotations:
if not isinstance(annotation, PictureDescriptionData):
continue
html_item += (
f"<h4>Annotations ({annotation.provenance})</h4>{annotation.text}<br />\n"
)
html_buffer.append(html_item)
display.HTML("<hr />".join(html_buffer))
from docling_core.types.doc.document import PictureDescriptionData from IPython import display html_buffer = [] # 显示前 5 张图片及其标题和注释: for pic in doc.pictures[:5]: html_item = ( f"图片
" f'
' f"
" ) for annotation in pic.annotations: if not isinstance(annotation, PictureDescriptionData): continue html_item += ( f"
\n" ) html_buffer.append(html_item) display.HTML("
".join(html_buffer))
图片 {pic.self_ref}
" f'' f"
标题
{pic.caption_text(doc=doc)}" ) for annotation in pic.annotations: if not isinstance(annotation, PictureDescriptionData): continue html_item += ( f"
注释 ({annotation.provenance})
{annotation.text}\n" ) html_buffer.append(html_item) display.HTML("
".join(html_buffer))
Out[4]
图片 #/pictures/0
标题
图 1:Docling 流水线和使用模型的草图。PDF 流水线和简单流水线都会构建 DoclingDocument 表示,该表示可以进一步增强。下游应用程序可以使用 Docling 的 API 检查、导出或分块文档以用于各种目的。注释 (ibm-granite/granite-vision-3.1-2b-preview)
在此图片中,我们可以看到一张带有文本和图片的 海报。图片 #/pictures/1
标题
图 2:数据集类别以及文档和页面的样本数量。注释 (ibm-granite/granite-vision-3.1-2b-preview)
在此图片中,我们可以看到一张饼图。在饼图中,我们可以看到 各个类别以及每个类别中的文档数量。图片 #/pictures/2
标题
图 3:所有文档的转换时间分布,按文档中的页数排序,适用于所有系统配置。每个点代表一个文档。使用对数/对数比例来均匀间距,因为页数和转换时间都具有长尾分布。注释 (ibm-granite/granite-vision-3.1-2b-preview)
在此图片中,我们可以看到一张图表。在 x 轴上,我们可以看到 页数。在 y 轴上,我们可以看到秒数。图片 #/pictures/3
标题
图 4:PDF 后端和 AI 模型对单页转换时间的贡献(以秒/页为单位)。越低越好。左图:各模型对其所应用页面的时间贡献范围(即,OCR 仅应用于包含位图的页面,表格结构仅应用于包含表格的页面)。右图:基准数据集中每页的平均时间贡献(考虑了对不含位图或表格的页面进行 OCR 和表格结构模型处理时的零时间贡献)。注释 (ibm-granite/granite-vision-3.1-2b-preview)
在此图片中,我们可以看到一个条形图和一个折线图。在条形图 中,我们可以看到 Pdf Parse、OCR、Layout、Table Structure、Page Total 和 Page 的值。在折线图 中,我们可以看到 Pdf Parse、OCR、Layout、Table Structure、Page Total 和 Page 的值。图片 #/pictures/4
标题
图 5:在三种场景下,我们的数据集在所有资产和系统配置上的每页转换时间(以秒为单位)。条形越低越好。配置包括 OCR 和表格结构识别(Docling 和 MinerU 上的快速表格选项,非结构化文档中的高分辨率,如表 1 所示)。注释 (ibm-granite/granite-vision-3.1-2b-preview)
在此图片中,我们可以看到一个条形图。在图表中,我们可以看到 CPU、Max、GPU 和 sec/page 的值。使用 SmolVLM 描述图片¶
本节将本地运行 HuggingFaceTB/SmolVLM-256M-Instruct 模型来描述文档中的图片。
In [7]
已复制!
from docling.datamodel.pipeline_options import smolvlm_picture_description
pipeline_options = PdfPipelineOptions()
pipeline_options.do_picture_description = True
pipeline_options.picture_description_options = (
smolvlm_picture_description # <-- the model choice
)
pipeline_options.picture_description_options.prompt = (
"Describe the image in three sentences. Be consise and accurate."
)
pipeline_options.images_scale = 2.0
pipeline_options.generate_picture_images = True
converter = DocumentConverter(
format_options={
InputFormat.PDF: PdfFormatOption(
pipeline_options=pipeline_options,
)
}
)
doc = converter.convert(DOC_SOURCE).document
from docling.datamodel.pipeline_options import smolvlm_picture_description pipeline_options = PdfPipelineOptions() pipeline_options.do_picture_description = True pipeline_options.picture_description_options = ( smolvlm_picture_description # <-- 模型选择 ) pipeline_options.picture_description_options.prompt = ( "用三句话描述图片。请简洁准确。" ) pipeline_options.images_scale = 2.0 pipeline_options.generate_picture_images = True converter = DocumentConverter( format_options={ InputFormat.PDF: PdfFormatOption( pipeline_options=pipeline_options, ) } ) doc = converter.convert(DOC_SOURCE).document
In [6]
已复制!
from docling_core.types.doc.document import PictureDescriptionData
from IPython import display
html_buffer = []
# display the first 5 pictures and their captions and annotations:
for pic in doc.pictures[:5]:
html_item = (
f"<h3>Picture <code>{pic.self_ref}</code></h3>"
f'<img src="{pic.image.uri!s}" /><br />'
f"<h4>Caption</h4>{pic.caption_text(doc=doc)}<br />"
)
for annotation in pic.annotations:
if not isinstance(annotation, PictureDescriptionData):
continue
html_item += (
f"<h4>Annotations ({annotation.provenance})</h4>{annotation.text}<br />\n"
)
html_buffer.append(html_item)
display.HTML("<hr />".join(html_buffer))
from docling_core.types.doc.document import PictureDescriptionData from IPython import display html_buffer = [] # 显示前 5 张图片及其标题和注释: for pic in doc.pictures[:5]: html_item = ( f"图片
" f'
' f"
" ) for annotation in pic.annotations: if not isinstance(annotation, PictureDescriptionData): continue html_item += ( f"
\n" ) html_buffer.append(html_item) display.HTML("
".join(html_buffer))
图片 {pic.self_ref}
" f'' f"
标题
{pic.caption_text(doc=doc)}" ) for annotation in pic.annotations: if not isinstance(annotation, PictureDescriptionData): continue html_item += ( f"
注释 ({annotation.provenance})
{annotation.text}\n" ) html_buffer.append(html_item) display.HTML("
".join(html_buffer))
Out[6]
图片 #/pictures/0
标题
图 1:Docling 流水线和使用模型的草图。PDF 流水线和简单流水线都会构建 DoclingDocument 表示,该表示可以进一步增强。下游应用程序可以使用 Docling 的 API 检查、导出或分块文档以用于各种目的。注释 (HuggingFaceTB/SmolVLM-256M-Instruct)
这是一个包含不同类型文档的页面。图片 #/pictures/1
标题
图 2:数据集类别以及文档和页面的样本数量。注释 (HuggingFaceTB/SmolVLM-256M-Instruct)
以下是按类别列出的每页文档列表:- 科学 - 文章 - 法律法规 - 文章 - 其他图片 #/pictures/2
标题
图 3:所有文档的转换时间分布,按文档中的页数排序,适用于所有系统配置。每个点代表一个文档。使用对数/对数比例来均匀间距,因为页数和转换时间都具有长尾分布。注释 (HuggingFaceTB/SmolVLM-256M-Instruct)
此图像是一个条形图,显示了网站页数作为网站页数的函数。x 轴表示页数,范围从 100 到 10,000。y 轴表示页数,范围从 100 到 10,000。图表标有“页数”标签,并在图表顶部有一个图例,指示页数。图表显示了一个清晰的趋势:随着页数的增加,页数减少。从以下几点可以看出这一点:- 页数从 100 增加到 1000。- 页数从 1000 减少到 10,000。- 页数从 10,000 增加到 10,000。图片 #/pictures/3
标题
图 4:PDF 后端和 AI 模型对单页转换时间的贡献(以秒/页为单位)。越低越好。左图:各模型对其所应用页面的时间贡献范围(即,OCR 仅应用于包含位图的页面,表格结构仅应用于包含表格的页面)。右图:基准数据集中每页的平均时间贡献(考虑了对不含位图或表格的页面进行 OCR 和表格结构模型处理时的零时间贡献)。注释 (HuggingFaceTB/SmolVLM-256M-Instruct)
条形图,包含代表不同数据点的不同颜色条形。图片 #/pictures/4
标题
图 5:在三种场景下,我们的数据集在所有资产和系统配置上的每页转换时间(以秒为单位)。条形越低越好。配置包括 OCR 和表格结构识别(Docling 和 MinerU 上的快速表格选项,非结构化文档中的高分辨率,如表 1 所示)。注释 (HuggingFaceTB/SmolVLM-256M-Instruct)
条形图,包含以下信息:- x 轴表示页数,范围从 0 到 14。- y 轴表示页面计数,范围从 0 到 14。- 图表包含三个类别:Marker、Unstructured 和 Detailed。- x 轴标签为“见/页”。- y 轴标签为“页面计数”。- 图表显示 Marker 类别的页数最多,其次是 Unstructured 类别,然后是 Detailed 类别。使用其他视觉模型¶
上述示例也可以使用其他视觉模型重现。Docling 选项 PictureDescriptionVlmOptions
允许您指定 Hugging Face Hub 中您喜爱的视觉模型。
In [8]
已复制!
from docling.datamodel.pipeline_options import PictureDescriptionVlmOptions
pipeline_options = PdfPipelineOptions()
pipeline_options.do_picture_description = True
pipeline_options.picture_description_options = PictureDescriptionVlmOptions(
repo_id="", # <-- add here the Hugging Face repo_id of your favorite VLM
prompt="Describe the image in three sentences. Be consise and accurate.",
)
pipeline_options.images_scale = 2.0
pipeline_options.generate_picture_images = True
converter = DocumentConverter(
format_options={
InputFormat.PDF: PdfFormatOption(
pipeline_options=pipeline_options,
)
}
)
# Uncomment to run:
# doc = converter.convert(DOC_SOURCE).document
from docling.datamodel.pipeline_options import PictureDescriptionVlmOptions pipeline_options = PdfPipelineOptions() pipeline_options.do_picture_description = True pipeline_options.picture_description_options = PictureDescriptionVlmOptions( repo_id="", # <-- 在此处添加您喜欢的 VLM 的 Hugging Face repo_id prompt="用三句话描述图片。请简洁准确。", ) pipeline_options.images_scale = 2.0 pipeline_options.generate_picture_images = True converter = DocumentConverter( format_options={ InputFormat.PDF: PdfFormatOption( pipeline_options=pipeline_options, ) } ) # 取消注释以运行: # doc = converter.convert(DOC_SOURCE).document
In [ ]
已复制!