kostissz's picture
Update app.py
37e70be verified
raw
history blame
6.09 kB
from typing import Dict, Tuple
import os
import gradio as gr
import torch.cuda
from docling.datamodel.base_models import InputFormat
from docling.datamodel.pipeline_options import PdfPipelineOptions, AcceleratorDevice
from docling.document_converter import DocumentConverter, PdfFormatOption
from docling_core.types import DoclingDocument
from docling.utils import model_downloader
from docling.datamodel.pipeline_options import smolvlm_picture_description
# Download models upon HF space initialization
pipeline_options = PdfPipelineOptions()
if torch.cuda.is_available():
print("Enabling CUDA Accelerator")
pipeline_options.accelerator_options.device = AcceleratorDevice.CUDA
pipeline_options.accelerator_options.cuda_use_flash_attention2 = True
if os.getenv("IS_HF_SPACE"):
print("Downloading models...")
model_downloader.download_models()
def parse_document(
file_path: str,
do_code_enrichment: bool,
do_formula_enrichment: bool,
do_picture_classification: bool,
do_picture_description: bool,
) -> Tuple[DoclingDocument, str]:
yield None, f"Parsing document... ⏳"
pipeline_options.do_code_enrichment = do_code_enrichment
pipeline_options.do_formula_enrichment = do_formula_enrichment
pipeline_options.generate_picture_images = do_picture_classification
pipeline_options.images_scale = 2
pipeline_options.do_picture_classification = do_picture_classification
pipeline_options.do_picture_description = do_picture_description
pipeline_options.picture_description_options = smolvlm_picture_description
pipeline_options.picture_description_options.prompt = "Describe the image in three sentences. Be concise and accurate."
pipeline_options.images_scale = 2.0
pipeline_options.generate_picture_images = True
print(f"Pipeline options defined: \n\t{pipeline_options}")
converter = DocumentConverter(
format_options={
InputFormat.PDF: PdfFormatOption(pipeline_options=pipeline_options)
}
)
result = converter.convert(file_path)
yield result.document, "Done ✅"
def to_html(docling_doc: DoclingDocument) -> str:
return docling_doc.export_to_html()
def to_markdown(docling_doc: DoclingDocument) -> str:
return docling_doc.export_to_markdown()
def to_json(docling_doc: DoclingDocument) -> Dict:
return docling_doc.export_to_dict()
def to_text(docling_doc: DoclingDocument) -> str:
return docling_doc.export_to_text()
def upload_file(file) -> str:
return file.name
def setup_gradio_demo():
with gr.Blocks() as demo:
gr.Markdown(
""" # Docling - OCR: Parse documents, images, spreadsheets and more to markdown or other formats!
Docling is very powerful tool, with lots of cool features and integrations to other AI frameworks (e.g. LlamaIndex, LangChain, and many more).
Model used for picture classification: [EfficientNet-B0 Document Image Classifier](https://huggingface.co/ds4sd/DocumentFigureClassifier)
Model used for picture description: [SmolVLM-256M-Instruct](https://huggingface.co/HuggingFaceTB/SmolVLM-256M-Instruct)
To explore the full set of features of Docling visit: https://github.com/docling-project/docling
"""
)
with gr.Row():
with gr.Column():
gr.Markdown("### 1) Upload")
file_output = gr.File(
file_count="single",
file_types=[
".pdf",
".docx",
".pptx",
".csv",
".md",
".png",
".jpg",
".tiff",
".bmp",
".html",
".xhtml",
".xlsx",
],
)
with gr.Column():
gr.Markdown("### 2) Configure engine & Parse")
code_understanding = gr.Checkbox(
value=False, label="Enable Code understanding"
)
formula_enrichment = gr.Checkbox(
value=False, label="Enable Formula understanding"
)
picture_classification = gr.Checkbox(
value=False, label="Enable Picture classification"
)
picture_description = gr.Checkbox(
value=False, label="Enable Picture description"
)
gr.Markdown(
"_**Warning:** Enabling any of these features can potentially increase the processing time._"
)
parse_button = gr.Button("Parse document")
status = gr.Markdown()
with gr.Column():
gr.Markdown("### 3) Convert")
html_button = gr.Button("Convert to HTML")
markdown_button = gr.Button("Convert to markdown")
json_button = gr.Button("Convert to JSON")
text_button = gr.Button("Convert to text")
doc = gr.State()
output = gr.Text(label="Output")
parse_button.click(
fn=parse_document,
inputs=[
file_output,
code_understanding,
formula_enrichment,
picture_classification,
picture_description,
],
outputs=[doc, status],
)
html_button.click(
fn=to_html,
inputs=doc,
outputs=output,
)
markdown_button.click(
fn=to_markdown,
inputs=doc,
outputs=output,
)
json_button.click(
fn=to_json,
inputs=doc,
outputs=output,
)
text_button.click(
fn=to_text,
inputs=doc,
outputs=output,
)
demo.launch()
if __name__ == "__main__":
setup_gradio_demo()