參考:
- 使用Keras和Tensorflow設定和安裝Mask RCNN
- Mask R-CNN for object detection and instance segmentation on Keras and TensorFlow
- MaskRCNN識别Pascal VOC 2007 使用非COCO資料格式
- labelme資料轉成COCO資料
- Pascal VOC轉COCO資料
MaskRCNN識别Pascal VOC 2007
完整程式在這裡
Pascal VOC 2007資料下載下傳
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-tar
# 執行以下指令将解壓到一個名為VOCdevkit的目錄中
tar xvf VOCtrainval_06-Nov-tar
tar xvf VOCtest_06-Nov-tar
tar xvf VOCdevkit_08-Jun-tar
資料預覽
1、VOC2007/Annotations
類别名與對象的矩形框位置
2、VOC2007/JPEGImages
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICdzFWRoRXdvN1LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX9sGROl3ZE10MFR0Tz0kMkZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DM2cDMwATMxEjMxMDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
3、VOC2007/SegmentationClass
4、VOC2007/SegmentationObject
将Pascal VOC2017轉COCO資料
- 參考Pascal VOC轉COCO資料
# 建立檔案夾存放資料
mkdir ./Mask_RCNN/COCO
參考RFCN識别Pascal VOC 2007 中的設定
這裡隻是為了示範友善
- 将
複制train2014
都存放在val2014
目錄下COCO
- 将
複制instances_train2014.json
、instances_val2014.json
、instances_valminusminival2014.json
都存放在instances_minival2014.json
目錄COCO/annotations
- 最終
目錄結構如下./Mask_RCNN/COCO
<COCO>
├─ annotations
│ ├─ instances_train2014.json
| |—— instances_val2014.json
│ |—— instances_valminusminival2014.json
| └─ instances_minival2014.json
|
|─ train2014
| └─ *.jpg
└─ val2014
└─ *.jpg
修改coco.py
- coco.py
- 改寫class CocoConfig(Config)
參考MaskRCNN識别Pascal VOC 2007
class CocoConfig(Config):
# 命名配置
NAME = "coco"
# 輸入圖像resing
IMAGE_MIN_DIM =
IMAGE_MAX_DIM =
# 使用的GPU數量。 對于CPU訓練,請使用1
GPU_COUNT =
IMAGES_PER_GPU = int( * * // (IMAGE_MAX_DIM * IMAGE_MAX_DIM * ))+
batch_size = GPU_COUNT * IMAGES_PER_GPU
# STEPS_PER_EPOCH = int(train_images / batch_size * (3 / 4))
STEPS_PER_EPOCH=
VALIDATION_STEPS = STEPS_PER_EPOCH // ( // )
NUM_CLASSES = + # 必須包含一個背景(背景作為一個類别) Pascal VOC 2007有20個類,前面加1 表示加上背景
scale = // IMAGE_MAX_DIM
RPN_ANCHOR_SCALES = ( // scale, // scale, // scale, // scale, // scale) # anchor side in pixels
RPN_NMS_THRESHOLD = # 0.6
RPN_TRAIN_ANCHORS_PER_IMAGE = // scale
MINI_MASK_SHAPE = ( // scale, // scale)
TRAIN_ROIS_PER_IMAGE = // scale
DETECTION_MAX_INSTANCES = * scale * //
DETECTION_MIN_CONFIDENCE =
train
# 這裡 --dataset=./COCO 資料路徑
# Train a new model starting from pre-trained COCO weights
python3 coco.py train --dataset=/path/to/coco/ --model=coco
# Train a new model starting from ImageNet weights
python3 coco.py train --dataset=/path/to/coco/ --model=imagenet
# Continue training a model that you had trained earlier
python3 coco.py train --dataset=/path/to/coco/ --model=/path/to/weights.h5
# Continue training the last model you trained. This will find
# the last trained weights in the model directory.
python3 coco.py train --dataset=/path/to/coco/ --model=last
# You can also run the COCO evaluation code with
# Run COCO evaluation on the last trained model
python3 coco.py evaluate --dataset=/path/to/coco/ --model=last
# (可選)如果imagenet模型參數下載下傳不了 可以按下面的方式修改
# 使用 --model=imagenet 需先下載下傳下面的模型 到 ./Mask_RCNN/ 目錄下
wget https://github.com/fchollet/deep-learning-models/releases/download/v0/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5
# 再修改coco.py 463行
model_path = model.get_imagenet_weights()
# 改成
model_path = os.path.join(ROOT_DIR, "resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5")
運作以下指令
python3 coco.py train --dataset=./COCO --model=imagenet
注:執行
python3 coco.py train --dataset=./COCO --model=coco
會報錯,因為我是使用Pascal VOC 2007轉成COCO格式資料,而不是真實的COCO資料,
--model=coco
是按原本的COCO資料得到的模型參數
evaluation
# Run COCO evaluation on the last trained model
python3 coco.py evaluate --dataset=./COCO --model=last --limit= # 隻評估2張,為了節省時間
# 這裡缺失'area'内容會報錯 因為Pascal VOC 2007在轉COCO資料時 沒有加上每個對象的 area,是以要想評估轉的時候需加上每個對象的'area' 即對象掩膜的面積(并不影響模型訓練與推理)
推理
參考 demo.md
# -*- coding:utf8 -*-
import os
import sys
import random
import math
import numpy as np
import skimage.io
import matplotlib
import matplotlib.pyplot as plt
import coco
import utils
import model as modellib
import visualize
# %matplotlib inline
# Root directory of the project
ROOT_DIR = os.getcwd()
# Directory to save logs and trained model
MODEL_DIR = os.path.join(ROOT_DIR, "logs")
# Directory of images to run detection on
IMAGE_DIR = os.path.join(ROOT_DIR, "images")
class InferenceConfig(coco.CocoConfig):
# Set batch size to 1 since we'll be running inference on
# one image at a time. Batch size = GPU_COUNT * IMAGES_PER_GPU
GPU_COUNT =
IMAGES_PER_GPU =
config = InferenceConfig()
config.display()
# Create model object in inference mode.
model = modellib.MaskRCNN(mode="inference", model_dir=MODEL_DIR, config=config)
model_path = model.find_last()[]
print("Loading weights ", model_path)
model.load_weights(model_path, by_name=True)
# 改成Pascal VOC 2007實際類别,按順序列出
# 參考 http://blog.csdn.net/wc781708249/article/details/79624990#t9
class_names=['BG','diningtable', 'person', 'bottle', 'boat', 'train', 'bird', 'dog', 'cat', 'tvmonitor',
'cow', 'car', 'sofa', 'horse', 'chair', 'pottedplant', 'bicycle', 'motorbike', 'aeroplane',
'sheep', 'bus'] # 第一個預設為背景
# Load a random image from the images folder
file_names = next(os.walk(IMAGE_DIR))[]
image = skimage.io.imread(os.path.join(IMAGE_DIR, random.choice(file_names)))
# Run detection
results = model.detect([image], verbose=)
# Visualize results
r = results[]
visualize.display_instances(image, r['rois'], r['masks'], r['class_ids'],
class_names, r['scores'])
直接執行該腳本即可。
注: 由于運作的時間不長,是以精度并不高,可以自行嘗試多運作一段時間,調試參數