windows+tensorflow2+python3环境配置mask-rcnn(COCO数据集)详解

windows+tensorflow2+python3环境配置COCO数据集详解

  • Github下载源码
    • 下载GIthub源码与数据
    • 解压文件放置到对应目录
    • 设置运行参数
  • 调试代码
    • 1. 'tensorflow' has no attribute 'random_shuffle'
    • 2. no attribute 'metrics_tensors'
    • 3. no 'load_weights_from_hdf5_group_by_name'
    • 4. no attribute 'metrics_tensors'
    • 5. no attribute 'imresize'
    • 6. no attribute '_get_distribution_strategy'

博主之前写过mask-rcnn[链接]基于tf2在windows系统中的代码调试案例,不过那个案例是基于一个小数据集balloon的实现版本。本文复现了源码在COCO数据集的实现,错误修改方式仍然同之前的博文,只需要下载好COCO数据集,执行coco.py即可。

Github下载源码

下载GIthub源码与数据

搜索mask-rcnn
进入第一个项目,点击releases page,进入发布的新版本以及预训练模型参数页面。
mask2.1
下载源代码源代码Source code(zip)Source code(tar.gz)均可(经测试,2.1版本修复了在win中的运行,下载2.1版本的源码)。并解压缩:
windows+tensorflow2+python3环境配置mask-rcnn(COCO数据集)详解_第1张图片
大概浏览一下,着重阅读Requirements内容,大致了解项目的配置使用流程。
windows+tensorflow2+python3环境配置mask-rcnn(COCO数据集)详解_第2张图片

按照文档要求逐个进行:

  1. 克隆此代码,我们已经完成
  2. 安装支持库,requirements.txt中所列支持库有:
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.

  1. 运行根目录下的setup.py安装,2.1版本没有此步骤。
  2. 下载预训练模型
    点击releases page,进入发布的新版本以及预训练模型参数页面。
    windows+tensorflow2+python3环境配置mask-rcnn(COCO数据集)详解_第3张图片
  3. 下载coco数据集上的预训练模型参数mask_rcnn_coco.h5做fine-tuning
    下载COCO数据集,并且安装COCO数据集的python API接口,该部分内容在博文COCO数据集、COCO API介绍中做了介绍,可以跳过去查看一下。除此之外,本代码下载了minimal和validation-minus-minival两个小份的验证数据。

解压文件放置到对应目录

1.mask_rcnn_coco.h5放置根目录下:
windows+tensorflow2+python3环境配置mask-rcnn(COCO数据集)详解_第4张图片

2.根目录下新建目录data/coco2014,将coco2014数据解压缩至该目录:
windows+tensorflow2+python3环境配置mask-rcnn(COCO数据集)详解_第5张图片

3.将下载的minival和valminusminival 的json标注文件解压缩在annotations文件夹中:
windows+tensorflow2+python3环境配置mask-rcnn(COCO数据集)详解_第6张图片

设置运行参数

运行coco数据集,查看Training on MS COCO部分内容,主要运行coco.py文件。
windows+tensorflow2+python3环境配置mask-rcnn(COCO数据集)详解_第7张图片
本机用spyder运行,设置方法如图,其他IDE根据自己的环境配置。

train --dataset=data/coco2014 --model=coco

windows+tensorflow2+python3环境配置mask-rcnn(COCO数据集)详解_第8张图片

至此,准备工作完成!!开始运行coco.py。当然肯定会报错了orz,出现什么问题解决什么一步步来。

调试代码

1. ‘tensorflow’ has no attribute ‘random_shuffle’

运行程序,提示错误

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()

以兼容模式运行tf修改后代码部分:
windows+tensorflow2+python3环境配置mask-rcnn(COCO数据集)详解_第9张图片

2. no attribute ‘metrics_tensors’

运行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)

修改后代码:
在这里插入图片描述

3. no ‘load_weights_from_hdf5_group_by_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

4. no attribute ‘metrics_tensors’

继续运行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)

修改后代码:
在这里插入图片描述

5. no attribute ‘imresize’

报错

  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”)

具体修改方法

  1. 先在utils.py文件中添加
import skimage.transform
  1. 将错误定位语句
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

修改后代码为:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6. no attribute ‘_get_distribution_strategy’

报错

  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下载已经修改好的代码,再下载完需要的预训练模型和数据集后,只需要修改第六点错误就可以运行。
运行截图

你可能感兴趣的:(mask-rcnn,tensorflow,深度学习)