added mask RCNN script (#780)
parent
dd821ca66f
commit
a435b410ed
@ -0,0 +1,32 @@
|
|||||||
|
# mask_rcnn_inception_resnet_v2_atrous_coco
|
||||||
|
|
||||||
|
## Use Case and High-Level Description
|
||||||
|
|
||||||
|
Mask R-CNN Inception Resnet V2 Atrous is trained on COCO dataset and used for object instance segmentation.
|
||||||
|
For details, see a [paper](https://arxiv.org/pdf/1703.06870.pdf).
|
||||||
|
|
||||||
|
## Specification
|
||||||
|
|
||||||
|
| Metric | Value |
|
||||||
|
|---------------------------------|-------------------------------------------|
|
||||||
|
| Type | Instance segmentation |
|
||||||
|
| GFlops | 675.314 |
|
||||||
|
| MParams | 92.368 |
|
||||||
|
| Source framework | TensorFlow\* |
|
||||||
|
|
||||||
|
## Legal Information
|
||||||
|
|
||||||
|
[https://raw.githubusercontent.com/tensorflow/models/master/LICENSE]()
|
||||||
|
|
||||||
|
## OpenVINO Conversion Notes
|
||||||
|
|
||||||
|
In order to convert the code into the openvino format, please see the [following link](https://docs.openvinotoolkit.org/latest/_docs_MO_DG_prepare_model_convert_model_tf_specific_Convert_Object_Detection_API_Models.html#mask_r_cnn_topologies).
|
||||||
|
|
||||||
|
The conversion command from the command line prompt will look something like the following.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ python /opt/intel/openvino/deployment_tools/model_optimizer/mo_tf.py \
|
||||||
|
--input_model /path/to/frozen_inference_graph.pb \
|
||||||
|
--tensorflow_use_custom_operations_config /opt/intel/openvino/deployment_tools/model_optimizer/extensions/front/tf/mask_rcnn_support.json \
|
||||||
|
--tensorflow_object_detection_api_pipeline_config /path/to/pipeline.config
|
||||||
|
```
|
||||||
@ -0,0 +1,64 @@
|
|||||||
|
import numpy as np
|
||||||
|
import cv2
|
||||||
|
|
||||||
|
|
||||||
|
MASK_THRESHOLD = .5
|
||||||
|
PROBABILITY_THRESHOLD = 0.2
|
||||||
|
|
||||||
|
|
||||||
|
# Ref: https://software.intel.com/en-us/forums/computer-vision/topic/804895
|
||||||
|
def segm_postprocess(box: list, raw_cls_mask, im_h, im_w, threshold):
|
||||||
|
ymin, xmin, ymax, xmax = box
|
||||||
|
|
||||||
|
width = int(abs(xmax - xmin))
|
||||||
|
height = int(abs(ymax - ymin))
|
||||||
|
|
||||||
|
result = np.zeros((im_h, im_w), dtype=np.uint8)
|
||||||
|
resized_mask = cv2.resize(raw_cls_mask, dsize=(height, width), interpolation=cv2.INTER_CUBIC)
|
||||||
|
|
||||||
|
# extract the ROI of the image
|
||||||
|
ymin = int(round(ymin))
|
||||||
|
xmin = int(round(xmin))
|
||||||
|
ymax = ymin + height
|
||||||
|
xmax = xmin + width
|
||||||
|
result[xmin:xmax, ymin:ymax] = (resized_mask>threshold).astype(np.uint8) * 255
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
for detection in detections:
|
||||||
|
frame_number = detection['frame_id']
|
||||||
|
height = detection['frame_height']
|
||||||
|
width = detection['frame_width']
|
||||||
|
detection = detection['detections']
|
||||||
|
|
||||||
|
masks = detection['masks']
|
||||||
|
boxes = detection['reshape_do_2d']
|
||||||
|
|
||||||
|
for index, box in enumerate(boxes):
|
||||||
|
label = int(box[1])
|
||||||
|
obj_value = box[2]
|
||||||
|
if obj_value >= PROBABILITY_THRESHOLD:
|
||||||
|
x = box[3] * width
|
||||||
|
y = box[4] * height
|
||||||
|
right = box[5] * width
|
||||||
|
bottom = box[6] * height
|
||||||
|
mask = masks[index][label]
|
||||||
|
|
||||||
|
mask = segm_postprocess((x, y, right, bottom),
|
||||||
|
mask,
|
||||||
|
height,
|
||||||
|
width,
|
||||||
|
MASK_THRESHOLD)
|
||||||
|
|
||||||
|
contour, _ = cv2.findContours(mask,
|
||||||
|
cv2.RETR_EXTERNAL,
|
||||||
|
cv2.CHAIN_APPROX_TC89_KCOS)
|
||||||
|
|
||||||
|
contour = contour[0]
|
||||||
|
contour = contour.tolist()
|
||||||
|
contour = [x[0] for x in contour]
|
||||||
|
|
||||||
|
# NOTE: if you want to see the boxes, uncomment next line
|
||||||
|
# results.add_box(x, y, right, bottom, label, frame_number)
|
||||||
|
results.add_polygon(contour, label, frame_number)
|
||||||
@ -0,0 +1,84 @@
|
|||||||
|
{
|
||||||
|
"label_map": {
|
||||||
|
"1": "person",
|
||||||
|
"2": "bicycle",
|
||||||
|
"3": "car",
|
||||||
|
"4": "motorcycle",
|
||||||
|
"5": "airplane",
|
||||||
|
"6": "bus",
|
||||||
|
"7": "train",
|
||||||
|
"8": "truck",
|
||||||
|
"9": "boat",
|
||||||
|
"10": "traffic_light",
|
||||||
|
"11": "fire_hydrant",
|
||||||
|
"13": "stop_sign",
|
||||||
|
"14": "parking_meter",
|
||||||
|
"15": "bench",
|
||||||
|
"16": "bird",
|
||||||
|
"17": "cat",
|
||||||
|
"18": "dog",
|
||||||
|
"19": "horse",
|
||||||
|
"20": "sheep",
|
||||||
|
"21": "cow",
|
||||||
|
"22": "elephant",
|
||||||
|
"23": "bear",
|
||||||
|
"24": "zebra",
|
||||||
|
"25": "giraffe",
|
||||||
|
"27": "backpack",
|
||||||
|
"28": "umbrella",
|
||||||
|
"31": "handbag",
|
||||||
|
"32": "tie",
|
||||||
|
"33": "suitcase",
|
||||||
|
"34": "frisbee",
|
||||||
|
"35": "skis",
|
||||||
|
"36": "snowboard",
|
||||||
|
"37": "sports_ball",
|
||||||
|
"38": "kite",
|
||||||
|
"39": "baseball_bat",
|
||||||
|
"40": "baseball_glove",
|
||||||
|
"41": "skateboard",
|
||||||
|
"42": "surfboard",
|
||||||
|
"43": "tennis_racket",
|
||||||
|
"44": "bottle",
|
||||||
|
"46": "wine_glass",
|
||||||
|
"47": "cup",
|
||||||
|
"48": "fork",
|
||||||
|
"49": "knife",
|
||||||
|
"50": "spoon",
|
||||||
|
"51": "bowl",
|
||||||
|
"52": "banana",
|
||||||
|
"53": "apple",
|
||||||
|
"54": "sandwich",
|
||||||
|
"55": "orange",
|
||||||
|
"56": "broccoli",
|
||||||
|
"57": "carrot",
|
||||||
|
"58": "hot_dog",
|
||||||
|
"59": "pizza",
|
||||||
|
"60": "donut",
|
||||||
|
"61": "cake",
|
||||||
|
"62": "chair",
|
||||||
|
"63": "couch",
|
||||||
|
"64": "potted_plant",
|
||||||
|
"65": "bed",
|
||||||
|
"67": "dining_table",
|
||||||
|
"70": "toilet",
|
||||||
|
"72": "tv",
|
||||||
|
"73": "laptop",
|
||||||
|
"74": "mouse",
|
||||||
|
"75": "remote",
|
||||||
|
"76": "keyboard",
|
||||||
|
"77": "cell_phone",
|
||||||
|
"78": "microwave",
|
||||||
|
"79": "oven",
|
||||||
|
"80": "toaster",
|
||||||
|
"81": "sink",
|
||||||
|
"83": "refrigerator",
|
||||||
|
"84": "book",
|
||||||
|
"85": "clock",
|
||||||
|
"86": "vase",
|
||||||
|
"87": "scissors",
|
||||||
|
"88": "teddy_bear",
|
||||||
|
"89": "hair_drier",
|
||||||
|
"90": "toothbrush"
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue