手把手教物体检测——M2Det
目錄
模型介紹
模型使用
下載源碼:
在data文件夾下新建VOCdevkit文件夾,導入VOC格式的數據集。如下圖:
下載權重文件,放在weights(如果沒有就在根目錄新建)文件夾下面。
修改voc0712.py里面的類別。
選擇配置文件。
刪除pycocotools
修改nms_wrapper.py
修改train.py
修改test.py
可視化結果
模型介紹
物體檢測模型M2Det,是北京大學&阿里達摩院提出的Single-shot目標檢測新模型,使用multi-level特征。在MS-COCO benchmark上,M2Det的單尺度版本和多尺度版本AP分別達到41.0和44.2?。
該模型的特點:
- 提出多級特征金字塔網絡MLFPN。MLFPN的結構如下:
- 基于提出的MLFPN,結合SSD,提出一種新的Single-shot目標檢測模型M2Det
模型使用
-
下載源碼:
https://github.com/qijiezhao/M2Det”。
-
在data文件夾下新建VOCdevkit文件夾,導入VOC格式的數據集。如下圖:
-
下載權重文件,放在weights(如果沒有就在根目錄新建)文件夾下面。
-
修改voc0712.py里面的類別。
將:
VOC_CLASSES = ( '__background__', # always index 0'aeroplane', 'bicycle', 'bird', 'boat','bottle', 'bus', 'car', 'cat', 'chair','cow', 'diningtable', 'dog', 'horse','motorbike', 'person', 'pottedplant','sheep', 'sofa', 'train', 'tvmonitor')修改為:
VOC_CLASSES = ( '__background__', # always index 0
??? 'aircraft', 'oiltank')
選擇配置文件。
本例采用configs->m2det512_vgg.py配置文件model = dict(
??? type = 'm2det',
??? input_size = 512,
??? init_net = True,
??? pretrained = 'weights/vgg16_reducedfc.pth',
??? m2det_config = dict(
??????? backbone = 'vgg16',
??????? net_family = 'vgg', # vgg includes ['vgg16','vgg19'], res includes ['resnetxxx','resnextxxx']
??????? base_out = [22,34], # [22,34] for vgg, [2,4] or [3,4] for res families
??????? planes = 256,
??????? num_levels = 8,
??????? num_scales = 6,
??????? sfam = False,
??????? smooth = True,
??????? num_classes = 3,#更改類別,按照數據集里面的類別數量+1(背景)
??????? ),
??? rgb_means = (104, 117, 123),
??? p = 0.6,
??? anchor_config = dict(
??????? step_pattern = [8, 16, 32, 64, 128, 256],
??????? size_pattern = [0.06, 0.15, 0.33, 0.51, 0.69, 0.87, 1.05],
??????? ),
??? save_eposhs = 10,
??? weights_save = 'weights/' #保存權重文件的目錄
??? )
train_cfg = dict(
??? cuda = True,#是否使用cuda
??? warmup = 5,
??? per_batch_size = 2,#修改batchsize,按照自己顯卡的能力修改
??? lr = [0.004, 0.002, 0.0004, 0.00004, 0.000004],#學利率調整,調整依據step_lr的epoch數值。
??? gamma = 0.1,
??? end_lr = 1e-6,
??? step_lr = dict(
??????? COCO = [90, 110, 130, 150, 160],
??????? VOC = [100, 150, 200, 250, 300], # unsolve
??????? ),
??? print_epochs = 10,#每個10個epoch保存一個模型。
??? num_workers= 2,#線程數,根據CPU調整
??? )
test_cfg = dict(
??? cuda = True,
??? topk = 0,
??? iou = 0.45,
??? soft_nms = True,
??? score_threshold = 0.1,
??? keep_per_class = 50,
??? save_folder = 'eval'
??? )
loss = dict(overlap_thresh = 0.5,
??????????? prior_for_matching = True,
??????????? bkg_label = 0,
??????????? neg_mining = True,
??????????? neg_pos = 3,
??????????? neg_overlap = 0.5,
??????????? encode_target = False)
optimizer = dict(type='SGD', momentum=0.9, weight_decay=0.0005)#激活函數。
#修改dataset,本例采用VOC2007數據集,將COCO的刪除即可,刪除VOC2012
dataset = dict(VOC = dict(train_sets = [('2007', 'trainval')],eval_sets = [('2007', 'test')],))import osimport oshome = ""#home路徑,默認是linux的,本例采用win10,講其修改為“”VOCroot = os.path.join(home,"data/VOCdevkit/")COCOroot = os.path.join(home,"data/coco/")-
刪除pycocotools
在安裝pycocotools工具前提下,將程序自帶的pycocotools工具包刪除。
修改coco.py
將:
from utils.pycocotools.coco import COCO
from utils.pycocotools.cocoeval import COCOeval
from utils.pycocotools import mask as COCOmask
修改為:
from pycocotools.coco import COCO
from pycocotools.cocoeval import COCOeval
from pycocotools import mask as COCOmask
-
修改nms_wrapper.py
from .nms.cpu_nms import cpu_nms, cpu_soft_nms
from .nms.gpu_nms import gpu_nms
# def nms(dets, thresh, force_cpu=False):
#???? """Dispatch to either CPU or GPU NMS implementations."""
#???? if dets.shape[0] == 0:
#???????? return []
#???? if cfg.USE_GPU_NMS and not force_cpu:
#???????? return gpu_nms(dets, thresh, device_id=cfg.GPU_ID)
#???? else:
#???????? return cpu_nms(dets, thresh)
def nms(dets, thresh, force_cpu=False):
??? """Dispatch to either CPU or GPU NMS implementations."""
??? if dets.shape[0] == 0:
??? ????return []
??? if force_cpu:
??????? return cpu_soft_nms(dets, thresh, method = 1)
??????? #return cpu_nms(dets, thresh)
??? return gpu_nms(dets, thresh)
from .nms.py_cpu_nms import py_cpu_nms
def nms(dets, thresh, force_cpu=False):
??? """Dispatch to either CPU or GPU NMS implementations."""
??? if dets.shape[0] == 0:
??????? return []
??? if force_cpu:
??????? return py_cpu_nms(dets, thresh, method = 1)
??? return py_cpu_nms(dets, thresh)
-
修改train.py
parser.add_argument('-c', '--config', default='configs/m2det512_vgg.py')
修改數據的格式
parser.add_argument('-d', '--dataset', default='VOC', help='VOC or COCO dataset')
-
修改test.py
parser = argparse.ArgumentParser(description='M2Det Testing')
parser.add_argument('-c', '--config', default='configs/m2det512_vgg.py', type=str)#選擇配置文件,和訓練的配置文件對應
parser.add_argument('-d', '--dataset', default='VOC', help='VOC or COCO version')
parser.add_argument('-m', '--trained_model', default='weights/M2Det_VOC_size512_netvgg16_epoch30.pth', type=str, help='Trained state_dict file path to open')
parser.add_argument('--test', action='store_true', help='to submit a test file')
annopath = os.path.join(
??????????????????????? rootpath,
??????????????????????? 'Annotations',
??????????????????????? '{:s}.xml')
annopath = rootpath+'/Annotations/{:s}.xml'
測試結果:
-
可視化結果
修改demo.py中超參數
parser.add_argument('-c', '--config', default='configs/m2det512_vgg.py', type=str)
parser.add_argument('-f', '--directory', default='imgs/', help='the path to demo images')
parser.add_argument('-m', '--trained_model', default='weights/M2Det_VOC_size512_netvgg16_epoch30.pth', type=str, help='Trained state_dict file path to open')
然后將部分測試圖片放到imgs文件夾下面,運行demo.py.
本文實例:https://download.csdn.net/download/hhhhhhhhhhwwwwwwwwww/12428492
總結
以上是生活随笔為你收集整理的手把手教物体检测——M2Det的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对抗攻击FGSM的纯粹版FGNS
- 下一篇: 数据结构(C语言版)之队列