From 2c8b76b16d364be886e094e5c79e817f319ac33d Mon Sep 17 00:00:00 2001 From: huangjun12 <2399845970@qq.com> Date: Tue, 1 Sep 2020 15:31:01 +0800 Subject: [PATCH] add slowfast model to video classification (#4815) --- dygraph/slowfast/README.md | 170 +++++++++ dygraph/slowfast/SLOWFAST.png | Bin 0 -> 239020 bytes dygraph/slowfast/config_utils.py | 85 +++++ dygraph/slowfast/eval.py | 191 ++++++++++ dygraph/slowfast/kinetics_dataset.py | 315 +++++++++++++++++ dygraph/slowfast/lr_policy.py | 41 +++ dygraph/slowfast/model.py | 417 ++++++++++++++++++++++ dygraph/slowfast/model_utils.py | 484 ++++++++++++++++++++++++++ dygraph/slowfast/predict.py | 221 ++++++++++++ dygraph/slowfast/run_eval_multi.sh | 7 + dygraph/slowfast/run_eval_single.sh | 6 + dygraph/slowfast/run_infer_multi.sh | 7 + dygraph/slowfast/run_infer_single.sh | 6 + dygraph/slowfast/run_train_multi.sh | 13 + dygraph/slowfast/run_train_single.sh | 9 + dygraph/slowfast/slowfast-single.yaml | 53 +++ dygraph/slowfast/slowfast.yaml | 55 +++ dygraph/slowfast/train.py | 461 ++++++++++++++++++++++++ 18 files changed, 2541 insertions(+) create mode 100644 dygraph/slowfast/README.md create mode 100644 dygraph/slowfast/SLOWFAST.png create mode 100644 dygraph/slowfast/config_utils.py create mode 100644 dygraph/slowfast/eval.py create mode 100644 dygraph/slowfast/kinetics_dataset.py create mode 100644 dygraph/slowfast/lr_policy.py create mode 100644 dygraph/slowfast/model.py create mode 100644 dygraph/slowfast/model_utils.py create mode 100644 dygraph/slowfast/predict.py create mode 100644 dygraph/slowfast/run_eval_multi.sh create mode 100644 dygraph/slowfast/run_eval_single.sh create mode 100644 dygraph/slowfast/run_infer_multi.sh create mode 100644 dygraph/slowfast/run_infer_single.sh create mode 100644 dygraph/slowfast/run_train_multi.sh create mode 100644 dygraph/slowfast/run_train_single.sh create mode 100644 dygraph/slowfast/slowfast-single.yaml create mode 100644 dygraph/slowfast/slowfast.yaml create mode 100644 dygraph/slowfast/train.py diff --git a/dygraph/slowfast/README.md b/dygraph/slowfast/README.md new file mode 100644 index 00000000..3a448d3c --- /dev/null +++ b/dygraph/slowfast/README.md @@ -0,0 +1,170 @@ +# SlowFast 视频分类模型动态图实现 + +--- +## 内容 + +- [模型简介](#模型简介) +- [代码结构](#代码结构) +- [安装说明](#安装说明) +- [数据准备](#数据准备) +- [模型训练](#模型训练) +- [模型评估](#模型评估) +- [模型预测](#模型预测) +- [参考论文](#参考论文) + + +## 模型简介 + +SlowFast是视频分类领域的高精度模型,使用slow和fast两个分支。slow分支以稀疏采样得到的帧作为输入,捕捉视频中的表观信息。fast分支以高频采样得到的帧作为输入,捕获视频中的运动信息,最终将两个分支的特征拼接得到预测结果。 + +

+
+SlowFast Overview +

+ +详细内容请参考ICCV 2019论文[SlowFast Networks for Video Recognition](https://arxiv.org/abs/1812.03982) + + +## 代码结构 +``` +├── slowfast.yaml # 多卡配置文件,用户可方便的配置超参数 +├── slowfast-single.yaml # 单卡评估预测配置文件,用户可方便的配置超参数 +├── run_train_multi.sh # 多卡训练脚本 +├── run_train_single.sh # 单卡训练脚本 +├── run_eval_multi.sh # 多卡评估脚本 +├── run_infer_multi.sh # 多卡预测脚本 +├── run_eval_single.sh # 单卡评估脚本 +├── run_infer_single.sh # 单卡预测脚本 +├── train.py # 训练代码 +├── eval.py # 评估代码,评估网络性能 +├── predict.py # 预测代码 +├── model.py # 网络结构 +├── model_utils.py # 网络结构细节相关 +├── lr_policy.py # 学习率调整方式 +├── kinetics_dataset.py # kinetics-400数据预处理代码 +└── config_utils.py # 配置细节相关代码 +``` + +## 安装说明 + +请使用```python3.7```运行样例代码 + +### 环境依赖: + +``` + CUDA >= 9.0 + cudnn >= 7.5 +``` + +### 依赖安装: + +- PaddlePaddle版本>= 2.0.0-alpha0: +``` pip3.7 install paddlepaddle-gpu==2.0.0a0 -i https://mirror.baidu.com/pypi/simple ``` +- 安装opencv 4.2: +``` pip3.7 install opencv-python==4.2.0.34``` +- 如果想可视化训练曲线,请安装VisualDL: +``` pip3.7 install visualdl -i https://mirror.baidu.com/pypi/simple``` + + +## 数据准备 + +SlowFast模型的训练数据采用Kinetics400数据集,直接输入mp4文件进行训练,数据准备方式如下: + +### mp4视频下载 + +在Code\_Root目录下创建文件夹 + +``` + cd $Code_Root/ && mkdir data + cd data && mkdir data_k400 && cd data_k400 + mkdir train_mp4 && mkdir val_mp4 +``` + +ActivityNet官方提供了Kinetics的下载工具,具体参考其[官方repo](https://github.com/activitynet/ActivityNet/tree/master/Crawler/Kinetics)即可下载Kinetics400的mp4视频集合。将kinetics400的训练与验证集合分别下载到data/data\_k400/train\_mp4与data/data\_k400/val\_mp4。 + +### 生成训练和验证集list + +验证(Validation)和评估(Evaluation)使用同一份数据集,预测(Predict)可以从验证数据集中挑选少量样本进行预测 + +``` + cd $Code_Root/data/ + ls $Code_Root/data/data_k400/train_mp4/* > train.csv + ls $Code_Root/data/data_k400/val_mp4/* > val.csv + ls $Code_Root/data/data_k400/val_mp4/* > test.csv + ls $Code_Root/data/data_k400/val_mp4/* > infer.csv +``` + +## 模型训练 + +数据准备完成后,可通过如下两种方式启动训练: + +默认使用8卡训练,启动方式如下: + + bash run_train_multi.sh + +若使用单卡训练,启动方式如下: + + bash run_train_single.sh + +- 建议使用多卡训练方式,单卡由于batch\_size减小,精度可能会有损失。 + +- 从头开始训练,使用上述启动命令行或者脚本程序即可启动训练,不需要用到预训练模型。 + +- Visual DL可以用来对训练过程进行可视化,具体使用方法请参考[VisualDL](https://github.com/PaddlePaddle/VisualDL) + +**训练资源要求:** + +* 8卡V100,总batch\_size=64,单卡batch\_size=8,单卡显存占用约9G。 +* Kinetics400训练集较大(约23万个样本),SlowFast模型迭代epoch数较多(196个),因此模型训练耗时较长,约200个小时。 +* 训练加速工作进行中,敬请期待。 + + +## 模型评估 + +训练完成后,可通过如下方式进行模型评估: + +多卡评估方式如下: + + bash run_eval_multi.sh + +若使用单卡评估,启动方式如下: + + bash run_eval_single.sh + +- 进行评估时,可修改脚本中的`weights`参数指定用到的权重文件,如果不设置,将使用默认参数文件checkpoints/slowfast_epoch195.pdparams。 + +- 使用```multi_crop```的方式进行评估,因此评估有一定耗时,建议使用多卡评估,加快评估速度。若使用默认方式进行多卡评估,耗时约4小时。 + +- 模型最终的评估精度会打印在日志文件中。 + + +在Kinetics400数据集下评估精度如下: + +| Acc1 | Acc5 | +| :---: | :---: | +| 74.35 | 91.33 | + +- 由于Kinetics400数据集部分源文件已缺失,无法下载,我们使用的数据集比官方数据少~5%,因此精度相比于论文公布的结果有一定损失。 + +## 模型预测 + +训练完成后,可通过如下方式进行模型预测: + +多卡预测方式如下: + + bash run_infer_multi.sh + +若使用单卡预测,启动方式如下: + + bash run_infer_single.sh + +- 进行预测时,可修改脚本中的`weights`参数指定用到的权重文件,如果不设置,将使用默认参数文件checkpoints/slowfast_epoch195.pdparams。 + +- 使用```multi_crop```的方式进行评估,因此单个视频文件预测也有一定耗时。 + +- 预测结果保存在./data/results/result.json文件中。 + + +## 参考论文 + +- [SlowFast Networks for Video Recognition](https://arxiv.org/abs/1812.03982) diff --git a/dygraph/slowfast/SLOWFAST.png b/dygraph/slowfast/SLOWFAST.png new file mode 100644 index 0000000000000000000000000000000000000000..8de85e26aabb1468da97a3503b6cb87317ffdda3 GIT binary patch literal 239020 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

!GJ9wezcE+TeCYugPuVb#*EG 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

D2#ft# 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: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 z�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 Vd415} Arguments ----------------".format( + mode)) + for sec, sec_items in cfg.items(): + logger.info("{}:".format(sec)) + for k, v in sec_items.items(): + logger.info(" {}:{}".format(k, v)) + logger.info("-------------------------------------------------") diff --git a/dygraph/slowfast/eval.py b/dygraph/slowfast/eval.py new file mode 100644 index 00000000..985a8eca --- /dev/null +++ b/dygraph/slowfast/eval.py @@ -0,0 +1,191 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve. +# +#Licensed under the Apache License, Version 2.0 (the "License"); +#you may not use this file except in compliance with the License. +#You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +#Unless required by applicable law or agreed to in writing, software +#distributed under the License is distributed on an "AS IS" BASIS, +#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +#See the License for the specific language governing permissions and +#limitations under the License. + +import os +import sys +import argparse +import ast +import logging +import numpy as np +import paddle.fluid as fluid +from paddle.fluid.dygraph.base import to_variable +from paddle.io import DataLoader, Dataset +from paddle.incubate.hapi.distributed import DistributedBatchSampler, _all_gather +from paddle.fluid.dygraph.parallel import ParallelEnv + +from model import * +from config_utils import * +from kinetics_dataset import KineticsDataset + +logging.root.handlers = [] +FORMAT = '[%(levelname)s: %(filename)s: %(lineno)4d]: %(message)s' +logging.basicConfig(level=logging.INFO, format=FORMAT, stream=sys.stdout) +logger = logging.getLogger(__name__) + + +def parse_args(): + parser = argparse.ArgumentParser( + "SLOWFAST test for performance evaluation.") + parser.add_argument( + '--config_file', + type=str, + default='slowfast.yaml', + help='path to config file of model') + parser.add_argument( + '--batch_size', + type=int, + default=None, + help='total eval batch size of all gpus.') + parser.add_argument( + '--use_gpu', + type=ast.literal_eval, + default=True, + help='default use gpu.') + parser.add_argument( + '--use_data_parallel', + type=ast.literal_eval, + default=True, + help='default use data parallel.') + parser.add_argument( + '--weights', + type=str, + default=None, + help='Weight path, None to use config setting.') + parser.add_argument( + '--log_interval', + type=int, + default=1, + help='mini-batch interval to log.') + args = parser.parse_args() + return args + + +# Performance Evaluation +def test_slowfast(args): + config = parse_config(args.config_file) + test_config = merge_configs(config, 'test', vars(args)) + print_configs(test_config, "Test") + + if not args.use_gpu: + place = fluid.CPUPlace() + elif not args.use_data_parallel: + place = fluid.CUDAPlace(0) + else: + place = fluid.CUDAPlace(fluid.dygraph.parallel.Env().dev_id) + + _nranks = ParallelEnv().nranks # num gpu + bs_single = int(test_config.TEST.batch_size / + _nranks) # batch_size of each gpu + + with fluid.dygraph.guard(place): + #build model + slowfast = SlowFast(cfg=test_config, num_classes=400) + if args.weights: + assert os.path.exists(args.weights + '.pdparams'),\ + "Given weight dir {} not exist.".format(args.weights) + + logger.info('load test weights from {}'.format(args.weights)) + model_dict, _ = fluid.load_dygraph(args.weights) + slowfast.set_dict(model_dict) + + if args.use_data_parallel: + strategy = fluid.dygraph.parallel.prepare_context() + slowfast = fluid.dygraph.parallel.DataParallel(slowfast, strategy) + + #create reader + test_data = KineticsDataset(mode="test", cfg=test_config) + test_sampler = DistributedBatchSampler( + test_data, batch_size=bs_single, shuffle=False, drop_last=False) + test_loader = DataLoader( + test_data, + batch_sampler=test_sampler, + places=place, + feed_list=None, + num_workers=8, + return_list=True) + + # start eval + num_ensemble_views = test_config.TEST.num_ensemble_views + num_spatial_crops = test_config.TEST.num_spatial_crops + num_cls = test_config.MODEL.num_classes + num_clips = num_ensemble_views * num_spatial_crops + num_videos = len(test_data) // num_clips + video_preds = np.zeros((num_videos, num_cls)) + video_labels = np.zeros((num_videos, 1), dtype="int64") + clip_count = {} + + print( + "[EVAL] eval start, number of videos {}, total number of clips {}". + format(num_videos, num_clips * num_videos)) + slowfast.eval() + for batch_id, data in enumerate(test_loader): + # call net + model_inputs = [data[0], data[1]] + preds = slowfast(model_inputs, training=False) + labels = data[2] + clip_ids = data[3] + + # gather mulit card, results of following process in each card is the same. + if _nranks > 1: + preds = _all_gather(preds, _nranks) + labels = _all_gather(labels, _nranks) + clip_ids = _all_gather(clip_ids, _nranks) + + # to numpy + preds = preds.numpy() + labels = labels.numpy().astype("int64") + clip_ids = clip_ids.numpy() + + # preds ensemble + for ind in range(preds.shape[0]): + vid_id = int(clip_ids[ind]) // num_clips + ts_idx = int(clip_ids[ind]) % num_clips + if vid_id not in clip_count: + clip_count[vid_id] = [] + if ts_idx in clip_count[vid_id]: + print( + "[EVAL] Passed!! read video {} clip index {} / {} repeatedly.". + format(vid_id, ts_idx, clip_ids[ind])) + else: + clip_count[vid_id].append(ts_idx) + video_preds[vid_id] += preds[ind] # ensemble method: sum + if video_labels[vid_id].sum() > 0: + assert video_labels[vid_id] == labels[ind] + video_labels[vid_id] = labels[ind] + if batch_id % args.log_interval == 0: + print("[EVAL] Processing batch {}/{} ...".format( + batch_id, len(test_data) // test_config.TEST.batch_size)) + + # check clip index of each video + for key in clip_count.keys(): + if len(clip_count[key]) != num_clips or sum(clip_count[ + key]) != num_clips * (num_clips - 1) / 2: + print( + "[EVAL] Warning!! video [{}] clip count [{}] not match number clips {}". + format(key, clip_count[key], num_clips)) + + video_preds = to_variable(video_preds) + video_labels = to_variable(video_labels) + acc_top1 = fluid.layers.accuracy( + input=video_preds, label=video_labels, k=1) + acc_top5 = fluid.layers.accuracy( + input=video_preds, label=video_labels, k=5) + print('[EVAL] eval finished, avg_acc1= {}, avg_acc5= {} '.format( + acc_top1.numpy(), acc_top5.numpy())) + + +if __name__ == "__main__": + args = parse_args() + logger.info(args) + test_slowfast(args) diff --git a/dygraph/slowfast/kinetics_dataset.py b/dygraph/slowfast/kinetics_dataset.py new file mode 100644 index 00000000..f5689708 --- /dev/null +++ b/dygraph/slowfast/kinetics_dataset.py @@ -0,0 +1,315 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import cv2 +import math +import random +import numpy as np +from PIL import Image, ImageEnhance +import logging +from paddle.io import Dataset + +logger = logging.getLogger(__name__) + +__all__ = ['KineticsDataset'] + + +class KineticsDataset(Dataset): + def __init__(self, mode, cfg): + self.mode = mode + self.format = cfg.MODEL.format + self.num_frames = cfg.MODEL.num_frames + self.sampling_rate = cfg.MODEL.sampling_rate + self.target_fps = cfg.MODEL.target_fps + self.slowfast_alpha = cfg.MODEL.alpha + + self.target_size = cfg[mode.upper()]['target_size'] + self.img_mean = cfg.MODEL.image_mean + self.img_std = cfg.MODEL.image_std + self.filelist = cfg[mode.upper()]['filelist'] + + if self.mode in ["train", "valid"]: + self.min_size = cfg[mode.upper()]['min_size'] + self.max_size = cfg[mode.upper()]['max_size'] + self.num_ensemble_views = 1 + self.num_spatial_crops = 1 + self._num_clips = 1 + elif self.mode in ['test', 'infer']: + self.min_size = self.max_size = self.target_size + self.num_ensemble_views = cfg.TEST.num_ensemble_views + self.num_spatial_crops = cfg.TEST.num_spatial_crops + self._num_clips = (self.num_ensemble_views * self.num_spatial_crops) + + self._construct_loader() + + def _construct_loader(self): + """ + Construct the video loader. + """ + self._num_retries = 5 + self._path_to_videos = [] + self._labels = [] + self._spatial_temporal_idx = [] + with open(self.filelist, "r") as f: + for clip_idx, path_label in enumerate(f.read().splitlines()): + if self.mode == 'infer': + path = path_label + label = 0 # without label when infer actually + else: + path, label = path_label.split() + for idx in range(self._num_clips): + self._path_to_videos.append(path) + self._labels.append(int(label)) + self._spatial_temporal_idx.append(idx) + + def __len__(self): + return len(self._path_to_videos) + + def __getitem__(self, idx): + if self.mode in ["train", "valid"]: + temporal_sample_index = -1 + spatial_sample_index = -1 + elif self.mode in ["test", 'infer']: + temporal_sample_index = (self._spatial_temporal_idx[idx] // + self.num_spatial_crops) + spatial_sample_index = (self._spatial_temporal_idx[idx] % + self.num_spatial_crops) + + for ir in range(self._num_retries): + mp4_path = self._path_to_videos[idx] + try: + pathways = self.mp4_loader( + mp4_path, + temporal_sample_index, + spatial_sample_index, + temporal_num_clips=self.num_ensemble_views, + spatial_num_clips=self.num_spatial_crops, + num_frames=self.num_frames, + sampling_rate=self.sampling_rate, + target_fps=self.target_fps, + target_size=self.target_size, + img_mean=self.img_mean, + img_std=self.img_std, + slowfast_alpha=self.slowfast_alpha, + min_size=self.min_size, + max_size=self.max_size) + except: + if ir < self._num_retries - 1: + logger.error( + 'Error when loading {}, have {} trys, will try again'. + format(mp4_path, ir)) + idx = random.randint(0, len(self._path_to_videos) - 1) + continue + else: + logger.error( + 'Error when loading {}, have {} trys, will not try again'. + format(mp4_path, ir)) + return None, None + label = self._labels[idx] + return pathways[0], pathways[1], np.array([label]), np.array([idx]) + + def mp4_loader(self, filepath, temporal_sample_index, spatial_sample_index, + temporal_num_clips, spatial_num_clips, num_frames, + sampling_rate, target_fps, target_size, img_mean, img_std, + slowfast_alpha, min_size, max_size): + frames_sample, clip_size = self.decode_sampling( + filepath, temporal_sample_index, temporal_num_clips, num_frames, + sampling_rate, target_fps) + frames_select = self.temporal_sampling( + frames_sample, clip_size, num_frames, filepath, + temporal_sample_index, temporal_num_clips) + frames_resize = self.scale(frames_select, min_size, max_size) + frames_crop = self.crop(frames_resize, target_size, + spatial_sample_index, spatial_num_clips) + frames_flip = self.flip(frames_crop, spatial_sample_index) + + #list to nparray + npframes = (np.stack(frames_flip)).astype('float32') + npframes_norm = self.color_norm(npframes, img_mean, img_std) + frames_list = self.pack_output(npframes_norm, slowfast_alpha) + + return frames_list + + def get_start_end_idx(self, video_size, clip_size, clip_idx, + temporal_num_clips): + delta = max(video_size - clip_size, 0) + if clip_idx == -1: # when test, temporal_num_clips is not used + # Random temporal sampling. + start_idx = random.uniform(0, delta) + else: + # Uniformly sample the clip with the given index. + start_idx = delta * clip_idx / temporal_num_clips + end_idx = start_idx + clip_size - 1 + return start_idx, end_idx + + def decode_sampling(self, filepath, temporal_sample_index, + temporal_num_clips, num_frames, sampling_rate, + target_fps): + cap = cv2.VideoCapture(filepath) + videolen = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) + (major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.') + if int(major_ver) < 3: + fps = cap.get(cv2.cv.CV_CAP_PROP_FPS) + else: + fps = cap.get(cv2.CAP_PROP_FPS) + + clip_size = num_frames * sampling_rate * fps / target_fps + + if filepath[-3:] != 'mp4': + start_idx, end_idx = 0, math.inf + else: + start_idx, end_idx = self.get_start_end_idx( + videolen, clip_size, temporal_sample_index, temporal_num_clips) + #print("filepath:",filepath,"start_idx:",start_idx,"end_idx:",end_idx) + + frames_sample = [] #start randomly, decode clip size + start_idx = math.ceil(start_idx) + cap.set(cv2.CAP_PROP_POS_FRAMES, start_idx) + for i in range(videolen): + if i < start_idx: + continue + ret, frame = cap.read() + if ret == False: + continue + if i <= end_idx + 1: #buffer + img = frame[:, :, ::-1] #BGR -> RGB + frames_sample.append(img) + else: + break + return frames_sample, clip_size + + def temporal_sampling(self, frames_sample, clip_size, num_frames, filepath, + temporal_sample_index, temporal_num_clips): + """ sample num_frames from clip_size """ + fs_len = len(frames_sample) + + if filepath[-3:] != 'mp4': + start_idx, end_idx = self.get_start_end_idx( + fs_len, clip_size, temporal_sample_index, temporal_num_clips) + else: + start_idx, end_idx = self.get_start_end_idx(fs_len, clip_size, 0, 1) + + index = np.linspace(start_idx, end_idx, num_frames).astype("int64") + index = np.clip(index, 0, fs_len - 1) + frames_select = [] + for i in range(index.shape[0]): + idx = index[i] + imgbuf = frames_sample[idx] + img = Image.fromarray(imgbuf, mode='RGB') + frames_select.append(img) + + return frames_select + + def scale(self, frames_select, min_size, max_size): + size = int(round(np.random.uniform(min_size, max_size))) + assert (len(frames_select) >= 1) , \ + "len(frames_select):{} should be larger than 1".format(len(frames_select)) + width, height = frames_select[0].size + if (width <= height and width == size) or (height <= width and + height == size): + return frames_select + + new_width = size + new_height = size + if width < height: + new_height = int(math.floor((float(height) / width) * size)) + else: + new_width = int(math.floor((float(width) / height) * size)) + + frames_resize = [] + for j in range(len(frames_select)): + img = frames_select[j] + scale_img = img.resize((new_width, new_height), Image.BILINEAR) + frames_resize.append(scale_img) + + return frames_resize + + def crop(self, frames_resize, target_size, spatial_sample_index, + spatial_num_clips): + w, h = frames_resize[0].size + if w == target_size and h == target_size: + return frames_resize + + assert (w >= target_size) and (h >= target_size), \ + "image width({}) and height({}) should be larger than crop size({},{})".format(w, h, target_size, target_size) + frames_crop = [] + if spatial_sample_index == -1: + x_offset = random.randint(0, w - target_size) + y_offset = random.randint(0, h - target_size) + else: + x_gap = int(math.ceil((w - target_size) / (spatial_num_clips - 1))) + y_gap = int(math.ceil((h - target_size) / (spatial_num_clips - 1))) + if h > w: + x_offset = int(math.ceil((w - target_size) / 2)) + if spatial_sample_index == 0: + y_offset = 0 + elif spatial_sample_index == spatial_num_clips - 1: + y_offset = h - target_size + else: + y_offset = y_gap * spatial_sample_index + else: + y_offset = int(math.ceil((h - target_size) / 2)) + if spatial_sample_index == 0: + x_offset = 0 + elif spatial_sample_index == spatial_num_clips - 1: + x_offset = w - target_size + else: + x_offset = x_gap * spatial_sample_index + + for img in frames_resize: + nimg = img.crop((x_offset, y_offset, x_offset + target_size, + y_offset + target_size)) + frames_crop.append(nimg) + return frames_crop + + def flip(self, frames_crop, spatial_sample_index): + # without flip when test + if spatial_sample_index != -1: + return frames_crop + + frames_flip = [] + if np.random.uniform() < 0.5: + for img in frames_crop: + nimg = img.transpose(Image.FLIP_LEFT_RIGHT) + frames_flip.append(nimg) + else: + frames_flip = frames_crop + return frames_flip + + def color_norm(self, npframes_norm, c_mean, c_std): + npframes_norm /= 255.0 + npframes_norm -= np.array(c_mean).reshape( + [1, 1, 1, 3]).astype(np.float32) + npframes_norm /= np.array(c_std).reshape( + [1, 1, 1, 3]).astype(np.float32) + return npframes_norm + + def pack_output(self, npframes_norm, slowfast_alpha): + fast_pathway = npframes_norm + + # sample num points between start and end + slow_idx_start = 0 + slow_idx_end = fast_pathway.shape[0] - 1 + slow_idx_num = fast_pathway.shape[0] // slowfast_alpha + slow_idxs_select = np.linspace(slow_idx_start, slow_idx_end, + slow_idx_num).astype("int64") + slow_pathway = fast_pathway[slow_idxs_select] + + # T H W C -> C T H W. + slow_pathway = slow_pathway.transpose(3, 0, 1, 2) + fast_pathway = fast_pathway.transpose(3, 0, 1, 2) + + # slow + fast + frames_list = [slow_pathway, fast_pathway] + return frames_list diff --git a/dygraph/slowfast/lr_policy.py b/dygraph/slowfast/lr_policy.py new file mode 100644 index 00000000..b834d5a1 --- /dev/null +++ b/dygraph/slowfast/lr_policy.py @@ -0,0 +1,41 @@ +"""Learning rate policy.""" + +import math + + +def get_epoch_lr(cur_epoch, cfg): + """ + Retrieve the learning rate of the current epoch with the option to perform + warm up in the beginning of the training stage. + Args: + cfg (CfgNode): configs. Details can be found in + slowfast/config/defaults.py + cur_epoch (float): the number of epoch of the current training stage. + #""" + warmup_epochs = cfg.warmup_epochs #34 + warmup_start_lr = cfg.warmup_start_lr #0.01 + lr = lr_func_cosine(cur_epoch, cfg) + + # Perform warm up. + if cur_epoch < warmup_epochs: + lr_start = warmup_start_lr + lr_end = lr_func_cosine(warmup_epochs, cfg) + alpha = (lr_end - lr_start) / warmup_epochs + lr = cur_epoch * alpha + lr_start + return lr + + +def lr_func_cosine(cur_epoch, cfg): + """ + Retrieve the learning rate to specified values at specified epoch with the + cosine learning rate schedule. Details can be found in: + Ilya Loshchilov, and Frank Hutter + SGDR: Stochastic Gradient Descent With Warm Restarts. + Args: + cfg (CfgNode): configs. Details can be found in + slowfast/config/defaults.py + cur_epoch (float): the number of epoch of the current training stage. + """ + base_lr = cfg.base_lr #0.1 + max_epoch = cfg.epoch #196 + return base_lr * (math.cos(math.pi * cur_epoch / max_epoch) + 1.0) * 0.5 diff --git a/dygraph/slowfast/model.py b/dygraph/slowfast/model.py new file mode 100644 index 00000000..d1dabab2 --- /dev/null +++ b/dygraph/slowfast/model.py @@ -0,0 +1,417 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve. +# +#Licensed under the Apache License, Version 2.0 (the "License"); +#you may not use this file except in compliance with the License. +#You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +#Unless required by applicable law or agreed to in writing, software +#distributed under the License is distributed on an "AS IS" BASIS, +#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +#See the License for the specific language governing permissions and +#limitations under the License. + +import paddle.fluid as fluid +from paddle.fluid.dygraph.base import to_variable + +from model_utils import * + + +class ResNetBasicStem(fluid.dygraph.Layer): + """ + ResNe(X)t 3D stem module. + Performs spatiotemporal Convolution, BN, and Relu following by a + spatiotemporal pooling. + """ + + def __init__( + self, + dim_in, + dim_out, + kernel, + stride, + padding, + eps=1e-5, ): + super(ResNetBasicStem, self).__init__() + self.kernel = kernel + self.stride = stride + self.padding = padding + self.eps = eps + self._construct_stem(dim_in, dim_out) + + def _construct_stem(self, dim_in, dim_out): + fan = (dim_out) * (self.kernel[0] * self.kernel[1] * self.kernel[2]) + initializer_tmp = get_conv_init(fan) + batchnorm_weight = 1.0 + + self._conv = fluid.dygraph.nn.Conv3D( + num_channels=dim_in, + num_filters=dim_out, + filter_size=self.kernel, + stride=self.stride, + padding=self.padding, + param_attr=fluid.ParamAttr(initializer=initializer_tmp), + bias_attr=False) + self._bn = fluid.dygraph.BatchNorm( + num_channels=dim_out, + epsilon=self.eps, + param_attr=fluid.ParamAttr( + initializer=fluid.initializer.Constant(batchnorm_weight), + regularizer=fluid.regularizer.L2Decay( + regularization_coeff=0.0)), + bias_attr=fluid.ParamAttr( + initializer=fluid.initializer.Constant(0.0), + regularizer=fluid.regularizer.L2Decay( + regularization_coeff=0.0))) + + def forward(self, x): + x = self._conv(x) + x = self._bn(x) + x = fluid.layers.relu(x) + x = fluid.layers.pool3d( + input=x, + pool_type="max", + pool_size=[1, 3, 3], + pool_stride=[1, 2, 2], + pool_padding=[0, 1, 1], + data_format="NCDHW") + return x + + +class VideoModelStem(fluid.dygraph.Layer): + """ + Video 3D stem module. Provides stem operations of Conv, BN, ReLU, MaxPool + on input data tensor for slow and fast pathways. + """ + + def __init__( + self, + dim_in, + dim_out, + kernel, + stride, + padding, + eps=1e-5, ): + """ + Args: + dim_in (list): the list of channel dimensions of the inputs. + dim_out (list): the output dimension of the convolution in the stem + layer. + kernel (list): the kernels' size of the convolutions in the stem + layers. Temporal kernel size, height kernel size, width kernel + size in order. + stride (list): the stride sizes of the convolutions in the stem + layer. Temporal kernel stride, height kernel size, width kernel + size in order. + padding (list): the paddings' sizes of the convolutions in the stem + layer. Temporal padding size, height padding size, width padding + size in order. + eps (float): epsilon for batch norm. + """ + super(VideoModelStem, self).__init__() + + assert (len({ + len(dim_in), + len(dim_out), + len(kernel), + len(stride), + len(padding), + }) == 1), "Input pathway dimensions are not consistent." + self.num_pathways = len(dim_in) + self.kernel = kernel + self.stride = stride + self.padding = padding + self.eps = eps + self._construct_stem(dim_in, dim_out) + + def _construct_stem(self, dim_in, dim_out): + for pathway in range(len(dim_in)): + stem = ResNetBasicStem( + dim_in[pathway], + dim_out[pathway], + self.kernel[pathway], + self.stride[pathway], + self.padding[pathway], + self.eps, ) + self.add_sublayer("pathway{}_stem".format(pathway), stem) + + def forward(self, x): + assert ( + len(x) == self.num_pathways + ), "Input tensor does not contain {} pathway".format(self.num_pathways) + + for pathway in range(len(x)): + m = getattr(self, "pathway{}_stem".format(pathway)) + x[pathway] = m(to_variable(x[pathway])) + + return x + + +class FuseFastToSlow(fluid.dygraph.Layer): + """ + Fuses the information from the Fast pathway to the Slow pathway. Given the + tensors from Slow pathway and Fast pathway, fuse information from Fast to + Slow, then return the fused tensors from Slow and Fast pathway in order. + """ + + def __init__( + self, + dim_in, + fusion_conv_channel_ratio, + fusion_kernel, + alpha, + eps=1e-5, ): + """ + Args: + dim_in (int): the channel dimension of the input. + fusion_conv_channel_ratio (int): channel ratio for the convolution + used to fuse from Fast pathway to Slow pathway. + fusion_kernel (int): kernel size of the convolution used to fuse + from Fast pathway to Slow pathway. + alpha (int): the frame rate ratio between the Fast and Slow pathway. + eps (float): epsilon for batch norm. + """ + super(FuseFastToSlow, self).__init__() + fan = (dim_in * fusion_conv_channel_ratio) * (fusion_kernel * 1 * 1) + initializer_tmp = get_conv_init(fan) + batchnorm_weight = 1.0 + + self._conv_f2s = fluid.dygraph.nn.Conv3D( + num_channels=dim_in, + num_filters=dim_in * fusion_conv_channel_ratio, + filter_size=[fusion_kernel, 1, 1], + stride=[alpha, 1, 1], + padding=[fusion_kernel // 2, 0, 0], + param_attr=fluid.ParamAttr(initializer=initializer_tmp), + bias_attr=False) + self._bn = fluid.dygraph.BatchNorm( + num_channels=dim_in * fusion_conv_channel_ratio, + epsilon=eps, + param_attr=fluid.ParamAttr( + initializer=fluid.initializer.Constant(batchnorm_weight), + regularizer=fluid.regularizer.L2Decay( + regularization_coeff=0.0)), + bias_attr=fluid.ParamAttr( + initializer=fluid.initializer.Constant(0.0), + regularizer=fluid.regularizer.L2Decay( + regularization_coeff=0.0))) + + def forward(self, x): + x_s = x[0] + x_f = x[1] + fuse = self._conv_f2s(x_f) + fuse = self._bn(fuse) + fuse = fluid.layers.relu(fuse) + x_s_fuse = fluid.layers.concat(input=[x_s, fuse], axis=1, name=None) + + return [x_s_fuse, x_f] + + +class SlowFast(fluid.dygraph.Layer): + """ + SlowFast model builder for SlowFast network. + + Christoph Feichtenhofer, Haoqi Fan, Jitendra Malik, and Kaiming He. + "Slowfast networks for video recognition." + https://arxiv.org/pdf/1812.03982.pdf + """ + + def __init__(self, cfg, num_classes): + """ + Args: + cfg (CfgNode): model building configs, details are in the + comments of the config file. + """ + super(SlowFast, self).__init__() + self.num_classes = num_classes + self.num_frames = cfg.MODEL.num_frames #32 + self.alpha = cfg.MODEL.alpha #8 + self.beta = cfg.MODEL.beta #8 + self.crop_size = cfg.MODEL.crop_size #224 + self.num_pathways = 2 + self.res_depth = 50 + self.num_groups = 1 + self.input_channel_num = [3, 3] + self.width_per_group = 64 + self.fusion_conv_channel_ratio = 2 + self.fusion_kernel_sz = 5 + self.dropout_rate = 0.5 + self._construct_network(cfg) + + def _construct_network(self, cfg): + """ + Builds a SlowFast model. + The first pathway is the Slow pathway + and the second pathway is the Fast pathway. + + Args: + cfg (CfgNode): model building configs, details are in the + comments of the config file. + """ + temp_kernel = [ + [[1], [5]], # conv1 temporal kernel for slow and fast pathway. + [[1], [3]], # res2 temporal kernel for slow and fast pathway. + [[1], [3]], # res3 temporal kernel for slow and fast pathway. + [[3], [3]], # res4 temporal kernel for slow and fast pathway. + [[3], [3]], + ] # res5 temporal kernel for slow and fast pathway. + + self.s1 = VideoModelStem( + dim_in=self.input_channel_num, + dim_out=[self.width_per_group, self.width_per_group // self.beta], + kernel=[temp_kernel[0][0] + [7, 7], temp_kernel[0][1] + [7, 7]], + stride=[[1, 2, 2]] * 2, + padding=[ + [temp_kernel[0][0][0] // 2, 3, 3], + [temp_kernel[0][1][0] // 2, 3, 3], + ], ) + self.s1_fuse = FuseFastToSlow( + dim_in=self.width_per_group // self.beta, + fusion_conv_channel_ratio=self.fusion_conv_channel_ratio, + fusion_kernel=self.fusion_kernel_sz, + alpha=self.alpha, ) + + # ResNet backbone + MODEL_STAGE_DEPTH = {50: (3, 4, 6, 3)} + (d2, d3, d4, d5) = MODEL_STAGE_DEPTH[self.res_depth] + + num_block_temp_kernel = [[3, 3], [4, 4], [6, 6], [3, 3]] + spatial_dilations = [[1, 1], [1, 1], [1, 1], [1, 1]] + spatial_strides = [[1, 1], [2, 2], [2, 2], [2, 2]] + + out_dim_ratio = self.beta // self.fusion_conv_channel_ratio #4 + dim_inner = self.width_per_group * self.num_groups #64 + + self.s2 = ResStage( + dim_in=[ + self.width_per_group + self.width_per_group // out_dim_ratio, + self.width_per_group // self.beta, + ], + dim_out=[ + self.width_per_group * 4, + self.width_per_group * 4 // self.beta, + ], + dim_inner=[dim_inner, dim_inner // self.beta], + temp_kernel_sizes=temp_kernel[1], + stride=spatial_strides[0], + num_blocks=[d2] * 2, + num_groups=[self.num_groups] * 2, + num_block_temp_kernel=num_block_temp_kernel[0], + dilation=spatial_dilations[0], ) + + self.s2_fuse = FuseFastToSlow( + dim_in=self.width_per_group * 4 // self.beta, + fusion_conv_channel_ratio=self.fusion_conv_channel_ratio, + fusion_kernel=self.fusion_kernel_sz, + alpha=self.alpha, ) + + self.s3 = ResStage( + dim_in=[ + self.width_per_group * 4 + self.width_per_group * 4 // + out_dim_ratio, + self.width_per_group * 4 // self.beta, + ], + dim_out=[ + self.width_per_group * 8, + self.width_per_group * 8 // self.beta, + ], + dim_inner=[dim_inner * 2, dim_inner * 2 // self.beta], + temp_kernel_sizes=temp_kernel[2], + stride=spatial_strides[1], + num_blocks=[d3] * 2, + num_groups=[self.num_groups] * 2, + num_block_temp_kernel=num_block_temp_kernel[1], + dilation=spatial_dilations[1], ) + + self.s3_fuse = FuseFastToSlow( + dim_in=self.width_per_group * 8 // self.beta, + fusion_conv_channel_ratio=self.fusion_conv_channel_ratio, + fusion_kernel=self.fusion_kernel_sz, + alpha=self.alpha, ) + + self.s4 = ResStage( + dim_in=[ + self.width_per_group * 8 + self.width_per_group * 8 // + out_dim_ratio, + self.width_per_group * 8 // self.beta, + ], + dim_out=[ + self.width_per_group * 16, + self.width_per_group * 16 // self.beta, + ], + dim_inner=[dim_inner * 4, dim_inner * 4 // self.beta], + temp_kernel_sizes=temp_kernel[3], + stride=spatial_strides[2], + num_blocks=[d4] * 2, + num_groups=[self.num_groups] * 2, + num_block_temp_kernel=num_block_temp_kernel[2], + dilation=spatial_dilations[2], ) + + self.s4_fuse = FuseFastToSlow( + dim_in=self.width_per_group * 16 // self.beta, + fusion_conv_channel_ratio=self.fusion_conv_channel_ratio, + fusion_kernel=self.fusion_kernel_sz, + alpha=self.alpha, ) + + self.s5 = ResStage( + dim_in=[ + self.width_per_group * 16 + self.width_per_group * 16 // + out_dim_ratio, + self.width_per_group * 16 // self.beta, + ], + dim_out=[ + self.width_per_group * 32, + self.width_per_group * 32 // self.beta, + ], + dim_inner=[dim_inner * 8, dim_inner * 8 // self.beta], + temp_kernel_sizes=temp_kernel[4], + stride=spatial_strides[3], + num_blocks=[d5] * 2, + num_groups=[self.num_groups] * 2, + num_block_temp_kernel=num_block_temp_kernel[3], + dilation=spatial_dilations[3], ) + + self.pool_size = [[1, 1, 1], [1, 1, 1]] + self.head = ResNetBasicHead( + dim_in=[ + self.width_per_group * 32, + self.width_per_group * 32 // self.beta, + ], + num_classes=self.num_classes, + pool_size=[ + [ + self.num_frames // self.alpha // self.pool_size[0][0], + self.crop_size // 32 // self.pool_size[0][1], + self.crop_size // 32 // self.pool_size[0][2], + ], + [ + self.num_frames // self.pool_size[1][0], + self.crop_size // 32 // self.pool_size[1][1], + self.crop_size // 32 // self.pool_size[1][2], + ], + ], + dropout_rate=self.dropout_rate, ) + + def forward(self, x, training): + x = self.s1(x) #VideoModelStem + x = self.s1_fuse(x) #FuseFastToSlow + x = self.s2(x) #ResStage + x = self.s2_fuse(x) + + for pathway in range(self.num_pathways): + x[pathway] = fluid.layers.pool3d( + input=x[pathway], + pool_type="max", + pool_size=self.pool_size[pathway], + pool_stride=self.pool_size[pathway], + pool_padding=[0, 0, 0], + data_format="NCDHW") + + x = self.s3(x) + x = self.s3_fuse(x) + x = self.s4(x) + x = self.s4_fuse(x) + x = self.s5(x) + x = self.head(x, training) #ResNetBasicHead + return x diff --git a/dygraph/slowfast/model_utils.py b/dygraph/slowfast/model_utils.py new file mode 100644 index 00000000..777a4163 --- /dev/null +++ b/dygraph/slowfast/model_utils.py @@ -0,0 +1,484 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve. +# +#Licensed under the Apache License, Version 2.0 (the "License"); +#you may not use this file except in compliance with the License. +#You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +#Unless required by applicable law or agreed to in writing, software +#distributed under the License is distributed on an "AS IS" BASIS, +#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +#See the License for the specific language governing permissions and +#limitations under the License. + +from paddle.fluid.initializer import MSRA +import paddle.fluid as fluid + + +# get init parameters for conv layer +def get_conv_init(fan_out): + return MSRA(uniform=False, fan_in=fan_out) + + +"""Video models.""" + + +class BottleneckTransform(fluid.dygraph.Layer): + """ + Bottleneck transformation: Tx1x1, 1x3x3, 1x1x1, where T is the size of + temporal kernel. + """ + + def __init__( + self, + dim_in, + dim_out, + temp_kernel_size, + stride, + dim_inner, + num_groups, + stride_1x1=False, + inplace_relu=True, + eps=1e-5, + dilation=1, ): + """ + Args: + dim_in (int): the channel dimensions of the input. + dim_out (int): the channel dimension of the output. + temp_kernel_size (int): the temporal kernel sizes of the middle + convolution in the bottleneck. + stride (int): the stride of the bottleneck. + dim_inner (int): the inner dimension of the block. + num_groups (int): number of groups for the convolution. num_groups=1 + is for standard ResNet like networks, and num_groups>1 is for + ResNeXt like networks. + stride_1x1 (bool): if True, apply stride to 1x1 conv, otherwise + apply stride to the 3x3 conv. + inplace_relu (bool): if True, calculate the relu on the original + input without allocating new memory. + eps (float): epsilon for batch norm. + dilation (int): size of dilation. + """ + super(BottleneckTransform, self).__init__() + self.temp_kernel_size = temp_kernel_size + self._inplace_relu = inplace_relu + self._eps = eps + self._stride_1x1 = stride_1x1 + self._construct(dim_in, dim_out, stride, dim_inner, num_groups, + dilation) + + def _construct(self, dim_in, dim_out, stride, dim_inner, num_groups, + dilation): + str1x1, str3x3 = (stride, 1) if self._stride_1x1 else (1, stride) + + fan = (dim_inner) * (self.temp_kernel_size * 1 * 1) + initializer_tmp = get_conv_init(fan) + batchnorm_weight = 1.0 + + self.a = fluid.dygraph.nn.Conv3D( + num_channels=dim_in, + num_filters=dim_inner, + filter_size=[self.temp_kernel_size, 1, 1], + stride=[1, str1x1, str1x1], + padding=[int(self.temp_kernel_size // 2), 0, 0], + param_attr=fluid.ParamAttr(initializer=initializer_tmp), + bias_attr=False) + self.a_bn = fluid.dygraph.BatchNorm( + num_channels=dim_inner, + epsilon=self._eps, + param_attr=fluid.ParamAttr( + initializer=fluid.initializer.Constant(batchnorm_weight), + regularizer=fluid.regularizer.L2Decay( + regularization_coeff=0.0)), + bias_attr=fluid.ParamAttr( + initializer=fluid.initializer.Constant(0.0), + regularizer=fluid.regularizer.L2Decay( + regularization_coeff=0.0))) + + # 1x3x3, BN, ReLU. + fan = (dim_inner) * (1 * 3 * 3) + initializer_tmp = get_conv_init(fan) + batchnorm_weight = 1.0 + + self.b = fluid.dygraph.nn.Conv3D( + num_channels=dim_inner, + num_filters=dim_inner, + filter_size=[1, 3, 3], + stride=[1, str3x3, str3x3], + padding=[0, dilation, dilation], + groups=num_groups, + dilation=[1, dilation, dilation], + param_attr=fluid.ParamAttr(initializer=initializer_tmp), + bias_attr=False) + self.b_bn = fluid.dygraph.BatchNorm( + num_channels=dim_inner, + epsilon=self._eps, + param_attr=fluid.ParamAttr( + initializer=fluid.initializer.Constant(batchnorm_weight), + regularizer=fluid.regularizer.L2Decay( + regularization_coeff=0.0)), + bias_attr=fluid.ParamAttr( + initializer=fluid.initializer.Constant(0.0), + regularizer=fluid.regularizer.L2Decay( + regularization_coeff=0.0))) + + # 1x1x1, BN. + fan = (dim_out) * (1 * 1 * 1) + initializer_tmp = get_conv_init(fan) + batchnorm_weight = 0.0 + + self.c = fluid.dygraph.nn.Conv3D( + num_channels=dim_inner, + num_filters=dim_out, + filter_size=[1, 1, 1], + stride=[1, 1, 1], + padding=[0, 0, 0], + param_attr=fluid.ParamAttr(initializer=initializer_tmp), + bias_attr=False) + self.c_bn = fluid.dygraph.BatchNorm( + num_channels=dim_out, + epsilon=self._eps, + param_attr=fluid.ParamAttr( + initializer=fluid.initializer.Constant(batchnorm_weight), + regularizer=fluid.regularizer.L2Decay( + regularization_coeff=0.0)), + bias_attr=fluid.ParamAttr( + initializer=fluid.initializer.Constant(0.0), + regularizer=fluid.regularizer.L2Decay( + regularization_coeff=0.0))) + + def forward(self, x): + # Branch2a. + x = self.a(x) + x = self.a_bn(x) + x = fluid.layers.relu(x) + + # Branch2b. + x = self.b(x) + x = self.b_bn(x) + x = fluid.layers.relu(x) + + # Branch2c + x = self.c(x) + x = self.c_bn(x) + return x + + +class ResBlock(fluid.dygraph.Layer): + """ + Residual block. + """ + + def __init__( + self, + dim_in, + dim_out, + temp_kernel_size, + stride, + dim_inner, + num_groups=1, + stride_1x1=False, + inplace_relu=True, + eps=1e-5, + dilation=1, ): + """ + ResBlock class constructs redisual blocks. More details can be found in: + Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. + "Deep residual learning for image recognition." + https://arxiv.org/abs/1512.03385 + Args: + dim_in (int): the channel dimensions of the input. + dim_out (int): the channel dimension of the output. + temp_kernel_size (int): the temporal kernel sizes of the middle + convolution in the bottleneck. + stride (int): the stride of the bottleneck. + trans_func (string): transform function to be used to construct the + bottleneck. + dim_inner (int): the inner dimension of the block. + num_groups (int): number of groups for the convolution. num_groups=1 + is for standard ResNet like networks, and num_groups>1 is for + ResNeXt like networks. + stride_1x1 (bool): if True, apply stride to 1x1 conv, otherwise + apply stride to the 3x3 conv. + inplace_relu (bool): calculate the relu on the original input + without allocating new memory. + eps (float): epsilon for batch norm. + dilation (int): size of dilation. + """ + super(ResBlock, self).__init__() + self._inplace_relu = inplace_relu + self._eps = eps + self._construct( + dim_in, + dim_out, + temp_kernel_size, + stride, + dim_inner, + num_groups, + stride_1x1, + inplace_relu, + dilation, ) + + def _construct( + self, + dim_in, + dim_out, + temp_kernel_size, + stride, + dim_inner, + num_groups, + stride_1x1, + inplace_relu, + dilation, ): + # Use skip connection with projection if dim or res change. + if (dim_in != dim_out) or (stride != 1): + fan = (dim_out) * (1 * 1 * 1) + initializer_tmp = get_conv_init(fan) + batchnorm_weight = 1.0 + self.branch1 = fluid.dygraph.nn.Conv3D( + num_channels=dim_in, + num_filters=dim_out, + filter_size=1, + stride=[1, stride, stride], + padding=0, + param_attr=fluid.ParamAttr(initializer=initializer_tmp), + bias_attr=False, + dilation=1) + self.branch1_bn = fluid.dygraph.BatchNorm( + num_channels=dim_out, + epsilon=self._eps, + param_attr=fluid.ParamAttr( + initializer=fluid.initializer.Constant(batchnorm_weight), + regularizer=fluid.regularizer.L2Decay( + regularization_coeff=0.0)), + bias_attr=fluid.ParamAttr( + initializer=fluid.initializer.Constant(0.0), + regularizer=fluid.regularizer.L2Decay( + regularization_coeff=0.0))) + + self.branch2 = BottleneckTransform( + dim_in, + dim_out, + temp_kernel_size, + stride, + dim_inner, + num_groups, + stride_1x1=stride_1x1, + inplace_relu=inplace_relu, + dilation=dilation, ) + + def forward(self, x): + if hasattr(self, "branch1"): + x1 = self.branch1(x) + x1 = self.branch1_bn(x1) + x2 = self.branch2(x) + x = fluid.layers.elementwise_add(x=x1, y=x2) + else: + x2 = self.branch2(x) + x = fluid.layers.elementwise_add(x=x, y=x2) + + x = fluid.layers.relu(x) + return x + + +class ResStage(fluid.dygraph.Layer): + """ + Stage of 3D ResNet. It expects to have one or more tensors as input for + multi-pathway (SlowFast) cases. More details can be found here: + + Christoph Feichtenhofer, Haoqi Fan, Jitendra Malik, and Kaiming He. + "Slowfast networks for video recognition." + https://arxiv.org/pdf/1812.03982.pdf + """ + + def __init__( + self, + dim_in, + dim_out, + stride, + temp_kernel_sizes, + num_blocks, + dim_inner, + num_groups, + num_block_temp_kernel, + dilation, + stride_1x1=False, + inplace_relu=True, ): + """ + The `__init__` method of any subclass should also contain these arguments. + ResStage builds p streams, where p can be greater or equal to one. + Args: + dim_in (list): list of p the channel dimensions of the input. + Different channel dimensions control the input dimension of + different pathways. + dim_out (list): list of p the channel dimensions of the output. + Different channel dimensions control the input dimension of + different pathways. + temp_kernel_sizes (list): list of the p temporal kernel sizes of the + convolution in the bottleneck. Different temp_kernel_sizes + control different pathway. + stride (list): list of the p strides of the bottleneck. Different + stride control different pathway. + num_blocks (list): list of p numbers of blocks for each of the + pathway. + dim_inner (list): list of the p inner channel dimensions of the + input. Different channel dimensions control the input dimension + of different pathways. + num_groups (list): list of number of p groups for the convolution. + num_groups=1 is for standard ResNet like networks, and + num_groups>1 is for ResNeXt like networks. + num_block_temp_kernel (list): extent the temp_kernel_sizes to + num_block_temp_kernel blocks, then fill temporal kernel size + of 1 for the rest of the layers. + dilation (list): size of dilation for each pathway. + """ + super(ResStage, self).__init__() + assert all((num_block_temp_kernel[i] <= num_blocks[i] + for i in range(len(temp_kernel_sizes)))) + self.num_blocks = num_blocks + self.temp_kernel_sizes = [(temp_kernel_sizes[i] * num_blocks[i] + )[:num_block_temp_kernel[i]] + [1] * + (num_blocks[i] - num_block_temp_kernel[i]) + for i in range(len(temp_kernel_sizes))] + assert (len({ + len(dim_in), + len(dim_out), + len(temp_kernel_sizes), + len(stride), + len(num_blocks), + len(dim_inner), + len(num_groups), + len(num_block_temp_kernel), + }) == 1) + self.num_pathways = len(self.num_blocks) + self._construct( + dim_in, + dim_out, + stride, + dim_inner, + num_groups, + stride_1x1, + inplace_relu, + dilation, ) + + def _construct( + self, + dim_in, + dim_out, + stride, + dim_inner, + num_groups, + stride_1x1, + inplace_relu, + dilation, ): + + for pathway in range(self.num_pathways): + for i in range(self.num_blocks[pathway]): + res_block = ResBlock( + dim_in[pathway] if i == 0 else dim_out[pathway], + dim_out[pathway], + self.temp_kernel_sizes[pathway][i], + stride[pathway] if i == 0 else 1, + dim_inner[pathway], + num_groups[pathway], + stride_1x1=stride_1x1, + inplace_relu=inplace_relu, + dilation=dilation[pathway], ) + self.add_sublayer("pathway{}_res{}".format(pathway, i), + res_block) + + def forward(self, inputs): + output = [] + for pathway in range(self.num_pathways): + x = inputs[pathway] + + for i in range(self.num_blocks[pathway]): + m = getattr(self, "pathway{}_res{}".format(pathway, i)) + x = m(x) + output.append(x) + + return output + + +"""ResNe(X)t Head helper.""" + + +class ResNetBasicHead(fluid.dygraph.Layer): + """ + ResNe(X)t 3D head. + This layer performs a fully-connected projection during training, when the + input size is 1x1x1. It performs a convolutional projection during testing + when the input size is larger than 1x1x1. If the inputs are from multiple + different pathways, the inputs will be concatenated after pooling. + """ + + def __init__( + self, + dim_in, + num_classes, + pool_size, + dropout_rate=0.0, ): + """ + ResNetBasicHead takes p pathways as input where p in [1, infty]. + + Args: + dim_in (list): the list of channel dimensions of the p inputs to the + ResNetHead. + num_classes (int): the channel dimensions of the p outputs to the + ResNetHead. + pool_size (list): the list of kernel sizes of p spatial temporal + poolings, temporal pool kernel size, spatial pool kernel size, + spatial pool kernel size in order. + dropout_rate (float): dropout rate. If equal to 0.0, perform no + dropout. + """ + super(ResNetBasicHead, self).__init__() + assert (len({len(pool_size), len(dim_in)}) == 1 + ), "pathway dimensions are not consistent." + self.num_pathways = len(pool_size) + self.pool_size = pool_size + self.dropout_rate = dropout_rate + fc_init_std = 0.01 + initializer_tmp = fluid.initializer.NormalInitializer( + loc=0.0, scale=fc_init_std) + self.projection = fluid.dygraph.Linear( + input_dim=sum(dim_in), + output_dim=num_classes, + param_attr=fluid.ParamAttr(initializer=initializer_tmp), + bias_attr=fluid.ParamAttr( + initializer=fluid.initializer.Constant(0.0)), ) + + def forward(self, inputs, training): + assert ( + len(inputs) == self.num_pathways + ), "Input tensor does not contain {} pathway".format(self.num_pathways) + pool_out = [] + for pathway in range(self.num_pathways): + tmp_out = fluid.layers.pool3d( + input=inputs[pathway], + pool_type="avg", + pool_size=self.pool_size[pathway], + pool_stride=1, + data_format="NCDHW") + pool_out.append(tmp_out) + + x = fluid.layers.concat(input=pool_out, axis=1, name=None) + x = fluid.layers.transpose(x=x, perm=(0, 2, 3, 4, 1)) + + # Perform dropout. + if self.dropout_rate > 0.0: + x = fluid.layers.dropout( + x, + dropout_prob=self.dropout_rate, + dropout_implementation='upscale_in_train') + + x = self.projection(x) + + # Performs fully convlutional inference. + if not training: + x = fluid.layers.softmax(x, axis=4) + x = fluid.layers.reduce_mean(x, dim=[1, 2, 3]) + + x = fluid.layers.reshape(x, shape=(x.shape[0], -1)) + return x diff --git a/dygraph/slowfast/predict.py b/dygraph/slowfast/predict.py new file mode 100644 index 00000000..04ad7f0c --- /dev/null +++ b/dygraph/slowfast/predict.py @@ -0,0 +1,221 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve. +# +#Licensed under the Apache License, Version 2.0 (the "License"); +#you may not use this file except in compliance with the License. +#You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +#Unless required by applicable law or agreed to in writing, software +#distributed under the License is distributed on an "AS IS" BASIS, +#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +#See the License for the specific language governing permissions and +#limitations under the License. + +import os +import sys +import argparse +import ast +import logging +import numpy as np +import json +import paddle.fluid as fluid +from paddle.fluid.dygraph.base import to_variable +from paddle.io import DataLoader, Dataset +from paddle.incubate.hapi.distributed import DistributedBatchSampler, _all_gather +from paddle.fluid.dygraph.parallel import ParallelEnv + +from model import * +from config_utils import * +from kinetics_dataset import KineticsDataset + +logging.root.handlers = [] +FORMAT = '[%(levelname)s: %(filename)s: %(lineno)4d]: %(message)s' +logging.basicConfig(level=logging.INFO, format=FORMAT, stream=sys.stdout) +logger = logging.getLogger(__name__) + + +def parse_args(): + parser = argparse.ArgumentParser( + "SLOWFAST test for performance evaluation.") + parser.add_argument( + '--config_file', + type=str, + default='slowfast.yaml', + help='path to config file of model') + parser.add_argument( + '--batch_size', + type=int, + default=None, + help='total eval batch size of all gpus.') + parser.add_argument( + '--use_gpu', + type=ast.literal_eval, + default=True, + help='default use gpu.') + parser.add_argument( + '--use_data_parallel', + type=ast.literal_eval, + default=True, + help='default use data parallel.') + parser.add_argument( + '--weights', + type=str, + default=None, + help='weight path, None to use config setting.') + parser.add_argument( + '--log_interval', + type=int, + default=1, + help='mini-batch interval to log.') + parser.add_argument( + '--save_path', + type=str, + default=None, + help='save path, None to use config setting.') + args = parser.parse_args() + return args + + +# Prediction +def infer_slowfast(args): + config = parse_config(args.config_file) + infer_config = merge_configs(config, 'infer', vars(args)) + print_configs(infer_config, "Infer") + + if not os.path.isdir(infer_config.INFER.save_path): + os.makedirs(infer_config.INFER.save_path) + + if not args.use_gpu: + place = fluid.CPUPlace() + elif not args.use_data_parallel: + place = fluid.CUDAPlace(0) + else: + place = fluid.CUDAPlace(fluid.dygraph.parallel.Env().dev_id) + + _nranks = ParallelEnv().nranks # num gpu + bs_single = int(infer_config.INFER.batch_size / + _nranks) # batch_size of each gpu + + with fluid.dygraph.guard(place): + #build model + slowfast = SlowFast(cfg=infer_config, num_classes=400) + if args.weights: + assert os.path.exists(args.weights + '.pdparams'),\ + "Given weight dir {} not exist.".format(args.weights) + + logger.info('load test weights from {}'.format(args.weights)) + model_dict, _ = fluid.load_dygraph(args.weights) + slowfast.set_dict(model_dict) + + if args.use_data_parallel: + strategy = fluid.dygraph.parallel.prepare_context() + slowfast = fluid.dygraph.parallel.DataParallel(slowfast, strategy) + + #create reader + infer_data = KineticsDataset(mode="infer", cfg=infer_config) + infer_sampler = DistributedBatchSampler( + infer_data, batch_size=bs_single, shuffle=False, drop_last=False) + infer_loader = DataLoader( + infer_data, + batch_sampler=infer_sampler, + places=place, + feed_list=None, + num_workers=0, + return_list=True) + + # start infer + num_ensemble_views = infer_config.INFER.num_ensemble_views + num_spatial_crops = infer_config.INFER.num_spatial_crops + num_cls = infer_config.MODEL.num_classes + num_clips = num_ensemble_views * num_spatial_crops + num_videos = len(infer_data) // num_clips + video_preds = np.zeros((num_videos, num_cls)) + clip_count = {} + + video_paths = [] + with open(infer_config.INFER.filelist, "r") as f: + for path in f.read().splitlines(): + video_paths.append(path) + + print( + "[INFER] infer start, number of videos {}, number of clips {}, total number of clips {}". + format(num_videos, num_clips, num_clips * num_videos)) + slowfast.eval() + for batch_id, data in enumerate(infer_loader): + # call net + model_inputs = [data[0], data[1]] + preds = slowfast(model_inputs, training=False) + clip_ids = data[3] + + # gather mulit card, results of following process in each card is the same. + if _nranks > 1: + preds = _all_gather(preds, _nranks) + clip_ids = _all_gather(clip_ids, _nranks) + + # to numpy + preds = preds.numpy() + clip_ids = clip_ids.numpy() + + # preds ensemble + for ind in range(preds.shape[0]): + vid_id = int(clip_ids[ind]) // num_clips + ts_idx = int(clip_ids[ind]) % num_clips + if vid_id not in clip_count: + clip_count[vid_id] = [] + if ts_idx in clip_count[vid_id]: + print( + "[INFER] Passed!! read video {} clip index {} / {} repeatedly.". + format(vid_id, ts_idx, clip_ids[ind])) + else: + clip_count[vid_id].append(ts_idx) + video_preds[vid_id] += preds[ind] # ensemble method: sum + if batch_id % args.log_interval == 0: + print("[INFER] Processing batch {}/{} ...".format( + batch_id, len(infer_data) // infer_config.INFER.batch_size)) + + # check clip index of each video + for key in clip_count.keys(): + if len(clip_count[key]) != num_clips or sum(clip_count[ + key]) != num_clips * (num_clips - 1) / 2: + print( + "[INFER] Warning!! video [{}] clip count [{}] not match number clips {}". + format(key, clip_count[key], num_clips)) + + res_list = [] + for j in range(video_preds.shape[0]): + pred = to_variable(video_preds[j] / num_clips) #mean prob + video_path = video_paths[j] + pred = to_variable(pred) + top1_values, top1_indices = fluid.layers.topk(pred, k=1) + top5_values, top5_indices = fluid.layers.topk(pred, k=5) + top1_values = top1_values.numpy().astype("float64")[0] + top1_indices = int(top1_indices.numpy()[0]) + top5_values = list(top5_values.numpy().astype("float64")) + top5_indices = [int(item) for item in top5_indices.numpy() + ] #np.int is not JSON serializable + print("[INFER] video id [{}], top1 value {}, top1 indices {}". + format(video_path, top1_values, top1_indices)) + print("[INFER] video id [{}], top5 value {}, top5 indices {}". + format(video_path, top5_values, top5_indices)) + save_dict = { + 'video_id': video_path, + 'top1_values': top1_values, + 'top1_indices': top1_indices, + 'top5_values': top5_values, + 'top5_indices': top5_indices + } + res_list.append(save_dict) + + with open( + os.path.join(infer_config.INFER.save_path, 'result' + '.json'), + 'w') as f: + json.dump(res_list, f) + print('[INFER] infer finished, results saved in {}'.format( + infer_config.INFER.save_path)) + + +if __name__ == "__main__": + args = parse_args() + logger.info(args) + infer_slowfast(args) diff --git a/dygraph/slowfast/run_eval_multi.sh b/dygraph/slowfast/run_eval_multi.sh new file mode 100644 index 00000000..b53e83c0 --- /dev/null +++ b/dygraph/slowfast/run_eval_multi.sh @@ -0,0 +1,7 @@ +export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 +python3.7 -m paddle.distributed.launch \ + eval.py \ + --config=slowfast.yaml \ + --use_gpu=True \ + --use_data_parallel=1 \ + --weights=checkpoints/slowfast_epoch195 diff --git a/dygraph/slowfast/run_eval_single.sh b/dygraph/slowfast/run_eval_single.sh new file mode 100644 index 00000000..c5d5e900 --- /dev/null +++ b/dygraph/slowfast/run_eval_single.sh @@ -0,0 +1,6 @@ +export CUDA_VISIBLE_DEVICES=0 +python3.7 eval.py \ + --config=slowfast-single.yaml \ + --use_gpu=True \ + --use_data_parallel=0 \ + --weights=checkpoints/slowfast_epoch195 diff --git a/dygraph/slowfast/run_infer_multi.sh b/dygraph/slowfast/run_infer_multi.sh new file mode 100644 index 00000000..422e1cb5 --- /dev/null +++ b/dygraph/slowfast/run_infer_multi.sh @@ -0,0 +1,7 @@ +export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 +python3.7 -m paddle.distributed.launch \ + predict.py \ + --config=slowfast.yaml \ + --use_gpu=True \ + --use_data_parallel=1 \ + --weights=checkpoints/slowfast_epoch195 diff --git a/dygraph/slowfast/run_infer_single.sh b/dygraph/slowfast/run_infer_single.sh new file mode 100644 index 00000000..419bf0fe --- /dev/null +++ b/dygraph/slowfast/run_infer_single.sh @@ -0,0 +1,6 @@ +export CUDA_VISIBLE_DEVICES=0 +python3.7 predict.py \ + --config=slowfast-single.yaml \ + --use_gpu=True \ + --use_data_parallel=0 \ + --weights=checkpoints/slowfast_epoch195 diff --git a/dygraph/slowfast/run_train_multi.sh b/dygraph/slowfast/run_train_multi.sh new file mode 100644 index 00000000..501bbd18 --- /dev/null +++ b/dygraph/slowfast/run_train_multi.sh @@ -0,0 +1,13 @@ +export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 + +start_time=$(date +%s) + +python3.7 -m paddle.distributed.launch --log_dir=logs \ + train.py \ + --config=slowfast.yaml \ + --use_gpu=True \ + --use_data_parallel=1 \ + +end_time=$(date +%s) +cost_time=$[ $end_time-$start_time ] +echo "8 card bs=64, 196 epoch 34 warmup epoch, 400 class, preciseBN 200 iter build kernel time is $(($cost_time/60))min $(($cost_time%60))s" diff --git a/dygraph/slowfast/run_train_single.sh b/dygraph/slowfast/run_train_single.sh new file mode 100644 index 00000000..35fae3b9 --- /dev/null +++ b/dygraph/slowfast/run_train_single.sh @@ -0,0 +1,9 @@ +export CUDA_VISIBLE_DEVICES=0 + +start_time=$(date +%s) + +python3.7 train.py --config=slowfast-single.yaml --use_gpu=True --use_data_parallel=0 + +end_time=$(date +%s) +cost_time=$[ $end_time-$start_time ] +echo "1 card bs=8, 196 epoch 34 warmup epoch, 400 class, preciseBN 200 iter build kernel time is $(($cost_time/60))min $(($cost_time%60))s" diff --git a/dygraph/slowfast/slowfast-single.yaml b/dygraph/slowfast/slowfast-single.yaml new file mode 100644 index 00000000..f674bb73 --- /dev/null +++ b/dygraph/slowfast/slowfast-single.yaml @@ -0,0 +1,53 @@ +MODEL: + name: "SLOWFAST" + format: "mp4" + num_classes: 400 + num_frames: 32 + sampling_rate: 2 + target_fps: 30 + alpha: 8 + beta: 8 + crop_size: 224 + image_mean: [0.45, 0.45, 0.45] + image_std: [0.225, 0.225, 0.225] + +TRAIN: + epoch: 196 + target_size: 224 + min_size: 256 + max_size: 320 + batch_size: 8 + use_gpu: True + num_gpus: 1 + filelist: "./data/train.csv" + base_lr: 0.1 + warmup_epochs: 34 + warmup_start_lr: 0.01 + l2_weight_decay: 1e-4 + momentum: 0.9 + +VALID: + use_preciseBN: True + preciseBN_interval: 10 + num_batches_preciseBN: 200 + target_size: 224 + min_size: 256 + max_size: 320 + batch_size: 8 + filelist: "./data/val.csv" + +TEST: + target_size: 256 + batch_size: 8 + filelist: "./data/val.csv" + num_ensemble_views: 10 + num_spatial_crops: 3 + +INFER: + target_size: 256 + batch_size: 8 + filelist: "./data/infer.csv" + num_ensemble_views: 10 + num_spatial_crops: 3 + save_path: "./data/results" + diff --git a/dygraph/slowfast/slowfast.yaml b/dygraph/slowfast/slowfast.yaml new file mode 100644 index 00000000..2e762f71 --- /dev/null +++ b/dygraph/slowfast/slowfast.yaml @@ -0,0 +1,55 @@ +MODEL: + name: "SLOWFAST" + format: "mp4" + num_classes: 400 + num_frames: 32 + sampling_rate: 2 + target_fps: 30 + alpha: 8 + beta: 8 + crop_size: 224 + image_mean: [0.45, 0.45, 0.45] + image_std: [0.225, 0.225, 0.225] + +TRAIN: + epoch: 196 + target_size: 224 + min_size: 256 + max_size: 320 + batch_size: 64 + use_gpu: True + num_gpus: 8 + filelist: "./data/train.csv" + base_lr: 0.1 + warmup_epochs: 34 + warmup_start_lr: 0.01 + l2_weight_decay: 1e-4 + momentum: 0.9 + +VALID: + use_preciseBN: True + preciseBN_interval: 10 + num_batches_preciseBN: 200 + target_size: 224 + min_size: 256 + max_size: 320 + batch_size: 64 + filelist: "./data/val.csv" + +TEST: + target_size: 256 + batch_size: 64 + filelist: "./data/val.csv" + weights: "checkpoints/slowfast_epoch195" + num_ensemble_views: 10 + num_spatial_crops: 3 + +INFER: + target_size: 256 + batch_size: 32 + filelist: "./data/infer.csv" + weights: "checkpoints/slowfast_epoch195" + num_ensemble_views: 10 + num_spatial_crops: 3 + save_path: "./data/results" + diff --git a/dygraph/slowfast/train.py b/dygraph/slowfast/train.py new file mode 100644 index 00000000..0a817659 --- /dev/null +++ b/dygraph/slowfast/train.py @@ -0,0 +1,461 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve. +# +#Licensed under the Apache License, Version 2.0 (the "License"); +#you may not use this file except in compliance with the License. +#You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +#Unless required by applicable law or agreed to in writing, software +#distributed under the License is distributed on an "AS IS" BASIS, +#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +#See the License for the specific language governing permissions and +#limitations under the License. + +import os +import sys +import time +import argparse +import ast +import logging +import itertools +import numpy as np +import random +import paddle +import paddle.fluid as fluid +from paddle.fluid.dygraph.base import to_variable +from paddle.io import DataLoader, Dataset +from paddle.incubate.hapi.distributed import DistributedBatchSampler + +from model import * +from config_utils import * +from lr_policy import get_epoch_lr +from kinetics_dataset import KineticsDataset + +logging.root.handlers = [] +FORMAT = '[%(levelname)s: %(filename)s: %(lineno)4d]: %(message)s' +logging.basicConfig(level=logging.INFO, format=FORMAT, stream=sys.stdout) +logger = logging.getLogger(__name__) + + +def parse_args(): + parser = argparse.ArgumentParser("SlowFast train") + parser.add_argument( + '--config', + type=str, + default='slowfast.yaml', + help='path to config file of model') + parser.add_argument( + '--use_visualdl', + type=ast.literal_eval, + default=False, + help='whether to use visual dl.') + parser.add_argument( + '--vd_logdir', + type=str, + default='./vdlog', + help='default save visualdl_log in ./vdlog.') + parser.add_argument( + '--use_data_parallel', + type=ast.literal_eval, + default=True, + help='default use data parallel.') + parser.add_argument( + '--use_gpu', + type=ast.literal_eval, + default=True, + help='default use gpu.') + parser.add_argument( + '--epoch', + type=int, + default=None, + help='epoch number, None to read from config file') + parser.add_argument( + '--batch_size', + type=int, + default=None, + help='training batch size. None to use config file setting.') + parser.add_argument( + '--save_dir', + type=str, + default='./checkpoints', + help='default model save in ./checkpoints.') + parser.add_argument( + '--resume', + type=ast.literal_eval, + default=False, + help='whether to resume training') + parser.add_argument( + '--resume_epoch', + type=int, + default=100000, + help='epoch to resume training based on latest saved checkpoints. ') + parser.add_argument( + '--valid_interval', + type=int, + default=1, + help='validation epoch interval, 0 for no validation.') + parser.add_argument( + '--log_interval', + type=int, + default=10, + help='mini-batch interval to log.') + + args = parser.parse_args() + return args + + +def val(epoch, model, valid_loader, use_visualdl): + val_iter_num = len(valid_loader) + total_loss = 0.0 + total_acc1 = 0.0 + total_acc5 = 0.0 + total_sample = 0 + + for batch_id, data in enumerate(valid_loader): + y_data = data[2] + labels = to_variable(y_data) + labels.stop_gradient = True + model_inputs = [data[0], data[1]] + + preds = model(model_inputs, training=False) + + loss_out = fluid.layers.softmax_with_cross_entropy( + logits=preds, label=labels) + avg_loss = fluid.layers.mean(loss_out) + acc_top1 = fluid.layers.accuracy(input=preds, label=labels, k=1) + acc_top5 = fluid.layers.accuracy(input=preds, label=labels, k=5) + + total_loss += avg_loss.numpy()[0] + total_acc1 += acc_top1.numpy()[0] + total_acc5 += acc_top5.numpy()[0] + total_sample += 1 + if use_visualdl: + vdl_writer.add_scalar( + tag="val/loss", + step=epoch * val_iter_num + batch_id, + value=avg_loss.numpy()) + vdl_writer.add_scalar( + tag="val/err1", + step=epoch * val_iter_num + batch_id, + value=1.0 - acc_top1.numpy()) + vdl_writer.add_scalar( + tag="val/err5", + step=epoch * val_iter_num + batch_id, + value=1.0 - acc_top5.numpy()) + print( "[Test Epoch %d, batch %d] loss %.5f, err1 %.5f, err5 %.5f" % \ + (epoch, batch_id, avg_loss.numpy(), 1.0 - acc_top1.numpy(), 1. - acc_top5.numpy())) + print( '[TEST Epoch %d end] avg_loss %.5f, avg_err1 %.5f, avg_err5= %.5f' % \ + (epoch, total_loss / total_sample, 1. - total_acc1 / total_sample, 1. - total_acc5 / total_sample)) + + if use_visualdl: + vdl_writer.add_scalar( + tag="val_epoch/loss", step=epoch, value=total_loss / total_sample) + vdl_writer.add_scalar( + tag="val_epoch/err1", + step=epoch, + value=1.0 - total_acc1 / total_sample) + vdl_writer.add_scalar( + tag="val_epoch/err5", + step=epoch, + value=1.0 - total_acc5 / total_sample) + + +def create_optimizer(cfg, data_size, params): + l2_weight_decay = cfg.l2_weight_decay + momentum = cfg.momentum + + lr_list = [] + bd_list = [] + cur_bd = 1 + for cur_epoch in range(cfg.epoch): + for cur_iter in range(data_size): + cur_lr = get_epoch_lr(cur_epoch + float(cur_iter) / data_size, cfg) + lr_list.append(cur_lr) + bd_list.append(cur_bd) + cur_bd += 1 + bd_list.pop() + + optimizer = fluid.optimizer.Momentum( + learning_rate=fluid.layers.piecewise_decay( + boundaries=bd_list, values=lr_list), + momentum=momentum, + regularization=fluid.regularizer.L2Decay(l2_weight_decay), + use_nesterov=True, + parameter_list=params) + + return optimizer + + +def precise_BN(model, data_loader, num_iters=200): + """ + Recompute and update the batch norm stats to make them more precise. During + training both BN stats and the weight are changing after every iteration, so + the running average can not precisely reflect the actual stats of the + current model. + In this function, the BN stats are recomputed with fixed weights, to make + the running average more precise. Specifically, it computes the true average + of per-batch mean/variance instead of the running average. + This is useful to improve validation accuracy. + :param model: the model whose bn stats will be recomputed + :param data_loader: an iterator. Produce data as input to the model + :param num_iters: number of iterations to compute the stats. + :return: the model with precise mean and variance in bn layers. + """ + bn_layers_list = [ + m for m in model.sublayers() + if isinstance(m, paddle.fluid.dygraph.nn.BatchNorm) and not m._is_test + ] + if len(bn_layers_list) == 0: + return + + # moving_mean=moving_mean*momentum+batch_mean*(1.−momentum) + # we set momentum=0. to get the true mean and variance during forward + momentum_actual = [bn._momentum for bn in bn_layers_list] + for bn in bn_layers_list: + bn._momentum = 0. + + running_mean = [ + fluid.layers.zeros_like(bn._mean) for bn in bn_layers_list + ] #pre-ignore + running_var = [ + fluid.layers.zeros_like(bn._variance) for bn in bn_layers_list + ] + + ind = -1 + for ind, data in enumerate(itertools.islice(data_loader, num_iters)): + model_inputs = [data[0], data[1]] + model(model_inputs, training=True) + + for i, bn in enumerate(bn_layers_list): + # Accumulates the bn stats. + running_mean[i] += (bn._mean - running_mean[i]) / (ind + 1) + running_var[i] += (bn._variance - running_var[i]) / (ind + 1) + + assert ind == num_iters - 1, ( + "update_bn_stats is meant to run for {} iterations, " + "but the dataloader stops at {} iterations.".format(num_iters, ind)) + + # Sets the precise bn stats. + for i, bn in enumerate(bn_layers_list): + bn._mean.set_value(running_mean[i]) + bn._variance.set_value(running_var[i]) + bn._momentum = momentum_actual[i] + + +def train(args): + config = parse_config(args.config) + train_config = merge_configs(config, 'train', vars(args)) + valid_config = merge_configs(config, 'valid', vars(args)) + print_configs(train_config, 'Train') + + # visual dl to visualize trianing process + local_rank = fluid.dygraph.parallel.Env().local_rank + if args.use_visualdl: + try: + from visualdl import LogWriter + vdl_writer = LogWriter(args.vd_logdir + '/' + str(local_rank)) + except: + print( + "visualdl is not installed, please install visualdl if you want to use" + ) + + if not args.use_gpu: + place = fluid.CPUPlace() + elif not args.use_data_parallel: + place = fluid.CUDAPlace(0) + else: + place = fluid.CUDAPlace(fluid.dygraph.parallel.Env().dev_id) + + random.seed(0) + np.random.seed(0) + paddle.framework.manual_seed(0) + with fluid.dygraph.guard(place): + # 1. init net + if args.use_data_parallel: + strategy = fluid.dygraph.parallel.prepare_context() + + video_model = SlowFast(cfg=train_config, num_classes=400) + if args.use_data_parallel: + video_model = fluid.dygraph.parallel.DataParallel(video_model, + strategy) + + bs_denominator = 1 + if args.use_gpu: + gpus = os.getenv("CUDA_VISIBLE_DEVICES", "") + if gpus == "": + pass + else: + gpus = gpus.split(",") + num_gpus = len(gpus) + assert num_gpus == train_config.TRAIN.num_gpus, \ + "num_gpus({}) set by CUDA_VISIBLE_DEVICES" \ + "shoud be the same as that" \ + "set in {}({})".format( + num_gpus, args.config, train_config.TRAIN.num_gpus) + bs_denominator = train_config.TRAIN.num_gpus + + # 2. reader and optimizer + bs_train_single = int(train_config.TRAIN.batch_size / bs_denominator) + bs_val_single = int(train_config.VALID.batch_size / bs_denominator) + train_data = KineticsDataset(mode="train", cfg=train_config) + valid_data = KineticsDataset(mode="valid", cfg=valid_config) + train_sampler = DistributedBatchSampler( + train_data, + batch_size=bs_train_single, + shuffle=True, + drop_last=True) + train_loader = DataLoader( + train_data, + batch_sampler=train_sampler, + places=place, + feed_list=None, + num_workers=8, + return_list=True) + valid_sampler = DistributedBatchSampler( + valid_data, + batch_size=bs_val_single, + shuffle=False, + drop_last=False) + valid_loader = DataLoader( + valid_data, + batch_sampler=valid_sampler, + places=place, + feed_list=None, + num_workers=8, + return_list=True) + + train_iter_num = len(train_loader) + optimizer = create_optimizer(train_config.TRAIN, train_iter_num, + video_model.parameters()) + + #3. load checkpoint + if args.resume: + saved_path = "slowfast_epoch" #default + model_path = saved_path + args.resume_epoch + assert os.path.exists(model_path + ".pdparams"), \ + "Given dir {}.pdparams not exist.".format(model_path) + assert os.path.exists(model_path + ".pdopt"), \ + "Given dir {}.pdopt not exist.".format(model_path) + para_dict, opti_dict = fluid.dygraph.load_dygraph(model_path) + video_model.set_dict(para_dict) + optimizer.set_dict(opti_dict) + if args.use_visualdl: + # change log path otherwise log history will be overwritten + vdl_writer = LogWriter(args.vd_logdir + args.resume_epoch + '/' + + str(local_rank)) + + # 4. train loop + for epoch in range(train_config.TRAIN.epoch): + epoch_start = time.time() + if args.resume and epoch <= args.resume_epoch: + print("epoch:{}<=args.resume_epoch:{}, pass".format( + epoch, args.resume_epoch)) + continue + video_model.train() + total_loss = 0.0 + total_acc1 = 0.0 + total_acc5 = 0.0 + total_sample = 0 + + print('start for, Epoch {}/{} '.format(epoch, + train_config.TRAIN.epoch)) + batch_start = time.time() + for batch_id, data in enumerate(train_loader): + batch_reader_end = time.time() + y_data = data[2] + labels = to_variable(y_data) + labels.stop_gradient = True + model_inputs = [data[0], data[1]] + + # 4.1.1 call net() + preds = video_model(model_inputs, training=True) + loss_out = fluid.layers.softmax_with_cross_entropy( + logits=preds, label=labels) + avg_loss = fluid.layers.mean(loss_out) + acc_top1 = fluid.layers.accuracy(input=preds, label=labels, k=1) + acc_top5 = fluid.layers.accuracy(input=preds, label=labels, k=5) + + # 4.1.2 call backward() + if args.use_data_parallel: + avg_loss = video_model.scale_loss(avg_loss) + avg_loss.backward() + video_model.apply_collective_grads() + else: + avg_loss.backward() + + # 4.1.3 call minimize() + optimizer.minimize(avg_loss) + video_model.clear_gradients() + + total_loss += avg_loss.numpy()[0] + total_acc1 += acc_top1.numpy()[0] + total_acc5 += acc_top5.numpy()[0] + total_sample += 1 + if args.use_visualdl: + vdl_writer.add_scalar( + tag="train/loss", + step=epoch * train_iter_num + batch_id, + value=avg_loss.numpy()) + vdl_writer.add_scalar( + tag="train/err1", + step=epoch * train_iter_num + batch_id, + value=1.0 - acc_top1.numpy()) + vdl_writer.add_scalar( + tag="train/err5", + step=epoch * train_iter_num + batch_id, + value=1.0 - acc_top5.numpy()) + + train_batch_cost = time.time() - batch_start + train_reader_cost = batch_reader_end - batch_start + batch_start = time.time() + if batch_id % args.log_interval == 0: + print( "[Epoch %d, batch %d] loss %.5f, err1 %.5f, err5 %.5f, batch_cost: %.5f s, reader_cost: %.5f s" % \ + (epoch, batch_id, avg_loss.numpy(), 1.0 - acc_top1.numpy(), 1. - acc_top5.numpy(), train_batch_cost, train_reader_cost)) + + train_epoch_cost = time.time() - epoch_start + print( '[Epoch %d end] avg_loss %.5f, avg_err1 %.5f, avg_err5= %.5f, epoch_cost: %.5f s' % \ + (epoch, total_loss / total_sample, 1. - total_acc1 / total_sample, 1. - total_acc5 / total_sample, train_epoch_cost)) + if args.use_visualdl: + vdl_writer.add_scalar( + tag="train_epoch/loss", + step=epoch, + value=total_loss / total_sample) + vdl_writer.add_scalar( + tag="train_epoch/err1", + step=epoch, + value=1. - total_acc1 / total_sample) + vdl_writer.add_scalar( + tag="train_epoch/err5", + step=epoch, + value=1. - total_acc5 / total_sample) + + # 4.3 do preciseBN + if valid_config.VALID.use_preciseBN and epoch % valid_config.VALID.preciseBN_interval == 0: + print("do precise BN in epoch {} ...".format(epoch)) + precise_BN(video_model, train_loader, + min(valid_config.VALID.num_batches_preciseBN, + len(train_loader))) + + # 4.3 save checkpoint + if local_rank == 0: + if not os.path.isdir(args.save_dir): + os.makedirs(args.save_dir) + model_path = os.path.join(args.save_dir, + "slowfast_epoch{}".format(epoch)) + fluid.dygraph.save_dygraph(video_model.state_dict(), model_path) + fluid.dygraph.save_dygraph(optimizer.state_dict(), model_path) + print('save_dygraph End, Epoch {}/{} '.format( + epoch, train_config.TRAIN.epoch)) + + # 4.4 validation + video_model.eval() + val(epoch, video_model, valid_loader, args.use_visualdl) + + logger.info('[TRAIN] training finished') + + +if __name__ == "__main__": + args = parse_args() + logger.info(args) + train(args) -- GitLab