)
自制AVA数据集并训练前言软硬件配置数据集整体结构视频预处理部分帧率转换与视频分割视频重命名对视频进行帧分割整合帧预标注目标检测标注检查生成pkl文件生成VIA标注文件使用VIA进行标注VIA标注文件整合deepsort追踪VIA和deepsort整合去除误差值生成标注框文件生成排除的标注戳的文件生成frame_lists生成行为标注训练前言上次使用几个视频做了一个小demo这次是完整的自制ava行为数据集进行训练我是做野生动物主要参考教程是杨帆老师的博客感谢大佬真的自定义ava数据集及训练与测试 完整版关于我自己使用的代码放在了这里大家需要的话可以下载参考https://gitee.com/gkotta1/datadeal/tree/master关于里面的代码会更适用于我自己的数据集所以大家可以根据自己的需要稍作改动软硬件配置win 11python 3.8pytorch 2.0.0torchvision 0.15.0CUDA 11.8RTX3070数据集整体结构数据集的整体结构如下所示有将最主要的代码结构和需要的文件标出dataset/ │ ├── annotations/ │ ├── action_list.pbtxt │ ├── ava_detection_train_boxes_and_labels.csv │ ├── ava_detection_val_boxes_and_labels.csv │ ├── ava_train_excluded_timestamps_v2.2.csv │ ├── ava_train_v2.2.csv │ ├── ava_val_excluded_timestamps_v2.2.csv │ └── ava_val_v2.2.csv │ ├── frame_lists/ │ ├── train.csv │ └── val.csv │ ├── merge_label_txt/ │ ├── 1_000001.txt │ └── 1_000002.txt │ ├── merge_label_xml/ │ ├── 1_000001.xml │ └── 1_000002.xml │ ├── merge_labelframes_all/ │ ├── 1_000001.jpg │ └── 1_000002.jpg │ ├── videos/ │ ├──1.mp4 │ └──2.mp4 │ ├── videos_labelframes/ │ ├──1│ │ ├── 1_000001.jpg │ │ └── 1_finish.json │ └──2│ ├── videos_rawframes/ │ ├──1│ │ └── 1_000001.jpg │ └──2├── avaMin_dense_proposals_train.pkl └── avaMin_dense_proposals_val.pkl视频预处理部分帧率转换与视频分割参考代码帧率转换datadeal\behavior_datadeal\reframe_mp4.py将所有的视频都转换为30帧/秒视频切割datadeal\behavior_datadeal\split_mp4.py将所有视频最终切割为10秒每段视频重命名我的视频是将不同的物种视频分开放的因此将不同子文件夹下的视频集中到一起并且按照从1开始的序号进行重命名参考代码视频重命名datadeal\behavior_datadeal\merge_rename_mp4.py对视频进行帧分割打开cmd将路径换到.sh文件所在的目录下分别运行shextract_frames_1s.sh# 分割标注帧# 裁剪出来每个视频12帧shextract_frames_30s.sh# 分割原始帧# 裁剪出来每个视频304帧整合帧将所有的标注帧都放到一起方便YOLO进行目标检测参考代码整合帧datadeal\behavior_datadeal\merge_labelframes_all.py预标注由于手动标注工作量太大了再加上via画框实在是有点困难因此在这里先使用yolo进行预标注然后使用labelimg修改标注框最后使用via进行行为标注使用YOLO进行预标注运行YOLO文件夹下面的detect.py代码需要注意这些地方的更改一定要注意上下都更改还有下面的save-txt那里记得default更改为true推理之后生成这样的一个文件夹其中labels中存放的是txt文件但是由于生成的标注文件是丢失或者不准确的因此使用labelimg对推理结果进行检查并且更正会更方便一点目标检测标注检查为了避免种类的错误将txt转换为xml格式参考代码txt转xmldatadeal\yolo_datadeal\yolo_xml.py然后使用labelimg进行预标注这部分就不详细讲了大家需要的话可以去找找labelimg的教程预标注完成后再将xml转换为txt参考代码xml转txt\datadeal\yolo_datadeal\voctotxt.py生成pkl文件为了后续步骤分别生成avaMin_dense_proposals_train.pkl和avaMin_dense_proposals_val.pkl文件提取边界框信息包括坐标和检测概率保存为pkl文件在这里的时候博主只保留了人的信息但是我需要每一个物种的信息每个物种按照41的比例分为训练集和验证集划分原理是每四个训练文件一个验证文件运行下面的代码同时生成avaMin_dense_proposals_train.pkl和avaMin_dense_proposals_val.pkl文件参考代码pkl文件生成datadeal\behavior_datadeal\dense_proposals_train.py生成VIA标注文件根据pkl生成VIA标注文件并且去除默认值参考代码生成via标注文件datadeal\behavior_datadeal\dense_proposals_train_to_via.py去除默认值datadeal\behavior_datadeal\via_json_default_delete.py使用VIA进行标注将去除默认值之后生成的json文件导入VIA标注过程可以参考上一篇教程将所有的标注文件都保存为文件夹名_finish.jsonVIA标注文件整合将所有的后缀为_finish.json的标注文件进行整合整合成一个没有身份ID的表格参考代码标注文件整合datadeal\behavior_datadeal\json_extract.py生成train/val_without_personID.csvdeepsort追踪参考代码deepsort追踪datadeal\behavior_datadeal\yolov5_to_deepsort.py要注意自己下载权重文件并且更改路径生成一个带有标注框和身份ID的csv文件生成train/val_personID.csvVIA和deepsort整合将生成的文件名为train/val_without_personID.csv和train/val_personID.csv的分别整合到一起参考代码VIA和deepsort整合datadeal\behavior_datadeal\train_temp.py生成train/val_temp.csv去除误差值将上面整合生成的为-1的值去掉然后生成最终的行为csv文件参考代码去除误差值datadeal\behavior_datadeal\train.py生成ava_train/val_v2.2.csv生成标注框文件参考代码训练标注框datadeal\behavior_datadeal\train_boxes.py测试标注框datadeal\behavior_datadeal\val_boxes.py生成ava_detection_train/val_boxes_and_labels.csv生成排除的标注戳的文件参考代码排除标注戳的文件datadeal\behavior_datadeal\train_excluded_timestamps.py生成ava_train/val_excluded_timestamps.csv生成frame_lists参考代码生成帧列表的文件datadeal\behavior_datadeal\frame_lists.py生成train/val.csv生成行为标注action_list.pbtxt这个可以自己生成一下item{name:movingid:1}item{name:groomingid:2}item{name:alertingid:3}item{name:restingid:4}item{name:foragingid:5}item{name:flappingid:6}训练python tools/run_net.py--cfgconfigs/AVA/SLOWFAST_32x2_R50_animal.yaml这里放一下我的代码另外注意数据集中名称如果不对要在default.py中进行更改我这里没有设置预训练权重如果需要的话可以自己加上TRAIN:ENABLE:TrueDATASET:avaBATCH_SIZE:8EVAL_PERIOD:5CHECKPOINT_PERIOD:5AUTO_RESUME:True# CHECKPOINT_FILE_PATH: path to the pretrain checkpoint file.CHECKPOINT_TYPE:pytorchDATA:NUM_FRAMES:32SAMPLING_RATE:2TRAIN_JITTER_SCALES:[256,320]TRAIN_CROP_SIZE:224TEST_CROP_SIZE:224INPUT_CHANNEL_NUM:[3,3]DETECTION:ENABLE:TrueALIGNED:TrueAVA:FRAME_DIR:D:/file/postgrad/experiment/bird_ava_dataset/videos_rawframesFRAME_LIST_DIR:D:/file/postgrad/experiment/bird_ava_dataset/frame_listsANNOTATION_DIR:D:/file/postgrad/experiment/bird_ava_dataset/annotationsDETECTION_SCORE_THRESH:0.8TRAIN_PREDICT_BOX_LISTS:[ava_train_v2.2.csv,ava_detection_train_boxes_and_labels.csv,]TEST_PREDICT_BOX_LISTS:[ava_val_v2.2.csv,ava_detection_val_boxes_and_labels.csv,]SLOWFAST:ALPHA:4BETA_INV:8FUSION_CONV_CHANNEL_RATIO:2FUSION_KERNEL_SZ:7RESNET:ZERO_INIT_FINAL_BN:TrueWIDTH_PER_GROUP:64NUM_GROUPS:1DEPTH:50TRANS_FUNC:bottleneck_transformSTRIDE_1X1:FalseNUM_BLOCK_TEMP_KERNEL:[[3,3],[4,4],[6,6],[3,3]]SPATIAL_DILATIONS:[[1,1],[1,1],[1,1],[2,2]]SPATIAL_STRIDES:[[1,1],[2,2],[2,2],[1,1]]NONLOCAL:LOCATION:[[[],[]],[[],[]],[[],[]],[[],[]]]GROUP:[[1,1],[1,1],[1,1],[1,1]]INSTANTIATION:dot_productPOOL:[[[1,2,2],[1,2,2]],[[1,2,2],[1,2,2]],[[1,2,2],[1,2,2]],[[1,2,2],[1,2,2]]]BN:USE_PRECISE_STATS:FalseNUM_BATCHES_PRECISE:200SOLVER:BASE_LR:0.1# 初始学习率LR_POLICY:steps_with_relative_lrs# 学习率的调整策略STEPS:[0,10,15,20]# 学习率调整的关键节点LRS:[1,0.1,0.01,0.001]# 学习率的缩放比例MAX_EPOCH:30# 训练的总epoch数MOMENTUM:0.9# 动量因子WEIGHT_DECAY:1e-7# 权重衰减系数WARMUP_EPOCHS:5.0# 学习率预热的epoch数量WARMUP_START_LR:0.000125# 预热阶段的起始学习率OPTIMIZING_METHOD:sgdMODEL:NUM_CLASSES:6ARCH:slowfastMODEL_NAME:SlowFastLOSS_FUNC:bceDROPOUT_RATE:0.5HEAD_ACT:sigmoidTEST:ENABLE:FalseDATASET:avaBATCH_SIZE:8DATA_LOADER:NUM_WORKERS:2PIN_MEMORY:TrueNUM_GPUS:1NUM_SHARDS:1RNG_SEED:0OUTPUT_DIR:.