天天看點

MaskRCNN識别Pascal VOC 2007[轉成COCO資料格式]MaskRCNN識别Pascal VOC 2007Pascal VOC 2007資料下載下傳将Pascal VOC2017轉COCO資料修改coco.pytrainevaluation推理

參考:

  • 使用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

MaskRCNN識别Pascal VOC 2007[轉成COCO資料格式]MaskRCNN識别Pascal VOC 2007Pascal VOC 2007資料下載下傳将Pascal VOC2017轉COCO資料修改coco.pytrainevaluation推理

3、VOC2007/SegmentationClass

MaskRCNN識别Pascal VOC 2007[轉成COCO資料格式]MaskRCNN識别Pascal VOC 2007Pascal VOC 2007資料下載下傳将Pascal VOC2017轉COCO資料修改coco.pytrainevaluation推理

4、VOC2007/SegmentationObject

MaskRCNN識别Pascal VOC 2007[轉成COCO資料格式]MaskRCNN識别Pascal VOC 2007Pascal VOC 2007資料下載下傳将Pascal VOC2017轉COCO資料修改coco.pytrainevaluation推理

将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'])
           

直接執行該腳本即可。

MaskRCNN識别Pascal VOC 2007[轉成COCO資料格式]MaskRCNN識别Pascal VOC 2007Pascal VOC 2007資料下載下傳将Pascal VOC2017轉COCO資料修改coco.pytrainevaluation推理

注: 由于運作的時間不長,是以精度并不高,可以自行嘗試多運作一段時間,調試參數

繼續閱讀