运行matterport/MaskRCNN代码时遭遇AttributeError:module 'keras.engine' has no attribute 'Layer'
AttributeError: module 'keras.engine' has no attribute 'Layer'错误 嘿,这个问题我之前帮好几个开发者踩过坑,本质就是你当前用的Keras(或者TensorFlow整合的tf.keras)版本和MaskRCNN代码里依赖的旧Keras API不匹配导致的——在较新的Keras版本(尤其是TensorFlow 2.x附带的tf.keras)里,keras.engine.Layer这个模块路径已经被调整了,而原版MaskRCNN还在沿用旧的写法,所以才会抛出这个属性找不到的错误。
给你几个可行的解决方案,按优先级排序:
直接修改MaskRCNN的代码适配新版环境
找到报错的/usr/local/lib/python3.7/dist-packages/mrcnn/model.py文件,做两处关键修改:- 把文件开头的
import keras.engine as KE替换成from tensorflow.keras.layers import Layer(如果代码里没导入tensorflow,还要加一句import tensorflow as tf) - 把第255行的
class ProposalLayer(KE.Layer):改成class ProposalLayer(Layer):
除了这个层,代码里其他用到KE.Layer的自定义层类也要同步替换成Layer,确保所有继承关系都适配新API。
- 把文件开头的
安装MaskRCNN兼容的旧版Keras和TensorFlow
如果不想改代码,可以直接回退到官方测试过的兼容版本组合:pip uninstall -y keras tensorflow pip install keras==2.2.5 tensorflow==1.15.0这套版本能完美适配原版MaskRCNN,不会出现API不匹配的问题。
切换到适配tf.keras的MaskRCNN分支
现在有不少社区维护的MaskRCNN分支已经适配了TensorFlow 2.x的tf.keras环境,你可以替换掉当前的代码库,用这些更新后的版本,就能直接在新版TF环境下运行,不用再纠结版本兼容问题。
另外要注意:如果选择用TensorFlow 2.x环境,一定要把代码里所有的Keras导入都换成tf.keras的路径,比如把import keras.backend as K改成from tensorflow.keras import backend as K,这样能避免大部分版本冲突问题。
内容的提问来源于stack exchange,提问作者TAIFOUR TAOUTAOU




