最近新接触到一个与VOS相关的任务,叫做Referring VOS,该任务基于文本描述对视频中特定目标进行分割,是一个新兴的跨模态CV任务。
数据集
1.静态推断图像分割数据集
虽然RVOS是视频任务,但根据以往的经验和相关文章的方法,可以使用静态推断图像分割数据集进行模型的预训练。可用数据集包括:RefCOCO、RefCOCO+、A2D。
2.视频推断数据集
现有的视频推断数据集都是直接从向已有的VOS数据集中加入文本描述标签得到的。
包括:Refer-DAVIS17和Refer-Youtube-VOS数据集
Refer-Youtube-VOS有3471个视频,每个视频有一个或多个目标,每个目标每帧有两个文本描述。
现有方法
- [1] 中提出了最早的RVOS方法LRE。该方法分为两阶段: 第一阶段基于文本描述进行目标bbox定位,第二阶段将原RGB图像+bbox预测图+光流图连接成5通道输入,然后用分割网络进行分割。
- [2] 中构造并开开源了大规模的Refer-Youtube-VOS数据集,并提出了URVOS方法,该方法以STMN方法为基本框架,将文本描述特征作为额外的注意力引入解码过程辅助封。在Refer-DAVIS17和Refer-Youtube-VOS上都达到了很高的精度。是一个很强的baseline。
- [3] 使用Deplabv3作为图像视觉编码器,用BERT作为文本编码器,通过简单粗暴的相乘得到跨模态特征,然后解码得到分割结果。在不使用Refer-Youtube-VOS训练的前提下在Refer-DAVIS17上精度超过了URVOS
RefVOS方法复现
根据github上的说明尝试跑一跑RefVOS(https://github.com/miriambellver/refvos)。
准备工作:
(1)下载预训练的BERT模型和配置文件,refcoco、refcoco+、refcocog数据集(主要是包含文本信息的.p文件和.json文件,图像文件与原始COCO相同)
(2)
基于已有镜像开一个虚拟环境Env1
virtualenv --system-site-packages Env1
然后进入虚拟环境,安装任务需要的包
cd your_path
source Env1/bin/activate
pip install transformer
pip install tensorflow
执行程序
python train.py --dataset refcoco --model_id model_pretrained_bert --ck_bert /gdata1/linfc/Ref-COCO/pretrained_wights/checkpoints_bert/bert_pretrained_refcoco --refer_data_root=/gdata1/linfc/Ref-COCO
(1)由于集群受暂时写缓存权限,出现报错1
File "/ghome/linfc/my_RVOS/RefVOS/data/dataset_refer_bert.py", line 52, in __init__
self.tokenizer = transformers.BertTokenizer.from_pretrained(args.bert_tokenizer)
File "/ghome/linfc/Env1/lib/python3.6/site-packages/transformers/tokenization_utils_base.py", line 1670, in from_pretrained
user_agent=user_agent,
File "/ghome/linfc/Env1/lib/python3.6/site-packages/transformers/file_utils.py", line 1173, in cached_path
local_files_only=local_files_only,
File "/ghome/linfc/Env1/lib/python3.6/site-packages/transformers/file_utils.py", line 1320, in get_from_cache
os.makedirs(cache_dir, exist_ok=True)
File "/usr/lib/python3.6/os.py", line 210, in makedirs
makedirs(head, mode, exist_ok)
File "/usr/lib/python3.6/os.py", line 210, in makedirs
makedirs(head, mode, exist_ok)
File "/usr/lib/python3.6/os.py", line 220, in makedirs
mkdir(name, mode)
PermissionError: [Errno 13] Permission denied: '/.cache'
解决方法:
在file_utils.py文件第1320行修改默认缓存地址:
cache_dir = r’/gdata1/linfc/Ref-COCO/cache’
(2)报错2
Traceback (most recent call last):
File "train.py", line 467, in <module>
main(args)
File "train.py", line 315, in main
bert_model = model_class.from_pretrained(args.ck_bert)
File "/ghome/linfc/Env1/lib/python3.6/site-packages/transformers/modeling_utils.py", line 988, in from_pretrained
**kwargs,
File "/ghome/linfc/Env1/lib/python3.6/site-packages/transformers/configuration_utils.py", line 401, in from_pretrained
config_dict, kwargs = cls.get_config_dict(pretrained_model_name_or_path, **kwargs)
File "/ghome/linfc/Env1/lib/python3.6/site-packages/transformers/configuration_utils.py", line 478, in get_config_dict
raise EnvironmentError(msg)
OSError: Can't load config for '/gdata1/linfc/Ref-COCO/pretrained_wights/checkpoints_bert/bert_pretrained_refcoco'.
检查代码,发现是缺少config文件。检查数据集,发现在/gdata1/linfc/Ref-COCO/pretrained_wights/checkpoints_bert中对下载的预训练模型bert_pretrained_refcoco.zip没有解压。解压后得到文件夹bert_pretrained_refcoco,内含pytorch_model.bin和config.json两个文件。
(3)报错3
Traceback (most recent call last):
File "train.py", line 467, in <module>
main(args)
File "train.py", line 395, in main
logger_train = Logger(os.path.join(model_dir, 'train'))
File "/ghome/linfc/my_RVOS/RefVOS/logger.py", line 17, in __init__
self.writer = tf.summary.FileWriter(log_dir)
AttributeError: module 'tensorboard.summary._tf.summary' has no attribute 'FileWriter'
临时装的tensorflow版本不对,根据https://blog.csdn.net/u010556156/article/details/103320010的做法,将tf.summary.FileWriter(log_dir)换成tf.summary.create_file_writer(log_dir),解决问题。
(4)报错4
File "/ghome/linfc/my_RVOS/RefVOS/data/dataset_refer_bert.py", line 95, in __getitem__
img = Image.open(os.path.join(self.refer.IMAGE_DIR, this_img['file_name'])).convert("RGB")
File "/usr/local/lib/python3.6/dist-packages/PIL/Image.py", line 2878, in open
fp = builtins.open(filename, "rb")
FileNotFoundError: [Errno 2] No such file or directory: '/gdata1/linfc/Ref-COCO/images/mscoco/images/train2014/COCO_train2014_000000289583.jpg'
(1)由于coco实际路径与默认设置不同,在refer.py中,将第51行的
self.IMAGE_DIR = osp.join(data_root, ‘images/mscoco/images/train2014’)
改为实际路径
self.IMAGE_DIR = r’/gpub/coco/train2017’
(2)由于集群只提供了COCO的2017版数据集,这里将默认文件名中‘COCO_train2014_’去掉。
在dataset_refer_bert.py中,在将95行
this_img[‘file_name’]
改为
this_img[‘file_name’].replace(‘COCO_train2014_’, ‘’)
(5)报错5
RuntimeError: CUDA out of memory. Tried to allocate 170.00 MiB (GPU 0; 10.92 GiB total capacity; 9.86 GiB already allocated; 71.00 MiB free; 407.70 MiB cached)
在11G显存的1080Ti上,即使batchsize设为1也仍然显存不够。查看原github说明:
看来是需要V100显卡才能有足够显存运行,不知道这里的V100是16G显存还是32G显存的版本
目前没有可用的V100显卡。。
So, 从零开始的RVOS: 从开始到放弃?
References:
[1] 2018_ACCV_Video Object Segmentation with Language Referring Expressions
[2] 2020_ECCV_URVOS_Unified Referring Video Object Segmentation Network with a Large-Scale Benchmark
[3] 2020_arxiv_RefVOS: A Closer Look at Referring Expressions for Video Object Segmentation