作者:忘爱LIAN | 来源:互联网 | 2023-07-19 19:56
参考代码:
https://github.com/kenshohara/3D-ResNets-PyTorch
0.环境
ubuntu16.04
python3.6
cuda9.0# pip install
torch==1.1.0
joblib
pandas
h5py
torchvision# apt install
apt-get -y install ffmpeg
1.数据准备
1.1 下载数据
官网:https://www.crcv.ucf.edu/data/UCF101.php,下面有两处是我们需要的。第一处是avi数据,第二处是分训练集与测试集的。
UCF101视频分类数据集:http://www.crcv.ucf.edu/datasets/human-actions/ucf101/UCF101.rar
新建data目录,解压UCF101.rar文件到其中:
apt-get install unrar
unrar x UCF101.rar
下载第二处数据https://www.crcv.ucf.edu/data/UCF101/UCF101TrainTestSplits-DetectionTask.zip。放到自己想放的地方,我是放到data目录下。
1.2 视频生成图片
修改代码(参考此处https://github.com/kenshohara/3D-ResNets-PyTorch/issues/202):
# line 18
p = subprocess.run(ffprobe_cmd, capture_output=True)
# 改为
p = subprocess.run(ffprobe_cmd, stdout=PIPE, stderr=PIPE)
运行命令,视频生成jpg文件:
python -m util_scripts.generate_video_jpgs avi_video_dir_path jpg_video_dir_path ucf101eg:
python -m util_scripts.generate_video_jpgs "/root/avi_video_dir_path" "/root/jpg_video_dir_path" dataset="ucf101"
大概这个过程需要花1个小时以内。
1.3 生成json文件
python -m util_scripts.ucf101_json annotation_dir_path jpg_video_dir_path dst_json_path# eg:python -m util_scripts.ucf101_json "/root/data/ucfTrainTestlist" "/root/data/UCF101_jpg/" "/root/data/UCF101_json"
2.准备预训练模型
https://drive.google.com/drive/folders/1zvl89AgFAApbH0At-gMuZSeQB_LpNP-M
3.文件结构
dataUCF101_videosApplyEyeMakeup...YoYoUCF101_jpgApplyEyeMakeup...YoYoUCF101_jsonucf101_01.jsonUCF101_txtclassInd.txttestlist01.txttestlist02.txttestlist03.txttrainlist01.txttrainlist02.txttrainlist03.txtmodelsresnet-50-kinetics.pthresults
4.finetuning for mutil-gpu
此处遇到“RuntimeError: module must have its parameters and buffers on device cuda:0 (device_ids[0]) but found one of them on device: cuda:1”问题,已经尝试修改两天了,暂缓一下。
下载好了多gpu训练的模型,需要多gpu优化才行,否则会报模型的参数名称不对应的问题。
修改代码:
# model.py
# line 100pretrain = torch.load(pretrain_path, map_location='cpu')if torch.cuda.device_count() > 1:# 如果有多个GPU,将模型并行化,用DataParallel来操作。这个过程会将key值加一个"module. ***"。model = nn.DataParallel(model)model.load_state_dict(pretrain['state_dict'])tmp_model = modelif model_name == 'densenet':tmp_model.classifier = nn.Linear(tmp_model.classifier.in_features,n_finetune_classes)elif model_name != 'densenet' and torch.cuda.device_count() > 1:tmp_model.fc = nn.Linear(tmp_model.module.fc.in_features,n_finetune_classes)else:tmp_model.fc = nn.Linear(tmp_model.fc.in_features,n_finetune_classes)
如果指定gpu从0开始的话,下面的"cuda:0";如果从1开始,设置“cuda:1”。
# main.py
opt.device = torch.device('cpu' if opt.no_cuda else 'cuda')# 指定为
opt.device = torch.device('cpu' if opt.no_cuda else 'cuda:0')
# or
opt.device = torch.device('cpu' if opt.no_cuda else 'cuda:1')
CUDA_VISIBLE_DEVICES='0,1,2,3' python main.py --root_path ./data --video_path ucf101_jpg/ --annotation_path ucf101_json/ucf101_01.json \
--result_path results --dataset ucf101 --n_classes 101 --n_pretrain_classes 400 \
--pretrain_path models/resnet-50-kinetics.pth --ft_begin_module fc \
--model resnet --model_depth 50 --batch_size 128 --n_threads 4 --checkpoint 5
如果出现共享内存不足的话,修改 --n_threads 1,或者更小。如果还有问题的话,参考我的另外一篇博客,将对应代码添加到运行代码的前面。https://blog.csdn.net/qq_35975447/article/details/107287614
5.训练
python main.py --root_path ./data --video_path ucf101_jpg/ --annotation_path ucf101_json/ucf101_01.json \
--result_path results --dataset ucf101 --n_classes 101 --model resnet --model_depth 50 --batch_size 128 \
--n_threads 4 --checkpoint 5
如果出现共享内存不足的话,修改 --n_threads 1,或者更小。如果还有问题的话,参考我的另外一篇博客,将对应代码添加到运行代码的前面。https://blog.csdn.net/qq_35975447/article/details/107287614
终端显示结果:
batch_size=32时,大概需要7GB显存吧。