imgaug增强边界框

2024-04-15 02:58
文章标签 增强 边界 imgaug

本文主要是介绍imgaug增强边界框,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

         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增强边界框的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/904723

相关文章

Rhinoceros 8 for Mac/Win:重塑三维建模边界的革新之作

Rhinoceros 8(简称Rhino 8),作为一款由Robert McNeel & Assoc公司开发的顶尖三维建模软件,无论是对于Mac还是Windows用户而言,都是一款不可多得的高效工具。Rhino 8以其强大的功能、广泛的应用领域以及卓越的性能,在建筑设计、工业设计、产品设计、三维动画制作、科学研究及机械设计等多个领域展现出了非凡的实力。 强大的建模能力 Rhino 8支持多种建

黑神话:悟空》增加草地绘制距离MOD使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验

《黑神话:悟空》增加草地绘制距离MOD为玩家提供了一种全新的视觉体验,通过扩展游戏中草地的绘制距离,增加了场景的深度和真实感。该MOD通过增加草地的绘制距离,使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验。 增加草地绘制距离MOD安装 1、在%userprofile%AppDataLocalb1SavedConfigWindows目录下找到Engine.ini文件。 2、使用记事本编辑

国产隔离放大器:增强信号完整性和系统安全性的指南

隔离放大器是电子领域的关键组件,特别是在信号完整性和电气隔离至关重要的应用中。这些放大器隔离输入和输出信号,使它们能够在没有直接电气连接的情况下跨不同系统传输数据。这确保了电路一部分的高压尖峰或噪声不会影响另一部分,从而保护了系统和用户。随着国产隔离放大器的不断发展,它们提供了性能、可靠性和成本效益的完美结合,使其成为工程师和系统设计师的理想选择。 1. 了解国产隔离放大器的优势 增强信号

像素间的关系(邻接、连通、区域、边界、距离定义)

文章目录 像素的相邻像素4邻域D邻域8邻域 邻接、连通、区域和边界邻接类型连通区域边界 距离测度欧氏距离城市街区距离(city-block distance)棋盘距离(chessboard distance) 参考 像素的相邻像素 4邻域 坐标 ( x , y ) (x,y) (x,y)处的像素 p p p有2个水平的相邻像素和2个垂直的相邻像素,它们的坐标是: ( x

jmeter压力测试,通过LLM利用RAG实现知识库问答,NEO4J部署,GraphRAG以知识图谱在查询时增强提示实现更准确的知识库问答(9/7)

前言         这周也是杂七杂八的一天(高情商:我是一块砖,哪里需要往哪里搬),首先是接触了jemter这个压力测试工具,然后帮公司的AIGC项目编写使用手册和问答手册的第一版,并通过这个平台的智能体实现知识库问答的功能展示,以及部分个人扩展和思考(NEO4J创建知识图谱的GraphRAG)。 Jmeter         Jmeter是一个压力测试工具,一开始导师叫我熟悉的时候我还说

Java高级特性增强-NIO

GitHub:https://github.com/wangzhiwubigdata/God-Of-BigData 关注公众号,内推,面试,资源下载,关注更多大数据技术~大数据成神之路~预计更新500+篇文章,已经更新50+篇~ **Java高级特性增强-NIO 本部分网络上有大量的资源可以参考,在这里做了部分整理并做了部分勘误,感谢前辈的付出,每

一个功能增强的Delphi TListView组件——TSmartListView

unit SmartListView;  {* |<PRE>  ================================================================================  * 单元名称:TSmartListView v1.01  * 单元作者:HsuChong@hotmail.com  * 备    注:  * 开发平台:PWin2003St

华为OD机试 - 增强的strstr - 滑动窗口(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。 一、题目描述 C语言有一

OpenCV 旋转矩形边界

边界矩形是用最小面积绘制的,所以它也考虑了旋转。使用的函数是**cv.minAreaRect**()。 import cv2import numpy as npimg=cv2.imread(r'D:\PythonProject\thunder.jpg')img1=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)print(img.dtype)ret,thres