Skip to content

pixano_inference.tensorflow.fasterrcnn

FasterRCNN(model_id='', device='/GPU:0')

Bases: InferenceModel

TensorFlow Hub FasterRCNN Model

Attributes:

Name Type Description
name str

Model name

model_id str

Model ID

device str

Model GPU or CPU device

description str

Model description

model Model

TensorFlow model

Parameters:

Name Type Description Default
model_id str

Previously used ID, generate new ID if "". Defaults to "".

''
device str

Model GPU or CPU device (e.g. "/GPU:0", "/CPU:0"). Defaults to "/GPU:0".

'/GPU:0'
Source code in pixano_inference/tensorflow/fasterrcnn.py
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
def __init__(
    self,
    model_id: str = "",
    device: str = "/GPU:0",
) -> None:
    """Initialize model

    Args:
        model_id (str, optional): Previously used ID, generate new ID if "". Defaults to "".
        device (str, optional): Model GPU or CPU device (e.g. "/GPU:0", "/CPU:0"). Defaults to "/GPU:0".
    """

    super().__init__(
        name="FasterRCNN_R50",
        model_id=model_id,
        device=device,
        description="From TensorFlow Hub. FasterRCNN model, with ResNet50 architecture.",
    )

    # Model
    with tf.device(self.device):
        self.model = hub.load(
            "https://tfhub.dev/tensorflow/faster_rcnn/resnet50_v1_640x640/1"
        )

preannotate(batch, views, uri_prefix, threshold=0.0, prompt='')

Inference pre-annotation for a batch

Parameters:

Name Type Description Default
batch RecordBatch

Input batch

required
views list[str]

Dataset views

required
uri_prefix str

URI prefix for media files

required
threshold float

Confidence threshold. Defaults to 0.0.

0.0
prompt str

Annotation text prompt. Defaults to "".

''

Returns:

Type Description
list[dict]

Processed rows

Source code in pixano_inference/tensorflow/fasterrcnn.py
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
def preannotate(
    self,
    batch: pa.RecordBatch,
    views: list[str],
    uri_prefix: str,
    threshold: float = 0.0,
    prompt: str = "",
) -> list[dict]:
    """Inference pre-annotation for a batch

    Args:
        batch (pa.RecordBatch): Input batch
        views (list[str]): Dataset views
        uri_prefix (str): URI prefix for media files
        threshold (float, optional): Confidence threshold. Defaults to 0.0.
        prompt (str, optional): Annotation text prompt. Defaults to "".

    Returns:
        list[dict]: Processed rows
    """

    rows = []
    _ = prompt  # This model does not use prompts

    for view in views:
        # TF.Hub Models don't support image batches, so iterate manually
        for x in range(batch.num_rows):
            # Preprocess image
            im: Image = Image.from_dict(batch[view][x].as_py())
            im.uri_prefix = uri_prefix
            im = im.as_pillow()
            im_tensor = tf.expand_dims(tf.keras.utils.img_to_array(im), 0)
            im_tensor = tf.image.convert_image_dtype(im_tensor, dtype="uint8")

            # Inference
            output = self.model(im_tensor)

            # Process model outputs
            rows.extend(
                [
                    {
                        "id": shortuuid.uuid(),
                        "item_id": batch["id"][x].as_py(),
                        "view_id": view,
                        "bbox": BBox.from_xyxy(
                            [
                                float(output["detection_boxes"][0][i][1]),
                                float(output["detection_boxes"][0][i][0]),
                                float(output["detection_boxes"][0][i][3]),
                                float(output["detection_boxes"][0][i][2]),
                            ],
                            confidence=float(output["detection_scores"][0][i]),
                        ).to_dict(),
                        "category": coco_names_91(
                            output["detection_classes"][0][i]
                        ),
                    }
                    for i in range(int(output["num_detections"]))
                    if output["detection_scores"][0][i] > threshold
                ]
            )

    return rows