from pybx import anchor, ops
+
+= (256, 256)
+ image_sz = (10, 10)
+ feature_sz = 1/2.
+ asp_ratio
+= anchor.bx(image_sz, feature_sz, asp_ratio) coords, labels
PyBx
+Installation
+pip install pybx
+Usage
+To calculate the anchor boxes for a single feature size and aspect ratio, given the image size:
+100 anchor boxes of asp_ratio
0.5 is generated along with unique labels:
len(coords), len(labels)
(100, 100)
+The anchor box labels are especially useful, since they are pretty descriptive:
+-1], labels[-1] coords[
([234, 225, 252, 256], 'a_10x10_0.5_99')
+To calculate anchor boxes for multiple feature sizes and aspect ratios, we use anchor.bxs
instead:
= [(10, 10), (8, 8)]
+ feature_szs = [1., 1/2., 2.]
+ asp_ratios
+= anchor.bxs(image_sz, feature_szs, asp_ratios) coords, labels
All anchor boxes are returned as ndarrays
of shape (N,4)
where N is the number of boxes.
The box labels are even more important now, since they help you uniquely identify to which feature map size or aspect ratios they belong to.
+101], labels[101] coords[
(array([29, 0, 47, 30]), 'a_10x10_0.5_1')
+-1], labels[-1] coords[
(array([217, 228, 256, 251]), 'a_8x8_2.0_63')
+MultiBx
methods
+Box coordinates (with/without labels) in any format (usually ndarray
, list
, json
, dict
) can be instantialized as a MultiBx
, exposing many useful methods and attributes of MultiBx
. For example to calculate the area of each box iteratively:
from pybx.basics import *
+# passing anchor boxes and labels from anchor.bxs()
+print(coords.shape)
+
+= mbx(coords, labels)
+ boxes type(boxes)
(492, 4)
+pybx.basics.MultiBx
+len(boxes)
492
+= [b.area for b in boxes] areas
Each annotation in the MultiBx
object boxes
is also a BaseBx
with its own set of methods and properties.
-1] boxes[
BaseBx(coords=[[217, 228, 256, 251]], label=['a_8x8_2.0_63'])
+-1].coords, boxes[-1].label boxes[
([[217, 228, 256, 251]], (#1) ['a_8x8_2.0_63'])
+MultiBx
objects can also be “added” which stacks them vertically to create a new MultiBx
object:
= mbx(coords_json) # annotation as json records
+ boxes_true len(boxes_true)
2
+= mbx(coords_numpy) # annotation as ndarray
+ boxes_anchor len(boxes_anchor)
492
+ boxes_true
MultiBx(coords=[[130, 63, 225, 180], [13, 158, 90, 213]], label=['clock', 'frame'])
+= boxes_true + boxes_anchor + boxes_true boxes
len(boxes)
496
+Use ground truth boxes for model training
+from pybx.anchor import get_gt_thresh_iou, get_gt_max_iou
+from pybx.vis import VisBx
image_sz
(256, 256)
+ boxes_true
MultiBx(coords=[[130, 63, 225, 180], [13, 158, 90, 213]], label=['clock', 'frame'])
+Calculate candidate anchor boxes for many aspect ratios and scales.
+= [(10, 10), (3, 3), (2, 2)]
+ feature_szs = [0.3, 1/2., 2.]
+ asp_ratios
+= anchor.bxs(image_sz, feature_szs, asp_ratios) anchors, labels
Wrap using pybx methods. This step is not necessary but convenient.
+= get_bx(anchors, labels)
+ boxes_anchor len(boxes_anchor)
341
+The following function returns two positive ground truth anchors with largest IOU for each class in the label bounding boxes passed.
+= get_gt_max_iou(
+ gt_anchors, gt_ious, gt_masks =boxes_true,
+ true_annots=boxes_anchor, # if plain numpy, pass anchor_boxes and anchor_labels
+ anchor_boxes=False, # whether to replace ground truth labels with true labels
+ update_labels=1, # can request extra boxes
+ positive_boxes )
gt_anchors
{'clock': BaseBx(coords=[[156, 0, 227, 180]], label=['a_2x2_0.3_1']),
+ 'frame': BaseBx(coords=[[12, 152, 72, 256]], label=['a_3x3_0.5_6'])}
+= gt_anchors['clock'] + gt_anchors['frame']
+ all_gt_anchors all_gt_anchors
/mnt/data/projects/pybx/pybx/basics.py:464: BxViolation: Change of object type imminent if trying to add <class 'pybx.basics.BaseBx'>+<class 'pybx.basics.BaseBx'>. Use <class 'pybx.basics.BaseBx'>+<class 'pybx.basics.BaseBx'> instead or basics.stack_bxs().
+ f"Change of object type imminent if trying to add "
+MultiBx(coords=[[156, 0, 227, 180], [12, 152, 72, 256]], label=['a_2x2_0.3_1', 'a_3x3_0.5_6'])
+= VisBx(pth='../data/', img_fn='image.jpg', image_sz=image_sz)
+ v ={'a_2x2_0.3_1':'red', 'a_3x3_0.5_6': 'red'}) v.show(all_gt_anchors, color
<AxesSubplot:>
+More exploratory stuff in the walkthrough notebook!
+ + +