PatchViewer¶
- class ibb.widgets.PatchViewer(**kwargs: Any)[source]¶
This widget works in a similar way as the
BramboxViewer, but is meant to be used with large images and splits it in smaller patches with overlap.
It’s arguments work a lot like brambox’s brambox.util.BoxDrawer class.- Parameters
images (callable or dict-like object) – A way to get the image or path to the image from the image labels in the dataframe
boxes (pandas.DataFrame) – Bounding boxes to draw
overlap (int, or tuple of int, optional) – width and height overlap between patches; Default computed automatically
label (pandas.Series) – Label to write above the boxes; Default class_label (confidence)
color (pandas.Series) – Color to use for drawing; Default every class_label will get its own color, up to 10 labels
size (pandas.Series) – Thickness of the border of the bounding boxes; Default 3
alpha (pandas.Series) – Alpha fill value of the bounding boxes; Default 00
pad (int, float or tuple of 2 int/float) – Padding to add around the width and height (see Note); Default 10
**kwargs (dict) – Extra keyword arguments that will be passed to
Viewer
Note
If the images argument is callable, the image or path to the image will be retrieved in the following way: >>> image = images(image_label)
Otherwise the image or path is retrieved as: >>> image = images[image_label]
Note
The overlap property can be one of 3 possible types: - int : A fixed pixel overlap is added to each side. - (int, int) : Separate pixel overlap for the width and height. - None : Automatically compute overlap so all patches contain full image data
Note
The label, color, size and alpha arguments can also be tacked on to the boxes dataframe as columns. They can also be a single value, which will then be used for each bounding box.
Basically, as long as you can assign the value as a new column to the dataframe, it will work.
Examples¶
Warning
Note that the widgets are not responding as we do not have a python backend running!
[1]:
import brambox as bb
import ibb
[2]:
# Load annotations
anno = bb.io.load('pandas', 'annotations.h5')
anno
[2]:
| image | class_label | id | x_top_left | y_top_left | width | height | occluded | truncated | lost | difficult | ignore | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 000001 | dog | NaN | 48.0 | 240.0 | 147.0 | 131.0 | 0.0 | 1.0 | False | False | False |
| 1 | 000001 | person | NaN | 8.0 | 12.0 | 344.0 | 486.0 | 0.0 | 1.0 | False | False | False |
| 2 | 000002 | train | NaN | 139.0 | 200.0 | 68.0 | 101.0 | 0.0 | 0.0 | False | False | False |
| 3 | 000003 | sofa | NaN | 123.0 | 155.0 | 92.0 | 40.0 | 0.0 | 0.0 | False | False | False |
| 4 | 000003 | chair | NaN | 239.0 | 156.0 | 68.0 | 49.0 | 0.0 | 0.0 | False | False | False |
| 5 | 000004 | car | NaN | 13.0 | 311.0 | 71.0 | 51.0 | 0.0 | 0.0 | False | False | False |
| 6 | 000004 | car | NaN | 362.0 | 330.0 | 138.0 | 59.0 | 0.0 | 1.0 | False | False | False |
| 7 | 000004 | car | NaN | 235.0 | 328.0 | 99.0 | 47.0 | 0.0 | 0.0 | False | False | False |
| 8 | 000004 | car | NaN | 175.0 | 327.0 | 77.0 | 37.0 | 0.0 | 0.0 | False | False | False |
| 9 | 000004 | car | NaN | 139.0 | 320.0 | 50.0 | 39.0 | 0.0 | 0.0 | False | False | False |
| 10 | 000004 | car | NaN | 108.0 | 325.0 | 42.0 | 28.0 | 0.0 | 0.0 | False | False | False |
| 11 | 000004 | car | NaN | 84.0 | 323.0 | 37.0 | 27.0 | 0.0 | 0.0 | False | False | False |
[3]:
v = ibb.PatchViewer(
# Dictionary or Function to map image column to image paths
lambda name: f'images/{name}.jpg',
anno,
patch=100,
overlap=10,
)
v
[3]:
[4]:
# Load Detections
det = bb.io.load('pandas', 'detections.h5')
det
[4]:
| image | class_label | id | x_top_left | y_top_left | width | height | confidence | |
|---|---|---|---|---|---|---|---|---|
| 0 | 000001 | person | NaN | 270.069856 | 55.980325 | 35.082728 | 99.642827 | 0.002556 |
| 1 | 000001 | tvmonitor | NaN | 5.429369 | 80.088432 | 26.879914 | 99.102836 | 0.001120 |
| 2 | 000001 | person | NaN | 273.802024 | 96.162503 | 32.399382 | 73.652089 | 0.034645 |
| 3 | 000001 | person | NaN | 318.425435 | 77.141560 | 28.912620 | 123.342065 | 0.008122 |
| 4 | 000001 | person | NaN | 352.354380 | 93.409190 | 9.711184 | 83.560586 | 0.001517 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 164 | 000004 | car | NaN | 67.649786 | 306.099818 | 296.283392 | 96.845572 | 0.001021 |
| 165 | 000004 | motorbike | NaN | -35.525570 | 334.530390 | 342.759683 | 109.085184 | 0.001464 |
| 166 | 000004 | car | NaN | 6.774407 | 340.022931 | 330.145946 | 97.088520 | 0.001446 |
| 167 | 000004 | person | NaN | 41.884642 | 136.205545 | 339.365922 | 438.765929 | 0.001059 |
| 168 | 000004 | bus | NaN | 123.889300 | 143.956826 | 334.710195 | 428.265535 | 0.001212 |
169 rows × 8 columns
[5]:
ibb.PatchViewer(
# Dictionary or Function to map image column to image paths
lambda name: f'images/{name}.jpg',
det,
# Set overlap to 100 and let overlap be computed automatically
patch=100,
# Scale border size, based on confidence levels
size=det.confidence * 5,
)
[5]: