(一)搭建caffe2版

Caffe2已合并到pytorch框架里了,所以搭建caffe2就得搭建pytorch。在搭建的过程中,各种坑,后来定位到

maskRCNN头部网络_图像分割


才知道,pytorch,要求cudnn7+,而cudnn7+要求对应的cuda在9+,然而,升级cuda,对整个服务器的影响较大,为了不影响其他人的使用,放弃caffe2版本的搭建。所以在搭环境前,一定要看好需要的版本号。

(二)搭建tensorflow版

也是各种坑,其中下面这个坑是耗时最长的:

maskRCNN头部网络_图像分割_02


即:version GLBCXX_3.4.21 not defined in file in libstdc++.so.6 with link time reference

其实这类问题是很解决的,就是tensorflow中的so包缺少XXX版本,这类问题解决办法,要么升级GCC(这个办法,如果多人共用一个服务器,就不要升级了,会对别人有影响的),要么在整个服务器中找有 GLBCXX_3.4.21 的libstdc++.so.6包,具体方法是:

①find / -name libstdc++.so.6 ///先找到所有libstdc++.so.6 包

②strings /opt/lampp/lib/libstdc++.so.6 | grep GLIBCXX_ ///然后挨个路径下的libstdc++.so.6包查找里面是否有 GLBCXX_3.4.21

③如果找到,就创建一个软链接,让之前指向libstdc++.so.6的路径,改为指向有GLBCXX_3.4.21 的libstdc++.so.6

然而,我发现我软链接指向的libstdc++.so.6包里面是存在 GLBCXX_3.4.21,但一直提示找不到 GLBCXX_3.4.21 ,我也是很困惑,后来,我直接卸了服务器中的python3.6,用的python3.5,就没有这种错误了,具体细节原因,我也不清楚了。

maskRCNN头部网络_服务器_03


(三)模型训练

模型训练前,一定要选好数据标定工具,可以使用Labelme,也可以使用VIA,下面那篇博客有详细解释。


两种标定方法产生的json文件内部结构是不一样,所以,用不同的标定工具,后面训练的代码也是不一样的,如果用VIA可以改写MASK-RCNN工程里面的balloon.py,用来训练自己的数据集,如果是用Labelme,可以参照下面这篇博客。

需要说明一下的地方,很多博客中产生的labelme_json文件中的label.png是一片黑,然而我的是这样有颜色的图。

maskRCNN头部网络_maskRCNN头部网络_04


这是因为labelme版本不同导致的,可以看看这种彩色label.png是否为8位图,如果深度为8位,就不需要再转化,直接用labelme_json文件夹下的label.png放到cv2_mask文件下即可。

但是在训练的时候,总是出现IndexError: boolean index did not match indexed array along dimension 0; dimension is 1 but corresponding boolean dimension is 128

maskRCNN头部网络_服务器_05


网上找了很多办法都没有解决,后来无意中发现“直接用labelme_json文件夹下的label.png放到cv2_mask文件下”,这一步出错了,在放图片的这一步,使用了imread这个函数,后面的参数没有设置,在存放的过程中,默认将8位的图转化成了24位!!!!

后来使用src = imread(buff1, IMREAD_GRAYSCALE);还是出错
 IndexError: boolean index did not match indexed array along dimension 0; dimension is 1 but corresponding boolean dimension is 36

解决办法:直接在训练的train.py中,在load_shapes函数中的mask_path地址指向labelme_json文件夹下。 mask_path = dataset_root_path + “labelme_json/” + filestr + “_json/label.png”

最后,直接运行train.py出现下图,成功。

maskRCNN头部网络_服务器_06