跳转到主要内容

边界框比较工具

项目描述

box-diff

边界框比较工具

作者:Kevin Barnard, kbarnard@mbari.org

tests

安装

box-diff可在PyPI上作为boxdiff获得

pip install boxdiff

用法

box-diff的所有内容都包含在boxdiff包中。

import boxdiff

核心数据模型定义在boxdiff.models模块中。这些分为三组

  • BoundingBox:ID + 标记的二维边界框
  • Image:ID + 边界框集合
  • ImageSet:ID + 图像集合

注意:ID可以是整数、UUID或字符串。

每组都有一个数据模型(定义在boxdiff.models.core),一个delta(boxdiff.models.deltas)和一个差异标志(boxdiff.models.flags)。数据模型代表对象及其属性,而delta代表两个对象之间属性值的变化。差异标志表示从delta对象导出的两个对象之间属性差异的存在。

所有数据模型都可序列化为JSON。例如,

json_str = bounding_box.to_json(indent=2)

print(json_str)

可能得到

{
  "id": 0,
  "label": "label",
  "x": 0.0,
  "y": 0.0,
  "width": 1.0,
  "height": 1.0
}

同样,数据模型对象也可以从JSON解析。例如,

bounding_box = BoundingBox.from_json(json_str)

print(bounding_box)
# BoundingBox(id=0, label='label', x=0.0, y=0.0, width=1.0, height=1.0)

边界框

BoundingBox由ID、标签和一个二维框(x、y、宽度、高度)定义。

from boxdiff import BoundingBox

car_box = BoundingBox(
    id=0,
    label='car',
    x=100, y=200,
    width=300, height=80
)

可以使用==运算符检查相等性

same_car_box = BoundingBox(
    id=0,
    label='car',
    x=100, y=200,
    width=300, height=80
)

print(car_box == same_car_box)
# True

corrected_car_box = BoundingBox(
    id=0,
    label='car',
    x=90, y=210,
    width=320, height=85
)

print(car_box == corrected_car_box)
# False

可以使用-运算符计算两个边界框之间的BoundingBoxDelta

box_delta = corrected_car_box - car_box

print(box_delta)
# BoundingBoxDelta(id=1, label_old='car', label_new='car', x_delta=-10.0, y_delta=10.0, width_delta=20.0, height_delta=5.0)

然后可以从delta计算BoundingBoxDifference标志

print(box_delta.flags)
# BoundingBoxDifference.RESIZED|MOVED

可以使用+运算符将delta应用到边界框上

new_car_box = car_box + box_delta

print(new_car_box)
# BoundingBox(id=1, label='car', x=90.0, y=210.0, width=320.0, height=85.0)

print(new_car_box == corrected_car_box)
# True

可以从边界框计算面积

print(car_box.area)
# 24000.0

可以使用iou方法计算边界框之间的交集与并集

car_iou = car_box.iou(corrected_car_box)

print(car_iou)
# 0.695364238410596

图像

图像由一个ID和一组边界框定义。

from boxdiff import Image
from uuid import UUID

image = Image(
    id=UUID('78d76772-4664-467c-ae88-a25496234966'),
    bounding_boxes=[car_box]
)

同样,可以使用==运算符检查相等性,并使用-运算符计算增量。

corrected_image = Image(
    id=UUID('78d76772-4664-467c-ae88-a25496234966'),
    bounding_boxes=[corrected_car_box]
)

image_delta = corrected_image - image

print(image_delta)
# ImageDelta(
#   id=0, 
#   boxes_added=[], 
#   boxes_removed=[], 
#   box_deltas=[
#     BoundingBoxDelta(
#       id=0, 
#       label_old='car', 
#       label_new='car', 
#       x_delta=-10.0, 
#       y_delta=10.0, 
#       width_delta=20.0, 
#       height_delta=5.0
#     )
#   ]
# )

同样,可以从增量计算标志。

print(image_delta.flags)
# ImageDifference.BOXES_MODIFIED

图像集

ImageSet由一个ID和一组图像定义。

from boxdiff import ImageSet

image_set = ImageSet(
    id='my_image_set',
    images=[image, ...]
)

其语法和结构类似于Image

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

boxdiff-0.2.0.tar.gz (4.4 kB 查看哈希值)

上传时间

构建分布

boxdiff-0.2.0-py3-none-any.whl (5.6 kB 查看哈希值)

上传时间 Python 3

支持者