博主之前写过mask-rcnn[链接]基于tf2在windows系统中的代码调试案例,不过那个案例是基于一个小数据集balloon的实现版本。本文复现了源码在COCO数据集的实现,错误修改方式仍然同之前的博文,只需要下载好COCO数据集,执行coco.py即可。
进入第一个项目,点击releases page,进入发布的新版本以及预训练模型参数页面。
下载源代码源代码Source code(zip)或Source code(tar.gz)均可(经测试,2.1版本修复了在win中的运行,下载2.1版本的源码)。并解压缩:
大概浏览一下,着重阅读Requirements内容,大致了解项目的配置使用流程。
按照文档要求逐个进行:
numpy
scipy
Pillow
cython
matplotlib
scikit-image
tensorflow>=1.3.0
keras>=2.0.8
opencv-python
h5py
imgaug
IPython[all]
依次pip install安装即可,本机具体为python3.7(Anaconda 4.7.12),tensorflow 2.2.0.
2.根目录下新建目录data/coco2014,将coco2014数据解压缩至该目录:
3.将下载的minival和valminusminival 的json标注文件解压缩在annotations文件夹中:
运行coco数据集,查看Training on MS COCO部分内容,主要运行coco.py文件。
本机用spyder运行,设置方法如图,其他IDE根据自己的环境配置。
train --dataset=data/coco2014 --model=coco
至此,准备工作完成!!开始运行coco.py。当然肯定会报错了orz,出现什么问题解决什么一步步来。
运行程序,提示错误
AttributeError: module 'tensorflow' has no attribute 'random_shuffle'
显示tf没有random_shuffle属性,mask-rcnn源码为tf 1.3版本,本机是tensorflow 2.2.0环境,tf2弃用了tf1很多函数,在model.py、utils.py、parallel_model.py等文件(所有需要import tensorflow的文件中均做此修改)中,将
import tensorflow as tf
修改为:
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
运行coco.py,报错:
File "E:\_Detection_project\Mask_RCNN_tf2_Shawn\mrcnn\model.py", line 2201, in compile
self.keras_model.metrics_tensors.append(loss)
AttributeError: 'Model' object has no attribute 'metrics_tensors'
原因为keras本地版本过高,本机keras版本为2.3.1.三种解决办法,任选其一:
1)降低本地版本到2.2.5以下,当然要高于2.0.8
2)修改代码,将
self.keras_model.metrics_tensors.append(loss)
改成
self.keras_model.add_metric(loss, name)
3.初始化
self.keras_model.metrics_tensors = []
选择第二种办法,该方法是masrk rcnn master版本的代码
将该错误定位到的model.py中的语句
self.keras_model.metrics_tensors.append(loss)
改为
self.kears_model.add_metric(loss,name)
File "E:\_Detection_project\Mask_RCNN-2.1-tf2-coco\model.py", line 2039, in load_weights
topology.load_weights_from_hdf5_group_by_name(f, layers)
AttributeError: module 'keras.engine.topology' has no attribute 'load_weights_from_hdf5_group_by_name'
该错误已在mask R-CNN的issue中有提到,由farzadzare提出:
原因是keras的版本问题,新的版本没有这个函数了
解决的方案使用saving来取代代码中的topology
首先在model.py文件添加依赖库
from keras.engine import topology
修改为
from keras.engine import saving
然后定位到model.py文件该错误行,代码中topology全部替换为saving
继续运行coco.py,报错:
File "E:\_Detection_project\Mask_RCNN-2.1-tf2-coco\model.py", line 2102, in compile
self.keras_model.metrics_tensors.append(tf.reduce_mean(
AttributeError: 'Model' object has no attribute 'metrics_tensors'
原因为keras本地版本过高,本机keras版本为2.3.1.三种解决办法,任选其一:
1)降低本地版本到2.2.5以下,当然要高于2.0.8
2)修改代码,将
self.keras_model.metrics_tensors.append(loss)
改成
self.keras_model.add_metric(loss, name)
3.初始化
self.keras_model.metrics_tensors = []
选择第二种办法,该方法是masrk rcnn master版本的代码
在2.1中稍有不同,修改办法为
将该错误定位到的model.py中的语句
self.keras_model.metrics_tensors.append(tf.reduce_mean(layer.output, keep_dims=True))
改为
self.keras_model.add_metric(tf.reduce_mean(layer.output,keep_dims=True),name)
报错
File "E:\_Detection_project\Mask_RCNN-2.1-tf2-coco\utils.py", line 421, in resize_image
image = scipy.misc.imresize(
AttributeError: module 'scipy.misc' has no attribute 'imresize'
该错误原因为scipy版本过高,本机为1.4.1,降级到scipy==1.2.1就可以解决,但是不想降级的话,找个别的函数代替该函数功能即可。
错误定位到的utils.py文件中原函数
m = scipy.misc.imresize(m.astype(float), mini_shape, interp='bilinear')
该函数格式为
scipy.misc.imresize( arr, size, interp='bilinear', mode=None)
解决方案: 使用skimage.transform.resize()替换代码中出现的所有imresize方法。
将错误定位语句
scipy.misc.imresize(m.astype(float), (h, w), interp=‘bilinear’)
修改为
skimage.transform.resize(m.astype(float), (h,w), order=1, mode=“constant”)
具体修改方法
import skimage.transform
m = scipy.misc.imresize(m.astype(float), mini_shape, interp='bilinear')
修改为
m = skimage.transform.resize(m.astype(float), mini_shape, order=1, mode="constant")
修改后代码为:
3) utils.py文件中resize_image、expand_mask与unmold_mask函数中同样使用了该函数。
resize_image函数中
image = scipy.misc.imresize(
image, (round(h * scale), round(w * scale)))
修改为:
image = skimage.transform.resize(
image, (round(h * scale), round(w * scale)),
order=1, mode="constant", preserve_range=True)
expand_mask函数中
m = scipy.misc.imresize(m.astype(float), (h, w), interp='bilinear')
修改为
m = skimage.transform.resize(m.astype(float), (h, w), order=1, mode="constant")
unmold_mask函数中语句
mask = scipy.misc.imresize(
mask, (y2 - y1, x2 - x1), interp='bilinear').astype(np.float32) / 255.0
修改为
mask = skimage.transform.resize(mask, (y2 - y1, x2 - x1), order=1, mode="constant").astype(np.float32) / 255.0
报错
File "C:\Anaconda3\lib\site-packages\tensorflow_core\python\keras\callbacks.py", line 1532, in set_model
self.log_dir, self.model._get_distribution_strategy()) # pylint: disable=protected-access
AttributeError: 'Model' object has no attribute '_get_distribution_strategy'
该问题最后出错是因为keras模块调用了keras\callbacks\tensorboard_v2.py文件中的函数,在最开始修改代码的时候我们已经通过以下修改以tf1兼容形式运行。
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
而keras.model模块也是按照tf1模式创建了Model,在后续调用中使用了tensorboard_v2.py文件,本文尝试在balloon.py文件中也加入tf1兼容代码,但无效,最后就只好采用如下修改方法:
在Ancaonda文件夹中定位到\Lib\site-packages\keras\callbacks目录中,在tensorboard_v2.py文件中添加了
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
以tf1兼容模式运行。tensorboard_v2.py代码修改结果:
则问题解决,注意该问题修复方法修改了keras库文件,故在运行其他程序时记得修改回去
Finally,至此我们就完成了,mask-rcnn 2.1的版本修改,可以在win+tf2的环境下运行了,GPU比较差只想做下demo的小伙伴可以在balloon.py中加入以下语句,在cpu下运行(是真的慢。。。),有GPU的话不用做此修改。
import os
#only execute in cpu
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
运行截图如下,也可以直接在github下载已经修改好的代码,再下载完需要的预训练模型和数据集后,只需要修改第六点错误就可以运行。