Mask R-CNN Load_weights函数在带有 tensorflow.compat.v1 的 Google Colab 中不起作用

Mask R-CNN Load_weights function does not work in Google Colab with tensorflow.compat.v1

提问人:Kamel 提问时间:11/7/2023 更新时间:11/21/2023 访问量:187

问:

赏金将于明天到期。这个问题的答案有资格获得 +100 声望赏金。卡梅尔希望引起人们对这个问题的更多关注

我想使用迁移学习在 Google Colab 中训练 Mask R-CNN 模型。为此,我正在利用数据集。我安装了 Mask R-CNN。我注意到以下代码没有加载权重:.名称是正确的,并导致相同的问题。我可以通过检查以下行来确认这一点:coco.h5!pip install mrcnn-colabmodel.load_weights(COCO_MODEL_PATH, by_name=True)by_name=False

from mrcnn import visualize
visualize.display_weight_stats(model)

这在加载之前和之后显示相同的值(我只显示前 10 层):enter image description here

我相信我已经找到了解决这个问题的方法。它涉及以下代码行:

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
tf.compat.v1.get_default_graph()

通常推荐此解决方案,因为 Mask R-CNN 实际上需要 TensorFlow 1.X,而最新的 TensorFlow 版本是 2.X,而 Colab 不支持 TensorFlow 1.X。因此,我使用了这个解决方案,不幸的是,这导致该功能无法正常工作。 我设法调整了我的代码,这样就没有必要了,并使用了 https://github.com/ahmedfgad/Mask-RCNN-TF2/tree/master 中的修改和代码,这需要低于 3.10(Colab 中的标准)的 Python 版本。load_weightsimport tensorflow.compat.v1model.pyutils.py

对于 Python 降级,我使用了以下命令:

!apt-get update -y
!update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1
!update-alternatives --config python3
!apt install python3-pip
!apt install python3.7-distutils

这导致安装了另一个 Python 版本,但我无法在 Colab 中使用它。Colab 始终默认使用 Python 3.10。这可以通过运行以下代码来确认:

import sys
print("User Current Version:-", sys.version)

这将产生以下输出:

用户当前版本:- 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0]

因此,我使用 Python 3.7.6 在 Colab 中创建了一个新的运行时,如下所示:

!wget -O mini.sh https://repo.anaconda.com/miniconda/Miniconda3-py37_4.8.2-Linux-x86_64.sh
!chmod +x mini.sh
!bash ./mini.sh -b -f -p /usr/local
!conda install -q -y jupyter
!conda install -q -y google-colab -c conda-forge
!python -m ipykernel install --name "py37" --user

切换到此运行时后,我将 Python 版本升级到 3.7.11,这是我实际需要的:

!conda install python=3.7.11 -y

通过这些调整,我可以加载砝码;但是,我仅限于使用 CPU。造成此限制的原因是 Colab 的 CUDA 版本与此 Python 版本不兼容,我无法实现降级。此外,新的运行时解决方案通常需要频繁的重新启动运行时操作,因为当我单击“运行”按钮时,它往往会冻结。 所以,关于这个问题,我有以下几个问题:

  1. 如何将 CUDA 版本降级到 10.1?我已经尝试了各种方法,但我总是得出结论,这在 Colab 中是不可能的。
  2. 是否可以强制 Colab 使用以前安装的 Python 版本?
  3. 是否有允许加载权重的代码的替代方案?import tensorflow.compat.v1 as tf
python tensorflow google-colaboratory 迁移学习 掩码-rcnn

评论

0赞 Singh 11/14/2023
您可以将 Mask-RCNN 与 TF2 一起使用,不要在 Colab 中降级 Colab+Python+TF 和其他默认设置,您只会为自己创造更多的开销。事实上,这可能会导致 Colab 在运行代码时崩溃。只需搜索如何在 TF2 中使用 Mask-RCNN,如果找不到任何指南,请告诉我。
0赞 Singh 11/14/2023
如果您只想使用 TF1,您可以根据您的系统在 CPU/GPU 或任何具有 GPU 的虚拟服务器(如 GCP/AWS VM 实例)上本地运行代码,这样您就可以自定义所有必需的设置,如 Python 版本、CUDA 版本、TF 版本等。还是必须使用 Colab?
0赞 Kamel 11/14/2023
我可以使用此链接中提供的代码将 Mask-RCNN 与 TF2 一起使用:github.com/ahmedfgad/Mask-RCNN-TF2/tree/master。此代码要求 Python 版本为 3.7.11。所有其他修改代码以与 TF2 兼容的尝试都涉及使用,我认为这些尝试会导致未加载权重的问题。如果您发现代码不使用并在 Python 3.10 下运行,那么接收链接将非常有帮助。import tensorflow.compat.v1import tensorflow.compat.v1

答:

0赞 Mohamed Reda 11/17/2023 #1

我认为 Mask R-CNN 需要 TensorFlow 1.X,而 Colab 的默认 Python 版本(3.10)不支持

评论

0赞 Kamel 11/17/2023
我使用了修改后的 Mask-RCNN 代码,网址为:github.com/ahmedfgad/Mask-RCNN-TF2/tree/master。使用此版本,即使没有 ,Tensorflow 2.X 也是可行的,这会导致使用该函数加载权重时出现问题。import tensorflow.compat.v1load_weights
2赞 Ro.oT 11/18/2023 #2

您可以使用此实现,该实现构建在原始 Mask R-CNN 存储库之上,以支持 TF2。此存储库允许使用 TensorFlow 2.14.0 和 Python 3.10.12 训练和测试 Mask R-CNN 模型。

您也可以在 Google Colab 上使用它(当前的 colab 环境也使用 Python 3.10.12 和 TF 2.14.0),它在 GPU 上没有任何问题。请确保您的运行时使用的是 GPU:

enter image description here

然后按照以下确切步骤操作:

# Clone the repo
!git clone https://github.com/z-mahmud22/Mask-RCNN_TF2.14.0.git maskrcnn  

# Change the runtime directory to the cloned repo
import os 
os.chdir('/content/maskrcnn/')

# Download pre-trained weights
!wget https://github.com/matterport/Mask_RCNN/releases/download/v2.0/mask_rcnn_coco.h5

然后使用此代码片段将权重加载到 Mask R-CNN 模型中:

import mrcnn
import mrcnn.config
import mrcnn.model

# create a config file

CLASS_NAMES = ['BG', 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light', 'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone', 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush']

class SimpleConfig(mrcnn.config.Config):
    # Give the configuration a recognizable name
    NAME = "coco_inference"
    
    # set the number of GPUs to use along with the number of images per GPU
    GPU_COUNT = 1
    IMAGES_PER_GPU = 1

    # Number of classes = number of classes + 1 (+1 for the background). The background class is named BG
    NUM_CLASSES = len(CLASS_NAMES)

# Initialize the Mask R-CNN model for inference and then load the weights.
# This step builds the Keras model architecture.
model = mrcnn.model.MaskRCNN(mode="inference", 
                             config=SimpleConfig(),
                             model_dir=os.getcwd())

# Load the weights into the model
model.load_weights(filepath="mask_rcnn_coco.h5", 
                   by_name=True)

如果您能正确地遵循所有这些步骤,您应该能够毫无问题地加载预先训练的权重,并通过以下方式验证权重的变化:

from mrcnn import visualize
visualize.display_weight_stats(model)

打印出来:

# Showing the first 10 layers as done in the question
WEIGHT NAME SHAPE   MIN MAX STD
conv1/kernel:0  (7, 7, 3, 64)   -0.8616 +0.8451 +0.1315
conv1/bias:0    (64,)   -0.0002 +0.0004 +0.0001
bn_conv1/gamma:0    (64,)   +0.0835 +2.6411 +0.5091
bn_conv1/beta:0 (64,)   -2.3931 +5.3610 +1.9781
bn_conv1/moving_mean:0  (64,)   -173.0470   +116.3013   +44.5654
bn_conv1/moving_variance:0*** Overflow? (64,)   +0.0000 +146335.3594    +21847.9668
res2a_branch2a/kernel:0 (1, 1, 64, 64)  -0.6574 +0.3179 +0.0764
res2a_branch2a/bias:0   (64,)   -0.0022 +0.0082 +0.0018
bn2a_branch2a/gamma:0   (64,)   +0.2169 +1.8489 +0.4116
bn2a_branch2a/beta:0    (64,)   -2.1180 +3.7332 +1.1786 

下面是一个片段,用于可视化来自预训练的 Mask R-CNN 的预测:

import cv2
import mrcnn.visualize
# load the input image, convert it from BGR to RGB channel
image = cv2.imread("test.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# Perform a forward pass of the network to obtain the results
r = model.detect([image], verbose=0)

# Get the results for the first image.
r = r[0]

# Visualize the detected objects.
mrcnn.visualize.display_instances(image=image, 
                                  boxes=r['rois'], 
                                  masks=r['masks'], 
                                  class_ids=r['class_ids'], 
                                  class_names=CLASS_NAMES, 
                                  scores=r['scores'])

其结果为:enter image description here

评论

0赞 Kamel 11/20/2023
你后来用过吗?当我这样做时,权重没有区别。我用我自己的代码和你的示例代码在推理和训练模式下尝试了它,无论有没有GPU。我非常有信心,问题在于您建议的实现中也使用了它。from mrcnn import visualizevisualize.display_weight_stats(model)tf.compat.v1model.py
0赞 Ro.oT 11/21/2023
嗨,你是对的。砝码以前没有正确加载。我不确定为什么,因为它没有抛出任何错误,但我也不确定这是否是由于 .但是,我已经更新了我的答案,现在应该可以正常工作了。tf.compat.v1