Skip to content

Example Workflows - Workflows for OCR

Below you can find example workflows you can use as inspiration to build your apps.

Workflow with DocTR model

This example showcases quite sophisticated workflows usage scenario that assume the following:

  • we have generic object detection model capable of recognising cars

  • we have specialised object detection model trained to detect license plates in the images depicting single car only

  • we have generic OCR model capable of recognising lines of texts from images

Our goal is to read license plates of every car we detect in the picture. We can achieve that goal with workflow from this example. In the definition we can see that generic object detection model is applied first, to make the job easier for the secondary (plates detection) model we enlarge bounding boxes, slightly offsetting its dimensions with Detections Offset block - later we apply cropping to be able to run license plate detection for every detected car instance (increasing the depth of the batch). Once secondary model runs and we have bounding boxes for license plates - we crop previously cropped cars images to extract plates. Once this is done, plates crops are passed to OCR step which turns images of plates into text.

Workflow definition
{
    "version": "1.0",
    "inputs": [
        {
            "type": "WorkflowImage",
            "name": "image"
        }
    ],
    "steps": [
        {
            "type": "RoboflowObjectDetectionModel",
            "name": "detection",
            "image": "$inputs.image",
            "model_id": "yolov8n-640",
            "class_filter": [
                "car"
            ]
        },
        {
            "type": "DetectionOffset",
            "name": "offset",
            "predictions": "$steps.detection.predictions",
            "image_metadata": "$steps.detection.image",
            "prediction_type": "$steps.detection.prediction_type",
            "offset_width": 10,
            "offset_height": 10
        },
        {
            "type": "Crop",
            "name": "cars_crops",
            "image": "$inputs.image",
            "predictions": "$steps.offset.predictions"
        },
        {
            "type": "RoboflowObjectDetectionModel",
            "name": "plates_detection",
            "image": "$steps.cars_crops.crops",
            "model_id": "vehicle-registration-plates-trudk/2"
        },
        {
            "type": "DetectionOffset",
            "name": "plates_offset",
            "predictions": "$steps.plates_detection.predictions",
            "image_metadata": "$steps.plates_detection.image",
            "prediction_type": "$steps.plates_detection.prediction_type",
            "offset_width": 50,
            "offset_height": 50
        },
        {
            "type": "Crop",
            "name": "plates_crops",
            "image": "$steps.cars_crops.crops",
            "predictions": "$steps.plates_offset.predictions"
        },
        {
            "type": "OCRModel",
            "name": "ocr",
            "image": "$steps.plates_crops.crops"
        }
    ],
    "outputs": [
        {
            "type": "JsonField",
            "name": "cars_crops",
            "selector": "$steps.cars_crops.crops"
        },
        {
            "type": "JsonField",
            "name": "plates_crops",
            "selector": "$steps.plates_crops.crops"
        },
        {
            "type": "JsonField",
            "name": "plates_ocr",
            "selector": "$steps.ocr.result"
        }
    ]
}

Google Vision OCR

In this example, Google Vision OCR is used to extract text from input image. Additionally, example presents how to combine structured output of Google API with visualisation blocks.

Workflow definition
{
    "version": "1.0",
    "inputs": [
        {
            "type": "WorkflowImage",
            "name": "image"
        },
        {
            "type": "WorkflowParameter",
            "name": "api_key"
        }
    ],
    "steps": [
        {
            "type": "roboflow_core/google_vision_ocr@v1",
            "name": "google_vision_ocr",
            "image": "$inputs.image",
            "ocr_type": "text_detection",
            "api_key": "$inputs.api_key"
        },
        {
            "type": "roboflow_core/bounding_box_visualization@v1",
            "name": "bounding_box_visualization",
            "predictions": "$steps.google_vision_ocr.predictions",
            "image": "$inputs.image"
        },
        {
            "type": "roboflow_core/label_visualization@v1",
            "name": "label_visualization",
            "predictions": "$steps.google_vision_ocr.predictions",
            "image": "$steps.bounding_box_visualization.image"
        }
    ],
    "outputs": [
        {
            "type": "JsonField",
            "name": "extracted_text",
            "selector": "$steps.google_vision_ocr.text"
        },
        {
            "type": "JsonField",
            "name": "text_detections",
            "selector": "$steps.google_vision_ocr.predictions"
        },
        {
            "type": "JsonField",
            "name": "text_visualised",
            "selector": "$steps.label_visualization.image"
        }
    ]
}