OpenPose -tensorflow代码解析(1)——工程概述&&训练前的准备

前言

该openpose-tensorflow的工程是自己实现的,所以有些地方写的会比较简单,但阅读性强、方便使用。

论文翻译 || openpose – Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields
工程实现 || 基于opencv使用openpose完成人体姿态估计

OpenPose -tensorflow代码解析(1)——工程概述&&训练前的准备
OpenPose -tensorflow代码解析(2)—— 数据增强和处理 dataset.py
OpenPose -tensorflow代码解析(3)—— 网络结构的搭建 Net.py
OpenPose -tensorflow代码解析(4)—— 训练脚本 train.py
OpenPose -tensorflow代码解析(5)—— 预测代码解析 predict.py

1 项目需求

最近项目需要对手部进行关节点识别。

  • 【提供的图片】固定的姿势,完整单个手部图片
  • 【要求】每个关键点都必须识别出来,不要求实时,但精度要高。
  • 【思路】对于关键点是识别,直接想到 OpenPose 工程,使用官网提供的exe 进行手部模型测试,发现精度和稳定行并不能满足项目需求。所以我们针对自己的场景,采集手部图片数据集。然后重新训练神经网络。
  • 【具体实施】自己选用 tensorflow 框架,来自己编写 openpose 工程
    (github上有很多公布的tensorflow、pytorch等工程代码,都可以进行借鉴参考)
  • 【开发环境】:【Ubuntu18 】+ 【tensorflow-gpu 1.14】

2 数据集的准备

2.1 image与label的形式

得到的手部关节点图片如下
在这里插入图片描述
使用 labelme 进行关键点的标注:labelme标注软件的使用 (这个连接介绍的是语义分割数据的标注,该软件也可以进行目标框、关键点的标注)
标注后对 json文件进行解析,得到的关键点保存为 txt 文件。内容为:

199 365
273 330
335 298
381 276
425 260
309 217
350 159
372 131
390 97
271 203
300 121
315 86
328 43
236 205
243 120
244 83
246 35
195 213
193 150
188 120
181 83
188 403
188 403

2.2 数据的目录组织的形式如下:

+ openpose_hand
 + data
  |+ dataset2 (存放这数据集的 image 和 label)
  |+ train.txt (记录训练数据路径)
  |+ test.txt (记录验证数据路径)
 + code
  |+ train.py
  |…
  
在这里插入图片描述

2.3 生成必要的文件

在正式训练之前,需要写个简单的脚本,实现生成train.txt、test.txt 文件的功能。

#  generate_txt.py

import os
import random

def generate_txt():

   ftrain = open('../data/train.txt', 'w')
   fval = open('../data/test.txt', 'w')

   data_path = '../data/dataset2/'
   label_path = '../data/dataset2/'

   file_names = os.listdir(data_path)
   file_names = [file_names[i] for i in range(len(file_names)) if file_names[i][-4:]==".png"]
   print(len(file_names))

   random.shuffle(file_names)

   for i in range(10000):
       # print(i)
       file_name = file_names[i][:-4]
       new_data = data_path+file_name + '.png'
       new_label = label_path+file_name + '.txt'
       ftrain.write(new_data+" "+new_label+"\n")

   for i in range(1328):
       # print(i)
       file_name = file_names[i][:-4]
       new_data = data_path+file_name + '.png'
       new_label = label_path+file_name + '.txt'
       fval.write(new_data+" "+new_label+"\n")

generate_txt()

3 训练自己的数据集

当有新的数据集,来进行关节点预测。整个工程需要修改的内容为

  • 1 按照 2章节的讲解,将工程和数据组织起来,生成 train.txt、test.txt

  • 2 修改 opt.py 脚本,其中需要修改的为
    (1) cfg.OP.cpm_num :关键点的数量、cfg.OP.paf_num 连接点对的数量 ×2
    (2) cfg.TRAIN.input_size :神经网络输入的尺寸中的高H(也是输入图像的H)、
    cfg.OP.WH_ratio = H/W
    (3) batchsize、训练轮次、保存路径,根据自己实际情况修改数值

     from easydict import EasyDict as edict
    print("read config  ====================================")
    cfg                             = edict()
    cfg.OP                        = edict()
    
    cfg.OP.strides                = 8
    cfg.OP.WH_ratio               = 1
    cfg.OP.cpm_num = 22
    cfg.OP.paf_num = 21*2
    
    # Train options
    cfg.TRAIN                       = edict()
    cfg.TRAIN.annot_path            = "../data/train.txt"
    cfg.TRAIN.batch_size            = 8
    cfg.TRAIN.input_size            = [512]
    # cfg.TRAIN.input_size            = [320, 352, 384, 416, 448, 480, 512, 544, 576, 608]
    cfg.TRAIN.data_aug              = True
    cfg.TRAIN.learn_rate_init       = 1e-4
    cfg.TRAIN.learn_rate_end        = 1e-6
    
    cfg.TRAIN.warmup_epoch         = 2
    cfg.TRAIN.first_stage_epoch    = 100
    cfg.TRAIN.second_stage_epoch   = 30
    cfg.TRAIN.initial_weights        = None
    cfg.TRAIN.ckpt_path        = "./model/checkpoint0/"
    cfg.TRAIN.log_path = './model/log0/'
    #
    
    # TEST options
    cfg.TEST                        = edict()
    cfg.TEST.annot_path             = "../data/test.txt"
    cfg.TEST.batch_size             = 8
    cfg.TEST.input_size             = [512]
    cfg.TEST.data_aug               = False
     
    
  • 3 修改 dataset.py 脚本
    (1) self.shuffle_ref 根据自己的数据情况,分配关键点对的连接方式
    (2) self.LR_morrir 根据自己数据情况,给出镜像的索引列表。
    self.LR_morrir 如果关键点是对称的,对于关键点[0,1,2,3,4,5],假设它们对应的镜像点的索引为 [5,4,3,2,1,0]。如果关键点不是对称的,这里为空

  • 4 修改 train.py 脚本
    (1)

                self.learning_rate = tf.train.exponential_decay(starter_learning_rate,
                                                           self.global_step,
                                                           decay_steps=800,
                                                           decay_rate=0.96,
                                                           staircase=True)
    

    其中的 decay_steps 需要根据自己的起止学习率和经验设置学习率的衰减步长。
    (2) 如果选用 tf.train.piecewise_constant 来衰减学习率,就要在 opt.py 脚本中,修改 cfg.TRAIN.learn_rate_init 的定义,例 cfg.TRAIN.learn_rate_init = [1e-4, 1e-5, 1e-6]

完成如上操作,就可正常训练出结果,要进一步的优化,就需要细读代码来修改脚本。炼丹愉快!

  • 6
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值