国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

MaskRCNN-Benchmark(Pytorch版本)訓練自己的數據以及避坑指南

Acceml / 1660人閱讀

摘要:一安裝地址版本首先要閱讀官網說明的環境要求,千萬不要一股腦直接安裝,不然后面程序很有可能會報錯一定要按上面的說明一步一步來,千萬別省略,不然后面程序很有可能會報錯二數據準備我要制作的原始數據格式是訓練文件在一個

一、安裝

地址:MaskRCNN-Benchmark(Pytorch版本)

首先要閱讀官網說明的環境要求,千萬不要一股腦直接安裝,不然后面程序很有可能會報錯!!!

PyTorch 1.0 from a nightly release. It will not work with 1.0 nor 1.0.1. Installation instructions can be found in https://pytorch.org/get-start...

torchvision from master

cocoapi

yacs

matplotlib

GCC >= 4.9

OpenCV

# first, make sure that your conda is setup properly with the right environment
# for that, check that `which conda`, `which pip` and `which python` points to the
# right path. From a clean conda env, this is what you need to do

conda create --name maskrcnn_benchmark
conda activate maskrcnn_benchmark

# this installs the right pip and dependencies for the fresh python
conda install ipython

# maskrcnn_benchmark and coco api dependencies
pip install ninja yacs cython matplotlib tqdm opencv-python

# follow PyTorch installation in https://pytorch.org/get-started/locally/
# we give the instructions for CUDA 9.0
conda install -c pytorch pytorch-nightly torchvision cudatoolkit=9.0

export INSTALL_DIR=$PWD

# install pycocotools
cd $INSTALL_DIR
git clone https://github.com/cocodataset/cocoapi.git
cd cocoapi/PythonAPI
python setup.py build_ext install

# install apex
cd $INSTALL_DIR
git clone https://github.com/NVIDIA/apex.git
cd apex
python setup.py install --cuda_ext --cpp_ext

# install PyTorch Detection
cd $INSTALL_DIR
git clone https://github.com/facebookresearch/maskrcnn-benchmark.git
cd maskrcnn-benchmark

# the following will install the lib with
# symbolic links, so that you can modify
# the files if you want and won"t need to
# re-build it
python setup.py build develop


unset INSTALL_DIR

# or if you are on macOS
# MACOSX_DEPLOYMENT_TARGET=10.9 CC=clang CXX=clang++ python setup.py build develop

一定要按上面的說明一步一步來,千萬別省略,不然后面程序很有可能會報錯!!!


二、數據準備

我要制作的原始數據格式是訓練文件在一個文件(train),標注文件是csv格式,內容如下:

第一步,先把全部有標記的圖片且分為訓練集,驗證集,分別存儲在兩個文件夾中,代碼如下:

#!/usr/bin/env python
# coding=UTF-8
"""
@Description: 
@Author: HuangQinJian
@LastEditors: HuangQinJian
@Date: 2019-05-01 12:56:08
@LastEditTime: 2019-05-01 13:11:38
"""
import pandas as pd
import random
import os
import shutil

if not os.path.exists("trained/"):
    os.mkdir("trained/")

if not os.path.exists("val/"):
    os.mkdir("val/")

val_rate = 0.15

img_path = "train/"
img_list = os.listdir(img_path)
train = pd.read_csv("train_label_fix.csv")
# print(img_list)
random.shuffle(img_list)

total_num = len(img_list)
val_num = int(total_num*val_rate)
train_num = total_num-val_num

for i in range(train_num):
    img_name = img_list[i]
    shutil.copy("train/" + img_name, "trained/" + img_name)
for j in range(val_num):
    img_name = img_list[j+train_num]
    shutil.copy("train/" + img_name, "val/" + img_name)

第二步,把csv格式的標注文件轉換成coco的格式,代碼如下:

#!/usr/bin/env python
# coding=UTF-8
"""
@Description: 
@Author: HuangQinJian
@LastEditors: HuangQinJian
@Date: 2019-04-23 11:28:23
@LastEditTime: 2019-05-01 13:15:57
"""
import sys
import os
import json
import cv2
import pandas as pd

START_BOUNDING_BOX_ID = 1
PRE_DEFINE_CATEGORIES = {}


def convert(csv_path, img_path, json_file):
    """
    csv_path : csv文件的路徑
    img_path : 存放圖片的文件夾
    json_file : 保存生成的json文件路徑
    """
    json_dict = {"images": [], "type": "instances", "annotations": [],
                 "categories": []}
    bnd_id = START_BOUNDING_BOX_ID
    categories = PRE_DEFINE_CATEGORIES
    csv = pd.read_csv(csv_path)
    img_nameList = os.listdir(img_path)
    img_num = len(img_nameList)
    print("圖片總數為{0}".format(img_num))
    for i in range(img_num):
        # for i in range(30):
        image_id = i+1
        img_name = img_nameList[i]
        if img_name == "60f3ea2534804c9b806e7d5ae1e229cf.jpg" or img_name == "6b292bacb2024d9b9f2d0620f489b1e4.jpg":
            continue
        # 可能需要根據具體格式修改的地方
        lines = csv[csv.filename == img_name]
        img = cv2.imread(os.path.join(img_path, img_name))
        height, width, _ = img.shape
        image = {"file_name": img_name, "height": height, "width": width,
                 "id": image_id}
        print(image)
        json_dict["images"].append(image)
        for j in range(len(lines)):
            # 可能需要根據具體格式修改的地方
            category = str(lines.iloc[j]["type"])
            if category not in categories:
                new_id = len(categories)
                categories[category] = new_id
            category_id = categories[category]
            # 可能需要根據具體格式修改的地方
            xmin = int(lines.iloc[j]["X1"])
            ymin = int(lines.iloc[j]["Y1"])
            xmax = int(lines.iloc[j]["X3"])
            ymax = int(lines.iloc[j]["Y3"])
            # print(xmin, ymin, xmax, ymax)
            assert(xmax > xmin)
            assert(ymax > ymin)
            o_width = abs(xmax - xmin)
            o_height = abs(ymax - ymin)
            ann = {"area": o_width*o_height, "iscrowd": 0, "image_id":
                   image_id, "bbox": [xmin, ymin, o_width, o_height],
                   "category_id": category_id, "id": bnd_id, "ignore": 0,
                   "segmentation": []}
            json_dict["annotations"].append(ann)
            bnd_id = bnd_id + 1
    for cate, cid in categories.items():
        cat = {"supercategory": "none", "id": cid, "name": cate}
        json_dict["categories"].append(cat)

    json_fp = open(json_file, "w")
    json_str = json.dumps(json_dict, indent=4)
    json_fp.write(json_str)
    json_fp.close()


if __name__ == "__main__":
    # csv_path = "data/train_label_fix.csv"
    # img_path = "data/train/"
    # json_file = "train.json"
    csv_path = "train_label_fix.csv"
    img_path = "trained/"
    json_file = "trained.json"
    convert(csv_path, img_path, json_file)
    csv_path = "train_label_fix.csv"
    img_path = "val/"
    json_file = "val.json"
    convert(csv_path, img_path, json_file)

第三步,可視化轉換后的coco的格式,以確保轉換正確,代碼如下:

(注意:在這一步中,需要先下載 cocoapi , 可能出現的 問題)

#!/usr/bin/env python
# coding=UTF-8
"""
@Description: 
@Author: HuangQinJian
@LastEditors: HuangQinJian
@Date: 2019-04-23 13:43:24
@LastEditTime: 2019-04-30 21:29:26
"""
from pycocotools.coco import COCO
import skimage.io as io
import matplotlib.pyplot as plt
import pylab
import cv2
import os
from skimage.io import imsave
import numpy as np
pylab.rcParams["figure.figsize"] = (8.0, 10.0)

img_path = "data/train/"
annFile = "train.json"

if not os.path.exists("anno_image_coco/"):
    os.makedirs("anno_image_coco/")


def draw_rectangle(coordinates, image, image_name):
    for coordinate in coordinates:
        left = np.rint(coordinate[0])
        right = np.rint(coordinate[1])
        top = np.rint(coordinate[2])
        bottom = np.rint(coordinate[3])
        # 左上角坐標, 右下角坐標
        cv2.rectangle(image,
                      (int(left), int(right)),
                      (int(top), int(bottom)),
                      (0, 255, 0),
                      2)
    imsave("anno_image_coco/"+image_name, image)


# 初始化標注數據的 COCO api
coco = COCO(annFile)

# display COCO categories and supercategories
cats = coco.loadCats(coco.getCatIds())
nms = [cat["name"] for cat in cats]
# print("COCO categories: 
{}
".format(" ".join(nms)))

nms = set([cat["supercategory"] for cat in cats])
# print("COCO supercategories: 
{}".format(" ".join(nms)))

img_path = "data/train/"
img_list = os.listdir(img_path)
# for i in range(len(img_list)):
for i in range(7):
    imgIds = i+1
    img = coco.loadImgs(imgIds)[0]
    image_name = img["file_name"]
    # print(img)

    # 加載并顯示圖片
    # I = io.imread("%s/%s" % (img_path, img["file_name"]))
    # plt.axis("off")
    # plt.imshow(I)
    # plt.show()

    # catIds=[] 說明展示所有類別的box,也可以指定類別
    annIds = coco.getAnnIds(imgIds=img["id"], catIds=[], iscrowd=None)
    anns = coco.loadAnns(annIds)
    # print(anns)
    coordinates = []
    img_raw = cv2.imread(os.path.join(img_path, image_name))
    for j in range(len(anns)):
        coordinate = []
        coordinate.append(anns[j]["bbox"][0])
        coordinate.append(anns[j]["bbox"][1]+anns[j]["bbox"][3])
        coordinate.append(anns[j]["bbox"][0]+anns[j]["bbox"][2])
        coordinate.append(anns[j]["bbox"][1])
        # print(coordinate)
        coordinates.append(coordinate)
    # print(coordinates)
    draw_rectangle(coordinates, img_raw, image_name)

三、文件配置

在訓練自己的數據集過程中需要修改的地方可能很多,下面我就列出常用的幾個:

修改maskrcnn_benchmark/config/paths_catalog.py中數據集路徑:

class DatasetCatalog(object):
    # 看自己的實際情況修改路徑!!!
    # 看自己的實際情況修改路徑!!!
    # 看自己的實際情況修改路徑!!!
    DATA_DIR = ""
    DATASETS = {
        "coco_2017_train": {
            "img_dir": "coco/train2017",
            "ann_file": "coco/annotations/instances_train2017.json"
        },
        "coco_2017_val": {
            "img_dir": "coco/val2017",
            "ann_file": "coco/annotations/instances_val2017.json"
        },
        # 改成訓練集所在路徑!!!
        # 改成訓練集所在路徑!!!
        # 改成訓練集所在路徑!!!
        "coco_2014_train": {
            "img_dir": "/data1/hqj/traffic-sign-identification/trained",
            "ann_file": "/data1/hqj/traffic-sign-identification/trained.json"
        },
        # 改成驗證集所在路徑!!!
        # 改成驗證集所在路徑!!!
        # 改成驗證集所在路徑!!!
        "coco_2014_val": {
            "img_dir": "/data1/hqj/traffic-sign-identification/val",
            "ann_file": "/data1/hqj/traffic-sign-identification/val.json"
        },
        # 改成測試集所在路徑!!!
        # 改成測試集所在路徑!!!
        # 改成測試集所在路徑!!!
        "coco_2014_test": {
            "img_dir": "/data1/hqj/traffic-sign-identification/test"
        ...

config下的配置文件:

由于這個文件下的參數很多,往往需要根據自己的具體需求改,我就列出自己的配置(使用的是e2e_faster_rcnn_X_101_32x8d_FPN_1x.yaml其中我有注釋的必須改,比如 NUM_CLASSES):

INPUT:
  MIN_SIZE_TRAIN: (1000,)
  MAX_SIZE_TRAIN: 1667
  MIN_SIZE_TEST: 1000
  MAX_SIZE_TEST: 1667
MODEL:
  META_ARCHITECTURE: "GeneralizedRCNN"
  WEIGHT: "catalog://ImageNetPretrained/FAIR/20171220/X-101-32x8d"
  BACKBONE:
    CONV_BODY: "R-101-FPN"
  RPN:
    USE_FPN: True
    BATCH_SIZE_PER_IMAGE: 128
    ANCHOR_SIZES: (16, 32, 64, 128, 256)
    ANCHOR_STRIDE: (4, 8, 16, 32, 64)
    PRE_NMS_TOP_N_TRAIN: 2000
    PRE_NMS_TOP_N_TEST: 1000
    POST_NMS_TOP_N_TEST: 1000
    FPN_POST_NMS_TOP_N_TEST: 1000
    FPN_POST_NMS_TOP_N_TRAIN: 1000
    ASPECT_RATIOS : (1.0,)
  FPN:
    USE_GN: True
  ROI_HEADS:
    # 是否使用FPN
    USE_FPN: True
  ROI_BOX_HEAD:
    USE_GN: True
    POOLER_RESOLUTION: 7
    POOLER_SCALES: (0.25, 0.125, 0.0625, 0.03125)
    POOLER_SAMPLING_RATIO: 2
    FEATURE_EXTRACTOR: "FPN2MLPFeatureExtractor"
    PREDICTOR: "FPNPredictor"
    # 修改成自己任務所需要檢測的類別數+1
    NUM_CLASSES: 22
  RESNETS:
    BACKBONE_OUT_CHANNELS: 256
    STRIDE_IN_1X1: False
    NUM_GROUPS: 32
    WIDTH_PER_GROUP: 8
DATASETS:
  # paths_catalog.py文件中的配置,數據集指定時如果僅有一個數據集不要忘了逗號(如:("coco_2014_val",))
  TRAIN: ("coco_2014_train",)
  TEST: ("coco_2014_val",)
DATALOADER:
  SIZE_DIVISIBILITY: 32
SOLVER:
  BASE_LR: 0.001
  WEIGHT_DECAY: 0.0001
  STEPS: (240000, 320000)
  MAX_ITER: 360000
  # 很重要的設置,具體可以參見官網說明:https://github.com/facebookresearch/maskrcnn-benchmark/blob/master/README.md
  IMS_PER_BATCH: 1
  # 保存模型的間隔
  CHECKPOINT_PERIOD: 18000
# 輸出文件路徑
OUTPUT_DIR: "./weight/"

如果只做檢測任務的話,刪除 maskrcnn-benchmark/maskrcnn_benchmark/data/datasets/coco.py 中 82-84這三行比較保險。

maskrcnn_benchmark/engine/trainer.py 中 第 90 行可設置輸出日志的間隔(默認20,我感覺輸出太頻繁,看你自己)


四、模型訓練

單GPU

官網給出的是:

python /path_to_maskrcnn_benchmark/tools/train_net.py --config-file "/path/to/config/file.yaml"

但是這個默認會使用第一個GPU,如果想指定GPU的話,可以使用以下命令:

# 3是要使用GPU的ID
CUDA_VISIBLE_DEVICES=3 python /path_to_maskrcnn_benchmark/tools/train_net.py --config-file "/path/to/config/file.yaml"

如果出現內存溢出的情況,這時候就需要調整參數,具體可以參見官網:內存溢出解決

多GPU

官網給出的是:

export NGPUS=8
python -m torch.distributed.launch --nproc_per_node=$NGPUS /path_to_maskrcnn_benchmark/tools/train_net.py --config-file "path/to/config/file.yaml" MODEL.RPN.FPN_POST_NMS_TOP_N_TRAIN images_per_gpu x 1000

但是這個默認會隨機使用GPU,如果想指定GPU的話,可以使用以下命令:

# --nproc_per_node=4 是指使用GPU的數目為4
CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch --nproc_per_node=4  /path_to_maskrcnn_benchmark/tools/train_net.py --config-file "path/to/config/file.yaml"

遺憾的是,多GPU在我的服務器上一直運行不成功,還請大家幫忙解決!!!

問題地址:Multi-GPU training error


五、模型驗證

修改 config 配置文件中 WEIGHT: "../weight/model_final.pth"(此處應為訓練完保存的權重)

運行命令:

CUDA_VISIBLE_DEVICES=5 python tools/test_net.py --config-file "/path/to/config/file.yaml" TEST.IMS_PER_BATCH 8

其中TEST.IMS_PER_BATCH 8也可以在config文件中直接配置:

TEST:
  IMS_PER_BATCH: 8

六、模型預測

修改 config 配置文件中 WEIGHT: "../weight/model_final.pth"(此處應為訓練完保存的權重)

修改demo/predictor.py中 CATEGORIES ,替換成自己數據的物體類別(如果想可視化結果,沒有可以不改,可以參考demo/下面的例子):

class COCODemo(object):
    # COCO categories for pretty print
    CATEGORIES = [
        "__background",
        ...
    ]

新建一個文件 demo/predict.py(需要修改的地方已做注釋)

#!/usr/bin/env python
# coding=UTF-8
"""
@Description:
@Author: HuangQinJian
@LastEditors: HuangQinJian
@Date: 2019-05-01 12:36:04
@LastEditTime: 2019-05-03 17:29:23
"""
import os

import matplotlib.pylab as pylab
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from PIL import Image

from maskrcnn_benchmark.config import cfg
from predictor import COCODemo
from tqdm import tqdm

# this makes our figures bigger
pylab.rcParams["figure.figsize"] = 20, 12

# 替換成自己的配置文件
# 替換成自己的配置文件
# 替換成自己的配置文件
config_file = "../configs/e2e_faster_rcnn_R_50_FPN_1x.yaml"

# update the config options with the config file
cfg.merge_from_file(config_file)
# manual override some options
cfg.merge_from_list(["MODEL.DEVICE", "cuda"])


def load(img_path):
    pil_image = Image.open(img_path).convert("RGB")
    # convert to BGR format
    image = np.array(pil_image)[:, :, [2, 1, 0]]
    return image

# 根據自己的需求改
# 根據自己的需求改
# 根據自己的需求改
coco_demo = COCODemo(
    cfg,
    min_image_size=1600,
    confidence_threshold=0.7,
)

# 測試圖片的路徑
# 測試圖片的路徑
# 測試圖片的路徑
imgs_dir = "/data1/hqj/traffic-sign-identification/test"
img_names = os.listdir(imgs_dir)

submit_v4 = pd.DataFrame()
empty_v4 = pd.DataFrame()

filenameList = []

X1List = []
X2List = []
X3List = []
X4List = []

Y1List = []
Y2List = []
Y3List = []
Y4List = []

TypeList = []

empty_img_name = []

# for img_name in img_names:
for i, img_name in enumerate(tqdm(img_names)):
    path = os.path.join(imgs_dir, img_name)
    image = load(path)
    # compute predictions
    predictions = coco_demo.compute_prediction(image)
    try:
        scores = predictions.get_field("scores").numpy()
        bbox = predictions.bbox[np.argmax(scores)].numpy()
        labelList = predictions.get_field("labels").numpy()
        label = labelList[np.argmax(scores)]

        filenameList.append(img_name)
        X1List.append(round(bbox[0]))
        Y1List.append(round(bbox[1]))
        X2List.append(round(bbox[2]))
        Y2List.append(round(bbox[1]))
        X3List.append(round(bbox[2]))
        Y3List.append(round(bbox[3]))
        X4List.append(round(bbox[0]))
        Y4List.append(round(bbox[3]))
        TypeList.append(label)
        # print(filenameList, X1List, X2List, X3List, X4List, Y1List,
        #       Y2List, Y3List, Y4List, TypeList)
        print(label)
    except:
        empty_img_name.append(img_name)
        print(empty_img_name)

submit_v4["filename"] = filenameList
submit_v4["X1"] = X1List
submit_v4["Y1"] = Y1List
submit_v4["X2"] = X2List
submit_v4["Y2"] = Y2List
submit_v4["X3"] = X3List
submit_v4["Y3"] = Y3List
submit_v4["X4"] = X4List
submit_v4["Y4"] = Y4List
submit_v4["type"] = TypeList

empty_v4["filename"] = empty_img_name

submit_v4.to_csv("submit_v4.csv", index=None)
empty_v4.to_csv("empty_v4.csv", index=None)

運行命令:

CUDA_VISIBLE_DEVICES=5  python demo/predict.py

七、結束語

1. 若有修改maskrcnn-benchmark文件夾下的代碼,一定要重新編譯!一定要重新編譯!一定要重新編譯!

2. 更多精彩內容,歡迎前往我的 CSDN

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43708.html

相關文章

  • Facebook開源Mask R-CNNPyTorch 1.0基準

    摘要:近日,開源了和的實現基準。是商湯和港中文近日聯合開源的基于的開源目標檢測工具包。你也可以配置你自己的到數據集的路徑。 近日,Facebook AI Research 開源了 Faster R-CNN 和 Mask R-CNN 的 PyTorch 1.0 實現基準:MaskRCNN-Benchmark。相比 Detectron 和 mmdetection,MaskRCNN-Benchmark ...

    calx 評論0 收藏0
  • 從硬件配置、軟件安裝到基準測試,1700美元深度學習機器構建指南

    摘要:受到其他同行在上討論更好經驗的激勵,我決定買一個專用的深度學習盒子放在家里。下面是我的選擇從選擇配件到基準測試。即便是深度學習的較佳選擇,同樣也很重要。安裝大多數深度學習框架是首先基于系統開發,然后逐漸擴展到支持其他操作系統。 在用了十年的 MacBook Airs 和云服務以后,我現在要搭建一個(筆記本)桌面了幾年時間里我都在用越來越薄的 MacBooks 來搭載一個瘦客戶端(thin c...

    pkwenda 評論0 收藏0
  • PyTorch和TensorFlow到底哪個更好?看看一線開發者怎么說

    摘要:我認為對機器學習開發者來說,是一個了不起的工具集。這個帖子發出后得到了很多機器學習研究者和開發者的關注,他們紛紛跟貼談論自己的想法和經驗不只是關于和,討論中還涉及到更多工具。 Theano、TensorFlow、Torch、MXNet 再到近日比較熱門的 PyTorch 等等,深度學習框架之間的比較一直以來都是非常受人關注的熱點話題。機器之心也曾發表過多篇相關的介紹和對比文章,如《主流深度學...

    coordinate35 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<