(slowfast使用方法一) -- 使用mmaction2附带的slowfast训练自定义视频数据集

目录

一、最终文件格式

二、在云端运行前需要准备的步骤

1.在windows上下载sh.exe

2.裁剪视频

3.下载文件到本地

三、在windows上标注文件(避免在云端浪费时间)

1、抽取视频(填充Dataset / frames文件夹)

2022-5-27   

我本来以为这件事情很简单,一点都不重要,直到我遇见了一个致命的错误,卡了有三周左右。

在此记录一下:裁剪后的视频时长,一定一定一定要一致!!!!!不一致的话必错无疑!!!!(除非你是大佬。)

【非常重要,非常重要!!这里是本篇博客最重要的地方】

2、整合和缩减帧(填充choose_frames_all)

3、不整合的缩减(填充choose_frames)

4、检测choose_frames_all(YOLO第一次检测)

5、生成dense_proposals_train.pkl(用于产生行为标注)

6、准备choose_frames_middle文件夹

7、生成via标注文件

8、 去掉via默认值

9、标注文件,并保存且命名。

10、压缩choose_frames_middle文件夹

四、云端操作步骤

0、当想要重新开始操作的时候,将choose_frames_all、choose_frames、frames、choose_frames_middle、rawframes文件夹重新生成

1.下载项目:

2、安装ffmpeg(如果已安装,直接跳过)

如果速度奇慢,不要犹豫,直接重启或者新建实例

3、抽取视频(填充Dataset / frames文件夹)

4、整合和缩减帧(填充choose_frames_all)

5、不整合的缩减(填充choose_frames)

6、安装YOLO和deepsort

7、检测choose_frames_all(YOLO第一次检测)

8、生成dense_proposals_train.pkl(用于产生行为标注)

9、准备choose_frames_middle文件夹

10、提取标注完成的json文件

11、 通过deepsort检测图片(这一步开始,会生成很多文件)

 12、融合actions与personID

13、修正ava_train_temp.csv

14、生成其他标注文件

15、生成rawframes文件夹(这个文件夹将frames文件夹的名称进行改动)

16、修正文件

17、安装mmactions

18、在/mmaction2_YF/configs/detection/ava/下创建 my_slowfast_kinetics_pretrained_r50_4x16x1_20e_ava_rgb.py

 19、训练(感动,(ಥ_ಥ) 终于到了这一步了)

20、测试




一、最终文件格式

二、在云端运行前需要准备的步骤

1.在windows上下载sh.exe

(slowfast使用方法一) -- 使用mmaction2附带的slowfast训练自定义视频数据集_第1张图片

        sh.exe可以在windows下使用一些简单的linux命令。

切换环境:

source activate py37

2.裁剪视频

IN_DATA_DIR="./videos"

OUT_DATA_DIR="./video_crop"

ffmpeg -ss 1030 -t 11 -y -i "${IN_DATA_DIR}/1.mp4" "${OUT_DATA_DIR}/1.mp4"

ffmpeg -ss 1340 -t 11 -y -i "${IN_DATA_DIR}/1.mp4" "${OUT_DATA_DIR}/2.mp4"

ffmpeg -ss 1850 -t 11 -y -i "${IN_DATA_DIR}/1.mp4" "${OUT_DATA_DIR}/3.mp4"

 裁剪得到的视频最好是长度一致的,并且以阿拉伯数字命名。

如全部视频都是1分钟或30秒。

3.下载文件到本地

YOLO权重

https://github.com/ultralytics/yolov5/releases/download/v6.1/yolov5s.pt

DeepSort权重

https://drive.google.com/drive/folders/1xhG0kRH1EX5B9_Iz8gQJb7UNnn_riXi6
这个下载不下来,自己想办法((^_−)☆o(´^`)o)

三、在windows上标注文件(避免在云端浪费时间)

1、抽取视频(填充Dataset / frames文件夹)

此时应当已经准备好了裁剪后的视频。

cd /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset
bash cut_frames.sh 

frames就是分了文件夹的全部图片。

此时frames中应当有若干个文件夹,文件夹下是        若干个视频        所有的图片

2022-5-27   

我本来以为这件事情很简单,一点都不重要,直到我遇见了一个致命的错误,卡了有三周左右。

在此记录一下:裁剪后的视频时长,一定一定一定要一致!!!!!不一致的话必错无疑!!!!(除非你是大佬。)

【非常重要,非常重要!!这里是本篇博客最重要的地方】

2、整合和缩减帧(填充choose_frames_all)

cd /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset 
python choose_frames_all.py 15 0

15表示视频长度,0表示视频开始。我一般设置的长一点。

把所有的图片放在一个文件夹中,为了YOLO的检测



这个步骤是为了方便YOLOv5的检测过程;choose_frames_all中应当是视频的所有帧。

格式为1_000001.jpg

3、不整合的缩减(填充choose_frames)

cd /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset 
python choose_frames.py 15 0

每隔30张取一张图片,图片名称分别为1,31,61……

这个步骤是为了后续方便标注行为。

choose_frames文件夹下有若干个子文件夹,子文件夹下是每隔30帧的抽样图片(不排除前两张和后两张)

4、检测choose_frames_all(YOLO第一次检测)

建议在运行此代码前把/home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/yolovDeepsort/yolov5/runs文件夹删除,下面是原因。

rm -rf /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/yolovDeepsort/yolov5/runs

在yolovDeepsort/yolov5/runs/detect/exp中生成结果,运行次数多了的话,结果会在exp2、exp3中生成,后边一定要注意!!! 

cd /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/yolovDeepsort
python ./yolov5/detect.py --source ../Dataset/choose_frames_all/ --save-txt --save-conf 

5、生成dense_proposals_train.pkl(用于产生行为标注)

cd /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/yolovDeepsort/mywork
python dense_proposals_train.py ../yolov5/runs/detect/exp/labels ./dense_proposals_train.pkl show

 dense_proposals_train.pkl文件是由YOLO第一次检测出的结果生成的。

6、准备choose_frames_middle文件夹

cd /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset/
python choose_frames_middle.py

在这里插入图片描述

7、生成via标注文件

cd /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/yolovDeepsort/mywork/
python dense_proposals_train_to_via.py ./dense_proposals_train.pkl ../../Dataset/choose_frames_middle/

在这里插入图片描述

 文件有dense_proposals_train.pkl文件生成。

8、 去掉via默认值

cd /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset
python chang_via_json.py 

在这里插入图片描述

9、标注文件,并保存且命名。

使用 image_anchor.html 进行文件的标注

在这里插入图片描述

10、压缩choose_frames_middle文件夹

unzip choose_frames_middle.zip

zip FileName.zip DirName                     ----------------压缩命令

 这个是linux解压命令和压缩命令

压缩完之后,就可以将其复制到云端Datasets文件夹。

四、云端操作步骤

0、当想要重新开始操作的时候,将choose_frames_all、choose_frames、frames、choose_frames_middle、rawframes文件夹重新生成

rm -rf choose_frames choose_frames_all choose_frames_middle frames rawframes 
mkdir choose_frames choose_frames_all choose_frames_middle frames rawframes 

1.下载项目:

cd /home
git clone https://gitee.com/YFwinston/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset.git

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

 在这一步等待的同时可以把mmacton、mmcv等安装一下。

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

2、安装ffmpeg(如果已安装,直接跳过)

conda install x264 ffmpeg -c conda-forge -y

如果速度奇慢,不要犹豫,直接重启或者新建实例

3、抽取视频(填充Dataset / frames文件夹)

这个步骤一定是在准备好video_crop文件夹下视频的基础上进行的。

cd /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset
bash cut_frames.sh 

frames就是分了文件夹的全部图片。

此时frames中应当有若干个文件夹,文件夹下是视频所有的图片

4、整合和缩减帧(填充choose_frames_all)

cd /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset 
python choose_frames_all.py 15 0

15表示视频长度,0表示视频开始。我一般设置的长一点。

把所有的图片放在一个文件夹中,为了YOLO的检测



这个步骤是为了方便YOLOv5的检测过程;choose_frames_all中应当是视频的所有帧。

格式为1_000001.jpg

5、不整合的缩减(填充choose_frames)

cd /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset 
python choose_frames.py 15 0

每隔30张取一张图片,图片名称分别为1,31,61……

这个步骤是为了后续方便标注行为。

choose_frames文件夹下有若干个子文件夹,子文件夹下是每隔30帧的抽样图片(不排除前两张和后两张)

6、安装YOLO和deepsort

cd /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/yolovDeepsort
pip install -r requirements.txt
pip install opencv-python-headless==4.1.2.30

wget https://github.com/ultralytics/yolov5/releases/download/v6.1/yolov5s.pt -O /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/yolovDeepsort/yolov5/yolov5s.pt 
mkdir -p /root/.config/Ultralytics/
wget  https://ultralytics.com/assets/Arial.ttf -O /root/.config/Ultralytics/Arial.ttf

建议先现在yolov5s.pt,把它复制过去。

(如果复制了,直接运行下边代码。)

cd /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/yolovDeepsort
pip install -r requirements.txt
pip install opencv-python-headless==4.1.2.30

mkdir -p /root/.config/Ultralytics/
wget  https://ultralytics.com/assets/Arial.ttf -O /root/.config/Ultralytics/Arial.ttf

7、检测choose_frames_all(YOLO第一次检测)

建议在运行此代码前把/home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/yolovDeepsort/yolov5/runs文件夹删除,下面是原因。

rm -rf /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/yolovDeepsort/yolov5/runs

在yolovDeepsort/yolov5/runs/detect/exp中生成结果,运行次数多了的话,结果会在exp2、exp3中生成,后边一定要注意!!! 

cd /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/yolovDeepsort
python ./yolov5/detect.py --source ../Dataset/choose_frames_all/ --save-txt --save-conf 

8、生成dense_proposals_train.pkl(用于产生行为标注)

cd /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/yolovDeepsort/mywork
python dense_proposals_train.py ../yolov5/runs/detect/exp/labels ./dense_proposals_train.pkl show

 dense_proposals_train.pkl文件是由YOLO第一次检测出的结果生成的。

9、准备choose_frames_middle文件夹

可以直接将第二步得到的压缩包复制到Datasets文件夹中。

然后进行解压缩。

unzip choose_frames_middle.zip

zip FileName.zip DirName                     ----------------压缩命令

 这个是linux解压命令和压缩命令

压缩完之后,就可以将其复制到云端Datasets文件夹。

10、提取标注完成的json文件

choose_frames_middle文件夹中的若干个文件中有1_finish.json文件,这一步内容就是从这个json文件中获取csv文件。

在这里插入图片描述

cd  /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset/
python json_extract.py

会在/home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset/下生成:train_without_personID.csv

这一步执行后,生成train_without_personId.csv文件
 

在这里插入图片描述

这一步很有可能会报错。

attributeNum1 = len(viaJson['attribute']['1']['options'])
#attributeNum2 = len(viaJson['attribute']['2']['options'])+attributeNum1
#attributeNum3 = len(viaJson['attribute']['3']['options'])+attributeNum2
#attributeNums = [0,attributeNum1,attributeNum2]
attributeNums = [0, attributeNum1]

这里是对json文件进行解析,打开json文件可以看到

如果自己定义的行为种类有多种的话,代码就需要改进,

                                                                        attributeNum的个数 == atrribute字典下内容个数

11、 通过deepsort检测图片(这一步开始,会生成很多文件)

        首先在/home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/yolovDeepsort/mywork下执行(生成./dense_proposals_train_deepsort.pkl文件)

cd /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/yolovDeepsort/mywork
python dense_proposals_train_deepsort.py ../yolov5/runs/detect/exp/labels ./dense_proposals_train_deepsort.pkl show

        接下来使用deepsort关联人的id,这一步骤使用Datasets / frames中的图片进行检测。

执行这一步之前,要将之前下载好的ckpt.t7文件复制到./deep_sort_pytorch/deep_sort/deep/checkpoint/文件夹。(重要)

cd /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/yolovDeepsort/
python yolov5_to_deepsort.py --source /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset/frames

 这一步执行后,会生成train_personID.csv文件

 12、融合actions与personID

这一步就是将train_personID.csv和train_without_personID.csv两个文件进行融合。

在Datasets文件夹下执行:

cd  /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset/
python train_temp.py

最后结果:home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset/train_temp.csv

这一步执行,生成train_temp.csv文件

13、修正ava_train_temp.csv

train_temp.csv中存在很多-1,需要进行修正

在Datasets下执行

cd /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset/
python train.py

这一步执行,生成Dataset/annotations/train.csv

这一步如果报错,需要对train.py进行修改。

14、生成其他标注文件

生成train_excluded_timestamps.csv

cd /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset/annotations
touch train_excluded_timestamps.csv

生成included_timestamps.txt

cd /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset/annotations
touch included_timestamps.txt

        在included_timestamps.txt中写入

02
03
04
05
06
07
08

这里的内容与视频长度有关,如果长度是10秒的话,这里的内容就是去除前两秒和后两秒的数字。

生成action_list.pbtxt

cd /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset/annotations
touch action_list.pbtxt

在其中写入行为,比如我定义的行为是:

item {
  name: "boxing"
  id: 1
}
item {
  name: "hand_clapping"
  id: 2
}
item {
  name: "hand_waving"
  id: 3
}

生成dense_proposals_train.pkl

cp /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/yolovDeepsort/mywork/dense_proposals_train.pkl /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset/annotations

val文件生成(这一步我没有理解,按照原博文写吧)

dense_proposals_val.pkl

val.csv

train_excluded_timestamps.csv

cp /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset/annotations/dense_proposals_train.pkl /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset/annotations/dense_proposals_val.pkl
cp /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset/annotations/train.csv /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset/annotations/val.csv
cp /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset/annotations/train_excluded_timestamps.csv /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset/annotations/val_excluded_timestamps.csv

15、生成rawframes文件夹(这个文件夹将frames文件夹的名称进行改动)

cp -r /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset/frames/* /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset/rawframes
cd /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/yolovDeepsort/mywork/
python change_raw_frames.py

16、修正文件

dense_proposals_train

dense_proposals_val

cd /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/yolovDeepsort/mywork
python change_dense_proposals_train.py
cd /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/yolovDeepsort/mywork
python change_dense_proposals_val.py

17、安装mmactions

cd /home

git clone https://gitee.com/YFwinston/mmaction2_YF.git

pip install mmcv-full==1.3.17 -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.8.0/index.html

pip install opencv-python-headless==4.1.2.30

pip install moviepy

cd mmaction2_YF
pip install -r requirements/build.txt
pip install -v -e .
mkdir -p ./data/ava

cd ..
git clone https://gitee.com/YFwinston/mmdetection.git
cd mmdetection
pip install -r requirements/build.txt
pip install -v -e .

cd ../mmaction2_YF

wget https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_2x_coco/faster_rcnn_r50_fpn_2x_coco_bbox_mAP-0.384_20200504_210434-a5d8aa15.pth -P ./Checkpionts/mmdetection/

wget https://download.openmmlab.com/mmaction/recognition/slowfast/slowfast_r50_8x8x1_256e_kinetics400_rgb/slowfast_r50_8x8x1_256e_kinetics400_rgb_20200716-73547d2b.pth -P ./Checkpionts/mmaction/

18、在/mmaction2_YF/configs/detection/ava/下创建 my_slowfast_kinetics_pretrained_r50_4x16x1_20e_ava_rgb.py

cd /home/mmaction2_YF/configs/detection/ava/
touch my_slowfast_kinetics_pretrained_r50_4x16x1_20e_ava_rgb.py
# model setting
model = dict(
    type='FastRCNN',
    backbone=dict(
        type='ResNet3dSlowFast',
        pretrained=None,
        resample_rate=8,
        speed_ratio=8,
        channel_ratio=8,
        slow_pathway=dict(
            type='resnet3d',
            depth=50,
            pretrained=None,
            lateral=True,
            conv1_kernel=(1, 7, 7),
            dilations=(1, 1, 1, 1),
            conv1_stride_t=1,
            pool1_stride_t=1,
            inflate=(0, 0, 1, 1),
            spatial_strides=(1, 2, 2, 1)),
        fast_pathway=dict(
            type='resnet3d',
            depth=50,
            pretrained=None,
            lateral=False,
            base_channels=8,
            conv1_kernel=(5, 7, 7),
            conv1_stride_t=1,
            pool1_stride_t=1,
            spatial_strides=(1, 2, 2, 1))),
    roi_head=dict(
        type='AVARoIHead',
        bbox_roi_extractor=dict(
            type='SingleRoIExtractor3D',
            roi_layer_type='RoIAlign',
            output_size=8,
            with_temporal_pool=True),
        bbox_head=dict(
            type='BBoxHeadAVA',
            in_channels=2304,
            num_classes=81,
            multilabel=True,
            dropout_ratio=0.5)),
    train_cfg=dict(
        rcnn=dict(
            assigner=dict(
                type='MaxIoUAssignerAVA',
                pos_iou_thr=0.9,
                neg_iou_thr=0.9,
                min_pos_iou=0.9),
            sampler=dict(
                type='RandomSampler',
                num=32,
                pos_fraction=1,
                neg_pos_ub=-1,
                add_gt_as_proposals=True),
            pos_weight=1.0,
            debug=False)),
    test_cfg=dict(rcnn=dict(action_thr=0.002)))

dataset_type = 'AVADataset'
data_root = '/home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset/rawframes'
anno_root = '/home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset/annotations'


#ann_file_train = f'{anno_root}/ava_train_v2.1.csv'
ann_file_train = f'{anno_root}/train.csv'
#ann_file_val = f'{anno_root}/ava_val_v2.1.csv'
ann_file_val = f'{anno_root}/val.csv'

#exclude_file_train = f'{anno_root}/ava_train_excluded_timestamps_v2.1.csv'
#exclude_file_val = f'{anno_root}/ava_val_excluded_timestamps_v2.1.csv'

exclude_file_train = f'{anno_root}/train_excluded_timestamps.csv'
exclude_file_val = f'{anno_root}/val_excluded_timestamps.csv'

#label_file = f'{anno_root}/ava_action_list_v2.1_for_activitynet_2018.pbtxt'
label_file = f'{anno_root}/action_list.pbtxt'

proposal_file_train = (f'{anno_root}/dense_proposals_train.pkl')
proposal_file_val = f'{anno_root}/dense_proposals_val.pkl'

img_norm_cfg = dict(
    mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_bgr=False)

train_pipeline = [
    dict(type='SampleAVAFrames', clip_len=32, frame_interval=2),
    dict(type='RawFrameDecode'),
    dict(type='RandomRescale', scale_range=(256, 320)),
    dict(type='RandomCrop', size=256),
    dict(type='Flip', flip_ratio=0.5),
    dict(type='Normalize', **img_norm_cfg),
    dict(type='FormatShape', input_format='NCTHW', collapse=True),
    # Rename is needed to use mmdet detectors
    dict(type='Rename', mapping=dict(imgs='img')),
    dict(type='ToTensor', keys=['img', 'proposals', 'gt_bboxes', 'gt_labels']),
    dict(
        type='ToDataContainer',
        fields=[
            dict(key=['proposals', 'gt_bboxes', 'gt_labels'], stack=False)
        ]),
    dict(
        type='Collect',
        keys=['img', 'proposals', 'gt_bboxes', 'gt_labels'],
        meta_keys=['scores', 'entity_ids'])
]
# The testing is w/o. any cropping / flipping
val_pipeline = [
    dict(type='SampleAVAFrames', clip_len=32, frame_interval=2),
    dict(type='RawFrameDecode'),
    dict(type='Resize', scale=(-1, 256)),
    dict(type='Normalize', **img_norm_cfg),
    dict(type='FormatShape', input_format='NCTHW', collapse=True),
    # Rename is needed to use mmdet detectors
    dict(type='Rename', mapping=dict(imgs='img')),
    dict(type='ToTensor', keys=['img', 'proposals']),
    dict(type='ToDataContainer', fields=[dict(key='proposals', stack=False)]),
    dict(
        type='Collect',
        keys=['img', 'proposals'],
        meta_keys=['scores', 'img_shape'],
        nested=True)
]

data = dict(
    #videos_per_gpu=9,
    #workers_per_gpu=2,
    videos_per_gpu=5,
    workers_per_gpu=2,
    val_dataloader=dict(videos_per_gpu=1),
    test_dataloader=dict(videos_per_gpu=1),
    train=dict(
        type=dataset_type,
        ann_file=ann_file_train,
        exclude_file=exclude_file_train,
        pipeline=train_pipeline,
        label_file=label_file,
        proposal_file=proposal_file_train,
        person_det_score_thr=0.9,
        data_prefix=data_root,
        start_index=1,),
    val=dict(
        type=dataset_type,
        ann_file=ann_file_val,
        exclude_file=exclude_file_val,
        pipeline=val_pipeline,
        label_file=label_file,
        proposal_file=proposal_file_val,
        person_det_score_thr=0.9,
        data_prefix=data_root,
        start_index=1,))
data['test'] = data['val']

#optimizer = dict(type='SGD', lr=0.1125, momentum=0.9, weight_decay=0.00001)
optimizer = dict(type='SGD', lr=0.0125, momentum=0.9, weight_decay=0.00001)
# this lr is used for 8 gpus

optimizer_config = dict(grad_clip=dict(max_norm=40, norm_type=2))
# learning policy

lr_config = dict(
    policy='step',
    step=[10, 15],
    warmup='linear',
    warmup_by_epoch=True,
    warmup_iters=5,
    warmup_ratio=0.1)
#total_epochs = 20
total_epochs = 100
checkpoint_config = dict(interval=1)
workflow = [('train', 1)]
evaluation = dict(interval=1, save_best='[email protected]')
log_config = dict(
    interval=20, hooks=[
        dict(type='TextLoggerHook'),
    ])
dist_params = dict(backend='nccl')
log_level = 'INFO'
work_dir = ('./work_dirs/ava/'
            'slowfast_kinetics_pretrained_r50_4x16x1_20e_ava_rgb')
load_from = ('https://download.openmmlab.com/mmaction/recognition/slowfast/'
             'slowfast_r50_4x16x1_256e_kinetics400_rgb/'
             'slowfast_r50_4x16x1_256e_kinetics400_rgb_20200704-bcde7ed7.pth')
resume_from = None
find_unused_parameters = False


 19、训练(感动,(ಥ_ಥ) 终于到了这一步了)

cd /home/mmaction2_YF
python tools/train.py configs/detection/ava/my_slowfast_kinetics_pretrained_r50_4x16x1_20e_ava_rgb.py --validate

训练的文件生成在home/mmaction2_YF/work_dirs/ava/slowfast_kinetics_pretrained_r50_4x16x1_20e_ava_rgb中

很有可能会失败……

20、测试

创建新的label_map

cd /home/mmaction2_YF/tools/data/ava
touch label_map2.txt

内容:

1: stand
2: sit

         这里的行为可以自己填写,自定义的几种,那么这里就填写几种。

然后运行

cd /home/mmaction2_YF
python demo/demo_spatiotemporal_det.py --config configs/detection/ava/my_slowfast_kinetics_pretrained_r50_4x16x1_20e_ava_rgb.py --checkpoint /home/mmaction2_YF/work_dirs/ava/slowfast_kinetics_pretrained_r50_4x16x1_20e_ava_rgb/[email protected]_epoch_10.pth --det-config demo/faster_rcnn_r50_fpn_2x_coco.py  --det-checkpoint Checkpionts/mmdetection/faster_rcnn_r50_fpn_2x_coco_bbox_mAP-0.384_20200504_210434-a5d8aa15.pth   --video /home/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset/Dataset/video_crop/1.mp4  --out-filename demo/det_1.mp4   --det-score-thr 0.5 --action-score-thr 0.5 --output-stepsize 4  --output-fps 6 --label-map tools/data/ava/label_map2.txt

[email protected]_epoch_10.pth是训练最优的权重,检测结果在demo/det_1.mp4,可以自己调整。

我也是正在调试,多会失败,一定要稳住心态,一步一步来……加油加油,一定可以毕业哒!!

错误总结:

1、出现

Traceback (most recent call last):
  File "tools/train.py", line 201, in 
    main()
  File "tools/train.py", line 189, in main
    train_model(
  File "/root/home/mmaction2_YF/mmaction/apis/train.py", line 203, in train_model
    runner.run(data_loaders, cfg.workflow, cfg.total_epochs, **runner_kwargs)
  File "/root/miniconda3/lib/python3.8/site-packages/mmcv/runner/epoch_based_runner.py", line 127, in run
    epoch_runner(data_loaders[i], **kwargs)
  File "/root/miniconda3/lib/python3.8/site-packages/mmcv/runner/epoch_based_runner.py", line 47, in train
    for i, data_batch in enumerate(self.data_loader):
  File "/root/miniconda3/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 517, in __next__
    data = self._next_data()
  File "/root/miniconda3/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 557, in _next_data
    data = self._dataset_fetcher.fetch(index)  # may raise StopIteration
  File "/root/miniconda3/lib/python3.8/site-packages/torch/utils/data/_utils/fetch.py", line 44, in fetch
    data = [self.dataset[idx] for idx in possibly_batched_index]
  File "/root/miniconda3/lib/python3.8/site-packages/torch/utils/data/_utils/fetch.py", line 44, in 
    data = [self.dataset[idx] for idx in possibly_batched_index]
  File "/root/home/mmaction2_YF/mmaction/datasets/base.py", line 289, in __getitem__
    return self.prepare_train_frames(idx)
  File "/root/home/mmaction2_YF/mmaction/datasets/ava_dataset.py", line 294, in prepare_train_frames
    assert proposals.shape[-1] in [4, 5]
AssertionError

一般是数据加载的问题,一定要确保json_extract.py运行没有问题。

2、同时,当某张图片没有人出现的时候,不要自己画框标注,否则会出错。

你可能感兴趣的:(SlowFast,python,开发语言)