首先参考了文献1的资料进行配置和转换,基本按照步骤可以实现。但是在调试过程中发现了些新问题,记录如下:
1. 问题 module 'tensorflow' has no attribute 'placeholder'
方案:将
import tensorflow as tf
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
2. 问题 Tried to convert 'shape' to a tensor and failed
方案:https://github.com/matterport/Mask_RCNN/issues/1820
还是要多看GitHub的issue
3.问题:AttributeError: ‘str‘ object has no attribute ‘decode‘解决方法
前面添加 .encode('utf8').decode('utf8')
有点混乱,什么时候再整理下。
参考资料:
【1】windows+tensorflow2+python3环境配置mask-rcnn_v2.1详解 https://blog.csdn.net/u013085021/article/details/105471398
转载 如下:
tf2改版后有了较大的改动,以前很多的经典算法都建立在tf1的版本上,需要做相应的修改才能在tf2上运行。本文详细记录了在win+tf2+python3环境下配置mask-rcnn_v2.1气球检测版本的过程以及遇到的问题。本机具体版本为windows10,python3.7,tensorflow2.1.0。
首先搜索适用于win+tf的mask-rcnn源码,选择一个星星比较多的版本,很明显,我们选第一个。
进入第一个项目,先大概浏览一下,着重阅读Installation内容,大致了解项目的配置使用流程。
点击releases page,进入发布的新版本以及预训练模型参数页面。
依次下载气球数据集balloon_dataset.zip、预训练模型参数mask_rcnn_balloon.h5(也可以下载coco数据集上的预训练模型参数mask_rcnn_coco.h5做fine-tuning,本文下载了后者fune-tune模型)、源代码Source code(zip)或Source code(tar.gz)均可。
下载后的文件如图:
1.先解压v2.1文件,随便命名为自己想要的名字,解压后文件夹内的内容如图所示,v2.1核心代码还是mask-rcnn的东西,只添加了一个自定义数据集:
2.解压balloon_dataset.zip放置在v2.1文件夹内:
balloon_dataset.zip文件夹解压后还有一个__MACOSX文件夹,压缩包是苹果打包的,win解压后就多了一个文件夹,删除即可,然后v2.1文件夹内是这样式的:
3.放置预训练权重参数,将mask_rcnn_coco.h5模型参数在项目文件夹与.samples/balloon目录均复制,注意,是两个目录下均复制预训练模型(其实weights_path在路径中是设置在根目录下,源代码是从linux系统中直接拷贝过来的,win系统路径为反斜杠,不识别,所以在运行中权重路径会设置在balloon.py所在路径,但为了避免有的系统可以识别,故偷个懒,在根目录下和balloon目录下均拷贝预训练模型)。
根目录:
balloon目录:
4.最后将根目录内所有.py文件均复制到./samples/balloon文件夹内。
到此,下载的数据和代码都放置在了相应的位置。
根据mask-rcnn Requirement要求,安装所需版本的支持库,本机具体为python3.7(Anaconda 4.7.12),tensorflow 2.1.0.
v2.1模型主要运行balloon.py文件,设置运行参数
train --dataset=../../balloon --weights=coco
本机用spyder运行,设置方法如图,其他IDE根据自己的环境配置。
至此,准备工作完成!!开始运行balloon.py。当然肯定会报错了orz,出现什么问题解决什么一步步来。
第一次运行,提示
ModuleNotFoundError: No module named 'keras'
这个问题很简单,缺少keras,pip安装即可。
pip install keras
再次运行,提示错误
AttributeError: module 'tensorflow' has no attribute 'random_shuffle'
显示tf没有random_shuffle属性,mask-rcnn源码为tf 1.3版本,本机是tensorflow 2.1.0环境,tf2弃用了tf1很多函数,在model.py、utils.py等文件(所有需要import tensorflow的文件中均做此修改)中,将
import tensorflow as tf
修改为:
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
以兼容模式运行tf1.修改后代码部分:
File "E:\_detection\Mask_RCNN-2.1-tf2-Shawn\samples\balloon\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文件
2017行
from keras.engine import topology
修改为
from keras.engine import saving
代码中topology全部替换为saving
继续运行balloon.py,报错:
File "E:\_detection\Mask_RCNN-2.1-tf2-Shawn\samples\balloon\model.py", line 2100, 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\Mask_RCNN-2.1-tf2-Shawn\samples\balloon\utils.py", line 465, in minimize_mask
m = scipy.misc.imresize(m.astype(float), mini_shape, interp='bilinear')
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")
注意:这里经测试不需要除以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下载已经修改好的代码,再下载完需要的预训练模型和数据集后,只需要修改第六点错误就可以运行。