这个东西很麻烦,相当于自己重新安装了一遍所有东西,而且因为没有root权限,全是用源码编译安装的,安装在自己的目录下
google错误信息能直接查到的就不贴在这里了,遇到无法解决的错误先考虑是否有软件没装或者没装好,比如我自己装的openblas就有问题,直接用服务器上的就行
Cuda与Cudnn
要重装Cuda的主要原因不是cuda版本不对,二是服务器上的cuda没有include进cudnn,服务器上同时装有cuda与cudnn,但是cudnn没有放进cuda的文件夹里,我们也没有权限放进去,只能装一个自己的cuda,装的跟服务器一样的版本v8
https://blog.youkuaiyun.com/weixin_41278720/article/details/81255265
装完cuda之后只要去服务器/cm/shared/apps/cudnn里把相应include和lib里的文件拷过去就行
其实我觉得应该也可以直接把服务器上装好的cuda拷到自己的目录然后改一下.bashrc就好了。。
注意!!!!
mxnet需要cudnn 5.1以下,我之前用的6,报错CUDNN_STATUS_ALLOC_FAILED
现在改成了cudnn5.0,但是可能是因为之前使用6.0编译的,现在还是用的6.0,报错OSError: libcudnn.so.6: cannot open shared object file: No such file or directory,感觉我可能要重新编译一次了。。。。
openblas
需要openblas,服务器上已经装的有了,在自己的环境变量里把它的动态库添加进去就行
gcc
需要gcc<=v5
用的gcc 4.6.1
https://www.cnblogs.com/wq242424/p/8981137.html
有几点要注意:
- ./contrib/download_prerequisites不单单是把那几个插件下下来,而且也自动安装了,不用自己再单独编译安装
- …/gcc-4.8.5/configure --prefix=/usr/local/gcc注意这里,安装位置是/liangtian/gcc,是新建的一个文件夹,而不是解压出来的gcc-4.6.1或者build的文件夹里,这三个最好都单独在一个文件夹里,兄弟关系。
lapack
这个/cm/shared/apps里也有,去config.mk里设置一下lapack的地址就好
python
编译后,需要python2.7, 源代码用的是2.7的语法
temp
可能会有tmp文件夹空间不够用的情况
直接暂时把临时文件夹设定到/mnt/xfs1/home/liangtian就好:export TMPDIR=/mnt/xfs1/home/liangtian
SNIPER-MXNet中出现ValueError: could not broadcast input array from shape (XXX,5) into shape (100,5)
参考:https://blog.youkuaiyun.com/weixin_30527323/article/details/95011142
在gt附近的100都改了
pycharm中ctrl + shift+f全局字符串搜索 参考:https://blog.youkuaiyun.com/u013066730/article/details/82848453
linux中可以用grep -r -l “字符串”(要有双引号,双引号内为查找的字符串)
结果显示
在/lib/dataset/coco.py的273行决定是否显示结果
coco.py的_write_coco_results方法为写输出
docker快速搭建
emmm发现github里作者已经给了一个dockerfile,如果用docker的话直接用他的dockerfile一键就能搭建了。。
eg.
使用当前目录的 Dockerfile 创建镜像,标签为 runoob/ubuntu:v1
docker build -t runoob/ubuntu:v1
使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像
docker build github.com/creack/docker-firefox
参考自 https://www.runoob.com/docker/docker-build-command.html
sniper的docker配置参考 https://blog.youkuaiyun.com/h8832077/article/details/88829197
换数据集神坑
已经训练了一个数据后,如果要换另外一个数据集,一定要清空data/cache/和data/computed_proposals ,不然如果你的annotations文件名什么的没变的话,用的还是上一个数据集的computed_proposals,这样样本数和box_list就很可能对不上,出现:
AssertionError: number of boxes matrix must match number of images
另外数据集图片的后缀一定要是小写的’jpg’不能是’JPG’,不然会出现
TypeError: ‘NoneType’ object has no attribute ‘__getitem__’
DCN1改DCN2
sniper本身用的是dcn1,要改成dcn2以求更好的效果
这是DCN的项目地址,包含dcn1与dcn2 https://github.com/msracver/Deformable-ConvNets
要将dcn1改为dcn2:
(1)把dcn2的operator复制到sniper的项目内
sniper项目内地址:/SNIPER-mxnet/src/operator/contrib
(2)重新编译
(3)编译后就可以直接使用了,注意,就算是dcn1的deformable_conv也不是一个单独的操作(函数),还包含前面操作:
dcn1:
offset = mx.symbol.Convolution(name=name + '_offset', data=act2,
num_filter=72, pad=(2, 2), kernel=(3, 3), stride=(1, 1),
dilate=(2, 2), cudnn_off=True)
conv2 = mx.contrib.symbol.DeformableConvolution(name=name + '_conv2', data=act2,
offset=offset,
num_filter=512, pad=(2, 2), kernel=(3, 3),
num_deformable_group=4,
stride=(1, 1), dilate=(2, 2), no_bias=True)
dcn2:
lr_mult=0.1
weight_var = mx.sym.Variable(name=name + '_offset_weight', init=mx.init.Zero(), lr_mult=lr_mult)
bias_var = mx.sym.Variable(name=name + '_offset_bias', init=mx.init.Zero(), lr_mult=lr_mult)
conv2_offset = mx.symbol.Convolution(name=name + '_offset', data=act2, num_filter=27,
pad=(1, 1), kernel=(3, 3), stride=(1, 1), weight=weight_var, bias=bias_var,
lr_mult=lr_mult)
conv2_offset_t = mx.sym.slice_axis(conv2_offset, axis=1, begin=0, end=18)
conv2_mask = mx.sym.slice_axis(conv2_offset, axis=1, begin=18, end=None)
conv2_mask = 2 * mx.sym.Activation(conv2_mask, act_type='sigmoid')
conv2 = mx.contrib.symbol.ModulatedDeformableConvolution(name=name + '_conv2', data=act2, offset=conv2_offset_t,
mask=conv2_mask,
num_filter=512, pad=(1, 1), kernel=(3, 3),
stride=(1, 1),
num_deformable_group=1, no_bias=True)
dcn1的roipooling:
offset_t = mx.contrib.sym.DeformablePSROIPooling(name='offset_t', data=conv_new_1_relu, rois=rois, group_size=1, pooled_size=7,
sample_per_part=4, no_trans=True, part_size=7, output_dim=256, spatial_scale=0.0625)
offset = mx.sym.FullyConnected(name='offset', data=offset_t, num_hidden=7 * 7 * 2, lr_mult=0.01)
offset_reshape = mx.sym.Reshape(data=offset, shape=(-1, 2, 7, 7), name="offset_reshape")
deformable_roi_pool = mx.contrib.sym.DeformablePSROIPooling(name='deformable_roi_pool', data=conv_new_1_relu, rois=rois,
trans=offset_reshape, group_size=1, pooled_size=7, sample_per_part=4,
no_trans=False, part_size=7, output_dim=256, spatial_scale=0.0625, trans_std=0.1)
dcn2的roipooling:
roi_align = mx.contrib.sym.DeformablePSROIPooling(name='roi_align', #offset_t
data=conv_new_1_relu,
rois=rois,
group_size=1,
pooled_size=7,
sample_per_part=2,
no_trans=True,
part_size=7,
output_dim=256,
spatial_scale=0.0625)
feat_deform = mx.symbol.FullyConnected(name='fc_deform_1', data=roi_align, num_hidden=1024)#offset
feat_deform = mx.sym.Activation(data=feat_deform, act_type='relu', name='fc_deform_1_relu')
feat_deform = mx.symbol.FullyConnected(name='fc_deform_2', data=feat_deform, num_hidden=1024)
feat_deform = mx.sym.Activation(data=feat_deform, act_type='relu', name='fc_deform_2_relu')
feat_deform = mx.symbol.FullyConnected(name='fc_deform_3', data=feat_deform, num_hidden=7 * 7 * 3)
roi_offset = mx.sym.slice_axis(feat_deform, axis=1, begin=0, end=7 * 7 * 2)
roi_offset = mx.sym.reshape(roi_offset, shape=(-1, 2, 7, 7))
roi_mask = mx.sym.slice_axis(feat_deform, axis=1, begin=7 * 7 * 2, end=None)
roi_mask_sigmoid = mx.sym.Activation(roi_mask, act_type='sigmoid')
roi_mask_sigmoid = mx.sym.reshape(roi_mask_sigmoid, shape=(-1, 1, 7, 7))
deform_roi_pool = mx.contrib.sym.DeformablePSROIPooling(name='deformable_roi_pool',
data=conv_new_1_relu,
rois=rois,
trans=roi_offset,
group_size=1,
pooled_size=7,
sample_per_part=2,
no_trans=False,
part_size=7,
output_dim=256,
spatial_scale=0.0625,
trans_std=0.1)
deformable_roi_pool = mx.sym.broadcast_mul(deform_roi_pool, roi_mask_sigmoid)
注意dcn2的roipooling增加了‘fc_deform_1’,‘fc_deform_2’,‘fc_deform_3’层,后面都要初始化,
去掉了‘offset’层,不用再初始化
另外,SNIPER-MXNET/src/operator/contribute的deformable*.c和modulate*.c文件里设置了im2col的默认值64,也就是说所有卡上的batchsize合起来不能超过这个值,改成104后重新编译就可以一张卡13了
查看各个参数的名字
symbol/symbol.py里的infer_shape函数得到的arg_shape_dict字典为模型涉及到的所有参数,遍历即可,比如要看与"offset"有关的直接加个判断条件if … in …即可,或者在main.py里有用load_params()得到的也是参数