目录

前言:

1. 写入json文件时的 ground truth bbox

2. 导入图片 和 获取对应的 ground truth bbox

3. 进行数据增强后, 决定了 最终的 ground truth bbox


前言:

数据集的ground truth bbox 是一个重要的部分,在训练过程的开始输入数据会经过一系列的变化,然后才被送入到model中,在这个过程中,ground truth bbox 是怎样对应着 数据的变化而相应的改变,从而达到标注的信息是正确的呢?o(* ̄▽ ̄*)o

1. 写入json文件时的 ground truth bbox

        for trackid, ann in enumerate(anns):  # ann <c> 相当于拿出每张图片的每个目标的bboxrect = ann['bbox']  # bboxc = ann['category_id']  # 类别 idbbox = [rect[0], rect[1], rect[0] + rect[2], rect[1] + rect[3]]  # xywh to xyxyif rect[2] <= 0 or rect[3] <= 0:  # lead nan error in cls.count += 1print(count, rect)continuedataset[video_crop_base_path]['{:02d}'.format(trackid)] = {'000000': bbox}  # 举例 {'val2017/000000397133':{'00':{'000000':[217.62,240.54,256.61,298.289999]}}}

可以看出,虽然数据集中的每张图片被裁剪成以目标为中心并resize成511(详见另一篇用于目标跟踪的COCO数据集的预处理过程的API,以及对训练数据的数据增强操作),但是写入json文件的ground truth bbox 还是原来最初标注的bbox值,没做任何处理,只不过从xywh转成xyxy型写入的,所以经过裁剪处理后的图片与json文件中的ground truth bbox 并不是 对应的,但是依然可以获取一些原始的信息,比如bbox的 长和宽,以及会根据这个原始的bbox 来计算填充裁剪bbox的尺寸

利用创建的json文件中的bbox可视化效果如下,可见其包含的信息还是原来未处理中的目标

裁剪后图片画json文件中的bbox

裁剪前的原始图片画json文件中的bbox

2. 导入图片 和 获取对应的 ground truth bbox

由于裁剪的图片都是以目标为中心的,所以根据裁剪图片的形状可以确定目标的中心坐标。然后虽然裁剪的时候尺寸不一定是设定的255和127,不过最终确定的模板和搜索区域的输入是确定的,即127和255。所以根据这个,可以获得目标的 ground truth bbox,目标的中心坐标就是图片的中心坐标,目标的 w 和 h  可以根据裁剪 bbox(填充后的尺寸和resize后的输入尺寸的比例)和json文件中的ground truth bbox 得到的w和h 得到,如下代码中所示

    def _get_bbox(self, image, shape):  # shape 就是 bboximh, imw = image.shape[:2]  # 511,511if len(shape) == 4:  # Truew, h = shape[2]-shape[0], shape[3]-shape[1]  # 举例 h:42.920000000000016  w:38.360000000000014else:w, h = shapecontext_amount = 0.5exemplar_size = cfg.TRAIN.EXEMPLAR_SIZE  # 127wc_z = w + context_amount * (w+h)  # 举例 79.0000000000000hc_z = h + context_amount * (w+h)  # 举例 83.5600000000000s_z = np.sqrt(wc_z * hc_z)  # 举例 81.248015367668   裁剪填充的尺寸scale_z = exemplar_size / s_z  # 举例 1.5631115104248  ratiow = w*scale_z  # 举例 59.96150953989797  裁剪的尺寸 w 以及 hh = h*scale_z  # 举例 67.08890002743356cx, cy = imw//2, imh//2  # 举例 cx:255 cy : 255  以目标为中心bbox = center2corner(Center(cx, cy, w, h))  # {corner:4} <c>  原矩形框没有用上,只用了w和w计算一下比例,然后目标中心就是511图片的中心return bbox

但这个bbox 是对应 裁剪后的满足输入到model  尺寸的image的标注,到现在为止只是导入了原来裁剪后的图片,还没进行 填充 再 resize成 127和255 这步操作,所以现在 image 和 ground truth bbox 也不是 对应的

在 iamge 上画一下 现在的 ground truth bbox,如下所示,虽然框住的目标是正确的,但实际上现在还不算是紧密的矩形框,简单来说中心位置是正确的,但是size是不对应的,该图片还没进行填充裁剪和resize操作(现在的尺寸依然是511),这个图中的目标太小体现不出来差别。

3. 进行数据增强后, 决定了 最终的 ground truth bbox

到现在 ,image的尺寸依然是(511,511),进入数据增强,首先会设定一个新的crop_bbox(后面会以这个为基础构建变换矩阵, 对 image 进行 放射变换),以目标为中心,template_size 或者 search_size为边长,

shape = image.shape  # (511,511,3)
crop_bbox = center2corner(Center(shape[0]//2, shape[1]//2,size-1, size-1))

将其 (蓝色)与第2部分得到的ground truth bbox (黄色) 一起画出来如下所示

数据增强过程中,只有 平移和尺度变换会改变bbox的位置和尺寸,所以这步过后最终的ground turt bbox才确定下来。

进行平移和尺度变换后的矩形框如下图红色所示。它是根据上图蓝色部分基础上进行的平移加变换。画出来后如下图所示。,其中红色就是平移加尺度变换后的裁剪bbox

那么裁剪bbox进行平移和尺度变换后,裁剪的图片也会相比于原本打算的会发生变化,接下来就是怎样把目标的 ground turth bbox 也进行相应的变换,是目标与 ground turth bbox 对应,进行如下操作:

x1, y1 = crop_bbox.x1, crop_bbox.y1
bbox = Corner(bbox.x1 - x1, bbox.y1 - y1,bbox.x2 - x1, bbox.y2 - y1)
if self.scale:bbox = Corner(bbox.x1 / scale_x, bbox.y1 / scale_y,bbox.x2 / scale_x, bbox.y2 / scale_y)

在未裁剪的image 画出 bbox如下所示

如图中左上角矩形框所示,这是为裁剪图片,但是如果把红色矩形框的左上角顶点移到图片image的左上角顶点上,是不是可以想象出它已经包围了目标。其实源代码中也是这样做的,从上面的代码中就可以看出,就是相当于把 进行尺度变换后的用于裁剪的bbox(红色框)左上角顶点(x1, y1)作为参照对应到图片的左上角顶点(0,0),用ground turth bbox(黄色框所示)的左上角顶点和右下角顶点减去(x1, y1)。

接下来把image 进行裁剪,裁剪成127或者255,

    def _crop_roi(self, image, bbox, out_sz, padding=(0, 0, 0)):bbox = [float(x) for x in bbox]  # list:4 [, , ,]a = (out_sz-1) / (bbox[2]-bbox[0])b = (out_sz-1) / (bbox[3]-bbox[1])c = -a * bbox[0]d = -b * bbox[1]mapping = np.array([[a, 0, c],[0, b, d]]).astype(np.float)crop = cv2.warpAffine(image, mapping, (out_sz, out_sz),borderMode=cv2.BORDER_CONSTANT,borderValue=padding)

以红色矩形框为基础,设置变换矩阵,进行仿射变换,得到相应的输出尺寸,裁剪后的图片上画出ground turth bbox 如下图所示,可以以看到下面就是最终的 search图片和 ground turth bbox 的由来。

这里会有一个疑问,不仅search会进行平移加尺度变换 ,而且模板template也会进行平移加尺度变换,那模板的目标会相对于整个区域发生偏移吗?的确模板很可能不在以目标为中心,不过这无关紧要,因为模板送入model的作用就是整个作为卷积核去对大的搜索区域进行相关运算,所以目标在不在中心不影响它应尽的作用,而且这样也增加了模板的多样性以及model的鲁棒性。

 template, _ = self.template_aug(template_image,template_box,cfg.TRAIN.EXEMPLAR_SIZE,gray=gray)  # ndarry:(127,127,3)search, bbox = self.search_aug(search_image,search_box,cfg.TRAIN.SEARCH_SIZE,gray=gray) 

coco数据集进行裁剪、数据增强过程中的ground_truth bbox的设定以及变化相关推荐

  1. 数据可视化过程中常见的错误类型

    数据可视化是一个沟通复杂信息的强大武器.通过可视化信息,我们的大脑能够更好地抓取和保存有效信息,增加信息的印象.但如果数据可视化做的较弱,反而会带来负面效果.错误的表达会损害数据的传播,完全曲解他们. ...

  2. DTCC:数据库安全重点在数据拷贝过程中

    本文讲的是DTCC:数据库安全重点在数据拷贝过程中,2017年5月11日-13日,2017中国数据库技术大会于北京国际会议中心盛大开幕.作为国内最受关注的数据库技术大会,本届大会以"数据驱动 ...

  3. 数据治理过程中会遇到哪些数据问题?

    目前,企业数据的管理和使用仍存在许多问题,导致数据不能很好地利用.企业数据治理过程中主要有以下五类问题: 1.睡眠数据 睡眠数据是指被收集和处理但不用于任何目的的数据.有数据而不使用,甚至业务部门和领 ...

  4. imgaug数据增强库中常用的增强器

    Overview of Augmenters: https://imgaug.readthedocs.io/en/latest/source/overview_of_augmenters.html 1 ...

  5. 计算机系统中数据加工过程中,数据库系统复习题-第1章绪论

    使用数据库系统有什么好处?(填空题) 使用数据库系统的好处是由数据库管理系统的特点或优点决定的. 使用数据库系统的好处很多,例如可以大大提高应用开发的效率,方便用户的使用,减轻数据库系统管理人员维护的 ...

  6. 大数据运营过程中存在哪些问题?

    大数据在概念领域已经受到了很多企业和个人的认可,但是在是实际的使用过程中,越来越多的人希望通过大数据的应用来指导企业的运营,但是企业资源是不是可以被充分的使用,大数据的应用真的可以和概念一样达到相应的 ...

  7. POI导入数据的过程中,遇到读取以科学计数法显示的数据

    在Poi读取Excel数据的过程当中,经常会因为用户操作的问题或是Excel的自动转换将单元格数据转换为科学计数法形式表现,那么这时在后台读取数据并进行校验数据格式的过程当中有可能就会出现错误,或者是 ...

  8. c++builder传递参数_参数按值传递和按地址传递过程中,指向内存的指针如何变化?...

    大家好,我们今日继续讲解VBA代码解决方案的第125讲内容:关键字ByVal和ByRef的作用.在上一节中我们讲到了形式参数和实际参数的定义,同时讲到了从实际参数传递给形式参数的过程中按值传递和按地址 ...

  9. java 方法执行结束局部变量释放_JAVA-方法在执行过程中,JVM的内存分配和变化情况,栈(stack)的情况浅析...

    方法在执行过程中,在JVM中的内存是如何分配的?内存是如何变化的? 一.方法只定义不调用,是不会被执行的,并且在JVM中也不会给该方法分配"运行所属"的内存空间.只有在调用这个方法 ...

最新文章

  1. JFileChooser文件过滤的实现
  2. python鱼眼图像识别_一种融合鱼眼图像与深度图像的动态环境视觉里程计方法与流程...
  3. 化工网站开发_西部地区鼓励投资化工(石化)项目征求意见发布
  4. python基础课程2(看代码看注释)--条件判断|循环|函数|生成器|类
  5. pycharm 变量批量重命名
  6. 80X86 汇编指令符号大全
  7. 设置SQLSERVER的错误日志数量和查找SQLSERVER安装错误日志
  8. Library弱依赖打包
  9. 网络蚂蚁的最基本原理nbsp;-nbsp;httpnbsp;1.1
  10. 软件工程基础作业 可行性与需求分析
  11. steam登录api_steam饰品骗术——骗你说你的账户违反了 Steam 服务协议条款,然后让你转出库存给你的好友。...
  12. PS照片换背景,证件照更换背景色
  13. Joplin 的思维导图 Mindmap(脑图)插件
  14. 159610-89-6,6-Azido-N-Fmoc-L-norleucine,FMC-LYS(N3)-OHO, 6-叠氮基-N-Fmoc-L-正亮氨酸可用于通过稳定的酰胺键与叠氮基衍生伯胺
  15. Visual Studio中的Android模拟器使用详解
  16. 手机加密聊天软件功能文档(基于android系统)
  17. 用Raphael在网页中画圆环进度条(简化版)
  18. 阿里云服务器漏洞phpmyadmin CVE-2016-6617解决方法
  19. js中如何将object转化为json数据,json数据转js对象
  20. 电路板排针拆除(拔出)方法

热门文章

  1. Tensorflow GPU并行运算
  2. 两块STM32之间 SPI DMA通信
  3. 服务器设计系列 网络模型,网络服务器的结构模型
  4. 爬取百大弹幕,大家还是喜欢上罗老师的课!
  5. kebab-case
  6. MATLAB中的CVX包使用中的错误:Cannot perform the operation: {convex} .* {convex}
  7. 原生js写一个简单的编辑器
  8. theano环境配置
  9. yesry 通过桥接器,Java调用任何API或DLL
  10. NUMERIC和DECIMAL区别