imgaug对边界框及其扩展具有本地支持。 它们通过其左上角和右下角的坐标表示,既是绝对值,又具有亚像素精度。

在imgaug中,边框仅受增强器更改图像几何形状的影响。 例如 水平翻转或仿射变换。 它们不受其他方法(例如高斯噪声)的影响。

在以下各节中列出了两个类,用于在imgaug中增加边界框。

API:边界框

imgaug.augmentables.bbs.BoundingBox(x1,y1,x2,y2,label = None):单个边界框的容器,根据其左上角和右下角定义,每个角分别表示为x和y像素坐标(浮点数,即亚像素精度)。BoundingBox提供的重要属性是:.x1,.y1,.x2,.y2,.height,.width,.area,.center_x,.center_y。
BoundingBox提供的重要方法是:
project(from_shape,to_shape):将边界框坐标从一种图像形状投影到另一种图像形状。
extend([all_sides],[top],[right],[bottom],[left]):沿给定边增加像素值的边界框大小。
交集(其他,[默认]):返回此边界框和另一个边界框的相交边界框。
union(other):类似于intersection(),返回联合。
iou(other):计算此边界框和另一个边界框的IoU。
is_fully_within_image(image):确定所有边界框坐标是否在图像平面内。
is_partly_within_image(image):确定边框的至少一部分是否在图像平面内。
clip_out_of_image(image):裁剪边界框在图像平面之外的所有部分。
shift([x],[y]):移动边界框。
draw_on_image(图像,[颜色],α,[大小],[副本],[raise_if_out_of_image]):在图像上绘制边界框及其标签。
draw_label_on_image(图像,[颜色],[颜色文本],[颜色_bg],[alpha],[大小],[大小_文本],[高度],[副本],[raise_if_out_of_image]):仅绘制包含标签(文本)的矩形)(在边框上方)上。
draw_box_on_image(图像,[颜色],[alpha],[尺寸],[副本],[raise_if_out_of_image):仅在图像上绘制边框的框。
extract_from_image(image,[pad],[pad_max],[prevent_zero_size]):从图像中提取包围盒中包含的像素。

API:BoundingBoxesOnImage

imgaug.augmentables.bbs.BoundingBoxesOnImage(bounding_boxes,shape):放置在图像上的边界框列表的容器。 shape参数表示放置边框的图像的形状。需要确保基于图像大小的增强在图像和放置在其上的边界框之间对齐(例如,裁剪)。BoundingBoxesOnImage提供的重要方法是:
on(image):将边界框投影到另一个图像上。
from_xyxy_array(xyxy,shape):从(N,4)numpy数组创建BoundingBoxesOnImage实例。
to_xyxy_array([dtype]):将实例转换为(N,4)numpy数组。
draw_on_image([颜色],[alpha],[大小],[副本],[raise_if_out_of_image]):将所有边界框及其标签绘制到图像上。
remove_out_of_image([完全],[部分]):删除完全或至少部分在图像平面之外的边界框。
clip_out_of_image():在所有边界框上调用clip_out_of_image()。
shift([x],[y]):在所有边界框上调用shift()。

API:方法

可以使用方法expand(images = ...,bounding_boxes = ...)来扩大边界框。 或者,可以使用Enhance_bounding_boxes(),它接受BoundingBoxesOnImage的单个实例或该类的列表。

API:更多

下面介绍大多数提到的方法。 该API还包含更多详细信息。 参见例如 BoundingBox,BoundingBoxesOnImage,imgaug.augmenters.meta.Augmenter.augment()和imgaug.augmenters.meta.Augmenter.augment_bounding_boxes()

例子

让我们尝试一个简单的边界框增强示例。 我们加载一张图像,在其上放置两个边界框,然后使用仿射变换来扩充数据。

首先,我们加载并可视化数据:

ia.seed(1)
image = imageio.imread("d.jpg")
#image = ia.imresize_single_image(image, (1280,720))
bbs = BoundingBoxesOnImage([BoundingBox(x1=1154, x2=1185, y1=254, y2=282),BoundingBox(x1=1220, x2=1270, y1=423, y2=472)
], shape=image.shape)
ia.imshow(bbs.draw_on_image(image, size=2))

下一步是定义我们要应用的扩充。 我们选择一个简单的对比度增强(仅影响图像)和仿射变换(影响图像和边界框)。

ia.seed(1)seq = iaa.Sequential([iaa.GammaContrast(1.5),iaa.Affine(translate_percent={"x": 0.1}, scale=0.8)
])

现在,我们同时增强图像和其上的边框。 我们可以使用seq.augment(...)或其快捷方式seq(...):

image_aug, bbs_aug = seq(image=image, bounding_boxes=bbs)

请注意,如果我们想增加几个图像,我们将使用seq(images = [image1,image2,...],bounding_boxes = [bbs1,bbs2,...])之类的东西。 该方法非常灵活,并且还可以处理与BoundingBoxesOnImage不同的边界框,例如 每个图像一个(N,4)数组,表示每个边界框的(x1,y1,x2,y2)。 确保尽管对图像和边界框都调用一次该方法,但不要两次(对于图像一次,针对边界框)一次,因为这样每次调用将采样不同的随机值,并且扩展将最终未对齐。

现在我们已经扩充了数据,我们可以再次对其进行可视化:

ia.imshow(bbs_aug.draw_on_image(image_aug, size=2))

45度旋转引入的问题

让我们尝试另一种增强技术。 这次我们应用仅包含旋转的仿射变换。

image = imageio.imread("d.jpg")
bbs = BoundingBoxesOnImage([BoundingBox(x1=1154, x2=1185, y1=254, y2=282),BoundingBox(x1=1220, x2=1270, y1=423, y2=472)
], shape=image.shape)
image_aug, bbs_aug = iaa.Affine(rotate=45)(image=image, bounding_boxes=bbs)
ia.imshow(bbs_aug.draw_on_image(image_aug))

您现在可能倾向于说这些扩充功能看起来有些错误,并且某些地方一定出错了。 但是输出实际上是正确的,并且显示了边界框扩展的特殊情况-或者,为什么要避免45°旋转。 问题源于非对象像素是边界框的一部分。 旋转后,必须绘制一个包含这些非对象像素的新边界框。 以下示例将问题可视化:

image = imageio.imread("d.jpg")
bbs = BoundingBoxesOnImage([BoundingBox(x1=1154, x2=1185, y1=254, y2=282),BoundingBox(x1=1220, x2=1270, y1=423, y2=472)
], shape=image.shape)
# highlight the area of each bounding box
image_points = np.copy(image)
colors = [(0, 255, 0), (128, 128, 255)]
for bb, color in zip(bbs.bounding_boxes, colors):image_points[bb.y1_int:bb.y2_int:4, bb.x1_int:bb.x2_int:4] = color
# rotate the image with the highlighted bounding box areas
rot = iaa.Affine(rotate=45)
image_points_aug, bbs_aug = rot(image=image_points, bounding_boxes=bbs)
# visualize
side_by_side = np.hstack([bbs.draw_on_image(image_points, size=2),bbs_aug.draw_on_image(image_points_aug, size=2)])
fig, ax = plt.subplots(figsize=(20, 20))
ax.imshow(side_by_side)

如您所见,增强的边界框非常适合每个边界框的旋转像素。 但是由于必须环绕最顶部/右侧/底部/左侧的像素,因此新的边界框现在还包含大量以前未包含在边界框中的像素。

绘画

常见的操作是在图像上绘制边框。 上面的示例中已经使用了执行此操作的方法。 它提供了参数来控制绘制的边界框的颜色,大小(即边框厚度)和alpha(即不透明度)。 以下示例显示了它们的用法。

image = imageio.imread("d.jpg")
bbs = BoundingBoxesOnImage([BoundingBox(x1=1154, x2=1185, y1=254, y2=282),BoundingBox(x1=1220, x2=1270, y1=423, y2=472)
], shape=image.shape)
image_bbs = np.copy(image)
image_bbs = bbs.bounding_boxes[0].draw_on_image(image_bbs, color=[255, 0, 0], size=3)
image_bbs = bbs.bounding_boxes[1].draw_on_image(image_bbs, color=[0, 255, 0], size=10, alpha=0.5)
ia.imshow(image_bbs)

如果我们向边界框添加标签,它们也会自动绘制:

image = imageio.imread("d.jpg")
bbs = BoundingBoxesOnImage([BoundingBox(x1=1154, x2=1185, y1=254, y2=282),BoundingBox(x1=1220, x2=1270, y1=423, y2=472)
], shape=image.shape)
image_bbs = np.copy(image)
image_bbs = bbs.bounding_boxes[0].draw_on_image(image_bbs, color=[0, 255, 0], size=3)
image_bbs = bbs.bounding_boxes[1].draw_on_image(image_bbs, color=[255, 0, 0], size=10, alpha=0.5)
#加标签
bbs_labeled = bbs.deepcopy()
bbs_labeled[0].label = "safeHat"
bbs_labeled[1].label = "person"
image_bbs = bbs_labeled.draw_on_image(image, size=2)
ia.imshow(image_bbs)

如果要在边界框上设置标签但不绘制它们,请在每个边界框上手动调用draw_box_on_image()。 那只会画box。

提取图像内容,移动边界框

使用边界框时,另一种常见操作是提取其相应的图像区域。 当边界框完全位于图像平面内时,这是微不足道的。 如果它也可以全部或部分位于图像平面之外,则操作将变得更加复杂。 BoundingBox提供了extract_from_image(image),从而避免了处理此类问题的麻烦。 如果边界框未完全在图像中,它将根据需要将结果零填充,以达到边界框的高度和宽度。

image = imageio.imread("d.jpg")
bbs = BoundingBoxesOnImage([BoundingBox(x1=1154, x2=1185, y1=254, y2=282),BoundingBox(x1=1220, x2=1270, y1=423, y2=472)
], shape=image.shape)
hat = bbs.bounding_boxes[0].extract_from_image(image)
ia.imshow(hat)

通过组合.extend()和.extract_from_image()来提取更大的图像区域:

image = imageio.imread("d.jpg")
bbs = BoundingBoxesOnImage([BoundingBox(x1=1154, x2=1185, y1=254, y2=282),BoundingBox(x1=1220, x2=1270, y1=423, y2=472)
], shape=image.shape)
hat = bbs.bounding_boxes[1].extend(all_sides=10, left=100).extract_from_image(image)
ia.imshow(hat)

现在,我们将边界框部分移到图像的外部,然后提取其内容:

image = imageio.imread("d.jpg")
bbs = BoundingBoxesOnImage([BoundingBox(x1=1154, x2=1185, y1=254, y2=282),BoundingBox(x1=1220, x2=1270, y1=423, y2=472)
], shape=image.shape)
bb = bbs.bounding_boxes[0].shift(x=200)
ia.imshow(bb.draw_on_image(image, size=2))
ia.imshow(bb.extract_from_image(image))

如您在第二张图像中看到的,图像外部的像素填充有零。 如果您不希望这样做,则可以添加参数pad = False以禁用填充。 默认情况下,这仍将填充以防止任何轴变为零,即您将不会获得(0,0,3)输出数组。 这样可以防止错误 在绘图过程中。 如果您希望在这种情况下获得零大小的数组,只需添加prevent_zero_size = False。

imgaug增强边界框相关推荐

  1. [深度学习] imgaug边界框增强笔记

    imgaug边界框增强笔记主要是讲述基于imgaug库对目标检测图像的边界框进行图像增强.本文需要掌握imgaug库的基本使用,imgaug库的基本使用见[深度学习] imgaug库使用笔记. 文章目 ...

  2. 【图普科技】边界框的数据增强(二) ——缩放和平移

    本文由[图普科技]编译. 这是我们根据目标检测任务调整图像增强技术系列文章的第二部分.在这一部分中,我们将介绍如何实现缩放和平移的数据增强技术, 以及图像增强后,如果出现边界框在图像区域之外的情况该如 ...

  3. 【图普科技】边界框的数据增强:对目标检测图像变换的再思考(一)

    [本文由图普科技编译] 当谈到深度学习任务的表现时,毋庸置疑,数据越多越好.然而,我们拥有的数据可能是有限的.数据增强是通过人为扩充数据集来解决数据短缺问题的一种方法.实际上,该技术已被证明非常成功, ...

  4. 深度学习笔记(36) 边界框预测

    深度学习笔记(36) 边界框预测 1. 不精准的输出边界框问题 2. YOLO算法 1. 不精准的输出边界框问题 在滑动窗口法中,取这些离散的位置集合,然后在它们上运行分类器 在这种情况下,这些边界框 ...

  5. python采用Basemap绘制完美中国地图(包括绘制边界框,随机点等)

    python采用Basemap绘制完美中国地图(包括绘制边界框,随机点等) 1. 效果图 2. 原理 2.1 依赖模块及安装 2.2 工程目录 2.3 依赖文件latlng.txt 经纬度 3 源码 ...

  6. 【OpenCV 】计算物体的凸包/创建包围轮廓的矩形和圆形边界框/createTrackbar添加滑动条/

    目录 topic 1:模板匹配 topic 2:图像中寻找轮廓 topic 3:计算物体的凸包 topic 4:轮廓创建可倾斜的边界框和椭圆¶ topic 5:轮廓矩¶ topic 6:为程序界面添加 ...

  7. 边界框的回归策略搞不懂?算法太多分不清?看这篇就够了

    作者 | fivetrees 来源 | https://zhuanlan.zhihu.com/p/76477248 本文已由作者授权,未经允许,不得二次转载 [导读]目标检测包括目标分类和目标定位 2 ...

  8. 实战:基于深度学习和几何的3D边界框估计

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 3D 对象检测问题在需要决策或与现实世界中的对象交互的机器人应用中 ...

  9. 谷歌AI发布“会动的”3D物体数据集,附带标记边界框、相机位姿、稀疏点云,网友:快给我的AR模型用上...

    萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 见过3D物体数据集,见过会动的3D物体数据集吗? 每段动态视频都以目标为中心拍摄,不仅自带标注整体的边界框,每个视频还附带相机位姿和稀疏点云 ...

最新文章

  1. 利用卷积神经网络(VGG19)实现火灾分类(附tensorflow代码及训练集)
  2. ubuntu 关闭qq打不开的终极方法
  3. 在内地城区经济发展中冒头,长沙雨花是如何做到的?
  4. java技术系列(一) Enum
  5. 环境变量PATH、mv命令、cp命令、文档查看命令(cat、more、less、head、tail)
  6. 使用inspector功能查看和管理契约
  7. 笔记本html连接电视机黑屏是怎么回事,电脑连接电视黑屏是怎么回事
  8. (36)FPGA面试题D触发器实现4进制计数器
  9. 在IDEA中安装使用Antlr
  10. Hadoop学习笔记(一):零Linux基础安装hadoop过程笔记
  11. python函数局部变量_Python局部函数– functoolspartial()
  12. PHP视频教程下载(PHP100系列视频教程)
  13. java从0单排之java就业培训教程复习与面试题回顾——01
  14. mysql中的rman备份与恢复_RMAN备份与恢复实践(转)
  15. Android Textview控件基础属性
  16. 人工智能对摄影测量与遥感的影响与挑战——龚健雅院士
  17. 小技巧(7):WPS批量修改图片尺寸
  18. 找零钱问题(C语言实现)——贪心算法应用(1)
  19. [2022 ICLR] Pyraformer: Low-Complexity Pyramidal Attention for Long-Range 时空序列建模和预测
  20. WordPress独立下载页面插件

热门文章

  1. 圣诞狂欢节 满千减百 上不封顶
  2. Node部署和运维工作量降低80%,腾讯NOW直播是怎么做到的?
  3. 域名解析--详细讲解
  4. 7 天打造前端性能监控系统
  5. Excel 多个工作表或工作簿一键轻松合并
  6. Java程序中用JFreeChart制作图形报表-Java基础-Java-编程开发
  7. Excel如何批量删除合并相同单元格并填充
  8. 解决windows10无法关机问题
  9. 新披露的APT组织white company,针对巴基斯坦进行Shaheen攻击活动Lazarus组织最新活动各类安全资源...
  10. python sklearn svm模型的保存与加载调用