手把手带你复现ICCV 2017经典论文—PyraNet

  • 时间:
  • 浏览:1
  • 来源:5分11选5APP下载_5分11选5APP官方

文件 joints.mat 是 MATLAB 数据格式,中有 了另有一一三个小 以 x 坐标、y 坐标和另有一一三个小 表示关节可见性的二进制数字所构成的 3 x 14 x 8000 的矩阵。使用模块 scipy.io 的函数 loadmat 和 savemat 可不时需实现对 mat 数据的读写。读入后对原始标注进行转置,转置目的是分离每个图片的标注。

JSON格式读入

objcenter = np.array([bbox[0] + bbox[2] / 2., bbox[1] + bbox[3] / 2.])



使用 OpenCV 中的 flip 进行翻转,并对标注点进行处理。在 OpenCV 中 flip 函数的参数有 1 水平翻转、0 垂直翻转、-1 水平垂直翻转并全是。

这里采用的是先扩展边缘,而且放大图片,再进行 crop,原先做很多都可不可不能能保证图片中心处理后依然在中心位置,且没法关节将会 crop 而丢失。注意在处理图片的同時 时需对标注也进行处理。

作者用到了几种数据增强的手段:

1. 从颜色上考虑,还可不时需做图像亮度、饱和度、对比度变化、PCA Jittering(按照 RGB 另有一一三个小 颜色通道计算均值和标准差后在整个训练集上计算协方差矩阵,进行社会形态分解,得到社会形态向量和社会形态值);

for j in range(3):

noise_img = image

bbox = [0, 0, shape[1], shape[0]]

示例图:

'''产生图像大小10%的随机点'''

原文发布时间为:2018-11-9

for i in range(n):

rot = rotMat[:, : 2]

制作Paddle数据

示例图的十三个小标注点:

def add_color_noise(self, image, percentage=0.1):

train_data[counter] = newimg.transpose(2, 0, 1)

joints = np.transpose(joints, (2, 1, 0))

但将会太熟悉两种 框架,也会遇到一点现象:一开使在 AI 开放平台上找了半天没找到文档入口,在搜索引擎上才发现有原先 paddlepaddle.org 的入口;当一点算子的名字和一点框架不太一样的时候,不太容易从文档里找到;不清楚不同版本之间的区别(能跑就行?);官网介绍对大规模计算友好、对可视化的支持均没法体验;Notebook 非常容易崩等现象等等……

MPII数据集简介

使用 paddle.batch 批量读入数据,并制作成 Paddle 的数据格式。

http://sam.johnson.io/research/lspet_dataset.zip

在 OpenCV 中可不时需使用:

for (l, r) in symmetry:

MATLAB格式读入

http://human-pose.mpi-inf.mpg.de/#overview

将每个图片打包成(图片,标注,bounding box)的形式,bounding box 即图片大小,其目的是将大小不一的图片处理成 256 x 256 的大小。

关于PaddlePaddle

joint_dict[joint_id] = {'imgpath': im_path, 'joints': joint_idd, 'bbox': bbox}

rotMat = cv2.getRotationMatrix2D((center[0], center[1]) , angle, 1.0)

要注意 OpenCV 和 PIL 读入的 RGB 顺序是不一样的,在使用不同库进行处理时需转换通道。

读入数据后,时需先把大小不一的标注图片统一转加上 256 x 256。

y = np.random.randint(0,image.shape[1])

左:原图,右:缩放后

x = np.random.randint(0,image.shape[0])

将会是单人数据集,该数据集的训练难度比多人数据集更简单。

数据增强

加上颜色噪声

{Head – 0, Neck – 1, Right Shoulder – 2, Right Elbow – 3, Right Wrist – 4, Left Shoulder – 5, Left Elbow – 6, Left Wrist – 7, Right Hip – 8, Right Knee – 9, Right Ankle – 10, Left Hip – 11, Left Knee – 12, Left Ankle – 13, Chest – 14, Background – 15}

MPII 数据集是以 JSON 格式进行的标注,可不时需通过 JSON 库进行读入。

newimg = cv2.warpAffine(img, rotMat, (width, height))

{1. Right ankle 2. Right knee 3. Right hip 4. Left hip 5. Left knee 6.Left ankle 7.Right wrist 8. Right elbow 9. Right shoulder 10. Left shoulder 11. Left elbow 12. Left wrist 13. Neck 14. Head top}

PCK@0.2 on LSP && LSP-extended:以驱干直径为归一化标准。

论文的评价标准

bbox = np.array(dic['bbox']).reshape(4, ).astype(np.float32)

PCKh@0.5 on MPII:以头部为归一化标准。

MPII 样本数:28000 个(单人、多人)

fluid.recordio_writer.convert_reader_to_recordio_file("./work/test_" + str(i) + "_test.recordio",

noise_img[x, y, i] = noise_img[x, y, i] + random.gauss(2,4)

x, y = anno[i][0], anno[i][1]

mode = 'train'), batch_size=1)

im_path = os.path.join(self.lsp_data_path[count], image_name)

anno = json.load(self.mpii_anno_pah)

noise_img[x, y, i] = 255 if noise_img[x, y, ch] > 255 else 0

从官方开源的一点 demo 项目来讲,对推荐和文本处理方面的应用比较友好,搜索相关关键字不都可不可不能能获得什么都入门的博客、在不同环境的安装指南,官方甚至还做了教学视频。

LSP_extended 样本数:8000 个(全身,单人)

im = np.asarray(im)

LSP 地址:

本文作者:Dicint

num = int(percentage*image.shape[0]*image.shape[1])

rot = rotMat[:, : 2]

'''对图片进行翻转'''

label.append((cod[i][0],cod[i][1]))

LSP 样本数:800 个(全身,单人)

def rotate(self, img, cord, anno, center):

if 'joints' in dic:

img = cv2.resize(big_img[min_y: max_y, min_x: max_x,:], (width, height))

LSP_extended 地址:

from PIL import Image

MPII 地址:

train_data[cnt++] = newimg

import numpy as np

旋转后点的坐标时需通过另有一一三个小 旋转矩阵来取舍 ,在网上的开源代码中,作者使用了以下矩阵的变换矩阵围绕着 (x,y) 进行任意深度图的变换。

big_img = cv2.copyMakeBorder(img, add, add, add, add, borderType = cv2.BORDER_CONSTANT, value=self.pixel_means.reshape(-1))

每个图片都由 Amazon Mechanical Turk 和之类 的途径标注而来,未必深度图准确。哪几种图片被缩放至每一点人至少 80 px 长度进行标注,中有 了 14 个节点。

coor = np.dot(rot, coor) + w

add = np.array([rotMat[0][2], rotMat[1][2]])

minx, miny, maxx, maxy = compute(extend_border, objcenter, in_size, out_size)

LSP && LSP_extended 共 1800 个标注,节点是以下 14 个:

从个科学学习路径来讲,我觉得就 TensorFlow 和现在流行的 PyTorch 而言,前者是业界工程依赖程度高,后者是研究者使用方便,PaddlePaddle 时需有另有一一三个小 清晰的受众定位和有效的推广机制。

def flip(self, img, cod, anno_valid, symmetry):

process(joints_anno)

查了一下资料,PaddlePaddle 最早在 16 年就将会对外开放,然而将会将会一点人入门做机器学习时间较晚有关,在复现活动时候,我就说 听过有另有一一三个小 开源深度图学习平台而我找不到乎 其名字。

对于容易过拟合的数据,数据增强是比较重要的,训练的时候学习率时需只有很多 ,当一次训练过拟合后,可不时需从 loss 曲线波动的地方回溯到较为平稳的点,并以平稳点的学习率为起点,以更低的学习率接上上次学习。

LSP数据集简介

newimg = newimg.transpose(2, 0, 1)

http://sam.johnson.io/research/lsp_dataset.zip

for i in range(n):

翻转

cv2.getRotationMatrix2D((center_x, center_y) , angle, 1.0)

coor = np.array([x, y])

'''处理标注点,symmetry是flip后所对应的标注,具体时需一点人根据实际状态取舍 '''

LSP && LSP_extended

得到转换矩阵,并通过仿射变换得到旋转后的图像。而标注点可不时需直接通过旋转矩阵获得对应点。

import scipy.io as sio

data = sio.loadmat(self.lsp_anno_path[count])

for idd, joint_idd in enumerate(joints):

旋转

(88.995834, 187.24898);(107.78065, 180.57408);(119.648575, 124.80561) (135.3259, 124.53958);(145.38748, 155.4263);(133.68799, 165.95587) (118.47862, 109.380215);(108.41703, 104.68042);(120.81852, 84.05927) (151.70525, 86.63316);(162.93677, 101.14057);(161.29883, 124.773575) (136.0279, 85.93119);(138.13379, 66.809995)

MPII 人体姿势数据集是人体姿势预估的另有一一三个小 benchmark,数据集包括了超过 40k 人的 28000 张带标注图片,哪几种图片是从 YouTube video 中抽取出来的。在测试集中还收录了身体部位遮挡、3D 躯干、头部方向的标注。

joint_id = idd + len(joints) if count else idd

'''加上噪声'''

import json

train_label[cnt++] = np.array(label)

label.append((coor[0], coor[1]))

image_name = "im%s.jpg" % str(idd + 1).zfill(5) if count else "im%s.jpg" % str(idd + 1).zfill(4)

3. 从噪声深度图,高斯噪声、椒盐噪声、模糊处理;

我所采用的办法是直接加上 10% 高斯分布的颜色点作为噪声。人为地损失每种通道信息也可不时需达到加上彩色噪声的效果。

该每种代码:

#self.show(bimg)

据说当前版本的 Fluid 在编写逻辑上和过去的版本将会有了很大的区别,在使用上直观的感受是和 TensorFlow 有一定的之类 性。

除此之外,以下数据增强的办法也很常见:

angle = random.uniform(45, 135)

PCK:检测的关键点与其对应的 groundtruth 之间的归一化距离小于设定阈值的比例。在本篇论文中,作者将图片中心作为身体的位置,并以图片大小作为衡量身体尺寸的标准。

在两种 具体例子中,进行数据增强的以时候考虑的是:1)形变会很多影响结果;2)会很多丢掉每种节点。

reader = paddle.batch(self.read_record(test_list, joint_dict,

尽管没法,在使用一定时间后,我觉得还是觉得挺方便的。两种 框架的使用群体目前未必多,对大公司来讲村里人 全是内内外部各自 对 TensorFlow 的封装性优化平台,对入门者而言往往又全是没法首选.

shape = im.shape

import cv2

2. 从图像空间性质上考虑,还可不时需使用随机裁剪、平移;

train_label[cnt++] = np.array(label)

包括以下 16 类标注:

feeder=feeder, reader_creator=reader)

cod[l], cod[r] = cod[l], cod[r]

对于 LSP 测试集,作者使用的是图像的中心作为身体的位置,并直接以图像大小来衡量身体大小。数据集里的原图片是大小不一的(原图尺寸地处 bbox 里),一般采取 crop 的办法有好几种,比如直接进行 crop,而且放大,原先做很明显会有丢失关节点的将会性。也可不时需先把图片里装中间,而且将图片缩里装目标尺寸范围内原尺寸的可缩放的大小,而且四条边还时需填充的距离,最后 resize 到应有大小。

newimg = cv2.warpAffine(img, rotMat, (width, height))

add = np.array([rotMat[0][2], rotMat[1][2]])

joints = data['joints']

im = Image.open(im_path)

for i in range(num):

return noise_img

bbox[:2] += add

两种 数据集是由 Flickr 上‘Volleyball’, ‘Badminton’, ‘Athletics’, ‘Baseball’, ‘Gymnastics’, ‘Parkour’, ‘Soccer’, ‘Tennis’(原数据集), ‘parkour’, ‘gymnastics’, and ‘athletics’ (扩展集)等标签所构成。

关于训练的过拟合抢救

数据集处理

4. 从类别分布的深度图,可不时需采用 label shuffle、Supervised Data Augmentation(海康威视 ILSVRC 2016 的 report)。

newimg = cv2.flip(img, 1)

 ●  旋转 rotate ●  翻转 flip ●  加上颜色噪声 add color noise

缩放

coor = np.dot(rot, coor) + add