位置: IT常识 - 正文

利用openpose提取自建数据集骨骼点训练st-gcn,复现st-gcn(openpose的输出)

编辑:rootadmin
利用openpose提取自建数据集骨骼点训练st-gcn,复现st-gcn 利用openpose提取自建数据集骨骼点训练st-gcn,复现st-gcn0、下载st-gcn

推荐整理分享利用openpose提取自建数据集骨骼点训练st-gcn,复现st-gcn(openpose的输出),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:openpose算法,openpose输出格式,openpose代码,openpose怎么用,openpose提取关节点信息,openpose代码,openpose怎么用,openpose的输出,内容如对您有帮助,希望把文章链接给更多的朋友!

参考: gitbub上fork后导入到gitee快些: st-gcn下载 也可以直接下载zip文件后解压

1、处理准备自己数据集数据集要求将相同类别的视频放到同一文件夹,我这里用到一个较老的数据集:training_lib_KTH.zip,六种行为放到六个不同文件夹。 用于st-gcn训练的数据集视频帧数不要超过300帧,5~6s的视频时长比较好,不要10几s的视频时长。要不然会报index 300 is out of bounds for axis 1 with size 300这种错误。因此对上面数据集进一步裁剪为6s的大概150帧(此视频帧率为25后面利用FFmpeg再次改变帧率为30时,时长会变长到8s)。裁剪后视频文件如下 原始数据集和裁剪为6s的数据集放在链接: 链接:https://pan.baidu.com/s/1oHQyo-c3e5YXb52b-O0STQ?pwd=x166 提取码:x1662、准备环境,搭建openpose环境搭建openpose环境是为了利用open pose提取knetics-skeleton视频的骨骼点,openpose环境的搭建可参考以下视频: openpose环境搭建 以及参考博客:windows 10下,自编译openpose代码此处注意如果用cuda,最好先下载vs后再下载cuda3、利用openpose提取自己视频骨骼数据

st-gcn作者有提供他们整理好并使用的kinetics-skeleton数据集,他们数据集格式如下图所示: 接下来参考:用自建kinetics-skeleton行为识别数据集训练st-gcn网络流程记录中的2部分对视频数据进行resize至340x256的大小,30fps的帧率。然后调用openpose的进行骨骼点数据的检测和输出。

#!/usr/bin/env python# coding:gbkimport osimport argparseimport jsonimport shutilimport numpy as npimport torchimport skvideo.io#from processor.io import IOimport toolsimport tools.utils as utils# if __name__ == '__main__':#class PreProcess(IO):class PreProcess(): def start(self): work_dir = 'D:/st-gcn' type_number = 6 action_filename_list = ['boxing', 'handclapping', 'handwaving', 'jogging', 'running', 'walking'] for process_index in range(type_number): action_filename = action_filename_list[process_index] # 标签信息 labelAction_name = '{}_{}'.format(action_filename,process_index) #labelAction_name = 'xxx_{}'.format(process_index) label_no = process_index # 视频所在文件夹 originvideo_file = 'D:/dataSet/training_lib_KTH_cut_6s/{}/'.format(action_filename) # resized视频输出文件夹 需要自己创建几个动作的文件夹 resizedvideo_file = './mydata/training_lib_KTH_cut_6s/resized/{}/'.format(action_filename) videos_file_names = os.listdir(originvideo_file) # 1. Resize文件夹下的视频到340x256 30fps for file_name in videos_file_names: video_path = '{}{}'.format(originvideo_file, file_name) outvideo_path = '{}{}'.format(resizedvideo_file, file_name) writer = skvideo.io.FFmpegWriter(outvideo_path, outputdict={'-f': 'mp4','-vcodec': 'libx264', '-s': '340x256', '-r': '30'}) reader = skvideo.io.FFmpegReader(video_path) for frame in reader.nextFrame(): writer.writeFrame(frame) writer.close() print('{} resize success'.format(file_name)) # 2. 利用openpose提取每段视频骨骼点数据 resizedvideos_file_names = os.listdir(resizedvideo_file) for file_name in resizedvideos_file_names: outvideo_path = '{}{}'.format(resizedvideo_file, file_name) # openpose = '{}/examples/openpose/openpose.bin'.format(self.arg.openpose) #openpose = '{}/OpenPoseDemo.exe'.format(self.arg.openpose) openpose = 'D:/openpose-master/build/x64/Release/OpenPoseDemo.exe' video_name = file_name.split('.')[0] output_snippets_dir = './mydata/training_lib_KTH_cut_6s/resized/snippets/{}'.format(video_name) output_sequence_dir = './mydata/training_lib_KTH_cut_6s/resized/data' output_sequence_path = '{}/{}.json'.format(output_sequence_dir, video_name) #label_name_path = '{}/resource/kinetics_skeleton/label_name_action.txt'.format(work_dir)#自己创建好标签文档,里面文档内写好动作名称 label_name_path = '{}/resource/kinetics_skeleton/label_name_action{}.txt'.format(work_dir,process_index) with open(label_name_path) as f: label_name = f.readlines() label_name = [line.rstrip() for line in label_name] # pose estimation openpose_args = dict( video=outvideo_path, write_json=output_snippets_dir, display=0, render_pose=0, model_pose='COCO') command_line = openpose + ' ' command_line += ' '.join(['--{} {}'.format(k, v) for k, v in openpose_args.items()]) shutil.rmtree(output_snippets_dir, ignore_errors=True) os.makedirs(output_snippets_dir) os.system(command_line) # pack openpose ouputs video = utils.video.get_video_frames(outvideo_path) height, width, _ = video[0].shape # 这里可以修改label, label_index video_info = utils.openpose.json_pack( output_snippets_dir, video_name, width, height, labelAction_name, label_no) if not os.path.exists(output_sequence_dir): os.makedirs(output_sequence_dir) with open(output_sequence_path, 'w') as outfile: json.dump(video_info, outfile) if len(video_info['data']) == 0: print('{} Can not find pose estimation results.'.format(file_name)) return else: print('{} pose estimation complete.'.format(file_name))if __name__ == '__main__': p=PreProcess() p.start()

运行代码之前提前再st-gcn里面建好/mydata/training_lib_KTH_cut_6s_resized文件夹,并在文件夹中将六种行为的文件夹也创建好,‘boxing’, ‘handclapping’, ‘handwaving’, ‘jogging’, ‘running’, ‘walking’。运行之前也需要创建标签文档0到5: 每个文档里面是100个动作标签 运行完如下所示: 此时打开data能看到所有视频的骨骼数据,snippets里面每个json文件存的是单帧骨骼数据,data里面每个json文件都是一个视频的所有骨骼点数据。data里面json文件打开如下图所示:

4、整理骨骼点数据,生成st-gcn运行的格式利用openpose提取自建数据集骨骼点训练st-gcn,复现st-gcn(openpose的输出)

首先将data里面的数据分成训练集、验证集、测试集按照6:2:2划分. 将01到15复制kinetics_train,16-20放到val,21-25放到test。

import jsonimport osif __name__ == '__main__': train_json_path = './mydata/kinetics-skeleton/kinetics_train' val_json_path = './mydata/kinetics-skeleton/kinetics_val' test_json_path = './mydata/kinetics-skeleton/kinetics_test' output_train_json_path = './mydata/kinetics-skeleton/kinetics_train_label.json' output_val_json_path = './mydata/kinetics-skeleton/kinetics_val_label.json' output_test_json_path = './mydata/kinetics-skeleton/kinetics_test_label.json' # train_json_names = os.listdir(train_json_path) val_json_names = os.listdir(val_json_path) test_json_names = os.listdir(test_json_path) train_label_json = dict() val_label_json = dict() test_label_json = dict() for file_name in train_json_names: name = file_name.split('.')[0] json_file_path = '{}/{}'.format(train_json_path, file_name) json_file = json.load(open(json_file_path)) file_label = dict() if len(json_file['data']) == 0: file_label['has_skeleton'] = False else: file_label['has_skeleton'] = True file_label['label'] = json_file['label'] file_label['label_index'] = json_file['label_index'] train_label_json['{}'.format(name)] = file_label print('{} success'.format(file_name)) with open(output_train_json_path, 'w') as outfile: json.dump(train_label_json, outfile) for file_name in val_json_names: name = file_name.split('.')[0] json_file_path = '{}/{}'.format(val_json_path, file_name) json_file = json.load(open(json_file_path)) file_label = dict() if len(json_file['data']) == 0: file_label['has_skeleton'] = False else: file_label['has_skeleton'] = True file_label['label'] = json_file['label'] file_label['label_index'] = json_file['label_index'] val_label_json['{}'.format(name)] = file_label print('{} success'.format(file_name)) with open(output_val_json_path, 'w') as outfile: json.dump(val_label_json, outfile) for file_name in test_json_names: name = file_name.split('.')[0] json_file_path = '{}/{}'.format(test_json_path, file_name) json_file = json.load(open(json_file_path)) file_label = dict() if len(json_file['data']) == 0: file_label['has_skeleton'] = False else: file_label['has_skeleton'] = True file_label['label'] = json_file['label'] file_label['label_index'] = json_file['label_index'] test_label_json['{}'.format(name)] = file_label print('{} success'.format(file_name)) with open(output_test_json_path, 'w') as outfile: json.dump(test_label_json, outfile)

生成如下: 再利用stgcn训练代码中自带了数据转换代码tools/kinetics_gendata.py,使用该脚本将kinetics-skleton数据集转换为训练使用的npy与pkl文件。 这里参考博客:数据转换中的三数据转换。以下地方需要修改:

num_person_in=1, #observe the first 5 persons num_person_out=1, #then choose 2 persons with the highest score part = ['train', 'val','test']

frame不用修改即可前面视频已经裁剪过 运行脚本后:

5、训练st-gcn网络

这部分参考st-gcn训练自建行为识别数据集中的5、6部分即可 我的train.yaml是这样修改的:

work_dir: ./work_dir/recognition/kinetics_skeleton/ST_GCN# feederfeeder: feeder.feeder.Feedertrain_feeder_args: random_choose: True random_move: True window_size: 150 # data_path: ./data/Kinetics/kinetics-skeleton/train_data.npy# label_path: ./data/Kinetics/kinetics-skeleton/train_label.pkl data_path: ./mydata/kinetics-skeleton/train_data.npy label_path: ./mydata/kinetics-skeleton/train_label.pkltest_feeder_args:# data_path: ./data/Kinetics/kinetics-skeleton/val_data.npy# label_path: ./data/Kinetics/kinetics-skeleton/val_label.pkl data_path: ./mydata/kinetics-skeleton/val_data.npy label_path: ./mydata/kinetics-skeleton/val_label.pkl# modelmodel: net.st_gcn.Modelmodel_args: in_channels: 3 num_class: 6 edge_importance_weighting: True graph_args: layout: 'openpose' strategy: 'spatial'# training#device: [0,1,2,3]device: [0]batch_size: 32test_batch_size: 32#optimbase_lr: 0.1step: [20, 30, 40, 50]num_epoch: 50

执行训练代码:

python main.py recognition -c config/st_gcn/kinetics-skeleton/train.yaml6、测试

可修改test.yaml利用刚刚自己的测试集进行测试

weights: ./work_dir/recognition/kinetics_skeleton/ST_GCN/epoch50_model.pt#weights: ./models/st_gcn.kinetics.pt# feederfeeder: feeder.feeder.Feedertest_feeder_args:# data_path: ./data/Kinetics/kinetics-skeleton/val_data.npy# label_path: ./data/Kinetics/kinetics-skeleton/val_label.pkl# data_path: ./mydata/kinetics-skeleton/val_data.npy# label_path: ./mydata/kinetics-skeleton/val_label.pkl data_path: ./mydata/kinetics-skeleton/test_data.npy label_path: ./mydata/kinetics-skeleton/test_label.pkl# modelmodel: net.st_gcn.Modelmodel_args: in_channels: 3 num_class: 6 edge_importance_weighting: True graph_args: layout: 'openpose' strategy: 'spatial'# test phase: testdevice: 0test_batch_size: 32

然后执行

python main.py recognition -c config/st_gcn/kinetics-skeleton/test.yaml

注:作者也是一位初学者,此文章供参考讨论,有什么问题欢迎讨论多多指教!

本文链接地址:https://www.jiuchutong.com/zhishi/297554.html 转载请保留说明!

上一篇:Vue插槽(vue插槽的使用场景)

下一篇:快速搞懂Pinia及数据持久化存储(详细教程)

  • 苹果xs无线充电功率(苹果xs无线充电充不进去)

    苹果xs无线充电功率(苹果xs无线充电充不进去)

  • 华为手机充电一闪一灭的(华为手机充电一会儿断了)

    华为手机充电一闪一灭的(华为手机充电一会儿断了)

  • 抖音如何增加粉丝(抖音如何增加粉丝量和关注度)

    抖音如何增加粉丝(抖音如何增加粉丝量和关注度)

  • 苹果7手机发热严重耗电快如何解决(苹果7手机发热发烫是什么原因)

    苹果7手机发热严重耗电快如何解决(苹果7手机发热发烫是什么原因)

  • pos连接服务器失败是什么意思(pos机连接失败是怎么回事)

    pos连接服务器失败是什么意思(pos机连接失败是怎么回事)

  • 通过微信能查到对方的手机号么(通过微信能查到什么)

    通过微信能查到对方的手机号么(通过微信能查到什么)

  • qq离线请留言是什么状态(qq离线请留言是真的不在线吗)

    qq离线请留言是什么状态(qq离线请留言是真的不在线吗)

  • qq群课堂有上课记录吗(qq群课堂上课老师可以看见学生吗)

    qq群课堂有上课记录吗(qq群课堂上课老师可以看见学生吗)

  • 屏幕花了是内屏坏了吗(屏幕花了是内屏还是外屏坏了)

    屏幕花了是内屏坏了吗(屏幕花了是内屏还是外屏坏了)

  • 抖音视频被限制分享是什么意思(抖音怎样发布视频)

    抖音视频被限制分享是什么意思(抖音怎样发布视频)

  • 华为折叠手机上市了吗(华为折叠手机上市时间2023)

    华为折叠手机上市了吗(华为折叠手机上市时间2023)

  • 如何删除游戏中心软件(如何删除游戏中心软件vivo)

    如何删除游戏中心软件(如何删除游戏中心软件vivo)

  • 华为mrxw09是什么型号(华为mrcwxo是什么型号)

    华为mrxw09是什么型号(华为mrcwxo是什么型号)

  • qq手机换绑多久生效(qq手机换绑多长时间)

    qq手机换绑多久生效(qq手机换绑多长时间)

  • 计算器上0ff是什么键(计算器上f是啥意思)

    计算器上0ff是什么键(计算器上f是啥意思)

  • qq新用户注册不了怎么办(qq新用户注册不可以玩游戏吗)

    qq新用户注册不了怎么办(qq新用户注册不可以玩游戏吗)

  • p30pro红外传感器有什么用(华为p30 pro红外传感器是干什么的)

    p30pro红外传感器有什么用(华为p30 pro红外传感器是干什么的)

  • 电脑数字下标怎么打(电脑怎么弄数字下标)

    电脑数字下标怎么打(电脑怎么弄数字下标)

  • 荣耀v20重量(荣耀v20重量为多少g)

    荣耀v20重量(荣耀v20重量为多少g)

  • mate30与mate30pro的区别(mate30跟mate30pro怎么选)

    mate30与mate30pro的区别(mate30跟mate30pro怎么选)

  • 微信视频怎么录屏(微信视频怎么录屏才会有声音)

    微信视频怎么录屏(微信视频怎么录屏才会有声音)

  • z5x手机有美颜视频通话吗(z1视频美颜)

    z5x手机有美颜视频通话吗(z1视频美颜)

  • 微信头像抖动是干嘛的(微信头像抖动是怎么回事)

    微信头像抖动是干嘛的(微信头像抖动是怎么回事)

  • 松果电单车在哪里充电(松果电单车在哪里扫码)

    松果电单车在哪里充电(松果电单车在哪里扫码)

  • 红魔3防水吗(红魔3用什么手机膜)

    红魔3防水吗(红魔3用什么手机膜)

  • 转转怎么交易(转转怎么交易虚拟物品)

    转转怎么交易(转转怎么交易虚拟物品)

  • 腾讯电脑管家上网保护有什么作用?(腾讯电脑管家上的steam可以吗)

    腾讯电脑管家上网保护有什么作用?(腾讯电脑管家上的steam可以吗)

  • axios+vue 请求时如何携带cookie(vueajax请求的五个步骤)

    axios+vue 请求时如何携带cookie(vueajax请求的五个步骤)

  • 计提并结转所得税费用的会计分录
  • 税务纳税等级m级是什么等级
  • 销项税额的计算方法
  • 公对公退款要交税吗
  • 财务章备案和不备份区别
  • 小规模没有成本票怎么做账
  • 公司买车能一次性抵扣所得税吗
  • 红冲后的发票税可以办退税吗
  • 置换上市公司资质要求
  • 销售旧房不能取得评估价格
  • 以固定资产换入固定资产
  • 收到预付款项发票如何入账?
  • 来料加工税务账应采取哪种核算方式?
  • 广告费可以预提吗
  • 活动现金红包
  • 装饰设计费计入什么科目
  • 怎么去税务局报账流程
  • 房屋转租收入会计分录
  • 技术服务费属于什么税收分类编码
  • 小规模免增值税印花税用交吗
  • 上年度职工工资总额
  • 工业企业预付材料款时一般应借记什么账户
  • 复核未通过
  • 如何免费获取网页文字
  • 苹果手机查看激活id账号信息
  • 代开专票名称没有填写可以报销吗
  • 固定资产包括哪些种类
  • 其他业务成本属于成本类吗
  • 桌面鼠标右键菜单设置
  • 报销费用多付会计分录
  • vue前端代码实例
  • macOS Big Sur 11.1 RC预览版(20C69)正式更新
  • 工程预付款抵扣是什么意思
  • php的运算符主要包括哪些?
  • 货物退回的会计处理
  • 截取字符串php
  • 广告费列支
  • 房地产企业销售佣金税前扣除
  • 前端必会
  • javascript百炼成仙免费
  • 微信小程序小小驯龙师破解版
  • php windows
  • 免税农业企业所得税怎样填报
  • 财政补助结转和财政补助结余
  • 金税盘减免税额
  • 解决Dede5.6联动类型更改排序数字的BUG
  • 尾款忘记支付,交易关闭怎么办
  • 商业承兑汇票如何追索
  • 百旺税控盘汇总上传如何检查
  • 财务预算资产负债表如何编制
  • 公司的货款直接转给股东个人了,该怎么转到公司
  • 合同印花税怎么做会计分录
  • 上年未结转的成本今年可以结转吗
  • 社区居委会有哪些成员
  • 进项税转出企业所得税调减么
  • 结转是什么意思啊
  • 收到免税发票会计分录
  • 超市发票报销一般写什么明细
  • 以旧验新发票
  • 会计错账更正方法口诀
  • 总分类账户和明细分类账户平行登记的要点包括
  • 红字冲销发票的作用
  • 私营公司预收账款怎么算
  • sqlserver导出数据库及表结构
  • win功能下载所需文件
  • service.exe是什么
  • win10多屏设置方法
  • 安装yum的命令
  • win10蓝屏故障
  • jQuery+AJAX实现遮罩层登录验证界面(附源码)
  • shell脚本tr
  • 网站检测系统
  • javascript的理解
  • 批处理倒计时30秒内打开文件a,否则30秒后执行文件b
  • unityai寻路
  • javascript sort方法排序
  • python如何编写
  • android 启动器 设置
  • 成都税务企业号公众号
  • 在外地买车在青岛能买吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设