我的博客

2020-04-22 笔试

目录
  1. 第一题
  2. 第二题

第一题

烤鱼

一人到店里吃烤鱼,厨师每 t 秒做好一条烤鱼,这个人需要 d 秒走到窗口,然后 d 秒回到自己座位,然后每吃一条烤鱼需要 x 秒。他只有在自己的座位上才能吃烤鱼,不能边走边吃。他每次可以拿任意数量的烤鱼。

0 秒时,他在自己座位上,窗口没有任何烤鱼。

输入四个数字 t,d,x,n。求他吃 1 条,2 条 … n 条烤鱼,分别最短需要多少时间。

第二题

输入两个数字,n ,m

把 n 分成相邻的 m 个数字,要求对着 m 个数字中每一个,不得同时出现下面两种情况:

  1. 一个数字的前一个数字比这个数字大
  2. 一个数字的后一个数字比这个数字大

求一共又多少种分法,结果对 1e9 + 7 取模

例如

5 3

可以分为

1 1 3
1 2 2
1 3 1
2 1 2 (非法)
2 2 1
3 1 1

(没跑通)在 multimodal Twitter dataset 上使用 VisualBert

目录
  1. 图片特征提取
    1. 第一次尝试(失败)
    2. 第二次尝试(失败)
    3. 第三次尝试(失败)
    4. 第四次尝试
    5. 第五次尝试
    6. 第六次尝试
    7. 第七次
      1. 安装 caffe2
    8. 第八次
    9. 第九次

因为没有跑通图像特征抽取的代码,所以没有成功复现。

论文:VisualBERT: A Simple and Performant Baseline for Vision and Language

论文地址:https://arxiv.org/abs/1908.03557

仓库地址:https://github.com/uclanlp/visualbert

图片特征提取

第一次尝试(失败)

  1. 安装 Detectron

    本来 Detectron 是提供了一个 docker,但是我没装上,所以安装了 caffee2 的 docker,然后进一步安装 Detectron,具体过程记录在我上一篇文章里。

  2. 下载与训练权重

    仓库 README 的 Extract image features on your own 部分中提到,他使用的权重是 35861858,我推测他用的是:

    模型:

    1
    wget https://dl.fbaipublicfiles.com/detectron/35861858/12_2017_baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml.02_32_51.SgT4y1cO/output/train/coco_2014_train:coco_2014_valminusminival/generalized_rcnn/model_final.pkl

    模型信息:3ae556bf3de044a56eb3ecb66fea5cda model_final.pkl 491 MB

    对应的配置文件:

    1
    configs/12_2017_baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml

    我们先把模型下载到代码的根目录,一会启动 docker 可以和代码一起挂在,而 yaml 文件是 detectron 仓库中的,因为 docker 镜像中已经克隆了那个仓库,所以已经有了。

  3. 特征提取脚本

    目前,只有 NLVR2 的脚本,visualbert/utils/get_image_features/extract_features_nlvr.py

    应该不怎么用修改就可以用。

    用法是:

    1
    2
    3
    #SET = train/dev/test1
    cd visualbert/utils/get_image_features
    CUDA_VISIBLE_DEVICES=0 python extract_features_nlvr.py --cfg XXX.yaml --wts XXX.pkl --min_bboxes 150 --max_bboxes 150 --feat_name gpu_0/fc6 --output_dir X_NLVR --image-ext png X_NLVR_IMAGE/SET --no_id --one_giant_file X_NLVR/features_SET_150.th

简单看这个脚本的结构,main 函数是入口,通过 recurse_find_image 函数获取图片的列表。然后就是对图片依次处理,这个参数 one_giant_file 好像是用于最后把所有结果输出到一个大文件里的,我感觉没有用,所以可以不加。

  1. 运行

    启动刚刚创建的,安装好了 的 Docker 镜像并挂载数据目录,代码模型目录,输出目录。

    1
    2
    mkdir /tmp/sarcasm_image2
    docker run --gpus all -v /home/sxw/jupyter_workspace/Data/sarcasm/dataset_image/:/root/images:ro -v /tmp/sarcasm_image2:/root/features -v /home/sxw/jupyter_workspace/mutil-model/visualbert/visualbert/:/root/code --rm -it my_detectron:v1.0 /bin/bash

    进入镜像后,先进入特征提取代码的路径

    1
    cd /root/code/utils/get_image_features/

安装依赖

1
pip install torch tqdm pycocotools

运行

1
python extract_features_nlvr.py --cfg /root/detectron/configs/12_2017_baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml --wts /root/code/model_final.pkl --min_bboxes 150 --max_bboxes 150 --feat_name gpu_0/fc6 --output_dir /root/features/ --image-ext jpg /root/images/

错误太多,不能运行,所以我又改写了脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import cv2
from caffe2.python import workspace
import caffe2
import os
from tqdm import tqdm
from detectron.core.config import cfg
import detectron.core.test_engine as model_engine
import detectron.utils.c2 as c2_utils
import detectron.core.test as infer_engine
import numpy as np
from detectron.core.config import merge_cfg_from_file


image_path = '/root/images/'
out_path = '/root/features/'
weight_path ='/root/code/model_final.pkl'
config_path = '/root/detectron/configs/12_2017_baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml'


workspace.GlobalInit(['caffe2', '--caffe2_log_level=0'])




def get_detections_from_im(cfg, model, im, image_id, feat_blob_name,
MIN_BOXES, MAX_BOXES, conf_thresh=0.2, bboxes=None):
with c2_utils.NamedCudaScope(0):
scores, cls_boxes, im_scale = infer_engine.im_detect_bbox(model,
im,
cfg.TEST.SCALE,
cfg.TEST.MAX_SIZE,
boxes=bboxes)
box_features = workspace.FetchBlob(feat_blob_name)
cls_prob = workspace.FetchBlob("gpu_0/cls_prob")
rois = workspace.FetchBlob("gpu_0/rois")
max_conf = np.zeros((rois.shape[0]))
# unscale back to raw image space
cls_boxes = rois[:, 1:5] / im_scale

for cls_ind in range(1, cls_prob.shape[1]):
cls_scores = scores[:, cls_ind]
dets = np.hstack((cls_boxes, cls_scores[:, np.newaxis])).astype(np.float32)
keep = np.array(nms(dets, cfg.TEST.NMS))
max_conf[keep] = np.where(cls_scores[keep] > max_conf[keep], cls_scores[keep], max_conf[keep])

keep_boxes = np.where(max_conf >= conf_thresh)[0]
if len(keep_boxes) < MIN_BOXES:
keep_boxes = np.argsort(max_conf)[::-1][:MIN_BOXES]
elif len(keep_boxes) > MAX_BOXES:
keep_boxes = np.argsort(max_conf)[::-1][:MAX_BOXES]
objects = np.argmax(cls_prob[keep_boxes], axis=1)

return box_features[keep_boxes], max_conf[keep_boxes], cls_boxes[keep_boxes]

im_list = os.listdir(image_path)
print(len(im_list))
merge_cfg_from_file(config_path)
cfg.NUM_GPUS = 1
model = model_engine.initialize_model_from_cfg(weight_path)
for i, im_name in enumerate(tqdm(im_list)):
im_base_name = os.path.basename(im_name)
image_id = im_base_name.split(".")[0]
bbox = None
im = cv2.imread(os.path.join(image_path, im_name))
outfile = os.path.join(out_path, image_id+".npz")
box_features, max_conf, cls_boxes = get_detections_from_im(
cfg, model, im, image_id, 'gpu_0/fc6', 150, 150
)
np.savez(outfile, box_features=box_features, max_conf=max_conf, cls_boxes=cls_boxes)

改写后的脚本仍无法运行,model = model_engine.initialize_model_from_cfg(weight_path) 报错:

24635
WARNING:root:[====DEPRECATE WARNING====]: you are creating an object from CNNModelHelper class which will be deprecated soon. Please use ModelHelper object with brew module. For more information, please refer to caffe2.ai and python/brew.py, python/brew_test.py for more information.
Traceback (most recent call last):
File “get_f.py”, line 67, in
model = model_engine.initialize_model_from_cfg(weight_path)
File “/root/detectron/detectron/core/test_engine.py”, line 327, in initialize_model_from_cfg
model = model_builder.create(cfg.MODEL.TYPE, train=False, gpu_id=gpu_id)
File “/root/detectron/detectron/modeling/model_builder.py”, line 124, in create
return get_func(model_type_func)(model)
File “/root/detectron/detectron/modeling/model_builder.py”, line 89, in generalized_rcnn
freeze_conv_body=cfg.TRAIN.FREEZE_CONV_BODY
File “/root/detectron/detectron/modeling/model_builder.py”, line 229, in build_generic_detection_model
optim.build_data_parallel_model(model, _single_gpu_build_func)
File “/root/detectron/detectron/modeling/optimizer.py”, line 54, in build_data_parallel_model
single_gpu_build_func(model)
File “/root/detectron/detectron/modeling/model_builder.py”, line 169, in _single_gpu_build_func
blob_conv, dim_conv, spatial_scale_conv = add_conv_body_func(model)
File “/root/detectron/detectron/modeling/FPN.py”, line 63, in add_fpn_ResNet101_conv5_body
model, ResNet.add_ResNet101_conv5_body, fpn_level_info_ResNet101_conv5
File “/root/detectron/detectron/modeling/FPN.py”, line 104, in add_fpn_onto_conv_body
conv_body_func(model)
File “/root/detectron/detectron/modeling/ResNet.py”, line 48, in add_ResNet101_conv5_body
return add_ResNet_convX_body(model, (3, 4, 23, 3))
File “/root/detectron/detectron/modeling/ResNet.py”, line 99, in add_ResNet_convX_body
p, dim_in = globals()cfg.RESNETS.STEM_FUNC
File “/root/detectron/detectron/modeling/ResNet.py”, line 253, in basic_bn_stem
p = model.AffineChannel(p, ‘res_conv1_bn’, dim=dim, inplace=True)
File “/root/detectron/detectron/modeling/detector.py”, line 103, in AffineChannel
return self.net.AffineChannel([blob_in, scale, bias], blob_in)
File “/usr/local/caffe2/python/core.py”, line 1958, in getattr
“,”.join(workspace.C.nearby_opnames(op_type)) + ‘]’
AttributeError: Method AffineChannel is not a registered operator. Did you mean: []

第二次尝试(失败)

根据 https://github.com/facebookresearch/Detectron/issues/756 提示,成功通过 Detectron 的 Dockerfile 构建了

1
docker run --gpus all -v /home/sxw/jupyter_workspace/Data/sarcasm/dataset_image/:/root/images:ro -v /tmp/sarcasm_image2:/root/features -v /home/sxw/jupyter_workspace/mutil-model/visualbert/visualbert/:/root/code --rm -it detectron:c2-cuda9-cudnn7 /bin/bash
1
2
3
4
5
6
pip install torch tqdm pycocotools
cd /root/
# git clone https://github.com/facebookresearch/Detectron.git
cd /root/code/utils/get_image_features/

python get_f.py --cfg /Detectron/configs/12_2017_baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml --wts /root/code/model_final.pkl --min_bboxes 150 --max_bboxes 150 --feat_name gpu_0/fc6 --output_dir /root/features/ --image-ext jpg /root/images/

还是不行和第一次最后的错误一样

第三次尝试(失败)

使用更早版本的 Detectron 构建 docker 镜像,仍然不行,而且出现了新的问题

第四次尝试

这次的方案是使用 caffe2 镜像,手动安装 Detectron

1
docker run --gpus all -v /home/sxw/jupyter_workspace/Data/sarcasm/dataset_image/:/root/images:ro -v /tmp/sarcasm_image2:/root/features -v /home/sxw/jupyter_workspace/mutil-model/visualbert/visualbert/:/root/code --rm -it caffe2/caffe2:snapshot-py2-cuda9.0-cudnn7-ubuntu16.04 /bin/bash

执行测试后发现原来测试都通不过。。。(测试命令为:python -m caffe2.python.operator_test.relu_op_test

第五次尝试

1
docker run --gpus all -v /home/sxw/jupyter_workspace/Data/sarcasm/dataset_image/:/root/images:ro -v /tmp/sarcasm_image2:/root/features -v /home/sxw/jupyter_workspace/mutil-model/visualbert/visualbert/:/root/code --rm -it zhang19941219/caffe2_py2_cuda90_cudnn7 /bin/bash

无法通过 caffe2 的测试

第六次尝试

1
docker run --gpus all -v /home/sxw/jupyter_workspace/Data/sarcasm/dataset_image/:/root/images:ro -v /tmp/sarcasm_image2:/root/features -v /home/sxw/jupyter_workspace/mutil-model/visualbert/visualbert/:/root/code --rm -it caffe2ai/caffe2:c2v0.8.1.cuda8.cudnn7.ubuntu16.04 /bin/bash

这次执行测试没有报错,但是似乎因为内存不够还是没有跑出来。

然后按照安装文档安装

  1. 安装 cocoapi

    git clone https://github.com/cocodataset/cocoapi.git

    依赖 pip install cython

    然后遇到莫名其妙的 matplotlib 安装失败的问题。pip 手动装了依然不行。

具体错误是 easy install 的

1
2
3
  code = compile(script, filename, 'exec')
File "/tmp/easy_install-21D8yi/matplotlib-3.2.1/setup.py", line 139
raise IOError(f"Failed to download jquery-ui. Please download "

解决:查看 makefile 实际上里面写的很简单,就是执行 setup.py,于是把依赖里的 matplotlib 注释掉,就好了。

  1. 安装 detectron
1
2
3
git clone https://github.com/facebookresearch/detectron
cd detectron/
pip install -r requirements.txt

测试是否成功

python detectron/tests/test_spatial_narrow_as_op.py

结果报错:

1
2
3
4
5
6
7
8
Traceback (most recent call last):
File "detectron/tests/test_spatial_narrow_as_op.py", line 88, in <module>
c2_utils.import_detectron_ops()
File "/root/detectron/detectron/utils/c2.py", line 43, in import_detectron_ops
detectron_ops_lib = envu.get_detectron_ops_lib()
File "/root/detectron/detectron/utils/env.py", line 75, in get_detectron_ops_lib
raise Exception('Detectron ops lib not found')
Exception: Detectron ops lib not found

查了一下似乎和 pytorch 有关,于是安装 pytorch:pip install torch,果然解决(我装的是 1.4.0)

但是测试似乎是卡住了,不报错也无法执行完毕,占用 26.5 GB 内存(我一共 32 GB) 和 不到 300 MB 显存。

安装依赖 pip install tqdm pycocotools

执行

1
2
3
cd /root/code/utils/get_image_features

python get_f.py --cfg /root/detectron/configs/12_2017_baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml --wts /root/code/model_final.pkl --min_bboxes 150 --max_bboxes 150 --feat_name gpu_0/fc6 --output_dir /root/features/ --image-ext jpg /root/images/

仍然是错误:AttributeError: Method AffineChannel is not a registered operator. Did you mean: []

查了一下感觉可能是 detectron 没有 make ops 的问题,但是这个操作提示找不到 caffe2 的 CMakeFile 配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
root@d785e85b8cfa:~/detectron# make ops
mkdir -p build && cd build && cmake .. && make -j24
CMake Error at CMakeLists.txt:8 (find_package):
By not providing "FindCaffe2.cmake" in CMAKE_MODULE_PATH this project has
asked CMake to find a package configuration file provided by "Caffe2", but
CMake did not find one.

Could not find a package configuration file provided by "Caffe2" with any
of the following names:

Caffe2Config.cmake
caffe2-config.cmake

Add the installation prefix of "Caffe2" to CMAKE_PREFIX_PATH or set
"Caffe2_DIR" to a directory containing one of the above files. If "Caffe2"
provides a separate development package or SDK, be sure it has been
installed.


-- Configuring incomplete, errors occurred!
See also "/root/detectron/build/CMakeFiles/CMakeOutput.log".
Makefile:13: recipe for target 'ops' failed
make: *** [ops] Error 1

参考官方的 DockerFile 是把这个 设置为

但我去看也没有找到这两个文件

1
2
3
root@d785e85b8cfa:~/detectron# ls /usr/local/caffe2/
CMakeFiles __init__.pyc contrib cuda_rtc distributed image mpi perfkernels python sgd utils
__init__.py binaries core db experiments mkl operators proto queue transforms video

可能是因为我用的镜像和官方镜像还是不同的。

再看 detectron 仓库,提示如果不行可能是没有在caffe2 执行 make install(https://github.com/facebookresearch/Detectron/blob/master/INSTALL.md#cmake-cannot-find-caffe2)

我去这个镜像的 /caffe2 尝试 make 但是第一发现没有 make install 只有 all,第二报错:

1
2
3
4
5
[  9%] Building NVCC (Device) object third_party/gloo/gloo/CMakeFiles/gloo_cuda.dir/nccl/gloo_cuda_generated_nccl.cu.o
nvcc fatal : Unsupported gpu architecture 'compute_75'
CMake Error at gloo_cuda_generated_nccl.cu.o.cmake:203 (message):
Error generating
/caffe2/build/third_party/gloo/gloo/CMakeFiles/gloo_cuda.dir/nccl/./gloo_cuda_generated_nccl.cu.o

参考:https://blog.csdn.net/xunan003/article/details/90696412

文章中说因为 2080 是 7.5,得用 cuda 10,所以我编译不过

第七次

使用 cuda10.1 + cudnn 7 镜像

1
docker run --gpus all --rm -it nvidia/cuda:10.1-cudnn7-runtime-ubuntu16.04 /bin/bash

安装 caffe2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
apt-get update
apt-get install -y --no-install-recommends \
build-essential \
git \
libgoogle-glog-dev \
libgtest-dev \
libiomp-dev \
libleveldb-dev \
liblmdb-dev \
libopencv-dev \
libopenmpi-dev \
libsnappy-dev \
libprotobuf-dev \
openmpi-bin \
openmpi-doc \
protobuf-compiler \
python-dev \
python-pip
pip install setuptools==40.7
pip install \
future \
numpy==1.16\
protobuf \
typing \
hypothesis==4
apt-get install -y --no-install-recommends \
libgflags-dev \
cmake
1
2
3
4
git clone https://github.com/facebookarchive/caffe2.git
cd caffe2
git checkout v0.8.1
git submodule update --init --recursive

这步报错:这个 https://github.com/RLovelett/eigen/ 仓库已经没了,我尝试找了 https://github.com/libigl/eigen 来代替,但是我也不确定可不可以。

https://github.com/NervanaSystems/nervanagpu 也没了,用 https://github.com/VisionSystemsInc/nervanagpu

1
2
3
cd third_party/
git clone https://github.com/libigl/eigen
git clone https://github.com/VisionSystemsInc/nervanagpu

安装 cocoapi

1
2
3
4
5
6
git clone https://github.com/cocodataset/cocoapi.git
cd cocoapi/PythonAPI
pip install cython
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib
#pip install tqdm pycocotools
make install

安装 detectron

1
2
git clone https://github.com/facebookresearch/detectron
cd detectron

在 build ops 的时候出错

CMake Error at CMakeLists.txt:8 (find_package):
By not providing “FindCaffe2.cmake” in CMAKE_MODULE_PATH this project has
asked CMake to find a package configuration file provided by “Caffe2”, but
CMake did not find one.

Could not find a package configuration file provided by “Caffe2” with any
of the following names:

Caffe2Config.cmake
caffe2-config.cmake

Add the installation prefix of “Caffe2” to CMAKE_PREFIX_PATH or set
“Caffe2_DIR” to a directory containing one of the above files. If “Caffe2”
provides a separate development package or SDK, be sure it has been
installed.

第八次

1
docker run --gpus all -v /home/sxw/jupyter_workspace/Data/sarcasm/dataset_image/:/root/images:ro -v /tmp/sarcasm_image2:/root/features -v /home/sxw/jupyter_workspace/mutil-model/visualbert/visualbert/:/root/code --rm -it housebw/detectron /bin/bash

进入容器后安装依赖

1
pip install tqdm

还是最早的错误:

root@c9cef23fd48e:~/code/utils/get_image_features# python get_f.py
24635
WARNING:root:[====DEPRECATE WARNING====]: you are creating an object from CNNModelHelper class which will be deprecated soon. Please use ModelHelper object with brew module. For more information, please refer to caffe2.ai and python/brew.py, python/brew_test.py for more information.
Traceback (most recent call last):
File “get_f.py”, line 67, in
model = model_engine.initialize_model_from_cfg(weight_path)
File “/detectron/detectron/core/test_engine.py”, line 328, in initialize_model_from_cfg
model = model_builder.create(cfg.MODEL.TYPE, train=False, gpu_id=gpu_id)
File “/detectron/detectron/modeling/model_builder.py”, line 124, in create
return get_func(model_type_func)(model)
File “/detectron/detectron/modeling/model_builder.py”, line 89, in generalized_rcnn
freeze_conv_body=cfg.TRAIN.FREEZE_CONV_BODY
File “/detectron/detectron/modeling/model_builder.py”, line 229, in build_generic_detection_model
optim.build_data_parallel_model(model, _single_gpu_build_func)
File “/detectron/detectron/modeling/optimizer.py”, line 54, in build_data_parallel_model
single_gpu_build_func(model)
File “/detectron/detectron/modeling/model_builder.py”, line 169, in _single_gpu_build_func
blob_conv, dim_conv, spatial_scale_conv = add_conv_body_func(model)
File “/detectron/detectron/modeling/FPN.py”, line 63, in add_fpn_ResNet101_conv5_body
model, ResNet.add_ResNet101_conv5_body, fpn_level_info_ResNet101_conv5
File “/detectron/detectron/modeling/FPN.py”, line 104, in add_fpn_onto_conv_body
conv_body_func(model)
File “/detectron/detectron/modeling/ResNet.py”, line 48, in add_ResNet101_conv5_body
return add_ResNet_convX_body(model, (3, 4, 23, 3))
File “/detectron/detectron/modeling/ResNet.py”, line 99, in add_ResNet_convX_body
p, dim_in = globals()cfg.RESNETS.STEM_FUNC
File “/detectron/detectron/modeling/ResNet.py”, line 253, in basic_bn_stem
p = model.AffineChannel(p, ‘res_conv1_bn’, dim=dim, inplace=True)
File “/detectron/detectron/modeling/detector.py”, line 103, in AffineChannel
return self.net.AffineChannel([blob_in, scale, bias], blob_in)
File “/usr/local/caffe2_build/caffe2/python/core.py”, line 2040, in getattr
“,”.join(workspace.C.nearby_opnames(op_type)) + ‘]’
AttributeError: Method AffineChannel is not a registered operator. Did you mean: []

而且这个 caffe2 测试也不能通过,错误:

gc=device_type: 1, dc=[, device_type: 1], engine=u’CUDNN’) produces unreliable results: Falsified on the first call but did not on a subsequent one


Ran 1 test in 11.002s

FAILED (errors=1)

第九次

1
docker run --gpus all -v /home/sxw/jupyter_workspace/Data/sarcasm/dataset_image/:/root/images:ro -v /tmp/sarcasm_image2:/root/features -v /home/sxw/jupyter_workspace/mutil-model/visualbert/visualbert/:/root/code --rm -it kracwarlock/detectron:1.1-cu100 /bin/bash
1
docker run --gpus all -v /home/sxw/jupyter_workspace/Data/sarcasm/dataset_image/:/root/images:ro -v /tmp/sarcasm_image2:/root/features -v /home/sxw/jupyter_workspace/mutil-model/visualbert/visualbert/:/root/code --rm -it yidliu/detectron:maskrcnn /bin/bash
1
docker run --gpus all -v /home/sxw/jupyter_workspace/Data/sarcasm/dataset_image/:/root/images:ro -v /tmp/sarcasm_image2:/root/features -v /home/sxw/jupyter_workspace/mutil-model/visualbert/visualbert/:/root/code --rm -it wxmao/detectron:v01 /bin/bash

以上几个 caffe2 测试都不能通过。

1
python -m caffe2.python.operator_test.relu_op_test
1
docker run --gpus all -v /home/sxw/jupyter_workspace/Data/sarcasm/dataset_image/:/root/images:ro -v /tmp/sarcasm_image2:/root/features -v /home/sxw/jupyter_workspace/mutil-model/visualbert/visualbert/:/root/code --rm -it caffe2/caffe2:snapshot-py2-cuda9.0-cudnn7-ubuntu16.04 /bin/bash

安装 facebookresearch 的 Detectron

目录
  1. 在 Caffe2 的 docker 容器中安装 Detectron
    1. 安装 Caffe2
    2. 在容器内安装 Detectron
  2. 通过 Dockerfile 安装 Detectron

Detectron 是 Facebook AI 研究院(FAIR)于 2018 年初公开的目标检测平台,使用 caffe2 深度学习框架。2019 年他们又推出了 Detectron2,这个是基于 PyTorch 的,是 Facebook 的下一代目标检测算法。

我最近需要复现一篇论文,所以需要安装和使用已经不再维护的 Detectron。

Github:https://github.com/facebookresearch/Detectron

安装文档:https://github.com/facebookresearch/Detectron/blob/master/INSTALL.md

有两种方法,第一是先 docker pull caffe2 的容器,然后在这个容器中安装 Detectron。方法二是使用 Detectron 仓库中提供的 Dockerfile 自动构建 Detectron 容器,开始时我第二个方法失败了,所以才使用方法一,但是方法一安装后,在复现论文过程中遇到问题,所以又尝试了第二种方法。

在 Caffe2 的 docker 容器中安装 Detectron

安装 Caffe2

文档:https://caffe2.ai/docs/getting-started.html

由于二进制安装包没有我使用的 CUDA 版本,所以选择了使用 docker 镜像

1
docker pull caffe2ai/caffe2

启动容器

1
docker run --gpus all -it caffe2ai/caffe2:latest /bin/bash

在容器内安装 Detectron

进入 root 目录

1
cd /root/

克隆仓库

1
2
git clone https://github.com/facebookresearch/detectron
cd detectron

安装依赖

1
root@72069f1e92cc:~/detectron# pip install -r requirements.txt

​ 这里用的是 python2

安装

1
make

测试

1
root@72069f1e92cc:~/detectron# python detectron/tests/test_spatial_narrow_as_op.py

结果报错:

Traceback (most recent call last):
File “detectron/tests/test_spatial_narrow_as_op.py”, line 88, in
c2_utils.import_detectron_ops()
File “/root/detectron/detectron/utils/c2.py”, line 43, in import_detectron_ops
detectron_ops_lib = envu.get_detectron_ops_lib()
File “/root/detectron/detectron/utils/env.py”, line 75, in get_detectron_ops_lib
raise Exception(‘Detectron ops lib not found’)
Exception: Detectron ops lib not found

我也没太弄清楚问题是啥

但是至此 python 中已经可以正常导入 caffe2 了

创建镜像

1
docker commit 72069f1e92cc my_detectron:v1.0

通过 Dockerfile 安装 Detectron

目前最新的 dockerfile 无法构建成功,原 Dockerfile 如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# Use Caffe2 image as parent image
FROM caffe2/caffe2:snapshot-py2-cuda9.0-cudnn7-ubuntu16.04

RUN mv /usr/local/caffe2 /usr/local/caffe2_build
ENV Caffe2_DIR /usr/local/caffe2_build

ENV PYTHONPATH /usr/local/caffe2_build:${PYTHONPATH}
ENV LD_LIBRARY_PATH /usr/local/caffe2_build/lib:${LD_LIBRARY_PATH}

# Clone the Detectron repository
RUN git clone https://github.com/facebookresearch/detectron /detectron

# Install Python dependencies
RUN pip install -r /detectron/requirements.txt

# Install the COCO API
RUN git clone https://github.com/cocodataset/cocoapi.git /cocoapi
WORKDIR /cocoapi/PythonAPI
RUN make install

# Go to Detectron root
WORKDIR /detectron

# Set up Python modules
RUN make

# [Optional] Build custom ops
RUN make ops

看到 issue756 中提示,在 RUN git clone https://github.com/facebookresearch/detectron /detectron 下面加一句 RUN cd /detectron && git checkout d56e267,构建过程使用 d56e267 而不是最新代码可以构建成功。

构建命令 docker build -t detectron:c2-cuda9-cudnn7 .

2020-04-20 笔试

目录
  1. 选择
  2. 编程
    1. 第一题
    2. 第二题

某所的 python 开发的笔试题,编程题很简单,选择题还有几个不错的。

选择

只记录几道看代码写输出的题目:

1
2
3
a ={} 
a.fromkeys(['a', 'b', 'c', 'd'], 100)
print (a)

{}

1
2
print(0.5 + 0.5 == 1)
print(0.1 + 0.2 == 0.3)

True
False

实际上 0.1 + 0.2 的结果是:0.30000000000000004,浮点数比较可以通过两数相减,取绝对值,如果小于一个很小的数(如 1e-6)就认为相等。

编程

第一题

题目描述
疫情正在某大洋岛国蔓延,且有失控之势。为了保证该国人民的安全,该国元首决定发挥该国岛屿众多的优势,将健康的人群送到该国的各个岛屿上去,这样就可以有效对人群进行隔离。

作为一名政府公务员,现在你被授命统计本国的岛屿数量。陆地和海洋已经在地图上按照网格的方式给标注出来了,例如:

11110
11010
11001
00000

其中,1表示陆地,0表示海洋,而所谓岛屿,是由若干块连续的陆地连接成的区域。当然,作为处于大洋中的岛国,在网格之外的四个边缘都是海洋区域。因此,上面这块地图中,有2个岛屿,第一个岛屿一共占9块网格,第二个岛屿占1块网格。下面是另一个区域的网格图:

11000
10000
00100
00010

可以看到,这个地图上,有三个岛屿,分别占3块、1块、1块网格。

为了提高效率,现在你准备用一个程序来统计任一区域中的岛屿数量,请写出程序。

输入描述:
输入一个二维数组,只有0和1,分别表示该区域的海洋和陆地。

输出描述:
输出一个数字,表示该数组表示的区域的岛屿数量。

示例 (输入输出示例仅供调试,后台判题数据一般不包含示例)
示例1
输入

1,1,1,1,0
1,1,0,1,0
1,1,0,0,1
1,0,0,0,0

输出

2

示例2

输入
1,0,0,1,0
1,1,0,1,0
0,0,1,0,1
0,0,0,0,1
0,1,1,1,1

输出

4

题目提示
1.本系统是构建在Ubuntu 14.04 64位操作系统之上,所有文件名大小写敏感,在c/c++引用头文件时尤其需要注意;

  1. 请不要自行输出提示信息,例如:printf(“Please input two numbers: “)、raw_input(‘Please input two numbers: ‘)等等,这将会导致您的答案不正确,因为任何的输出到屏幕都会作为您答案的一部分;

3.系统对于每一道编程试题均提供实时评测结果,您可在考试允许时间内多次提交您的代码以获得您所希望得到的结果,系统将以您的最后一次提交结果为准,但提交次数也将作为考试成绩的一部分。

4.请严格依照题目描述的格式输入输出数据,尤其参照试题所提供的样例,当然试题的样例输入/输出并不代表评测试题的全部数据。

5.关于自测,您可在页面左下角的输入框内填写输入数据,再点击保存并调试,即可看到程序输出的结果。

6.Python使用的是2.7&3两个版本,缩进可以使用tab、4个空格或2个空格,但是只能任选其中一种,不能多种混用;如果使用sys.stdin.readline,因为默认会带换行符,所以要strip(‘\n’)进行截取;建议使用raw_input()。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import sys
mp = []
for l in sys.stdin:
l = l.strip()
if not l:
break
mp.append(list(map(int, l.strip().split(','))))
n = len(mp)
m = len(mp[0])
f = [[False] * m for _ in range(n)]
def vis(i, j):
f[i][j] = True
for x, y in [(0,1), (1,0), (0,-1), (-1,0)]:
if 0 <= i + x < n and 0 <= j + y < m and f[i+x][j+y] == False and mp[i+x][j+y] == 1:
vis(i+x, j+y)
c = 0
for i in range(n):
for j in range(m):

if f[i][j] == False and mp[i][j] == 1:
vis(i, j)
c += 1
print(c)

第二题

题目描述
你在读的经营课程上,老师布置了一道作业。在一家公司的日常运营中,是会对一些商品的价格走势根据一些经验和数据进行预估,并据此进行决策。例如,假设某商品每天的价格都有可能变动,我们要做的就是低买高卖获得最高利润。比如假设我们预估该商品接下来七天内的价格走势如下:

4,1,2,3,6,4,8

那我们采取的最佳策略是在价格1块钱的时候买入,在价格8块钱的时候卖出。为了简化整个过程,我们限定在此周期内只能有一次买入一次卖出,且商品在没有购入前是无法卖出的,即该商品不是期货而是现货。

现要求你用程序来实现自动决策。输入一定天数的商品预估价格,自动计算出最优利润值。例如,上面的例子中,最优利润值为8-1=7。

输入描述:
输入一个数组,分别表示各天的预估价格

输出描述:
根据输入的预估价格,算出并输出最优的利润值。

示例 (输入输出示例仅供调试,后台判题数据一般不包含示例)
示例1
输入

4,1,2,3,6,4,8

输出

7

示例2
输入

5,3,8,2,5,8,4

输出

6

示例3
输入

10,8,7,5,4,2

输出

0

题目提示

  1. 本系统是构建在Ubuntu 14.04 64位操作系统之上,所有文件名大小写敏感,在c/c++引用头文件时尤其需要注意;

  2. 请不要自行输出提示信息,例如:printf(“Please input two numbers: “)、raw_input(‘Please input two numbers: ‘)等等,这将会导致您的答案不正确,因为任何的输出到屏幕都会作为您答案的一部分;

  3. 系统对于每一道编程试题均提供实时评测结果,您可在考试允许时间内多次提交您的代码以获得您所希望得到的结果,系统将以您的最后一次提交结果为准,但提交次数也将作为考试成绩的一部分。

  4. 请严格依照题目描述的格式输入输出数据,尤其参照试题所提供的样例,当然试题的样例输入/输出并不代表评测试题的全部数据。

  5. 关于自测,您可在页面左下角的输入框内填写输入数据,再点击保存并调试,即可看到程序输出的结果。

  6. Python使用的是2.7&3两个版本,缩进可以使用tab、4个空格或2个空格,但是只能任选其中一种,不能多种混用;如果使用sys.stdin.readline,因为默认会带换行符,所以要strip(‘\n’)进行截取;建议使用raw_input()。

1
2
3
4
5
6
7
8
9
10
p = list(map(int, input().split(',')))
mp = []
m = p[0]
for x in p:
m = min(m, x)
mp.append(m)
a = 0
for m, x in zip(mp, p):
a = max(x-m, a)
print(a)

python 同时向屏幕(stdout)和文件输出的方法

目录

以前知道有 tee 命令可以在实现,但是用的很少。

而且我的需求是,最近在 Jupyter Notebook 中执行脚本,需要关掉文件以后仍能看到期间的输出。

我自己的实现是写一个 log 函数代替 print,今天读到一个别人的方法。(代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import os
import sys

run_log_counter = 0

while(os.path.exists(args.folder + '/run_{}.log'.format(run_log_counter))):
run_log_counter += 1

file_log = open(args.folder + '/run_{}.log'.format(run_log_counter),'w') # File where you need to keep the logs
file_log.write("")
class Unbuffered:
def __init__(self, stream):
self.stream = stream
def write(self, data):
self.stream.write(data)
self.stream.flush()
file_log.write(data) # Write the data of stdout here to a text file as well
def flush(self):
pass

sys.stdout = Unbuffered(sys.stdout)

这样 print 的结果都会被写入到文件里了。

文本+视觉模型复现

目录
  1. LXMERT
  2. vilbert-multi-task

LXMERT

论文:LXMERT: Learning Cross-Modality Encoder Representations from Transformers

https://arxiv.org/abs/1908.07490

先预处理提取图片特征:通过物件识别得到 ROI(region of interest),和图片特征

https://codeplot.top/2020/04/11/%E5%9C%A8-multimodal-Twitter-dataset-%E4%B8%8A%E4%BD%BF%E7%94%A8-LXMERT/

vilbert-multi-task

论文:ViLBERT: Pretraining Task-Agnostic Visiolinguistic Representations for Vision-and-Language Tasks

https://arxiv.org/abs/1908.02265

https://codeplot.top/2020/04/05/%E5%9C%A8-multimodal-Twitter-dataset-%E4%B8%8A%E4%BD%BF%E7%94%A8-vilbert-multi-task/

4 月 12 日笔试

目录
  1. 第一题
  2. 第二题
  3. 第三题
  4. 第四题

一共四道题,2 小时,快手笔试

第一题

输入一个字符串,返回一个字符串,返回的字符串中把原字符串连续的超过两个相同字母删掉,如果一次删除后还有连续超过两个相同字母则继续删除。

例如:输入 'abbcccba' 输出 'aa'

字符串长度 10 ^ 5

我只想到模拟方法,虽然过了,但是实际上极端数据是过不了的例如:

1
2
3
4
5
6
7
8
9
l = []
x = 10 ** 5 // 3
for i in range(x):
l.append('a')
l.append('b')
for i in range(x):
l.append('bb')
l.append('aa')
s = ''.join(l)

我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
s = list(input())
while True:
skip = []
i = 2
while i < len(s):
if s[i-1] == s[i-2] == s[i]:
j = i
while j < len(s) and s[j] == s[i]:
j += 1
skip.append((i-2, j))
i = j + 2
else:
i += 1
if not skip:
break
ss = []
i = 0
for x, y in skip:
ss += s[i:x]
i = y
ss += s[i:]
s = ss
print(''.join(s))

第二题

用火柴棒摆数字,要求只能且必须移动一根火柴棒,问能得到的最大的数是多少。输入一个正数,输出一个整数。所有移动都无效时输出 -1

样例:109 输出 705

我先写了表示火柴棒数字的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def pn(n):
assert len(n) == 7
if n[0]:
print(' _ ')
else:
print(' ')
l = '| ' if n[1] else ' '
l += '| ' if n[2] else ' '
print(l)
print(' _ ' if n[3] else ' ')
l = '| ' if n[4] else ' '
l += '| ' if n[5] else ' '
print(l)
print(' - ' if n[6] else ' ')

num = [[1,1,1,0,1,1,1], [0,0,1,0,0,1,0], [1, 0, 1, 1, 1, 0, 1],[1, 0, 1, 1, 0, 1, 1],[0, 1, 1, 1, 0, 1, 0],[1, 1, 0, 1, 0, 1, 1],[1, 1, 0, 1, 1, 1, 1],[1, 0, 1, 0, 0,1, 0],[1,1,1,1,1,1,1],[1,1,1,1,0,1,1]]
for i in range(10):
print('----', i, '----')
pn(num[i])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
---- 0 ----
_
| |

| |
-
---- 1 ----

|

|

---- 2 ----
_
|
_
|
-
---- 3 ----
_
|
_
|
-
---- 4 ----

| |
_
|

---- 5 ----
_
|
_
|
-
---- 6 ----
_
|
_
| |
-
---- 7 ----
_
|

|

---- 8 ----
_
| |
_
| |
-
---- 9 ----
_
| |
_
|
-

然后写了搜索数字间转换关系的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
selfx = [[] for _ in range(10)]
def change(i):
cn = num[i]
for j in range(7):
if cn[j] == 1:
for k in range(7):
if k == j:
continue
if cn[k] == 0:
cx = num[i][::]
cx[j] = 0
cx[k] = 1
if cx in num:
nn = num.index(cx)
# print(nn)
# if nn > i:
selfx[i].append(nn)
for i in range(10):
change(i)
selfx # [[6, 9], [], [3], [5, 2], [], [3], [0, 9], [], [], [6, 0]]

remove = [[] for _ in range(10)]
def change(i):
cn = num[i]
for j in range(7):
if cn[j] == 1:
cx = num[i][::]
cx[j] = 0
if cx in num:
nn = num.index(cx)
remove[i].append(nn)
for i in range(10):
change(i)
remove # [[], [], [], [], [], [], [5], [1], [6, 0, 9], [3, 5]]
add = [[] for _ in range(10)]
def change(i):
cn = num[i]
for j in range(7):
if cn[j] == 0:
cx = num[i][::]
cx[j] = 1
if cx in num:
nn = num.index(cx)
add[i].append(nn)
for i in range(10):
change(i)
add # [[8], [7], [], [9], [], [9, 6], [8], [], [], [8]]

selfx:当前数字自身移动可以变成哪些数字

add:当前数字加上一根变成哪些数字

remove:当前数字去掉一根可以变成哪些数字

这题过了 97 %,最后是 WA。估计是第二种情况的问题,原来只考虑了数字变大的情况,实际上是不对的,因为题意要求(开始没读好题意)无论变大变小,必须移动,只有所有移动都无效时才输出 -1。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
add = [[8], [7], [], [9], [], [9, 6], [8], [], [], [8]]
remove = [[], [], [], [], [], [], [5], [1], [6, 0, 9], [3, 5]]
selfx = [[6, 9], [], [3], [5], [], [], [9], [], [], []]
selfx2 = [[6, 9], [], [3], [5, 2], [], [3], [0, 9], [], [], [6, 0]]
n = list(map(int, list(input())))
# n = [1, 0, 9]
# print(n)

def find_inc(i,e, x, ii=99999, s=1):
for j in range(i, e, s):
if j == ii: continue
if x[n[j]] and max(x[n[j]]) > n[j]:
return j, max(x[n[j]])
def find_dec(i, e, x, ii=99999, s=-1):
# print(i, e)
for j in range(i, e, s):
if j == ii: continue
if x[n[j]]:
return j, max(x[n[j]])

for i in range(len(n)):
# print('iiii', i)
op = []
if add[n[i]] and max(add[n[i]]) > n[i]:
op.append([max(add[n[i]]), 'a'])
if remove[n[i]] and max(remove[n[i]]) > n[i]:
op.append([max(remove[n[i]]), 'r'])
if selfx[n[i]] and max(selfx[n[i]]) > n[i]:
op.append([max(selfx[n[i]]), 's'])
op.sort(reverse=True)
# print(n[i], op)
f = False
for o in op:
if o[1] == 's':
n[i] = o[0]
f = True
break
elif o[1] == 'a':
xx = find_inc(i+1, len(n), remove)
if not xx:
xx = find_dec(len(n)-1, i, remove)
if xx:
n[i] = o[0]
n[xx[0]] = xx[1]
f = True
break
else:
xx = find_inc(i+1, len(n), add)
if not xx:
xx = find_dec(len(n)-1, i, add)
if xx:
n[i] = o[0]
n[xx[0]] = xx[1]
f = True
break
if f:
break
if f:
break
if f:
break
if f:
print(''.join(map(str,n)))
else:
for i in range(len(n)-1, -1, -1):
# print('iiii', i)
op = []
if add[n[i]] and max(add[n[i]]) < n[i]:
op.append([max(add[n[i]]), 'a'])
if remove[n[i]] and max(remove[n[i]]) < n[i]:
op.append([max(remove[n[i]]), 'r'])
if selfx2[n[i]] and max(selfx2[n[i]]) < n[i]:
op.append([max(selfx2[n[i]]), 's'])
op.sort(reverse=True)
# print(n[i], op)
f = False
for o in op:
if o[1] == 's':
n[i] = o[0]
f = True
break
elif o[1] == 'a':
xx = find_inc(0, len(n), remove, i)
if not xx:
xx = find_dec(len(n)-1, -1, remove, i)
if xx:
n[i] = o[0]
n[xx[0]] = xx[1]
f = True
break
else:
xx = find_inc(0, len(n), add, i)
if not xx:
xx = find_dec(len(n)-1, -1, add, i)
if xx:
n[i] = o[0]
n[xx[0]] = xx[1]
f = True
break
if f:
break
if f:
break
if f:
break
if f:
print(''.join(map(str,n)))
else:
print(-1)

第三题

输入两个数 k,n,返回数列的第 n 项模 397 的结果。

数列规则如下,前 k 项(0 ~ k-1)都是 1。第 k+1 项开始,每一项都是前面 k 项的和(那么说第 k + 1 项一定等于 k)

样例是:

2 4 输出 5

解释: 1 1 2 3 5 8 13 ……

我写了模拟,只出了 10%

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
n = 6
x = [k]
cur = k
for i in range(k - 1):
kk = (sum(x) + k-i-1) % 397
x.append(kk)
i = 0
j = k*2 - 1
while j < n:
j += 1
# print(x, i)
x[i] = sum(x) % 397
# print(x)
i = (i + 1)% k
print(x[i-1])

第四题

物资分配,n 个物资集散中心,有一个蓝对勾中心负责分配物资,物资都要运到蓝对勾,现在要额外修建 k 个蓝对勾分部,分部都建立在物质中心。

输入:第一行 n,k

以后 n 行每行四个数:物资中心编号(从 1 开始),货物数量,距离最近的物资中心编号,距离

单位货物运输单位距离需要 100 块。求如何修建分部使运输成本最小,输出最小成本。

每个物资中心能直接到达临近物资中心或者直接到蓝对勾总部(用编号 0 代表)保证无环。

这题没记下样例,也没写出来

在 multimodal Twitter dataset 上使用 LXMERT

目录
  1. 数据预处理
    1. 下载模型
    2. 启动并进入 docker 容器

LXMERT 代码仓库:https://github.com/airsplay/lxmert

论文:LXMERT: Learning Cross-Modality Encoder Representations from Transformers

支持的数据集:VQA、GQA、NLVR2

数据预处理

Faster R-CNN

安装 nvidia-docker:https://github.com/NVIDIA/nvidia-docker

先建立一个存放处理后的特征的文件夹:mkdir /tmp/sarcasm_image

把特征提取代码复制过去:cp data/vg_gqa_imgfeat/extract_gqa_image.py /tmp/sarcasm_image/

下载模型

1
wget 'https://www.dropbox.com/s/nu6jwhc88ujbw1v/resnet101_faster_rcnn_final_iter_320000.caffemodel?dl=1' -O data/nlvr2_imgfeat/resnet101_faster_rcnn_final_iter_320000.caffemodel

但是我得到的是 404 错误。

所以我到这里(https://github.com/peteanderson80/bottom-up-attention#demo)下载了模型 ,这个模型的 md5 是 53dec87566b0efc9648ffdfa8b81a6ee,我后来在 issue 里发现百度网盘的链接里有这个文件,于是又到百度网盘里下载, md5 是:6edf1e9f7a6e0bd7ca2af53390000b05,文件名 resnet101_faster_rcnn_final_iter_320000.caffemodel

再把模型拷贝过去:

1
cp resnet101_faster_rcnn_final_iter_320000.caffemodel /tmp/sarcasm_image/

启动并进入 docker 容器

1
docker run --gpus all -v /home/sxw/jupyter_workspace/Data/sarcasm/dataset_image/:/workspace/images:ro -v /tmp/sarcasm_image:/workspace/features --rm -it airsplay/bottom-up-attention bash

进入容器后,确认正确挂在了需要的文件:

root@800084edae63:/workspace# ls

features images

root@800084edae63:/workspace# ls features/ -lht

total 259M
-rw-rw-r– 1 1002 1002 259M Apr 11 06:18 resnet101_faster_rcnn_final_iter_320000.caffemodel
-rw-r–r– 1 root root 6.4K Apr 11 04:41 extract_gqa_image.py

root@800084edae63:/workspace# ls images/ -lht | head

total 2.6G
-rw-rw-r– 1 1002 1002 137K Mar 9 06:33 940985374565953537.jpg
-rw-rw-r– 1 1002 1002 157K Mar 9 06:33 941003843675942913.jpg
-rw-rw-r– 1 1002 1002 47K Mar 9 06:33 941028485794955264.jpg
-rw-rw-r– 1 1002 1002 31K Mar 9 06:33 941062957185744896.jpg
-rw-rw-r– 1 1002 1002 42K Mar 9 06:33 941083385396695041.jpg
-rw-rw-r– 1 1002 1002 79K Mar 9 06:33 941430864038174720.jpg
-rw-rw-r– 1 1002 1002 79K Mar 9 06:33 941434627436302336.jpg
-rw-rw-r– 1 1002 1002 28K Mar 9 06:33 941443078115774464.jpg
-rw-rw-r– 1 1002 1002 40K Mar 9 06:33 941756290635665408.jpg

然后开始提取特征:

cd features/

CUDA_VISIBLE_DEVICES=0 python extract_gqa_image.py --caffemodel ./resnet101_faster_rcnn_final_iter_320000.caffemodel

在 multimodal Twitter dataset 上使用 vilbert-multi-task

目录
  1. 图片特征提取:
  2. 依赖安装

https://github.com/facebookresearch/vilbert-multi-task

https://gitlab.com/vedanuj/vqa-maskrcnn-benchmark

http://lil.nlp.cornell.edu/nlvr/NLVR2BiasAnalysis.html

https://github.com/lil-lab/nlvr/tree/master/nlvr2

Foil 也是二分类问题,所以我从 Foil 任务改造出 multimodal Twitter dataset 任务

Foil 数据集:

https://foilunitn.github.io/

图片特征提取:

说明:https://github.com/facebookresearch/vilbert-multi-task/tree/master/data

代码:https://github.com/facebookresearch/vilbert-multi-task/blob/master/script/extract_features.py

使用了 maskrcnn_benchmark 得到图片中物体的位置

依赖安装

项目的 requirements.txt 有问题

https://github.com/facebookresearch/vilbert-multi-task/issues/14

pytorch-transformers==1.0.0 要改为 pytorch-transformers==1.1.0

需要安装 h5py

(vilbert-multi-task) (base) xxx@xxxx-xxx:~/multimodal_sarcasm_detection/Code/related_work/vilbert-multi-task/vilbert-multi-task$ python train_tasks.py –bert_model bert-base-uncased –from_pretrained ../multi_task_model.bin –config_file config/bert_base_6layer_6conect.json –tasks 19 –lr_scheduler ‘warmup_linear’ –train_iter_gap 4 –task_specific_tokens –save_name multi_task_model

python eval_tasks.py –bert_model bert-base-uncased –from_pretrained ../multi_task_model.bin –config_file config/bert_base_6layer_6conect.json –tasks 19 –lr_scheduler ‘warmup_linear’ –train_iter_gap 4 –task_specific_tokens –save_name multi_task_model

1
python train_tasks.py --bert_model bert-base-uncased --from_pretrained ../multi_task_model.bin --config_file config/bert_base_6layer_6conect.json --tasks 19 --lr_scheduler 'warmup_linear' --train_iter_gap 4 --task_specific_tokens --save_name multi_task_model

attention 可视化

目录

matplotlib 图像叠加显示热力图

https://blog.csdn.net/nkhgl/article/details/103183978

1
2
plt.imshow(np.hstack(img[i].cpu().numpy().reshape(3,224*224, 1)).reshape(224,224,3))
plt.imshow(rescale(xx), alpha=0.4, cmap=plt.cm.hot, vmin=0, vmax=1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
i = 1
xx = []
for l in attentions[i][-49:].reshape(7,7):
x = []
for v in l:
x += [v] * 32
xx += [x] * 32
cimg = np.hstack(img[i].cpu().numpy().reshape(3,224*224, 1)).reshape(224,224,3)
plt.imshow(cimg)
heatmap = np.array(rescale(attentions[i][-49:].reshape(7,7)))
# heatmap = np.array(attentions[i][-49:].reshape(7,7))
heatmap = cv2.resize(100-heatmap, (224, 224))
# heatmap = np.uint8(255 * heatmap) # 将热力图转换为RGB格式
# heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET) # 将热力图应用于原始图像
# plt.imshow(heatmap, alpha=0.4, vmin=0, vmax=1)
# plt.imshow(heatmap, alpha=0.4, cmap=plt.cm.hot, vmin=0, vmax=1)
# plt.imshow(heatmap, alpha=0.4, cmap='rainbow', vmin=0, vmax=1)
plt.imshow(heatmap, alpha=0.4, cmap=plt.cm.RdBu, vmin=0, vmax=100)

cnn 热力图

https://zhuanlan.zhihu.com/p/53683453

https://blog.csdn.net/Einstellung/article/details/82858974

https://www.jianshu.com/p/0431d6d89d8e

https://www.cnblogs.com/taotingz/p/11309333.html