1、前言

本个CenterNet系列的代码地址为:zzzxxxttt/torch_simple_CenterNet_45
此次主要记录的是数据处理方面,主要针对COCO数据。主要涉及脚本为:
datasets/coco.pyutils/images.py
以下主要结合代码进行对一些关键点和难点进行记录。

2、主要内容


这里主要对COCO数据集包含的对象进行罗列,这里额外加入了__background__,代表背景,同时列出对象所对应的编号,但其并不是连续的,从末尾是90而类别是80+1即可知道不对应,所以其并不连续;然后就是一些数据处理所需要用到的一些特定的常量。(图在上方 > - <)

def __init__(self, data_dir, split, split_ratio=1.0, img_size=512):        super(COCO, self).__init__()    self.num_classes = 80    self.class_name = COCO_NAMES    self.valid_ids = COCO_IDSself.cat_ids = {v: i for i, v in enumerate(self.valid_ids)}self.data_rng = np.random.RandomState(123)    self.eig_val = np.array(COCO_EIGEN_VALUES, dtype=np.float32)    self.eig_vec = np.array(COCO_EIGEN_VECTORS, dtype=np.float32)    self.mean = np.array(COCO_MEAN, dtype=np.float32)[None, None, :]    self.std = np.array(COCO_STD, dtype=np.float32)[None, None, :]self.split = split   # 'train'  'val'    self.data_dir = os.path.join(data_dir, 'COCO2017/')    self.img_dir = os.path.join(self.data_dir, 'images/%s2017' % split)if split == 'test':      self.annot_path = os.path.join(self.data_dir, 'annotations', 'image_info_test-dev2017.json')    else:      self.annot_path = os.path.join(self.data_dir, 'annotations', 'instances_%s2017.json' % split)self.max_objs = 128    self.padding = 127  self.down_ratio = 4self.img_size = {'h': img_size, 'w': img_size}self.fmap_size = {'h': img_size // self.down_ratio, 'w': img_size // self.down_ratio}self.rand_scales = np.arange(0.6, 1.4, 0.1)self.gaussian_iou = 0.7print('==> initializing coco 2017 %s data.' % split)    self.coco = coco.COCO(self.annot_path)self.images = self.coco.getImgIds()

接着是class COCO(data.Dataset)这个类,这是这个脚本的核心。def __init__()是进行的一些初始化处理操作,其中比较重要的是:
self.annot_path = os.path.join(self.data_dir, 'annotations', 'instances_%s2017.json' % split)
self.coco = coco.COCO(self.annot_path)
self.images = self.coco.getImgIds()

首先我们看coco这个库,需要我们导入pycocotools,这个的安装,具体可参考如下博客:
Windows下安装 pycocotools
安装好这个后,我们便来获取coco数据,如下是coco2017的目录结构:

训练所采用的是instances_train2017.json,通过此json标签文件,加上coco库,便可轻松获取COCO数据集我们想要的内容,如图片,图片所包含的物体的种类和编号,已经对应的bbox,都可以,具体操作流程如下:

self.coco = coco.COCO(self.annot_path)
self.images = self.coco.getImgIds()
#这里以index=0为例
img_id = self.images[0]
img_path = os.path.join(self.img_dir, self.coco.loadImgs(ids=[img_id])[0]['file_name'])
ann_ids = self.coco.getAnnIds(imgIds=[img_id])
annotations = self.coco.loadAnns(ids=ann_ids)labels = np.array([self.cat_ids[anno['category_id']] for anno in annotations])
bboxes = np.array([anno['bbox'] for anno in annotations], dtype=np.float32)

下图是获取到的self.coco的内容:

这里的anns,是图片中物体所在位置的bbox的坐标,其下的category_id,代表物体所属种类的编号,id,代表所属图片的标号,由于一张图片中可能存在多个物体,故可能出现不同的ann所属id相同的情况。这里的长度是860001。

这个的imgs,主要的作用是提供img所在路径,即提供file_name,图片名称,通过图片名称和根目录来读取图片。其长度为118287。

然后是def __getitem__(self, index)这个函数,也是数据处理和获取的主要函数。
下面这些主要是获取每张图片上的标签信息,包括其所属类别,bbox框,同时最后转化为[x1,y1,x2,y2]这种格式。(需要记住这种获取coco数据集的方法)

  def __getitem__(self, index):img_id = self.images[index]img_path = os.path.join(self.img_dir, self.coco.loadImgs(ids=[img_id])[0]['file_name'])#print(img_path)ann_ids = self.coco.getAnnIds(imgIds=[img_id])annotations = self.coco.loadAnns(ids=ann_ids)labels = np.array([self.cat_ids[anno['category_id']] for anno in annotations])bboxes = np.array([anno['bbox'] for anno in annotations], dtype=np.float32)if len(bboxes) == 0:bboxes = np.array([[0., 0., 0., 0.]], dtype=np.float32)labels = np.array([[0]])bboxes[:, 2:] += bboxes[:, :2]  # xywh to xyxy

然后是数据增强处理(代码见下方,示意图下),包括翻转、仿射变化(包括放缩,裁剪等)。翻转,即flipped为True时,代表进行翻转,img = img[ :, : :-1 , : ]作用是水平翻转,img = img[ : : -1 , : , : ]代表的是上下翻转;然后是get_border()这个函数,位于utils/image.py中,作用是当图片的w/h大于256时,便返回128,否则返回64,意思是图片较大时返回128,较小是返回64,然后center便是其选定的中心点,可见下面的示意图。然后是get_affine_transform()这个函数,其作用是求warpAffine()所需的变换矩阵,求变换矩阵,至少需要3个点,刚才的center是一个点,然后通过旋转一定角度又是一个点,在通过对称又可以获得一个点。这些点的处理全部位于utils/image.py中的get_affine_transform()函数中,其中,get_dir()是获取旋转后的点,get_3rd_point是获取对称的点。

flipped = Falseif self.split == 'train':scale = scale * np.random.choice(self.rand_scales)w_border = get_border(128, width)h_border = get_border(128, height)center[0] = np.random.randint(low=w_border, high=width - w_border)center[1] = np.random.randint(low=h_border, high=height - h_border)if np.random.random() < 0.5:flipped = Trueimg = img[:, ::-1, :]center[0] = width - center[0] - 1trans_img = get_affine_transform(center, scale, 0, [self.img_size['w'], self.img_size['h']])img = cv2.warpAffine(img, trans_img, (self.img_size['w'], self.img_size['h']))

接着,是下面的代码,归一化操作,颜色增强,均值处理,通道变化,特征图的变化矩阵,初始化所要用的参数,对bbox坐标点也进行相应的仿射变化,然后求出包含对象的中心点。

 img = img.astype(np.float32) / 255.if self.split == 'train':color_aug(self.data_rng, img, self.eig_val, self.eig_vec)img -= self.meanimg /= self.stdimg = img.transpose(2, 0, 1)  # from [H, W, C] to [C, H, W]trans_fmap = get_affine_transform(center, scale, 0, [self.fmap_size['w'], self.fmap_size['h']])hmap = np.zeros((self.num_classes, self.fmap_size['h'], self.fmap_size['w']), dtype=np.float32)  # heatmapw_h_ = np.zeros((self.max_objs, 2), dtype=np.float32)  # width and heightregs = np.zeros((self.max_objs, 2), dtype=np.float32)  # regressioninds = np.zeros((self.max_objs,), dtype=np.int64)ind_masks = np.zeros((self.max_objs,), dtype=np.uint8)# detections = []for k, (bbox, label) in enumerate(zip(bboxes, labels)):if flipped:bbox[[0, 2]] = width - bbox[[2, 0]] - 1bbox[:2] = affine_transform(bbox[:2], trans_fmap)bbox[2:] = affine_transform(bbox[2:], trans_fmap)bbox[[0, 2]] = np.clip(bbox[[0, 2]], 0, self.fmap_size['w'] - 1)bbox[[1, 3]] = np.clip(bbox[[1, 3]], 0, self.fmap_size['h'] - 1)h, w = bbox[3] - bbox[1], bbox[2] - bbox[0]if h > 0 and w > 0:obj_c = np.array([(bbox[0] + bbox[2]) / 2, (bbox[1] + bbox[3]) / 2], dtype=np.float32)obj_c_int = obj_c.astype(np.int32)

最后,是关于高斯处理的一些知识,具体见下列代码。首先是获取’‘高斯半径’’,具体求解见gaussian_radius这个函数,见下列图片,可以看出,是r1,r2,r3中的最小值。当时初看的时候,感觉很像二次函数的求根公式,后来经查询资料,果然真是。。。具体推导,可见下列我的手写版,也可参考下列网址讲解heatmap里面如何应用高斯散射核。求出高斯半径之后,便是绘制高斯核,这个主要是要了解高斯的二位表达式,然后数据获取到此基本结束,最后return所需要的东西即可。

     radius = max(0, int(gaussian_radius((math.ceil(h), math.ceil(w)), self.gaussian_iou)))draw_umich_gaussian(hmap[label], obj_c_int, radius)w_h_[k] = 1. * w, 1. * hregs[k] = obj_c - obj_c_int  # discretization errorinds[k] = obj_c_int[1] * self.fmap_size['w'] + obj_c_int[0]ind_masks[k] = 1

3、总结

这部分代码不是很难,主要是对一些数据处理方法、数学知识等的理解,明白代码所代表的的含义,理解原理才是难点。故记录一下。

CenterNet学习记录(一)——COCO数据处理相关推荐

  1. R语言数据处理学习记录--使用linkET包完成mental test

    R语言数据处理学习记录–使用linkET包完成mental test 注:本文仅作为自己的学习记录以备复习查阅 一 简单介绍一下 这个包依旧是来自于GitHub上,作者给出的介绍:linkET的目标是 ...

  2. 王爽 16 位汇编语言学习记录

    以下为汇编学习记录,内容全部出自王爽的16位<汇编语言>,如有错误,可直接去查看原书. 汇编语言   机器语言是机器指令集的集合,机器指令是一列二进制数字,计算机将其翻译成高低电平,从而使 ...

  3. ML、DL、CNN学习记录3

    文章目录 ML.DL.CNN学习记录3 Transfer Learning ML.DL.CNN学习记录3 # coding: utf-8 # Date:2020/8/15 19:16 # @Autho ...

  4. R语言基础学习记录4:重要函数

    时间: 2018-07-18(学习) 2018-07-22(学习记录) 教程:慕课网 <R语言基础> 讲师:Angelayuan 补充内容: R语言常用函数总结大全.gl()函数 学习内容 ...

  5. CVPR2019| 百度17篇CVPR论文学习记录(包含:无人驾驶、神经网络、GAN、无监督学习、目标检测)

    首先感谢现在网上资源丰富,能够获得很多人的总结,结合自身实际进行了学习记录. 并着重标注了其中关键核心 目录 1)Taking A Closer Look at Domain Shift: Categ ...

  6. Java学习记录_1:MOOC《零基础学Java语言》课后习题解

    Hey,我是寒水,一名大二学生,电子商务专业在读,正在学习Java中.我试图将在Java学习中遇到的一些困惑和最终的解答发在这个账号上,希望以此来激励我不要放弃学习! 在学习记录这个专题中,我收藏一些 ...

  7. scrapy框架菜鸟学习记录

    scrapy框架菜鸟学习记录 scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架.其可以应用在数据挖掘,信息处理或储存历史数据等一系列的程序中.其最初是为了页面抓取(更确切的说,网络抓 ...

  8. 大创学习记录(四)之yolov3代码学习

    PyTorch-YOLOv3项目训练与代码学习 借助从零开始的PyTorch项目理解YOLOv3目标检测的实现 PyTorch 对于PyTorch就不用多说了,目前最灵活.最容易掌握的深度学习库,它有 ...

  9. SSD训练数据集流程(学习记录)

    关于理论部分我看的是b站"霹雳吧啦Wz"的SSD理论讲解,作为入门小白表示能听懂,需要的同学可以自行观看 目录 1.训练环境 2.训练步骤 1.训练环境 我的环境是win11+an ...

最新文章

  1. CMU赵越:异常检测的算法、案例和落地
  2. 词法,语法,句法,语义
  3. ext js IE9显示白板 页面浏览器模式强制渲染IE8
  4. 电脑端京东的我的订单html+css页面_什么是前端和后端开发?写给即将迈入前端开发领域的朋友...
  5. 2.Android的学习(Android的环境搭建)
  6. 基于Android NDK的交叉编译
  7. UVA 10004 - Bicoloring
  8. python登录各种网页示例_Python 通过爬虫实现GitHub网页的模拟登录的示例代码
  9. python当输入0时结束_python输入-1时结束-女性时尚流行美容健康娱乐mv-ida网
  10. C. Valera and Elections DFS
  11. Linux下eclipse中shell脚本编程环境的搭建
  12. C++ 读取TXT文件
  13. 放大镜 讲课_《放大镜》的教学设计
  14. arcgis测量工具测量类型无法选择平面
  15. 独立站的SEO搜索引擎优化
  16. MySQL监控-Datadog数据库监控调研
  17. 计算机转换汉子英语,中英文切换(电脑怎么切换拼音打字)
  18. oracle递归查询(层级查询)
  19. IT大佬告诉你大数据有哪些特点,新人学习必知
  20. Ilog、Drools、Jess规则引擎的Rule Language 比对

热门文章

  1. 【论文笔记】GLFP: Global Localization from a Floor Plan
  2. Unix编程实践教程笔记(四) IO重定向
  3. Authing 正式加入 W3C 组织,将参与相关国际标准制定
  4. 开发 免费 短信控件 Redsky 1.0版本
  5. 电脑手机ipad平板百度网盘下载文件保存位置
  6. 利用EasyDL制作一个简单的图片识别小项目
  7. 如何去做用户访谈和用户调研?
  8. Hone C# III
  9. iOS 12系统安装教程:开发者预览版抢先体验
  10. 金融/股市/基本术语/常识积累