摘要:一安裝地址版本首先要閱讀官網說明的環境要求,千萬不要一股腦直接安裝,不然后面程序很有可能會報錯一定要按上面的說明一步一步來,千萬別省略,不然后面程序很有可能會報錯二數據準備我要制作的原始數據格式是訓練文件在一個
一、安裝
地址: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 AI Research 開源了 Faster R-CNN 和 Mask R-CNN 的 PyTorch 1.0 實現基準:MaskRCNN-Benchmark。相比 Detectron 和 mmdetection,MaskRCNN-Benchmark ...
摘要:受到其他同行在上討論更好經驗的激勵,我決定買一個專用的深度學習盒子放在家里。下面是我的選擇從選擇配件到基準測試。即便是深度學習的較佳選擇,同樣也很重要。安裝大多數深度學習框架是首先基于系統開發,然后逐漸擴展到支持其他操作系統。 在用了十年的 MacBook Airs 和云服務以后,我現在要搭建一個(筆記本)桌面了幾年時間里我都在用越來越薄的 MacBooks 來搭載一個瘦客戶端(thin c...
摘要:我認為對機器學習開發者來說,是一個了不起的工具集。這個帖子發出后得到了很多機器學習研究者和開發者的關注,他們紛紛跟貼談論自己的想法和經驗不只是關于和,討論中還涉及到更多工具。 Theano、TensorFlow、Torch、MXNet 再到近日比較熱門的 PyTorch 等等,深度學習框架之間的比較一直以來都是非常受人關注的熱點話題。機器之心也曾發表過多篇相關的介紹和對比文章,如《主流深度學...
閱讀 2650·2023-04-26 00:42
閱讀 2799·2021-09-24 10:34
閱讀 3810·2021-09-24 09:48
閱讀 4145·2021-09-03 10:28
閱讀 2577·2019-08-30 15:56
閱讀 2771·2019-08-30 15:55
閱讀 3254·2019-08-29 12:46
閱讀 2244·2019-08-28 17:52