**前言:**配置mask r-cnn的运行环境和代码需要注意的细节挺多。先推荐几篇不错的博文:1. https://blog.csdn.net/qq_29462849/article/details/81037343
2. https://blog.csdn.net/weixin_42880443/article/details/93622552
3. https://blog.csdn.net/heiheiya/article/details/81532914
4.https://blog.csdn.net/qq_36810544/article/details/83582397
一. 数据集
1.标注工具:labelme,可在annaconda下安装,进入prompt,输入:
conda create --name=labelme python=3.6
activate labelme
conda install pyqt5
pip install labelme
安装完成后直接在终端输入labelme即可。
labelme可参考:https://blog.csdn.net/shwan_ma/article/details/77823281
注意:标注时若一张图片中出现两个相同类型的物体,要注意区分,如dog1,dog2
2.前期准备
下载源码后,会有一个Mask_RCNN-master的文件夹,在该文件夹下新建四个文件夹,如下图。其中:
(1)将需要标注的图片放入pic文件夹中;
(2)用labelme标注好的图片会生成json文件,将其剪切到json文件夹中;
(3)用labelme_json_to_dataset.exe转换json文件:在cmd下定位到labelme_json_to_dataset.exe文件所在的文件夹下,然后输入以下代码:
for /r “json文件存放的路径” %i in (*.json) do labelme_json_to_dataset %i
执行上述代码,可得到同名的文件夹,将这些文件夹剪切到labelme_json文件夹下。
(4)labelme_json文件夹下的每个子文件夹都应包含如下几个数据,需要将label.png转移到cv2_mask文件夹中:
注意:
如果你生成的文件中没有.yaml文件,参考:https://blog.csdn.net/winter616/article/details/104426111/
如果得到的label.png是16位的,则需要转成8位的图片(一片漆黑是正常的):
def img_16to8():
from PIL import Image
import numpy as np
import shutil
import os
src_dir = r'...路径...\labelme_json'
dest_dir = r'...保存的路径...\cv2_mask'
for child_dir in os.listdir(src_dir):
new_name = child_dir.split('_')[0] + '.png'
old_mask = os.path.join(os.path.join(src_dir, child_dir), 'label.png')
img = Image.open(old_mask)
img = Image.fromarray(np.uint8(np.array(img)))
new_mask = os.path.join(dest_dir, new_name)
img.save(new_mask)
如果你得到的label.png本身就是8位的,那么直接批量把图片移到另一个文件夹下即可:
def movefile():
import shutil
import os
src_dir = '...路径.../labelme_json'
dest_dir = '...保存的路径.../cv2_mask'
for child_dir in os.listdir(src_dir):
new_name = child_dir.split('_')[0] + '.png'
old_mask = os.path.join(os.path.join(src_dir, child_dir), 'label.png')
dstflie = dest_dir + '\\' + new_name
shutil.copyfile(old_mask, dstflie)
if __name__ == '__main__':
movefile()
综上:
二. 训练
在Mask_RCNN-master文件夹下新建logs文件夹,在mrcnn文件夹下新建models文件夹,models用于保存已经预训练好的coco模型,可从这里下载,logs用于保存训练产生的模型。在samples文件夹下新建一个“scratch”文件夹,创建scratch.py,代码中的 init_with = “last” 第一次训练时请改成 init_with = “coco”。其他参数的修改显而易见,很简单的(可参考文章开头的博客)。
训练代码scratch.py如下:
import os
import sys
import random
import math
import re
import time
import numpy as np
import cv2
import matplotlib
import matplotlib.pyplot as plt
import yaml
from PIL import Image
# Root directory of the project
ROOT_DIR = os.path.abspath("C:/Users/think/Desktop/Mask_RCNN-master/")
sys.path.append(ROOT_DIR) # To find local version of the library
from mrcnn.config import Config
from mrcnn import utils
from mrcnn import model as modellib
# Directory to save logs and trained models
MODEL_DIR = os.path.join(ROOT_DIR, "logs")
iter_num = 0
# Local path to trained weights file
COCO_MODEL_PATH = os.path.join(ROOT_DIR, "mrcnn/models/mask_rcnn_coco.h5")
# Download COCO trained weights from Releases if needed
if not os.path.exists(COCO_MODEL_PATH):
utils.download_trained_weights(COCO_MODEL_PATH)
class ShapesConfig(Config):
"""Configuration for training on the toy shapes dataset.
Derives from the base Config class and overrides values specific
to the toy shapes dataset.
"""
# Give the configuration a recognizable name
NAME = "scratch"
# Train on 1 GPU and 8 images per GPU. We can put multiple images on each
# GPU because the images are small. Batch size is 8 (GPUs * images/GPU).
GPU_COUNT = 1
IMAGES_PER_GPU = 4
# Number of classes (including background)
NUM_CLASSES =