1. 程式人生 > >Fast RCNN 訓練自己資料集 (2修改資料讀取介面)

Fast RCNN 訓練自己資料集 (2修改資料讀取介面)

Fast RCNN訓練自己的資料集 (2修改讀寫介面)

這裡樓主講解了如何修改Fast RCNN訓練自己的資料集,首先請確保你已經安裝好了Fast RCNN的環境,具體的編配編制操作請參考我的上一篇文章。首先可以看到fast rcnn的工程目錄下有個Lib目錄
這裡下面存在3個目錄分別是:

  • datasets
  • fast_rcnn
  • roi_data_layer
  • utils

在這裡修改讀寫資料的介面主要是datasets目錄下,fast_rcnn下面主要存放的是python的訓練和測試指令碼,以及訓練的配置檔案,roi_data_layer下面存放的主要是一些ROI處理操作,utils下面存放的是一些通用操作比如非極大值nms,以及計算bounding box的重疊率等常用功能

1.構建自己的IMDB子類

1.1檔案概述

可有看到datasets目錄下主要有三個檔案,分別是

  • factory.py
  • imdb.py
  • pascal_voc.py

factory.py 學過設計模式的應該知道這是個工廠類,用類生成imdb類並且返回資料庫共網路訓練和測試使用
imdb.py 這裡是資料庫讀寫類的基類,分裝了許多db的操作,但是具體的一些檔案讀寫需要繼承繼續讀寫
pascal_voc.py Ross在這裡用pascal_voc.py這個類來操作

1.2 讀取檔案函式分析

接下來我來介紹一下pasca_voc.py這個檔案,我們主要是基於這個檔案進行修改,裡面有幾個重要的函式需要修改

  • def init(self, image_set, year, devkit_path=None)
    這個是初始化函式,它對應著的是pascal_voc的資料集訪問格式,其實我們將其介面修改的更簡單一點
  • def image_path_at(self, i)
    根據第i個影象樣本返回其對應的path,其呼叫了image_path_from_index(self, index)作為其具體實現
  • def image_path_from_index(self, index)
    實現了 image_path的具體功能
  • def _load_image_set_index(self)
    載入了樣本的list檔案
  • def _get_default_path(self)
    獲得資料集地址
  • def gt_roidb(self)
    讀取並返回ground_truth的db
  • def selective_search_roidb
    讀取並返回ROI的db
  • def _load_selective_search_roidb(self, gt_roidb)
    載入預選框的檔案
  • def selective_search_IJCV_roidb(self)
    在這裡呼叫讀取Ground_truth和ROI db並將db合併
  • def _load_selective_search_IJCV_roidb(self, gt_roidb)
    這裡是專門讀取作者在IJCV上用的dataset
  • def _load_pascal_annotation(self, index)
    這個函式是讀取gt的具體實現
  • def _write_voc_results_file(self, all_boxes)
    voc的檢測結果寫入到檔案
  • def _do_matlab_eval(self, comp_id, output_dir='output')
    根據matlab的evluation介面來做結果的分析
  • def evaluate_detections
    其呼叫了_do_matlab_eval
  • def competition_mode
    設定competitoin_mode,加了一些噪點

1.3訓練資料集格式

在我的檢測任務裡,我主要是從道路卡口資料中檢測車,因此我這裡只有background 和car兩類物體,為了操作方便,我不像pascal_voc資料集裡面一樣每個影象用一個xml來標註多類,先說一下我的資料格式

這裡是所有樣本的影象列表

我的GroundTruth資料的格式,第一個為影象路徑,之後1代表目標物的個數, 後面的座標代表左上右下的座標,座標的位置從1開始

這裡我要特別提醒一下大家,一定要注意座標格式,一定要注意座標格式,一定要注意座標格式,重要的事情說三遍!!!,要不然你會範很多錯誤都會是因為座標不一致引起的報錯

1.4修改讀取介面

這裡是原始的pascal_voc的init函式,在這裡,由於我們自己的資料集往往比voc的資料集要更簡單的一些,在作者額程式碼裡面用了很多的路徑拼接,我們不用去迎合他的格式,將這些操作簡單化即可,在這裡我會一一列舉每個我修改過的函式。這裡按照檔案中的順序排列。
原始初始化函式:

def __init__(self, image_set, year, devkit_path=None):
    datasets.imdb.__init__(self, 'voc_' + year + '_' + image_set)
    self._year = year
    self._image_set = image_set
    self._devkit_path = self._get_default_path() if devkit_path is None \
                        else devkit_path
    self._data_path = os.path.join(self._devkit_path, 'VOC' + self._year)
    self._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')
    self._class_to_ind = dict(zip(self.classes, xrange(self.num_classes)))
    self._image_ext = '.jpg'
    self._image_index = self._load_image_set_index()
    # Default to roidb handler
    self._roidb_handler = self.selective_search_roidb

    # PASCAL specific config options
    self.config = {'cleanup'  : True,
                   'use_salt' : True,
                   'top_k'    : 2000}

    assert os.path.exists(self._devkit_path), \
            'VOCdevkit path does not exist: {}'.format(self._devkit_path)
    assert os.path.exists(self._data_path), \
            'Path does not exist: {}'.format(self._data_path)

修改後的初始化函式:

 def __init__(self, image_set, devkit_path=None):
    datasets.imdb.__init__(self, image_set)#imageset 為train  test
    self._image_set = image_set
    self._devkit_path = devkit_path
    self._data_path = os.path.join(self._devkit_path)
    self._classes = ('__background__','car')#包含的類
    self._class_to_ind = dict(zip(self.classes, xrange(self.num_classes)))#構成字典{'__background__':'0','car':'1'}
    self._image_index = self._load_image_set_index('ImageList_Version_S_AddData.txt')#新增檔案列表
    # Default to roidb handler
    self._roidb_handler = self.selective_search_roidb
    # PASCAL specific config options
    self.config = {'cleanup'  : True,
                   'use_salt' : True,
                   'top_k'    : 2000}
    assert os.path.exists(self._devkit_path), \
            'VOCdevkit path does not exist: {}'.format(self._devkit_path)
    assert os.path.exists(self._data_path), \
            'Path does not exist: {}'.format(self._data_path)

原始的image_path_from_index:

def image_path_from_index(self, index):
    """
    Construct an image path from the image's "index" identifier.
    """
    image_path = os.path.join(self._data_path, 'JPEGImages',
                              index + self._image_ext)
    assert os.path.exists(image_path), \
            'Path does not exist: {}'.format(image_path)
    return image_path

修改後的image_path_from_index:

 def image_path_from_index(self, index):#根據_image_index獲取影象路徑
    """
    Construct an image path from the image's "index" identifier.
    """
    image_path = os.path.join(self._data_path, index)
    assert os.path.exists(image_path), \
            'Path does not exist: {}'.format(image_path)
    return image_path

原始的 _load_image_set_index:

 def _load_image_set_index(self):
    """
    Load the indexes listed in this dataset's image set file.
    """
    # Example path to image set file:
    # self._devkit_path + /VOCdevkit2007/VOC2007/ImageSets/Main/val.txt
    image_set_file = os.path.join(self._data_path, 'ImageSets', 'Main',
                                  self._image_set + '.txt')
    assert os.path.exists(image_set_file), \
            'Path does not exist: {}'.format(image_set_file)
    with open(image_set_file) as f:
        image_index = [x.strip() for x in f.readlines()]
    return image_index

修改後的 _load_image_set_index:

def _load_image_set_index(self, imagelist):#已經修改
    """
    Load the indexes listed in this dataset's image set file.
    """
    # Example path to image set file:
    # self._devkit_path + /VOCdevkit2007/VOC2007/ImageSets/Main/val.txt
    #/home/chenjie/KakouTrainForFRCNN_1/DataSet/KakouTrainFRCNN_ImageList.txt
    image_set_file = os.path.join(self._data_path, imagelist)# load ImageList that only contain ImageFileName
    assert os.path.exists(image_set_file), \
            'Path does not exist: {}'.format(image_set_file)
    with open(image_set_file) as f:
        image_index = [x.strip() for x in f.readlines()]
    return image_index

函式 _get_default_path,我直接刪除了

原始的gt_roidb:

def gt_roidb(self):
    """
    Return the database of ground-truth regions of interest.

    This function loads/saves from/to a cache file to speed up future calls.
    """
    cache_file = os.path.join(self.cache_path, self.name + '_gt_roidb.pkl')
    if os.path.exists(cache_file):
        with open(cache_file, 'rb') as fid:
            roidb = cPickle.load(fid)
        print '{} gt roidb loaded from {}'.format(self.name, cache_file)
        return roidb

    gt_roidb = [self._load_pascal_annotation(index)
                for index in self.image_index]
    with open(cache_file, 'wb') as fid:
        cPickle.dump(gt_roidb, fid, cPickle.HIGHEST_PROTOCOL)
    print 'wrote gt roidb to {}'.format(cache_file)

    return gt_roidb

修改後的gt_roidb:

def gt_roidb(self):
    """
    Return the database of ground-truth regions of interest.

    This function loads/saves from/to a cache file to speed up future calls.
    """
    cache_file = os.path.join(self.cache_path, self.name + '_gt_roidb.pkl')
    if os.path.exists(cache_file):#若存在cache file則直接從cache file中讀取
        with open(cache_file, 'rb') as fid:
            roidb = cPickle.load(fid)
        print '{} gt roidb loaded from {}'.format(self.name, cache_file)
        return roidb

    gt_roidb = self._load_annotation()  #已經修改,直接讀入整個GT檔案
    with open(cache_file, 'wb') as fid:
        cPickle.dump(gt_roidb, fid, cPickle.HIGHEST_PROTOCOL)
    print 'wrote gt roidb to {}'.format(cache_file)

    return gt_roidb

原始的selective_search_roidb(self):

def selective_search_roidb(self):
    """
    Return the database of selective search regions of interest.
    Ground-truth ROIs are also included.

    This function loads/saves from/to a cache file to speed up future calls.
    """
    cache_file = os.path.join(self.cache_path,
                              self.name + '_selective_search_roidb.pkl')

    if os.path.exists(cache_file):
        with open(cache_file, 'rb') as fid:
            roidb = cPickle.load(fid)
        print '{} ss roidb loaded from {}'.format(self.name, cache_file)
        return roidb

    if int(self._year) == 2007 or self._image_set != 'test':
        gt_roidb = self.gt_roidb()
        ss_roidb = self._load_selective_search_roidb(gt_roidb)
        roidb = datasets.imdb.merge_roidbs(gt_roidb, ss_roidb)
    else:
        roidb = self._load_selective_search_roidb(None)
    with open(cache_file, 'wb') as fid:
        cPickle.dump(roidb, fid, cPickle.HIGHEST_PROTOCOL)
    print 'wrote ss roidb to {}'.format(cache_file)

    return roidb

修改後的selective_search_roidb(self):
這裡有個pkl檔案我需要特別說明一下,如果你再次訓練的時候修改了資料庫,比如新增或者刪除了一些樣本,但是你的資料庫名字函式原來那個,比如我這裡訓練的資料庫叫KakouTrain,必須要在data/cache/目錄下把資料庫的快取檔案.pkl給刪除掉,否則其不會重新讀取相應的資料庫,而是直接從之前讀入然後快取的pkl檔案中讀取進來,這樣修改的資料庫並沒有進入網路,而是載入了老版本的資料。

def selective_search_roidb(self):#已經修改
    """
    Return the database of selective search regions of interest.
    Ground-truth ROIs are also included.

    This function loads/saves from/to a cache file to speed up future calls.
    """
    cache_file = os.path.join(self.cache_path,self.name + '_selective_search_roidb.pkl')

    if os.path.exists(cache_file): #若存在cache_file則讀取相對應的.pkl檔案
        with open(cache_file, 'rb') as fid:
            roidb = cPickle.load(fid)
        print '{} ss roidb loaded from {}'.format(self.name, cache_file)
        return roidb
    if self._image_set !='KakouTest':
        gt_roidb = self.gt_roidb()
        ss_roidb = self._load_selective_search_roidb(gt_roidb)
        roidb = datasets.imdb.merge_roidbs(gt_roidb, ss_roidb)
    else:
        roidb = self._load_selective_search_roidb(None)
    with open(cache_file, 'wb') as fid:
        cPickle.dump(roidb, fid, cPickle.HIGHEST_PROTOCOL)
    print 'wrote ss roidb to {}'.format(cache_file)

    return roidb

原始的_load_selective_search_roidb(self, gt_roidb):

 def _load_selective_search_roidb(self, gt_roidb):
    filename = os.path.abspath(os.path.join(self.cache_path, '..',
                                            'selective_search_data',
                                            self.name + '.mat'))
    assert os.path.exists(filename), \
           'Selective search data not found at: {}'.format(filename)
    raw_data = sio.loadmat(filename)['boxes'].ravel()

    box_list = []
    for i in xrange(raw_data.shape[0]):
        box_list.append(raw_data[i][:, (1, 0, 3, 2)] - 1)

    return self.create_roidb_from_box_list(box_list, gt_roidb)

修改後的_load_selective_search_roidb(self, gt_roidb):
這裡原作者用的是Selective_search,但是我用的是EdgeBox的方法來提取Mat,我沒有修改函式名,只是把輸入的Mat檔案給替換了,Edgebox實際的效果比selective_search要好,速度也要更快,具體的EdgeBox程式碼大家可以在Ross的tutorial中看到地址。
注意,這裡非常關鍵!!!!!,由於Selective_Search中的OP返回的座標順序需要調整,並不是左上右下的順序,可以看到在下面box_list.append()中有一個(1,0,3,2)的操作,不管你用哪種OP方法,輸入的座標都應該是x1 y1 x2 y2,不要弄成w h 那種格式,也不要調換順序。座標-1,預設座標從0開始,樓主提醒各位,一定要非常注意座標順序,大小,邊界,格式問題,否則你會被錯誤折騰死的!!!

def _load_selective_search_roidb(self, gt_roidb):#已經修改
    #filename = os.path.abspath(os.path.join(self.cache_path, '..','selective_search_data',self.name + '.mat'))
    filename = os.path.join(self._data_path, 'EdgeBox_Version_S_AddData.mat')#這裡輸入相對應的預選框檔案路徑
    assert os.path.exists(filename), \
           'Selective search data not found at: {}'.format(filename)
    raw_data = sio.loadmat(filename)['boxes'].ravel()

    box_list = []
    for i in xrange(raw_data.shape[0]):
        #box_list.append(raw_data[i][:,(1, 0, 3, 2)] - 1)#原來的Psacalvoc調換了列,我這裡box的順序是x1 ,y1,x2,y2 由EdgeBox格式為x1,y1,w,h經過修改
        box_list.append(raw_data[i][:,:] -1)

    return self.create_roidb_from_box_list(box_list, gt_roidb)

原始的_load_selective_search_IJCV_roidb,我沒用這個資料集,因此不修改這個函式

原始的_load_pascal_annotation(self, index):

def _load_pascal_annotation(self, index):
    """
    Load image and bounding boxes info from XML file in the PASCAL VOC
    format.
    """
    filename = os.path.join(self._data_path, 'Annotations', index + '.xml')
    # print 'Loading: {}'.format(filename)
    def get_data_from_tag(node, tag):
        return node.getElementsByTagName(tag)[0].childNodes[0].data

    with open(filename) as f:
        data = minidom.parseString(f.read())

    objs = data.getElementsByTagName('object')
    num_objs = len(objs)

    boxes = np.zeros((num_objs, 4), dtype=np.uint16)
    gt_classes = np.zeros((num_objs), dtype=np.int32)
    overlaps = np.zeros((num_objs, self.num_classes), dtype=np.float32)

    # Load object bounding boxes into a data frame.
    for ix, obj in enumerate(objs):
        # Make pixel indexes 0-based
        x1 = float(get_data_from_tag(obj, 'xmin')) - 1
        y1 = float(get_data_from_tag(obj, 'ymin')) - 1
        x2 = float(get_data_from_tag(obj, 'xmax')) - 1
        y2 = float(get_data_from_tag(obj, 'ymax')) - 1
        cls = self._class_to_ind[
                str(get_data_from_tag(obj, "name")).lower().strip()]
        boxes[ix, :] = [x1, y1, x2, y2]
        gt_classes[ix] = cls
        overlaps[ix, cls] = 1.0

    overlaps = scipy.sparse.csr_matrix(overlaps)

    return {'boxes' : boxes,
            'gt_classes': gt_classes,
            'gt_overlaps' : overlaps,
            'flipped' : False}

修改後的_load_pascal_annotation(self, index):

def _load_annotation(self):
    """
    Load image and bounding boxes info from annotation
    format.
    """
    #,此函式作用讀入GT檔案,我的檔案的格式 CarTrainingDataForFRCNN_1\Images\2015011100035366101A000131.jpg 1 147 65 443 361 
    gt_roidb = []
    annotationfile = os.path.join(self._data_path, 'ImageList_Version_S_GT_AddData.txt')
    f = open(annotationfile)
    split_line = f.readline().strip().split()
    num = 1
    while(split_line):
        num_objs = int(split_line[1])
        boxes = np.zeros((num_objs, 4), dtype=np.uint16)
        gt_classes = np.zeros((num_objs), dtype=np.int32)
        overlaps = np.zeros((num_objs, self.num_classes), dtype=np.float32)
        for i in range(num_objs):
            x1 = float( split_line[2 + i * 4])
            y1 = float (split_line[3 + i * 4])
            x2 = float (split_line[4 + i * 4])
            y2 = float (split_line[5 + i * 4])
            cls = self._class_to_ind['car']
            boxes[i,:] = [x1, y1, x2, y2]
            gt_classes[i] = cls
            overlaps[i,cls] = 1.0

        overlaps = scipy.sparse.csr_matrix(overlaps)
        gt_roidb.append({'boxes' : boxes, 'gt_classes': gt_classes, 'gt_overlaps' : overlaps, 'flipped' : False})
        split_line = f.readline().strip().split()

    f.close()
    return gt_roidb

之後的這幾個函式我都沒有修改,檢測結果,我是修改了demo.py這個檔案,直接生成txt檔案,然後用python opencv直接視覺化,沒有用著裡面的介面,感覺太麻煩了,先怎麼方便怎麼來

  • _write_voc_results_file(self, all_boxes)
  • _do_matlab_eval(self, comp_id, output_dir='output')
  • evaluate_detections(self, all_boxes, output_dir)
  • competition_mode(self, on)

記得在最後的__main__下面也修改相應的路徑
d = datasets.pascal_voc('trainval', '2007')
改成
d = datasets.kakou('KakouTrain', '/home/chenjie/KakouTrainForFRCNN_1')

並且同時在檔案的開頭import 裡面也做修改
import datasets.pascal_voc
改成
import datasets.kakou

OK,在這裡我們已經完成了整個的讀取介面的改寫,主要是將GT和預選框Mat檔案讀取並返回

2.修改factory.py

當網路訓練時會呼叫factory裡面的get方法獲得相應的imdb,
首先在檔案頭import 把pascal_voc改成kakou
在這個檔案作者生成了多個數據庫的路徑,我們自己資料庫只要給定根路徑即可,修改主要有以下4個

  • 因此將裡面的def _selective_search_IJCV_top_k函式整個註釋掉
  • 函式之後有兩個多級的for迴圈,也將其註釋
  • 直接定義imageset和devkit
  • 修改get_imdb函式

原始的factory.py:

__sets = {}

import datasets.pascal_voc
import numpy as np

def _selective_search_IJCV_top_k(split, year, top_k):
    """Return an imdb that uses the top k proposals from the selective search
    IJCV code.
    """
    imdb = datasets.pascal_voc(split, year)
    imdb.roidb_handler = imdb.selective_search_IJCV_roidb
    imdb.config['top_k'] = top_k
    return imdb

# Set up voc_<year>_<split> using selective search "fast" mode
for year in ['2007', '2012']:
    for split in ['train', 'val', 'trainval', 'test']:
        name = 'voc_{}_{}'.format(year, split)
        __sets[name] = (lambda split=split, year=year:
                datasets.pascal_voc(split, year))

# Set up voc_<year>_<split>_top_<k> using selective search "quality" mode
# but only returning the first k boxes
for top_k in np.arange(1000, 11000, 1000):
    for year in ['2007', '2012']:
        for split in ['train', 'val', 'trainval', 'test']:
            name = 'voc_{}_{}_top_{:d}'.format(year, split, top_k)
            __sets[name] = (lambda split=split, year=year, top_k=top_k:
                    _selective_search_IJCV_top_k(split, year, top_k))

def get_imdb(name):
    """Get an imdb (image database) by name."""
    if not __sets.has_key(name):
        raise KeyError('Unknown dataset: {}'.format(name))
    return __sets[name]()

def list_imdbs():
    """List all registered imdbs."""
    return __sets.keys()

修改後的factory.py

#import datasets.pascal_voc
import datasets.kakou
import numpy as np

__sets = {}
imageset = 'KakouTrain'
devkit = '/home/chenjie/DataSet/CarTrainingDataForFRCNN_1/Images_Version_S_AddData'
#def _selective_search_IJCV_top_k(split, year, top_k):
#    """Return an imdb that uses the top k proposals from the selective search
#    IJCV code.
#    """
#    imdb = datasets.pascal_voc(split, year)
#    imdb.roidb_handler = imdb.selective_search_IJCV_roidb
#    imdb.config['top_k'] = top_k
#    return imdb

### Set up voc_<year>_<split> using selective search "fast" mode
##for year in ['2007', '2012']:
##    for split in ['train', 'val', 'trainval', 'test']:
##        name = 'voc_{}_{}'.format(year, split)
##        __sets[name] = (lambda split=split, year=year:
##                datasets.pascal_voc(split, year))

# Set up voc_<year>_<split>_top_<k> using selective search "quality" mode
# but only returning the first k boxes
##for top_k in np.arange(1000, 11000, 1000):
##    for year in ['2007', '2012']:
##        for split in ['train', 'val', 'trainval', 'test']:
##            name = 'voc_{}_{}_top_{:d}'.format(year, split, top_k)
##            __sets[name] = (lambda split=split, year=year, top_k=top_k:
##                    _selective_search_IJCV_top_k(split, year, top_k))


def get_imdb(name):
    """Get an imdb (image database) by name."""
    __sets['KakouTrain'] = (lambda imageset = imageset, devkit = devkit: datasets.kakou(imageset,devkit))
    if not __sets.has_key(name):
        raise KeyError('Unknown dataset: {}'.format(name))
    return __sets[name]()

def list_imdbs():
    """List all registered imdbs."""
    return __sets.keys()

3.修改 __init__.py
在行首新增上 from .kakou import kakou

總結

在這裡終於改完了讀取介面的所有內容,主要步驟是

  1. 複製pascal_voc,改名字,修改GroundTruth和OP預選框的讀取方式
  2. 修改factory.py,修改資料庫路徑和獲得方式
  3. __init__.py新增上改完的py檔案

下面列出一些需要注意的地方

  1. 讀取方式怎麼方便怎麼來,並不一定要按照裡面xml的格式,因為大家自己應用到工程中去往往不會是非常多的類別,單個物件的直接用txt就可以
  2. 座標的順序我再說一次,要左上右下,並且x1必須要小於x2,這個是基本,反了會在座標水平變換的時候會出錯,座標從0開始,如果已經是0,則不需要再-1
  3. GT的路徑最好用相對,別用絕對,然後路徑拼接的時候要注意,然後如果是txt是windows下生成的,注意斜槓的方向和編碼的格式,中文路徑編碼必須用UTF-8無BOM格式,不能用windows自帶的記事本直接換一種編碼儲存,相關資料集的編碼問題參見我的另一篇文章,linux傳輸亂碼
  4. 關於Mat檔案,在訓練時是將所有影象的OP都合在了一起,是一個很大的Mat檔案,注意其中影象list的順序千萬不能錯,並且座標格式要修改為x1 y1 x2 y2,每種OP生成的座標順序要小心,從0開始還是從1開始也要小心
  5. 訓練影象的大小不要太大,否則生成的OP也會太多,速度太慢,影象樣本大小最好調整到500,600左右,然後再提取OP
  6. 如果讀取並生成pkl檔案之後,實際資料內容或者順序還有問題,記得要把data/cache/下面的pkl檔案給刪掉

關於下部訓練和檢測網路,我將在下一篇文章中說明

相關推薦

Fast RCNN 訓練自己資料 (2修改資料讀取介面)

Fast RCNN訓練自己的資料集 (2修改讀寫介面) 這裡樓主講解了如何修改Fast RCNN訓練自己的資料集,首先請確保你已經安裝好了Fast RCNN的環境,具體的編配編制操作請參考我的上一篇文章。首先可以看到fast rcnn的工程目錄下有個Lib目錄 這裡下面存在3個目錄分別是: datase

Fast RCNN 訓練自己資料 (1編譯配置)

FastRCNN 訓練自己資料集 (1編譯配置) FastRCNN是Ross Girshick在RCNN的基礎上增加了Multi task training整個的訓練過程和測試過程比RCNN快了許多。別的一些細節不展開,過幾天會上傳Fast RCNN的論文筆記。FastRCNN mAP效能上略有上升。Fa

Fast RCNN 訓練自己資料(3訓練和檢測)

1.預訓練模型介紹 首先在data目錄下,有兩個目錄就是之前在1中解壓好 fast_rcnn_models/ imagenet_models/ fast_rcnn_model資料夾下面是作者用fast rcnn訓練好的三個網路,分別對應著小、中、大型網路,大家可以試用一下這幾個網路,看一些檢測效果,

fast rcnn 訓練自己資料訓練和檢測)

1.預訓練模型介紹 首先在data目錄下,有兩個目錄就是之前在1中解壓好 fast_rcnn_models/imagenet_models/ fast_rcnn_model資料夾下面是作者用fast rcnn訓練好的三個網路,分別對應著小、中、大型網路,大家可

py-faster-rcnn訓練自己資料需要修改的引數

faster rcnn預設有三種網路模型ZF(小)、VGG_CNN_M_1024(中)、VGG16 (大) 訓練圖片大小為500*500,類別數1。 修改VGG_CNN_M_1024模型配置

使用pytorch版faster-rcnn訓練自己資料

使用pytorch版faster-rcnn訓練自己資料集 引言 faster-rcnn pytorch程式碼下載 訓練自己資料集 接下來工作 參考文獻 引言 最近在復現目標檢測程式碼(師兄強烈推薦F

用Faster RCNN訓練自己資料

Faster RCNN(py caffe)工程各個目錄的作用: caffe-fast-rcnn:caffe框架目錄; data:用來存放pretrained(預訓練)模型以及讀取檔案的cache快取,還有一些下載模型的指令碼; experiments:存放配置

Caffe學習系列——Faster-RCNN訓練自己資料

由於要實現服裝的目標檢測,所以一直在研究Faster-RCNN 。講到目標檢測,不得不提到rbg大神的深度神經網路檢測算法系列RCNN、Fast-RCNN、Faster-RCNN,其還在github上開源了自己的程式碼,造福廣大碼農。這是rbg大神的主頁 https://people.eecs.berk

Faster RCNN 訓練自己資料遇到的一些問題

1. xml標籤格式問題 原本的標籤是yaml格式的,需要轉換成xml格式。 在製作xml標籤時,有些資訊是比較重要的不能省略 <?xml version="1.0" encoding="utf-8"?> <annotation> <folder>

不能再詳細!!!手把手教你用Faster-RCNN訓練自己資料

一、環境安裝準備 python2.7以及相關的包cython, python-opencv, easydict 本文假設你已經按照上面的教程完成了安裝,並可以執行demo.py 並且可以訓練 二、準備自己的資料集 在實際的應用中,這個資料集肯定是自己專案裡面拍攝的。

深度學習Caffe實戰筆記(20)Windows平臺 Faster-RCNN 訓練自己資料

1、把自己的資料集放到Faster-master中 我覺得這個過程是最重要的一個過程吧,博主在這裡跳了很多的坑,最後找到了一個非常簡單高效的方法。不用修改任何檔案,就可以輕鬆實現載入自己的資料集。 在faster_rcnn-master資料夾下,有一個d

Faster-RCNN 訓練自己資料的坑記錄

主要照這篇部落格進行訓練配置,因為沒有GPU所以好多坑,CPU訓練可以參見這篇部落格 正所謂,跑通了的都一樣,錯誤千萬樣。按照教程來也是坑多 訓練: python train_faster_rcnn_alt_opt.py --net_name ZF --weights

caffe訓練自己資料——2. 開始訓練

一、配置檔案 1. 網路結構 henet_car_train_test.prototxt #name: "LeNet" layer { name: "mnist" type: "Data" top: "data" top: "lab

利用faster rcnn 訓練自己資料——kitti資料

前言:非常感謝https://blog.csdn.net/flztiii/article/details/73881954,這篇部落格,本文主要參考這篇文章kitti資料集是一個車輛檢測的資料集資料集的準備Kitti資料集的下載只需要第一個圖片集(12G)和標註檔案即可【第一

win10 tensorflow faster rcnn訓練自己資料(一、製作VOC2007資料

參考部落格:http://blog.csdn.net/gaohuazhao/article/details/60871886 一、關於VOC資料集: 1)JPEGImages資料夾 資料夾裡包含了訓練圖片和測試圖片,混放在一起 2)Annatations資料夾 資

Mask Rcnn訓練自己資料

最近在學習官方版的   Mask-Rcnn , 已經能夠訓練 , 下面簡述下使用自己資料集訓練的方法。經過測試驗證官方版的Mask-Rcnn是可以直接使用COCO資料集進行訓練的,所以本文也是COCO格式的資料集的製作方法。一,labelme標註資料集       製作資料

Pytorch打怪路(三)Pytorch建立自己資料2

前面一篇寫建立資料集的博文--- 是介紹的應用於影象分類任務的資料集,即輸入為一個影象和它的類別數字標籤,本篇介紹輸入的標籤label亦為影象的資料集,幷包含一些常用的處理手段。比如做影象語義分割時就會用到這種資料輸入方式。 1、資料集簡介 以VOC20

使用faster rcnn訓練自己資料(py-faster-rcnn

出於在csdn上面學到很多東西這裡也幫自己的一些收穫和大家分享一下     直奔主題~~ 前提是已經安裝好caffe的環境 本文是在Ubuntu 15.04下做的測試 $Faster_rcnn表示py-faster-rcnn根目錄 1. 修改資料介面 ($Faster_rc

faster-rcnn訓練自己資料時報錯too many indices

利用faster-rcnn 好不容易四個階段訓練完了,在測試的時候出現這個錯誤。 原因:在data/VOCdevkit2007/results/VOC2007/Main/  這個檔案下有n個txt檔案。n是你的類別數            每個txt儲存了test.txt

機器學習保險行業問答開放資料: 2. 使用案例

在上一篇文章中,介紹了資料集的設計,該語料可以用於研究和學習,從規模和質量上,是目前中文問答語料中,保險行業垂直領域最優秀的語料,關於該語料製作過程可以通過語料主頁瞭解,本篇的主要內容是使用該語料實現一個簡單的問答模型,並且給出準確度和損失函式作為資