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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

faster rcnn源码解读(四)之数据类型imdb.py和pascal_voc.py(主要是imdb和roidb数据类型的解说)

發布時間:2025/3/21 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 faster rcnn源码解读(四)之数据类型imdb.py和pascal_voc.py(主要是imdb和roidb数据类型的解说) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載自:faster rcnn源碼解讀(四)之數據類型imdb.py和pascal_voc.py(主要是imdb和roidb數據類型的解說) - 野孩子的專欄 - 博客頻道 - CSDN.NET

http://blog.csdn.net/u010668907/article/details/51945719

faster用python版本的https://github.com/rbgirshick/py-faster-rcnn

imdb.py源碼地址:https://github.com/rbgirshick/py-faster-rcnn/blob/master/lib/datasets/imdb.py

imdb源碼:

[python]?view plaincopy print?
  • #?--------------------------------------------------------??
  • #?Fast?R-CNN??
  • #?Copyright?(c)?2015?Microsoft??
  • #?Licensed?under?The?MIT?License?[see?LICENSE?for?details]??
  • #?Written?by?Ross?Girshick??
  • #?--------------------------------------------------------??
  • ??
  • import?os??
  • import?os.path?as?osp??
  • import?PIL??
  • from?utils.cython_bbox?import?bbox_overlaps??
  • import?numpy?as?np??
  • import?scipy.sparse??
  • from?fast_rcnn.config?import?cfg??
  • ??
  • class?imdb(object):??
  • ????"""Image?database."""??
  • ??
  • ????def?__init__(self,?name):??
  • ????????self._name?=?name??
  • ????????self._num_classes?=?0#<span?style="font-family:?Arial,?Helvetica,?sans-serif;">類別的長度</span>??
  • ????????self._classes?=?[]#<span?style="font-family:?Arial,?Helvetica,?sans-serif;">類別定義</span>??
  • ????????self._image_index?=?[]#<span?style="font-family:?Arial,?Helvetica,?sans-serif;">a?list?of?image?name(read?from?eg:</span><span?style="font-family:?Arial,?Helvetica,?sans-serif;">root/data?+?/VOCdevkit2007/VOC2007/ImageSets/Main/{image_set}.txt)</span><span?style="font-family:?Arial,?Helvetica,?sans-serif;">??
  • </span>????????self._obj_proposer?=?'selective_search'??
  • ????????self._roidb?=?None#gt_roidb(cfg.TRAIN.PROPOSAL_METHOD=gt導致了此操作)??
  • ????????self._roidb_handler?=?self.default_roidb??
  • ????????#?Use?this?dict?for?storing?dataset?specific?config?options??
  • ????????self.config?=?{}??
  • ?
  • ????@property??
  • ????def?name(self):??
  • ????????return?self._name??
  • ?
  • ????@property??
  • ????def?num_classes(self):??
  • ????????return?len(self._classes)??
  • ?
  • ????@property??
  • ????def?classes(self):??
  • ????????return?self._classes??
  • ?
  • ????@property??
  • ????def?image_index(self):??
  • ????????return?self._image_index??
  • ?
  • ????@property??
  • ????def?roidb_handler(self):??
  • ????????return?self._roidb_handler??
  • ?
  • ????@roidb_handler.setter??
  • ????def?roidb_handler(self,?val):??
  • ????????self._roidb_handler?=?val??
  • ??
  • ????def?set_proposal_method(self,?method):??
  • ????????method?=?eval('self.'?+?method?+?'_roidb')??
  • ????????self.roidb_handler?=?method??
  • ?
  • ????@property??
  • ????def?roidb(self):??
  • ????????#?A?roidb?is?a?list?of?dictionaries,?each?with?the?following?keys:??
  • ????????#???boxes??
  • ????????#???gt_overlaps??
  • ????????#???gt_classes??
  • ????????#???flipped??
  • ????????if?self._roidb?is?not?None:??
  • ????????????return?self._roidb??
  • ????????self._roidb?=?self.roidb_handler()??
  • ????????return?self._roidb??
  • ?
  • ????@property??
  • ????def?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??
  • ?
  • ????@property??
  • ????def?num_images(self):??
  • ??????return?len(self.image_index)??
  • ??
  • ????def?image_path_at(self,?i):??
  • ????????raise?NotImplementedError??
  • ??
  • ????def?default_roidb(self):??
  • ????????raise?NotImplementedError??
  • ??
  • ????def?evaluate_detections(self,?all_boxes,?output_dir=None):??
  • ????????"""?
  • ????????all_boxes?is?a?list?of?length?number-of-classes.?
  • ????????Each?list?element?is?a?list?of?length?number-of-images.?
  • ????????Each?of?those?list?elements?is?either?an?empty?list?[]?
  • ????????or?a?numpy?array?of?detection.?
  • ?
  • ????????all_boxes[class][image]?=?[]?or?np.array?of?shape?#dets?x?5?
  • ????????"""??
  • ????????raise?NotImplementedError??
  • ??
  • ????def?_get_widths(self):??
  • ??????return?[PIL.Image.open(self.image_path_at(i)).size[0]??
  • ??????????????for?i?in?xrange(self.num_images)]??
  • ??
  • ????def?append_flipped_images(self):??
  • ????????num_images?=?self.num_images??
  • ????????widths?=?self._get_widths()??
  • ????????for?i?in?xrange(num_images):??
  • ????????????boxes?=?self.roidb[i]['boxes'].copy()??
  • ????????????oldx1?=?boxes[:,?0].copy()??
  • ????????????oldx2?=?boxes[:,?2].copy()??
  • ????????????boxes[:,?0]?=?widths[i]?-?oldx2?-?1??
  • ????????????boxes[:,?2]?=?widths[i]?-?oldx1?-?1??
  • ????????????assert?(boxes[:,?2]?>=?boxes[:,?0]).all()??
  • ????????????entry?=?{'boxes'?:?boxes,??
  • ?????????????????????'gt_overlaps'?:?self.roidb[i]['gt_overlaps'],??
  • ?????????????????????'gt_classes'?:?self.roidb[i]['gt_classes'],??
  • ?????????????????????'flipped'?:?True}??
  • ????????????self.roidb.append(entry)??
  • ????????self._image_index?=?self._image_index?*?2??
  • ??
  • ????def?evaluate_recall(self,?candidate_boxes=None,?thresholds=None,??
  • ????????????????????????area='all',?limit=None):??
  • ????????"""Evaluate?detection?proposal?recall?metrics.?
  • ?
  • ????????Returns:?
  • ????????????results:?dictionary?of?results?with?keys?
  • ????????????????'ar':?average?recall?
  • ????????????????'recalls':?vector?recalls?at?each?IoU?overlap?threshold?
  • ????????????????'thresholds':?vector?of?IoU?overlap?thresholds?
  • ????????????????'gt_overlaps':?vector?of?all?ground-truth?overlaps?
  • ????????"""??
  • ????????#?Record?max?overlap?value?for?each?gt?box??
  • ????????#?Return?vector?of?overlap?values??
  • ????????areas?=?{?'all':?0,?'small':?1,?'medium':?2,?'large':?3,??
  • ??????????????????'96-128':?4,?'128-256':?5,?'256-512':?6,?'512-inf':?7}??
  • ????????area_ranges?=?[?[0**2,?1e5**2],????#?all??
  • ????????????????????????[0**2,?32**2],?????#?small??
  • ????????????????????????[32**2,?96**2],????#?medium??
  • ????????????????????????[96**2,?1e5**2],???#?large??
  • ????????????????????????[96**2,?128**2],???#?96-128??
  • ????????????????????????[128**2,?256**2],??#?128-256??
  • ????????????????????????[256**2,?512**2],??#?256-512??
  • ????????????????????????[512**2,?1e5**2],??#?512-inf??
  • ??????????????????????]??
  • ????????assert?areas.has_key(area),?'unknown?area?range:?{}'.format(area)??
  • ????????area_range?=?area_ranges[areas[area]]??
  • ????????gt_overlaps?=?np.zeros(0)??
  • ????????num_pos?=?0??
  • ????????for?i?in?xrange(self.num_images):??
  • ????????????#?Checking?for?max_overlaps?==?1?avoids?including?crowd?annotations??
  • ????????????#?(...pretty?hacking?:/)??
  • ????????????max_gt_overlaps?=?self.roidb[i]['gt_overlaps'].toarray().max(axis=1)??
  • ????????????gt_inds?=?np.where((self.roidb[i]['gt_classes']?>?0)?&??
  • ???????????????????????????????(max_gt_overlaps?==?1))[0]??
  • ????????????gt_boxes?=?self.roidb[i]['boxes'][gt_inds,?:]??
  • ????????????gt_areas?=?self.roidb[i]['seg_areas'][gt_inds]??
  • ????????????valid_gt_inds?=?np.where((gt_areas?>=?area_range[0])?&??
  • ?????????????????????????????????????(gt_areas?<=?area_range[1]))[0]??
  • ????????????gt_boxes?=?gt_boxes[valid_gt_inds,?:]??
  • ????????????num_pos?+=?len(valid_gt_inds)??
  • ??
  • ????????????if?candidate_boxes?is?None:??
  • ????????????????#?If?candidate_boxes?is?not?supplied,?the?default?is?to?use?the??
  • ????????????????#?non-ground-truth?boxes?from?this?roidb??
  • ????????????????non_gt_inds?=?np.where(self.roidb[i]['gt_classes']?==?0)[0]??
  • ????????????????boxes?=?self.roidb[i]['boxes'][non_gt_inds,?:]??
  • ????????????else:??
  • ????????????????boxes?=?candidate_boxes[i]??
  • ????????????if?boxes.shape[0]?==?0:??
  • ????????????????continue??
  • ????????????if?limit?is?not?None?and?boxes.shape[0]?>?limit:??
  • ????????????????boxes?=?boxes[:limit,?:]??
  • ??
  • ????????????overlaps?=?bbox_overlaps(boxes.astype(np.float),??
  • ?????????????????????????????????????gt_boxes.astype(np.float))??
  • ??
  • ????????????_gt_overlaps?=?np.zeros((gt_boxes.shape[0]))??
  • ????????????for?j?in?xrange(gt_boxes.shape[0]):??
  • ????????????????#?find?which?proposal?box?maximally?covers?each?gt?box??
  • ????????????????argmax_overlaps?=?overlaps.argmax(axis=0)??
  • ????????????????#?and?get?the?iou?amount?of?coverage?for?each?gt?box??
  • ????????????????max_overlaps?=?overlaps.max(axis=0)??
  • ????????????????#?find?which?gt?box?is?'best'?covered?(i.e.?'best'?=?most?iou)??
  • ????????????????gt_ind?=?max_overlaps.argmax()??
  • ????????????????gt_ovr?=?max_overlaps.max()??
  • ????????????????assert(gt_ovr?>=?0)??
  • ????????????????#?find?the?proposal?box?that?covers?the?best?covered?gt?box??
  • ????????????????box_ind?=?argmax_overlaps[gt_ind]??
  • ????????????????#?record?the?iou?coverage?of?this?gt?box??
  • ????????????????_gt_overlaps[j]?=?overlaps[box_ind,?gt_ind]??
  • ????????????????assert(_gt_overlaps[j]?==?gt_ovr)??
  • ????????????????#?mark?the?proposal?box?and?the?gt?box?as?used??
  • ????????????????overlaps[box_ind,?:]?=?-1??
  • ????????????????overlaps[:,?gt_ind]?=?-1??
  • ????????????#?append?recorded?iou?coverage?level??
  • ????????????gt_overlaps?=?np.hstack((gt_overlaps,?_gt_overlaps))??
  • ??
  • ????????gt_overlaps?=?np.sort(gt_overlaps)??
  • ????????if?thresholds?is?None:??
  • ????????????step?=?0.05??
  • ????????????thresholds?=?np.arange(0.5,?0.95?+?1e-5,?step)??
  • ????????recalls?=?np.zeros_like(thresholds)??
  • ????????#?compute?recall?for?each?iou?threshold??
  • ????????for?i,?t?in?enumerate(thresholds):??
  • ????????????recalls[i]?=?(gt_overlaps?>=?t).sum()?/?float(num_pos)??
  • ????????#?ar?=?2?*?np.trapz(recalls,?thresholds)??
  • ????????ar?=?recalls.mean()??
  • ????????return?{'ar':?ar,?'recalls':?recalls,?'thresholds':?thresholds,??
  • ????????????????'gt_overlaps':?gt_overlaps}??
  • ??
  • ????def?create_roidb_from_box_list(self,?box_list,?gt_roidb):??
  • ????????assert?len(box_list)?==?self.num_images,?\??
  • ????????????????'Number?of?boxes?must?match?number?of?ground-truth?images'??
  • ????????roidb?=?[]??
  • ????????for?i?in?xrange(self.num_images):??
  • ????????????boxes?=?box_list[i]??
  • ????????????num_boxes?=?boxes.shape[0]??
  • ????????????overlaps?=?np.zeros((num_boxes,?self.num_classes),?dtype=np.float32)??
  • ??
  • ????????????if?gt_roidb?is?not?None?and?gt_roidb[i]['boxes'].size?>?0:??
  • ????????????????gt_boxes?=?gt_roidb[i]['boxes']??
  • ????????????????gt_classes?=?gt_roidb[i]['gt_classes']??
  • ????????????????gt_overlaps?=?bbox_overlaps(boxes.astype(np.float),??
  • ????????????????????????????????????????????gt_boxes.astype(np.float))??
  • ????????????????argmaxes?=?gt_overlaps.argmax(axis=1)??
  • ????????????????maxes?=?gt_overlaps.max(axis=1)??
  • ????????????????I?=?np.where(maxes?>?0)[0]??
  • ????????????????overlaps[I,?gt_classes[argmaxes[I]]]?=?maxes[I]??
  • ??
  • ????????????overlaps?=?scipy.sparse.csr_matrix(overlaps)??
  • ????????????roidb.append({??
  • ????????????????'boxes'?:?boxes,??
  • ????????????????'gt_classes'?:?np.zeros((num_boxes,),?dtype=np.int32),??
  • ????????????????'gt_overlaps'?:?overlaps,??
  • ????????????????'flipped'?:?False,??
  • ????????????????'seg_areas'?:?np.zeros((num_boxes,),?dtype=np.float32),??
  • ????????????})??
  • ????????return?roidb??
  • ?
  • ????@staticmethod??
  • ????def?merge_roidbs(a,?b):??
  • ????????assert?len(a)?==?len(b)??
  • ????????for?i?in?xrange(len(a)):??
  • ????????????a[i]['boxes']?=?np.vstack((a[i]['boxes'],?b[i]['boxes']))??
  • ????????????a[i]['gt_classes']?=?np.hstack((a[i]['gt_classes'],??
  • ????????????????????????????????????????????b[i]['gt_classes']))??
  • ????????????a[i]['gt_overlaps']?=?scipy.sparse.vstack([a[i]['gt_overlaps'],??
  • ???????????????????????????????????????????????????????b[i]['gt_overlaps']])??
  • ????????????a[i]['seg_areas']?=?np.hstack((a[i]['seg_areas'],??
  • ???????????????????????????????????????????b[i]['seg_areas']))??
  • ????????return?a??
  • ??
  • ????def?competition_mode(self,?on):??
  • ????????"""Turn?competition?mode?on?or?off."""??
  • ????????pass??


  • get_imdb->factory->pascal_voc->(繼承)imdb

    factory

    ??year = ['2007', '2012']

    ??split = ['train', 'val', 'trainval', 'test']

    ?

    imdb

    ??image_set: split

    ??devkit_path: config.DATA_DIR(root/data/) + VOCdevkit + year

    ??data_path: devkit_path + '/' + 'VOC' + year

    ??image_index: a list read image name from

    ??????例如,root/data + /VOCdevkit2007/VOC2007/ImageSets/Main/{image_set}.txt

    ??roidb: gt_roidb得到(cfg.TRAIN.PROPOSAL_METHOD=gt導致了此操作)

    ??classes: 類別定義

    ??num_classes: 類別的長度

    ??class_to_ind{類別名:類別索引}字典


    ??num_images(): image_index'length,數據庫中圖片個數

    ??image_path_atindex): 得到第index圖片的地址,data_path + '/' + 'JPEGImages' + image_index[index] + image_ext(.jpg)

    ?

    ??在train_faster_rcnn_alt_opt.pyimdb.set_proposal_method之后一旦用imdb.roidb都會用gt_roidb讀取xml中的內容中得到部分信息

    xml的地址:data_path + '/' + 'Annotations' + '/' + index + '.xml'

    ??????????(root/data/) + VOCdevkit + year ?+ '/' + 'VOC' + year + '/' + 'Annotations' + '/' + index + '.xml'

    get_training_roidb: 對得到的roi做是否反轉(參見roidbflipped,為了擴充數據庫)和到roidb.pyprepare_roidb中計算得到roidb的其他數據

    ?

    一張圖有一個roidb,每個roidb是一個字典

    roidb:

    ??boxes: four rows.the proposal.left-up,right-down

    ??gt_overlaps: lenbox*類別數(即,每個box對應的類別。初始化時,從xml讀出來的類別對應類別值是1.0,被壓縮保存)

    ??gt_classes:?每個box的類別索引

    ??flipped: true,代表圖片被水平反轉,改變了boxes里第一、三列的值(所有原圖都這樣的操作,imdb.image_index*2(cfg.TRAIN.USE_FLIPPED會導致此操作的發生,見train.py 116)

    ??seg_areas:?box的面積

    ??(下面的值在roidb.pyprepare_roidb中得到)

    ??imageimage_path_atindex),此roi的圖片地址

    ??width:此圖片的寬

    ??height: 高

    ??max_classes: box的類別=labelsgt_overlaps行最大值索引)

    ??max_overlaps:?gt_overlaps行最大值)(max_overlaps=0max_classes=0,即都是背景,否則不正確) ?

    output_dir:?ROOT_DIR + 'output' + EXP_DIR('faster_rcnn_alt_opt') + imdb.name("voc_2007_trainval" or "voc_2007_test")


    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的faster rcnn源码解读(四)之数据类型imdb.py和pascal_voc.py(主要是imdb和roidb数据类型的解说)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 日韩成人高清视频在线观看 | 在线免费观看视频 | 艳妇臀荡乳欲伦交换在线看 | 国产又黄又粗又猛又爽 | 欧美日韩国产精品一区 | 欧美黄视频在线观看 | 日韩高清不卡 | 伊人日韩 | 国产女同91疯狂高潮互磨 | 亚洲小视频 | 日韩中文字幕综合 | 五月天婷婷丁香花 | 男人把女人捅爽 | 在线欧美国产 | 亚洲tv在线观看 | 国产主播在线观看 | 师生出轨h灌满了1v1 | 欧美aⅴ在线 | 午夜影院福利社 | 亚洲一级免费视频 | 亚洲AV成人午夜无码精品久久 | 灌篮高手全国大赛电影 | 欧美xxxx×黑人性爽 | 亚洲精品一区二区三区蜜桃久 | 污片在线看 | 中文字幕在线视频精品 | 日韩一卡二卡在线 | wwwwxxxx欧美 | 善良的老师伦理bd中字 | 亚洲午夜精品视频 | 欧美人与动性xxxxx杂性 | 91精品国产自产精品男人的天堂 | 国产欧美日韩91 | 影音先锋久久久久av综合网成人 | 日本高清在线观看 | 又粗又大又硬毛片免费看 | 日本后进式猛烈xx00动态图 | 午夜影院0606 | 欧美亚洲国产日韩 | 五月天激情国产综合婷婷婷 | 午夜国产一区二区三区 | 亚洲国产第一 | 99久久久无码国产精品性黑人 | 这里只有久久精品 | 97超视频 | 日本激情视频一区二区三区 | 国产精品永久在线观看 | 亚洲不卡av一区二区 | 动漫美女被吸乳奶动漫视频 | 女人舌吻男人茎视频 | 久久精品亚洲天堂 | 青青草原av | 丰满白嫩尤物一区二区 | 制服丝袜国产精品 | 台湾佬美性中文网 | 日本a级片网站 | 中国美女囗交视频 | 亚洲干 | 欧美日韩一二三 | 97成人超碰 | 欧美有码视频 | 日韩三级在线播放 | 精品国产日本 | 巨乳美女在线 | 日韩高清二区 | 天天爽夜夜爽视频 | 成人在线精品 | 黄污视频在线观看 | 青草草在线| 日韩黄色一级大片 | 潘金莲性xxxxhd | 污视频免费在线 | 都市激情第一页 | 欧美精品久久久久久久多人混战 | 亚洲午夜精品久久久久久浪潮 | 久久91亚洲人成电影网站 | 91视频在线观看 | 成年人免费视频网站 | 欧美男人又粗又长又大 | 91视频二区| 狠狠干夜夜操 | 欧美特级视频 | 女人脱下裤子让男人捅 | 欧美高跟鞋交xxxxxhd | 日本精品免费视频 | 中文字幕91视频 | 四虎影院在线看 | 精品人妻视频在线 | 免费性爱视频 | 99在线精品视频免费观看20 | av国产成人 | 欧美成人片在线观看 | 哺乳喂奶一二三区乳 | 欧美激情黑白配 | 成人福利在线 | 九九自拍 | 熟妇大屁股一区二区三区视频 | 成年人毛片 | 国精产品一品二品国精品69xx |