in sagemaker/src/run_inference.py [0:0]
def run_word_segmentation_net(nets, input_image, ctx, min_c=0.1, overlap_thres=0.1, topk=600):
x = nets["body"][0](input_image)
anchor_sizes = [[.1, .2], [.2, .3], [.2, .4], [.3, .4], [.3, .5], [.4, .6]]
anchor_ratios = [[1, 3, 5], [1, 3, 5], [1, 6, 8], [1, 4, 7], [1, 6, 8], [1, 5, 7]]
num_anchors = len(anchor_sizes)
num_classes = 2
# Run SSD
default_anchors = []
predicted_boxes = []
predicted_classes = []
for i in range(num_anchors):
default_anchors.append(mx.contrib.ndarray.MultiBoxPrior(x, sizes=anchor_sizes[i], ratios=anchor_ratios[i]))
predicted_boxes.append(_flatten_prediction(nets["box_preds"][i](x)))
predicted_classes.append(_flatten_prediction(nets["class_preds"][i](x)))
if i < len(nets["downsamples"]):
x = nets["downsamples"][i](x)
elif i == 3:
x = mx.nd.Pooling(x, global_pool=True, pool_type='max', kernel=(4, 4))
anchors = mx.nd.concat(*default_anchors, dim=1)
box_preds = mx.nd.concat(*predicted_boxes, dim=1)
class_preds = mx.nd.concat(*predicted_classes, dim=1)
class_preds = mx.nd.reshape(class_preds, shape=(0, -1, num_classes + 1))
# Do SSD prediction
bb = np.zeros(shape=(13, 5))
bb = mx.nd.array(bb)
bb = bb.as_in_context(ctx)
bb = bb.expand_dims(axis=0)
class_preds = mx.nd.transpose(class_preds, axes=(0, 2, 1))
box_target, box_mask, cls_target = mx.contrib.ndarray.MultiBoxTarget(
anchors, bb, class_preds)
cls_probs = mx.nd.SoftmaxActivation(class_preds, mode='channel')
predicted_bb = mx.contrib.ndarray.MultiBoxDetection(*[cls_probs, box_preds, anchors], force_suppress=True, clip=False)
predicted_bb = mx.contrib.ndarray.box_nms(predicted_bb, overlap_thresh=overlap_thres, valid_thresh=min_c, topk=topk)
predicted_bb = predicted_bb.asnumpy()
predicted_bb = predicted_bb[0, predicted_bb[0, :, 0] != -1]
predicted_bb = predicted_bb[:, 2:]
predicted_bb[:, 2] = predicted_bb[:, 2] - predicted_bb[:, 0]
predicted_bb[:, 3] = predicted_bb[:, 3] - predicted_bb[:, 1]
return predicted_bb