
* feat: adding new vlm-models support Signed-off-by: Peter Staar <taa@zurich.ibm.com> * fixed the transformers Signed-off-by: Peter Staar <taa@zurich.ibm.com> * got microsoft/Phi-4-multimodal-instruct to work Signed-off-by: Peter Staar <taa@zurich.ibm.com> * working on vlm's Signed-off-by: Peter Staar <taa@zurich.ibm.com> * refactoring the VLM part Signed-off-by: Peter Staar <taa@zurich.ibm.com> * all working, now serious refacgtoring necessary Signed-off-by: Peter Staar <taa@zurich.ibm.com> * refactoring the download_model Signed-off-by: Peter Staar <taa@zurich.ibm.com> * added the formulate_prompt Signed-off-by: Peter Staar <taa@zurich.ibm.com> * pixtral 12b runs via MLX and native transformers Signed-off-by: Peter Staar <taa@zurich.ibm.com> * added the VlmPredictionToken Signed-off-by: Peter Staar <taa@zurich.ibm.com> * refactoring minimal_vlm_pipeline Signed-off-by: Peter Staar <taa@zurich.ibm.com> * fixed the MyPy Signed-off-by: Peter Staar <taa@zurich.ibm.com> * added pipeline_model_specializations file Signed-off-by: Peter Staar <taa@zurich.ibm.com> * need to get Phi4 working again ... Signed-off-by: Peter Staar <taa@zurich.ibm.com> * finalising last points for vlms support Signed-off-by: Peter Staar <taa@zurich.ibm.com> * fixed the pipeline for Phi4 Signed-off-by: Peter Staar <taa@zurich.ibm.com> * streamlining all code Signed-off-by: Peter Staar <taa@zurich.ibm.com> * reformatted the code Signed-off-by: Peter Staar <taa@zurich.ibm.com> * fixing the tests Signed-off-by: Peter Staar <taa@zurich.ibm.com> * added the html backend to the VLM pipeline Signed-off-by: Peter Staar <taa@zurich.ibm.com> * fixed the static load_from_doctags Signed-off-by: Peter Staar <taa@zurich.ibm.com> * restore stable imports Signed-off-by: Michele Dolfi <dol@zurich.ibm.com> * use AutoModelForVision2Seq for Pixtral and review example (including rename) Signed-off-by: Michele Dolfi <dol@zurich.ibm.com> * remove unused value Signed-off-by: Michele Dolfi <dol@zurich.ibm.com> * refactor instances of VLM models Signed-off-by: Michele Dolfi <dol@zurich.ibm.com> * skip compare example in CI Signed-off-by: Michele Dolfi <dol@zurich.ibm.com> * use lowercase and uppercase only Signed-off-by: Michele Dolfi <dol@zurich.ibm.com> * add new minimal_vlm example and refactor pipeline_options_vlm_model for cleaner import Signed-off-by: Michele Dolfi <dol@zurich.ibm.com> * rename pipeline_vlm_model_spec Signed-off-by: Michele Dolfi <dol@zurich.ibm.com> * move more argument to options and simplify model init Signed-off-by: Michele Dolfi <dol@zurich.ibm.com> * add supported_devices Signed-off-by: Michele Dolfi <dol@zurich.ibm.com> * remove not-needed function Signed-off-by: Michele Dolfi <dol@zurich.ibm.com> * exclude minimal_vlm Signed-off-by: Michele Dolfi <dol@zurich.ibm.com> * missing file Signed-off-by: Michele Dolfi <dol@zurich.ibm.com> * add message for transformers version Signed-off-by: Michele Dolfi <dol@zurich.ibm.com> * rename to specs Signed-off-by: Michele Dolfi <dol@zurich.ibm.com> * use module import and remove MLX from non-darwin Signed-off-by: Michele Dolfi <dol@zurich.ibm.com> * remove hf_vlm_model and add extra_generation_args Signed-off-by: Michele Dolfi <dol@zurich.ibm.com> * use single HF VLM model class Signed-off-by: Michele Dolfi <dol@zurich.ibm.com> * remove torch type Signed-off-by: Michele Dolfi <dol@zurich.ibm.com> * add docs for vision models Signed-off-by: Michele Dolfi <dol@zurich.ibm.com> --------- Signed-off-by: Peter Staar <taa@zurich.ibm.com> Signed-off-by: Michele Dolfi <dol@zurich.ibm.com> Co-authored-by: Michele Dolfi <dol@zurich.ibm.com>
92 lines
2.9 KiB
Python
92 lines
2.9 KiB
Python
from abc import abstractmethod
|
|
from collections.abc import Iterable
|
|
from pathlib import Path
|
|
from typing import List, Optional, Type, Union
|
|
|
|
from docling_core.types.doc import (
|
|
DoclingDocument,
|
|
NodeItem,
|
|
PictureItem,
|
|
)
|
|
from docling_core.types.doc.document import ( # TODO: move import to docling_core.types.doc
|
|
PictureDescriptionData,
|
|
)
|
|
from PIL import Image
|
|
|
|
from docling.datamodel.accelerator_options import AcceleratorOptions
|
|
from docling.datamodel.pipeline_options import (
|
|
PictureDescriptionBaseOptions,
|
|
)
|
|
from docling.models.base_model import (
|
|
BaseItemAndImageEnrichmentModel,
|
|
BaseModelWithOptions,
|
|
ItemAndImageEnrichmentElement,
|
|
)
|
|
|
|
|
|
class PictureDescriptionBaseModel(
|
|
BaseItemAndImageEnrichmentModel, BaseModelWithOptions
|
|
):
|
|
images_scale: float = 2.0
|
|
|
|
def __init__(
|
|
self,
|
|
*,
|
|
enabled: bool,
|
|
enable_remote_services: bool,
|
|
artifacts_path: Optional[Union[Path, str]],
|
|
options: PictureDescriptionBaseOptions,
|
|
accelerator_options: AcceleratorOptions,
|
|
):
|
|
self.enabled = enabled
|
|
self.options = options
|
|
self.provenance = "not-implemented"
|
|
|
|
def is_processable(self, doc: DoclingDocument, element: NodeItem) -> bool:
|
|
return self.enabled and isinstance(element, PictureItem)
|
|
|
|
def _annotate_images(self, images: Iterable[Image.Image]) -> Iterable[str]:
|
|
raise NotImplementedError
|
|
|
|
def __call__(
|
|
self,
|
|
doc: DoclingDocument,
|
|
element_batch: Iterable[ItemAndImageEnrichmentElement],
|
|
) -> Iterable[NodeItem]:
|
|
if not self.enabled:
|
|
for element in element_batch:
|
|
yield element.item
|
|
return
|
|
|
|
images: List[Image.Image] = []
|
|
elements: List[PictureItem] = []
|
|
for el in element_batch:
|
|
assert isinstance(el.item, PictureItem)
|
|
describe_image = True
|
|
# Don't describe the image if it's smaller than the threshold
|
|
if len(el.item.prov) > 0:
|
|
prov = el.item.prov[0] # PictureItems have at most a single provenance
|
|
page = doc.pages.get(prov.page_no)
|
|
if page is not None:
|
|
page_area = page.size.width * page.size.height
|
|
if page_area > 0:
|
|
area_fraction = prov.bbox.area() / page_area
|
|
if area_fraction < self.options.picture_area_threshold:
|
|
describe_image = False
|
|
if describe_image:
|
|
elements.append(el.item)
|
|
images.append(el.image)
|
|
|
|
outputs = self._annotate_images(images)
|
|
|
|
for item, output in zip(elements, outputs):
|
|
item.annotations.append(
|
|
PictureDescriptionData(text=output, provenance=self.provenance)
|
|
)
|
|
yield item
|
|
|
|
@classmethod
|
|
@abstractmethod
|
|
def get_options_type(cls) -> Type[PictureDescriptionBaseOptions]:
|
|
pass
|