目录
- 利用自己数据创建一个项目
- 提取训练帧
- 标记训练帧中的关键部位
- 检查标签
- 创建一个训练集
- 训练网络
- 评估网络
- 分析一个新的视频
- 创建一个自动标记的视频
- 绘制轨迹
(以下步骤为可选步骤)
- 提取离群帧
- 修正标签
- 合并数据集
- 训练网络
利用自己数据创建一个项目
首先Test-wumingna-DLC初始文件目录如下:此文件夹下只有一个文件夹videos,在videos 文件夹下只有一个待训练的视频文件。
激活环境,引用相关库
#激活环境
source activate deeplabcut-py36
#进入pathon交互环境
python
#引用相关库
import deeplabcut
import tensorflow as tf
import os
from libpath import Path
创建一个新的项目
# 自定义项目名称
task = 'Test-wumingna-DLC'
#自定义实验者
exprimenter = 'wumingna'
#视频路径
video =['/home/wumingna/Test-wumingna-DLC/videos/mytest.mp4']
#创建新项目
deeplabcut.create_new_project(task,experimenter,video,working_directory='/home/wumingna/Test-wumingna-DLC/videos',copy_videos=True)
文件结构如下:
提取训练帧
成功的特征检测器的关键点是选择不同的帧,这是典型的标记行为。此功能选择从特定视频(或文件夹)均匀采样的N帧(algo =='uniform')。 注意:如果行为稀疏分布(考虑使用kmeans)和/或手动选择帧等。同时确保从不同(行为)会话和不同动物中获取选择数据(如果这些会有很大差异)(以训练不变特征检测器)。单个图像不应太大(即<850 x 850像素)。 虽然这也可以在以后处理,但建议裁剪框架,尽可能地去除框架中不必要的部分。始终检查裁剪的输出。 如果您对结果感到满意,请继续进行标记。
#设置文件配置变量,以便下面使用
path_config_file=deeplabcut.create_new_project(task,experimenter,video,copy_videos=True)
#提取训练帧的时候有两种选择,根据需要选择不同的方式
deeplabcut.extract_frames(config_path,‘automatic/manual’,‘uniform/kmeans’,crop=True/False, userfeedback=True/False)
#(1)自动提取训练帧
deeplabcut.extract_frames(path_config_file) #自动提取
#(1)手动提取训练帧,在“Do you want to crop the frames? ” 选择 “No”,否则无法捕获图像。
deeplabcut.extract_frames(path_config_file,'manual') #手动提取
时间上均匀分布的方式(uniform)、基于视觉外观的聚类(kmeans)或手动选择的方式从视频中选择帧。uniform最适合于在整个视频中以时间上独立的方式改变姿态的行为。然而,有些行为可能是稀疏的,比如在伸手和拉手非常快的情况下,在这种情况下,如果用户选择使用kmeans来对帧进行聚类,那么应该使用视觉信息来选择不同的帧,然后这个函数对视频进行下采样并对帧进行聚类。然后选择来自不同集群的帧。这个过程确保框架看起来不同,并且通常是可取的。然而,在大的和长的视频中,由于计算复杂性,这段代码很慢。
执行自动提取命令后,会跳出一个画面窗口,输入 yes 从视频中随机提取帧。如果是多个视频,将会分别存放在以视频文件名命名的多个文件中。
文件结构如下(都是一些照片)
标记训练帧中的关键部位
deeplabcut.label_frames(path_config_file)
左键移动,右键标记。标记完成后,点击 “Save”。之后会在 labeled-data/mytest/文件下生成 CollectedData_wumingna.csv, CollectedData_wumingna.h5。注意:“select a bodypart to label” 由config.yaml 文件中 bodyparts 中的参数决定。可以自行修改标记个数。
检查标签
deeplabcut.check_labels(path_config_file)
文件目录如下,新增一个test_labeled文件夹来保存被标记的图片。(labeled-data 下的两个文件夹my test 和mytest_labeled中保存的图像是一致的,唯一的区别在于是否被标记)
创建数据集
deeplabcut.create_training_dataset(path_config_file)
# 可以通过可选参数 num_shuffles = n 创建多个训练子集(默认为1),可以改变参数选择不同的网络,默认是Resnet-50
# deeplabcut.create_training_dataset(path_config_file, num_shuffles = n,resnet_101)
函数将打乱标记的数据集,把它分割去创建一个训练集和一个测试集。目录training-datasets的子目录‘iteration-#’存储着数据集和元信息, #代表着着迭代变量的值,它存储在项目配置文件。如果你希望对DeepLabCut的性能进行基准测试,可以通过在num_shuffles参数中指定一个整数值来创建多个训练子集。
每次迭代创建训练数据集都将创建一个.mat文件和一个一个.pickle文件,.mat文件包含了图像的地址和目标姿势,.pickle文件包含了关于训练数据集的元信息。这个步骤还为模型创建了一个目录,包括dlc模型中称为test和train的两个子目录,每个子目录都有一个名为pose_cfg.yaml的配置文件。如果需要,在训练开始之间,你可以编辑pose_cfg文件。
执行之后,文件结构如下:
开始训练
deeplabcut.train_network(path_config_file,shuffle=1,displayiters=300,saveiters=10,)
# 此函数有很多可选参数,学会基本操作后,可以慢慢学习其他参数的使用。
#完整函数如下:
train_network(config_path,shuffle=1,trainingsetindex=0,gputouse=
None,max_snapshots_to_keep=5, displayiters=1000,saveiters=20000,
maxiters=200000)
训练30分钟左右,ctrl+c 停止训练。
新增文件结构如下:
评估网络
#将plotting设置为True将手工和预测的标签绘制在出所有的测试集和训练集上
deeplabcut.evaluate_network(config_path, plotting=True)
新增文件结构:
分析一个新的视频(这里依旧分析原视频)
deeplabcut.analyze_videos(config_path,video,videotype=‘.mp4’)
标签存储在一个多索引的panda array中,其中包含网络名称、身体部件名称、(x, y)标签位置(以像素为单位)和每个身体部件的每一帧的可能性。
新增文件:
创建一个自动标记的视频
这个函数是创建带有预测标签的.mp4视频。这个视频与未标记的视频保留在一个目录下
deeplabcut.create_labeled_video(path_config_file,videofile_path, draw_skeleton=True)
绘制轨迹:
deeplabcut.plot_trajectories(config_path,video)
新增文件:
如果结果满意的话,就可以到此为止了,但是如果对结果不满意的话,可以接着进行下面的步骤:
提取离群帧
deeplabcut.extract_outlier_frames(config_path,video)
新增目录:
手动更改标签:此步骤是让用户更正提取帧中的标签
deeplabcut.refine_label(path_config_file)
合并数据集:
deeplabcut.merge_datasets(path_config_file)
创建训练数据集的新迭代,检查并训练...(现在剩下的步骤便是重复上面的步骤,在新的数据集上训练)