日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

faster-rcnn系列学习之准备数据

發(fā)布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 faster-rcnn系列学习之准备数据 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? ? ? ? ? ? 如下列舉了 將數(shù)據(jù)集做成VOC2007格式用于Faster-RCNN訓(xùn)練的相關(guān)鏈接。

  • RCNN系列實驗的PASCAL VOC數(shù)據(jù)集格式設(shè)置?
  • 制作VOC2007數(shù)據(jù)集用于Faster-RCNN訓(xùn)練
  • 將數(shù)據(jù)集做成VOC2007格式用于Faster-RCNN訓(xùn)練
    這一篇比較詳細地介紹了如何制造voc2007的所有文件,內(nèi)含相關(guān)軟件和代碼,值得一看。
  • voc2007數(shù)據(jù)集的下載和解壓
  • 下面的部分介紹了py-faster-rcnn源碼中關(guān)于產(chǎn)生imdb與roidb的方法。

  • ? ??faster-rcnn 之訓(xùn)練數(shù)據(jù)是如何準備的:imdb和roidb的產(chǎn)生
  • faster rcnn源碼解讀(四)之數(shù)據(jù)類型imdb.py和pascal_voc.py(主要是imdb和roidb數(shù)據(jù)類型的解說)
  • py-faster-rcnn源碼解讀系列(二)——pascal_voc.py

  • 具體的訓(xùn)練方法: Faster-RCNN+ZF用自己的數(shù)據(jù)集訓(xùn)練模型(Python版本)

    這里簡單說一下Imdb與roidb。

    imdb是作者封裝的一個圖片數(shù)據(jù)庫類,內(nèi)含數(shù)據(jù)庫的名字,比如默認的是voc_2007_trainval ,部分定義如下:

    class imdb(object):"""Image database."""def __init__(self, name):self._name = nameself._num_classes = 0self._classes = []self._image_index = []self._obj_proposer = 'selective_search'self._roidb = Noneself._roidb_handler = self.default_roidb #(handle本來是指針,這里就當做引用)# Use this dict for storing dataset specific config optionsself.config = {}@propertydef name(self):return self._name@propertydef num_classes(self):return len(self._classes)@propertydef classes(self):return self._classes@propertydef image_index(self):return self._image_index@propertydef roidb_handler(self):return self._roidb_handler@roidb_handler.setterdef roidb_handler(self, val):self._roidb_handler = val ##!!!!!!設(shè)置roidbdef set_proposal_method(self, method):method = eval('self.' + method + '_roidb') # python中eval是可以具體運行里面的字符串的,這里指運行:self.gt_roidb,函數(shù)在pascal_voc.py中。self.roidb_handler = method@propertydef roidb(self):# A roidb is a list of dictionaries, each with the following keys:# boxes# gt_overlaps# gt_classes# flippedif self._roidb is not None:return self._roidbself._roidb = self.roidb_handler()return self._roidb#cache_path: /data1/caiyong.wang/program/py-faster-rcnn.back_up/data/cache 緩沖路徑@propertydef cache_path(self):cache_path = osp.abspath(osp.join(cfg.DATA_DIR, 'cache'))if not os.path.exists(cache_path):os.makedirs(cache_path)return cache_path@propertydef num_images(self):return len(self.image_index)其中包含了roidb,roidb翻譯過來就是roi database.其實就是目標檢測包圍盒,從上面也可以看出, roidb是字典的列表,每項都是一張圖片,如下的每一項都是一張圖片上多個盒子的信息,因此是二維數(shù)組

    # A roidb is a list of dictionaries, each with the following keys:
    ?#??- ?boxes 一個二維數(shù)組 ? 每一行存儲 xmin ymin xmax ymax ,行指的多個box的序號
    # - ?gt_classes存儲了每個box所對應(yīng)的類索引(類數(shù)組在初始化函數(shù)中聲明)
    # - ?overlap是一個二維數(shù)組,行指box的序號,列共有21列,存儲的是0.0或者1.0 ,當box對應(yīng)的類別時,自然為1.0.這實際上是指對于ground truth box,由于這里的候選框就是ground truth box,所以自然重疊后為1,而與其他的自然重疊設(shè)為0.后來被轉(zhuǎn)成了稀疏矩陣.
    # - ?seg _areas存儲著 box的面積
    #- ?flipped 為false 代表該圖片還未被翻轉(zhuǎn)(后來在train.py里會將翻轉(zhuǎn)的圖片加進去,用該變量用于區(qū)分)


    產(chǎn)生imdb與roidb的主要代碼是:

    def get_roidb(imdb_name, rpn_file=None):imdb = get_imdb(imdb_name)#通過工廠類獲取數(shù)據(jù)庫信息print 'Loaded dataset `{:s}` for training'.format(imdb.name)imdb.set_proposal_method(cfg.TRAIN.PROPOSAL_METHOD)print 'Set proposal method: {:s}'.format(cfg.TRAIN.PROPOSAL_METHOD)if rpn_file is not None:imdb.config['rpn_file'] = rpn_fileroidb = get_training_roidb(imdb)#獲得訓(xùn)練數(shù)據(jù)return roidb, imdb
    步驟是
    1. 通過 lib/datasets/factory.py獲取pascal_voc對象。

    2.?pascal_voc繼承自imdb,進一步定義了該數(shù)據(jù)庫下的一些函數(shù)。

    如下是pascal_voc的一些成員舉例:

    #下面是成員變量的初始化: #{ # year:’2007’ # name:'voc_2007_trainval' # image _set:’trainval’ # devkit _path:’data/VOCdevkit2007’ # data _path:’data /VOCdevkit2007/VOC2007’ # classes:(…)_如果想要訓(xùn)練自己的數(shù)據(jù),需要修改這里_ # class _to _ind:{…} _一個將類名轉(zhuǎn)換成下標的字典 _ # image _ext:’.jpg’ # image _index: [‘000001’,’000003’,……]_根據(jù)trainval.txt獲取到的image索引_ # roidb _handler: <Method gt_roidb > # salt: <Object uuid > # comp _id:’comp4’ # config:{…} #}

    3.?通過 lib/datasets/imdb.py 中的set_proposal_method 獲取roidb.

    def set_proposal_method(self, method):method = eval('self.' + method + '_roidb') # python中eval是可以具體運行里面的字符串的,這里指運行:self.gt_roidb,函數(shù)在pascal_voc.py中。self.roidb_handler = method這里默認是eval('self.gt_roidb'),self.gt_roidb,函數(shù)在pascal_voc.py中。定義了ground truth的box的一些信息。

    4. 通過lib/fast rcnn/train.py中的如下函數(shù)獲取訓(xùn)練數(shù)據(jù)。

    def get_training_roidb(imdb):"""Returns a roidb (Region of Interest database) for use in training."""if cfg.TRAIN.USE_FLIPPED:print 'Appending horizontally-flipped training examples...'imdb.append_flipped_images()print 'done'print 'Preparing training data...'rdl_roidb.prepare_roidb(imdb)print 'done'return imdb.roidb
    這里面進行了圖片的翻轉(zhuǎn),其實是box的翻轉(zhuǎn)(見?lib/datasets/imdb.py/append_flipped_images)

    以及l(fā)ib/roi_data_layer/roidb/rdl_roidb對象的prepare_roidb ,這個函數(shù)豐富了roi的一些信息,新增了每一個圖片的roidb的圖片路徑,大小,以及每個box對應(yīng)的最大重疊,和最大重疊對應(yīng)的label等。

    def prepare_roidb(imdb):"""Enrich the imdb's roidb by adding some derived quantities thatare useful for training. This function precomputes the maximumoverlap, taken over ground-truth boxes, between each ROI andeach ground-truth box. The class with maximum overlap is alsorecorded."""sizes = [PIL.Image.open(imdb.image_path_at(i)).sizefor i in xrange(imdb.num_images)]roidb = imdb.roidbfor i in xrange(len(imdb.image_index)): #此時如果在前面調(diào)用了imdb.append_flipped_images,則imdb.image_index已經(jīng)翻倍。roidb[i]['image'] = imdb.image_path_at(i)roidb[i]['width'] = sizes[i][0]roidb[i]['height'] = sizes[i][1]# need gt_overlaps as a dense array for argmaxgt_overlaps = roidb[i]['gt_overlaps'].toarray()# max overlap with gt over classes (columns)max_overlaps = gt_overlaps.max(axis=1)# gt class that had the max overlapmax_classes = gt_overlaps.argmax(axis=1)roidb[i]['max_classes'] = max_classesroidb[i]['max_overlaps'] = max_overlaps# sanity checks# max overlap of 0 => class should be zero (background)zero_inds = np.where(max_overlaps == 0)[0]assert all(max_classes[zero_inds] == 0)# max overlap > 0 => class should not be zero (must be a fg class)nonzero_inds = np.where(max_overlaps > 0)[0]assert all(max_classes[nonzero_inds] != 0)







    總結(jié)

    以上是生活随笔為你收集整理的faster-rcnn系列学习之准备数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。