1. 程式人生 > >faster rcnn訓練

faster rcnn訓練

輸入命令./experiments/scripts/faster_rcnn_alt_opt.sh 0 ZF pascal_voc

faster_rcnn_alt_opt.sh的訓練程式碼如下:

time ./tools/train_faster_rcnn_alt_opt.py --gpu ${GPU_ID} \

  --net_name ${NET} \
  --weights data/imagenet_models/${NET}.v2.caffemodel \
  --imdb ${TRAIN_IMDB} \
  --cfg experiments/cfgs/faster_rcnn_alt_opt.yml \

  ${EXTRA_ARGS}

引數賦值:${GPU_ID} =0、${NET} =ZF、${TRAIN_IMDB} =pascal_voc

呼叫./tools/train_faster_rcnn_alt_opt.py檔案

1、初始化引數

(1)args = parse_args(),

包括--gpu:這個引數指定訓練使用的GPU裝置,我的電腦只有一枚GPU,預設情況下自動開啟,其gpu_id為0;

--net_name:訓練的網路型別

--weights:這個引數指定了finetune的初始引數,我的電腦GPU不怎麼高階,只能使用caffenet進行finetune;

--cfg:

--imdb:這個引數指定了訓練所需要的訓練資料,如果你需要訓練自己的資料,那麼這個引數是必須要指定的;

--set:

(2)rpn_test_prototxt = get_solvers(args.net_name)

在models/pascal_voc/netname/faster_rcnn_alt_opt資料夾下有stage1_rpn_solver60k80k.pt等不同階段所對應的solver檔案,並定義了各個階段最大迭代次數,這裡支援的net_name有VGG16、VGG_CNN_M_1024、ZF三種

def get_solvers(net_name):
    # Faster R-CNN Alternating Optimization
    n = 'faster_rcnn_alt_opt'
    # Solver for each training stage
    solvers = [[net_name, n, 'stage1_rpn_solver60k80k.pt'],
               [net_name, n, 'stage1_fast_rcnn_solver30k40k.pt'],
               [net_name, n, 'stage2_rpn_solver60k80k.pt'],
               [net_name, n, 'stage2_fast_rcnn_solver30k40k.pt']]
    solvers = [os.path.join(cfg.MODELS_DIR, *s) for s in solvers]
    # Iterations for each training stage
    #每一輪訓練的最大迭代次數,建議測試時都設定為100
    max_iters = [80000, 40000, 80000, 40000]
    # max_iters = [100, 100, 100, 100]
    # Test prototxt for the RPN
    rpn_test_prototxt = os.path.join(
        cfg.MODELS_DIR, net_name, n, 'rpn_test.pt')
    return solvers, max_iters, rpn_test_prototxt

2、train_rpn函式

(1)_init_caffe:該函式作用便是初始化caffe物件,僅做了兩步操作,第一步是初始化隨機種子,第二步是設定GPU。

def _init_caffe(cfg):
    """Initialize pycaffe in a training process.
    """

    import caffe
    # fix the random seeds (numpy and caffe) for reproducibility
    np.random.seed(cfg.RNG_SEED)
    caffe.set_random_seed(cfg.RNG_SEED)
    # set up caffe
    caffe.set_mode_gpu()
    caffe.set_device(cfg.GPU_ID)

(2)roidb, imdb = get_roidb(imdb_name)  

->imdb = get_imdb(imdb_name)

imdb根據imdb_name(預設是“voc_2007_trainval)來獲取,這裡的imdb物件的獲取採用了工廠模式,由\lib\datasets\factory.py生成,根據年份(2007)與切分的資料集(trainval)返回pascal_voc物件,pascal_voc與coco都繼承於imdb物件。(\lib\datasets\pascal_voc.py+coco.py)

->imdb.set_proposal_method(cfg.TRAIN.PROPOSAL_METHOD)

設定gt方法。首先這裡初始化了一些配置,比較容易忽略的的是PROPOSAL_METHOD設定成了’gt’,值得一提。這個設定是從get_roidb然後追溯到底層資料類pascal-voc得到體現,可以看到imdb(pascal_voc的父類)通過roidb_handler來決定用什麼方式生成roidb,預設為selective_search,這裡用了gt_roidb。 

->output_dir = get_output_dir(imdb)

確定路徑

->roidb = get_training_roidb(imdb)

roidb是通過lib\fast_rcnn\train.py中的get_training_roidb來獲取的,這個roidb是一個imdb的成員變數,包含了訓練集圖片中框出的每個區域。這個函式做了兩件事情,一是將原有的roidb中的每張圖片進行水平翻轉然後添加回roidb中,第二件事是做一些準備工作(有一些讓我很無語……),詳細的將在相應的檔案進行介紹

(3)model_paths = train_net(solver, roidb, output_dir, pretrained_model=init_model, max_iters=max_iters)

而這個 train_net() 函式是從 lib/fast_rcnn 資料夾中的 train.py 中 import 進來的。train.py主要由一個類SolverWrapper和兩個函式get_training_roidb()和train_net()組成。 

def train_net(solver_prototxt, roidb, output_dir,
              pretrained_model=None, max_iters=40000):
    """Train a Fast R-CNN network."""

    roidb = filter_roidb(roidb)
    sw = SolverWrapper(solver_prototxt, roidb, output_dir,
                       pretrained_model=pretrained_model)

    print 'Solving...'
    model_paths = sw.train_model(max_iters)
    print 'done solving'
    return model_paths

可以發現,該函式是通過呼叫類SolverWrapper來實現其主要功能的,類SolverWrapper初始化完成後,就是要呼叫train_model函式來進行網路訓練。

3、rpn_generate函式

該函式的作用就是根據輸入的資料與模型與prototxt產生proposal,可作為下一步的訓練所用,也可作為測試。 該函式最最核心的一句程式碼是rpn_proposals = imdb_proposals(rpn_net, imdb),其他的都是作為引數準備,與輸出的一些工作。如果僅僅淺嘗輒止的讀者,知道這個函式的功能就是對每張圖片產生最多2000個roi proposal 與對應的scores然後快取到某個資料夾即可。 希望打破砂鍋問到底的讀者,可以追到函式裡以及prototxt檔案去讀其實現細節。其中proposal_layer我也會單獨開一個篇章來討論實現中的一些重要工作。

def rpn_generate(queue=None, imdb_name=None, rpn_model_path=None, cfg=None,
                 rpn_test_prototxt=None):
    """Use a trained RPN to generate proposals.
    """
    # 設定cfg檔案
    cfg.TEST.RPN_PRE_NMS_TOP_N = -1     # no pre NMS filtering
    cfg.TEST.RPN_POST_NMS_TOP_N = 2000  # limit top boxes after NMS
    print 'RPN model: {}'.format(rpn_model_path)
    print('Using config:')
    pprint.pprint(cfg)

    import caffe
    _init_caffe(cfg)

    # NOTE: the matlab implementation computes proposals on flipped images, too.
    # We compute them on the image once and then flip the already computed
    # proposals. This might cause a minor loss in mAP (less proposal jittering).
    imdb = get_imdb(imdb_name)
    print 'Loaded dataset `{:s}` for proposal generation'.format(imdb.name)

    # Load RPN and configure output directory
    # 建立一個Net例項物件,以下為個人觀點,對boost庫以及wraper不熟,只說說個人理解,如有錯誤,後續更正,歡迎指正: 
    #a)會呼叫_caffe.cpp裡面的Net_Init_Load函式,_caffe.cpp裡面`.def("__init__", bp::make_constructor(&Net_Init_Load))`,
    #應該是將Net_Init_Load與__init__構造器繫結,所以在建立caffe.Net物件的時候,會呼叫Net_Init_Load,
    #終端上就會輸出網路的初始化資訊同時從pretrainedmodel上copy source layers
    rpn_net = caffe.Net(rpn_test_prototxt, rpn_model_path, caffe.TEST)
    output_dir = get_output_dir(imdb)
    print 'Output will be saved to `{:s}`'.format(output_dir)
    # Generate RPN proposals on all images in an imdb.
    #imdb_proposals函式在generate.py檔案中
    #rpn_proposals是一個列表的列表,每個子列表
    rpn_proposals = imdb_proposals(rpn_net, imdb)#核心
    # Write proposals to disk and send the proposal file path through the
    # multiprocessing queue
    # splitext函式分離檔案的檔名和拓展名
    rpn_net_name = os.path.splitext(os.path.basename(rpn_model_path))[0]
    rpn_proposals_path = os.path.join(
        output_dir, rpn_net_name + '_proposals.pkl')
    with open(rpn_proposals_path, 'wb') as f:
        cPickle.dump(rpn_proposals, f, cPickle.HIGHEST_PROTOCOL)
        # 將python專有的資料結構(比如rpn_proposals是一個列表)序列化,儲存在磁碟中
    print 'Wrote RPN proposals to {}'.format(rpn_proposals_path)
    #返回生成的rpn proposal的儲存地址。
    queue.put({'proposal_path': rpn_proposals_path})

4、train_fast_rcnn函式

這個函式就是訓練fast-rcnn的部分,首先它將產生roidb的方法設定成rpn_roidb,工廠模式的獲取roidb思想,在上文已提。 接下來就是準備一些引數、路徑等等,用於送入網路訓練,最後儲存模型。具體的訓練細節,需要閱讀prototxt檔案才能把它的過程弄得水落石出。

def train_fast_rcnn(queue=None, imdb_name=None, init_model=None, solver=None,
                    max_iters=None, cfg=None, rpn_file=None):
    """Train a Fast R-CNN using proposals generated by an RPN.
    """

    #這個引數的設定是為了提高程式碼的重用性。可以看到其他檔案中,train_rpn和train_fast_rcnn的過程在實現時,會有重複程式碼,故設定該變數將其合併。
    #conv5後面現在接的是fast-rcnn
    cfg.TRAIN.HAS_RPN = False           # not generating prosals on-the-fly
    #roidb由剛剛訓練完的RPN產生
    cfg.TRAIN.PROPOSAL_METHOD = 'rpn'   # use pre-computed RPN proposals instead
    #每個mini-batch包含兩張圖片,以及他們proposal的roi區域
    #每次訓練fast-rcnn使用兩張圖片
    cfg.TRAIN.IMS_PER_BATCH = 2
    print 'Init model: {}'.format(init_model)
    print 'RPN proposals: {}'.format(rpn_file)
    print('Using config:')
    pprint.pprint(cfg)

    import caffe
    _init_caffe(cfg)

    roidb, imdb = get_roidb(imdb_name, rpn_file=rpn_file)
    output_dir = get_output_dir(imdb)
    print 'Output will be saved to `{:s}`'.format(output_dir)
    # Train Fast R-CNN
    model_paths = train_net(solver, roidb, output_dir,
                            pretrained_model=init_model,
                            max_iters=max_iters)
    # Cleanup all but the final model
    for i in model_paths[:-1]:
        os.remove(i)
    fast_rcnn_model_path = model_paths[-1]
    # Send Fast R-CNN model path over the multiprocessing queue
    queue.put({'model_path': fast_rcnn_model_path})

5、資料準備

不過,關於Fast-RCNN的重頭戲我們其實還沒開始——那就是如何準備訓練資料。

在上面介紹訓練的流程中,與此相關的函式是:imdb= get_imdb(args.imdb_name)

這個函式是從從lib/datasets/資料夾中的factory.py中import進來的,我們來看一下這個函式:

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]()
這個函式很簡單,其實就是根據字典的key來取得訓練資料。 那麼這個字典是怎麼形成的呢?看下面:
for year in ['2007', '2012']:
    for split in ['train', 'val', 'trainval', 'test']:
        name = 'voc_{}_{}'.format(year, split)
        __sets[name] = (lambda split=split, year=year: pascal_voc(split, year))
它本質上是通過lib/datasets/資料夾下面的pascal_voc.py引入的。所以,現在我們就得開始進入pascal_voc.py:
def __init__(self, image_set, year, devkit_path=None):
        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.selective_search_roidb是一個函式物件,把這個函式物件付給_roidb_handler屬性
        self._roidb_handler = self.selective_search_roidb
        self._salt = str(uuid.uuid4())
        self._comp_id = 'comp4'

        # PASCAL specific config options
        self.config = {'cleanup'     : True,
                       'use_salt'    : True,
                       'use_diff'    : False,
                       'matlab_eval' : False,
                       'rpn_file'    : None,
                       'min_size'    : 2}

        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)

在初始化自身的同時,先呼叫了父類的初始化方法,將imdb_name傳入,例如(‘voc_2007_trainval’)
下面是成員變數的初始化:
{
    year:’2007’
    image _set:’trainval’
    devkit _path:’data/VOCdevkit2007’
    data _path:’data /VOCdevkit2007/VOC2007’
    classes:(…)_如果想要訓練自己的資料,需要修改這裡_
    class _to _ind:{…} _一個將類名轉換成下標的字典 _
    image _ext:’.jpg’
    image _index: [‘000001’,’000003’,……]_根據trainval.txt獲取到的image索引_
    roidb _handler: <Method gt_roidb >
    salt:  <Object uuid >
    comp _id:’comp4’
    config:{…}
}

類 init 構造完成後,會呼叫函式 roidb,這個函式是從類 imdb 中繼承過來的,這個函式會呼叫 _roidb_handler 來處理,其中 _roidb_handler=self.selective_search_roidb,下面我們來看看這個函式:

    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 = 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
這個函式在訓練階段會首先呼叫get_roidb() 函式:
def rpn_roidb(self):
        if int(self._year) == 2007 or self._image_set != 'test':
            gt_roidb = self.gt_roidb()
            # 求取rpn_roidb需要以gt_roidb作為引數才能得到
            rpn_roidb = self._load_rpn_roidb(gt_roidb)
            roidb = imdb.merge_roidbs(gt_roidb, rpn_roidb)
        else:
            roidb = self._load_rpn_roidb(None)

        return roidb
如果存在cache_file,那麼get_roidb()就會直接從cache_file中讀取資訊;如果不存在cache_file,那麼會呼叫_load_pascal_annotation()來取得標註資訊。_load_pascal_annotation函式如下所示:
 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')
        tree = ET.parse(filename)
        objs = tree.findall('object')
        if not self.config['use_diff']:
            # Exclude the samples labeled as difficult
            non_diff_objs = [
                obj for obj in objs if int(obj.find('difficult').text) == 0]
            # if len(non_diff_objs) != len(objs):
            #     print 'Removed {} difficult objects'.format(
            #         len(objs) - len(non_diff_objs))
            objs = non_diff_objs
        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)
        # "Seg" area for pascal is just the box area
        seg_areas = np.zeros((num_objs), dtype=np.float32)

        # Load object bounding boxes into a data frame.
        for ix, obj in enumerate(objs):
            bbox = obj.find('bndbox')
            # Make pixel indexes 0-based
            x1 = float(bbox.find('xmin').text) - 1
            y1 = float(bbox.find('ymin').text) - 1
            x2 = float(bbox.find('xmax').text) - 1
            y2 = float(bbox.find('ymax').text) - 1
            cls = self._class_to_ind[obj.find('name').text.lower().strip()]
            boxes[ix, :] = [x1, y1, x2, y2]
            gt_classes[ix] = cls
            # 從anatation直接載入影象的資訊,因為本身就是ground-truth , 所以overlap直接設為1
            overlaps[ix, cls] = 1.0
            seg_areas[ix] = (x2 - x1 + 1) * (y2 - y1 + 1)
        # overlaps為 num_objs * K 的陣列, K表示總共的類別數, num_objs表示當前這張圖片中box的個數
        overlaps = scipy.sparse.csr_matrix(overlaps)

        return {'boxes' : boxes,
                'gt_classes': gt_classes,
                'gt_overlaps' : overlaps,
                'flipped' : False,
                'seg_areas' : seg_areas}
當處理完標註的資料後,接下來就要載入SS階段獲得的資料,通過如下函式完成:
    def _load_selective_search_roidb(self, gt_roidb):
        filename = os.path.abspath(os.path.join(cfg.DATA_DIR,
                                                '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]):
            boxes = raw_data[i][:, (1, 0, 3, 2)] - 1
            keep = ds_utils.unique_boxes(boxes)
            boxes = boxes[keep, :]
            keep = ds_utils.filter_small_boxes(boxes, self.config['min_size'])
            boxes = boxes[keep, :]
            box_list.append(boxes)

        return self.create_roidb_from_box_list(box_list, gt_roidb)
    # 從XML檔案載入影象資訊,而且是ground-truth資訊,比如boxes   
有一點需要注意的是,ss中獲得的box的值,和fast-rcnn中認為的box值有點差別,那就是你需要交換box的x和y座標。

相關推薦

Ubuntu16.04+GeForce GTX 1070Ti+CUDA8.0+cuDNN5.1+TensorFlow1.2+tf-faster-rcnn訓練

1、下載CUDA8.0和CUDNN5.1 百度網盤下載地址(包含8.0和9.0):https://pan.baidu.com/s/1ir3rKhUtU1aIRE7n1BQ5mg 2、安裝CUDA8.0 安裝方式1(字尾為.deb的): sudo dpkg -i cuda-repo-u

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

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

Faster RCNN訓練自己的資料集

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

製作自己的目標檢測資料集再利用tf-faster-rcnn訓練

1.製作資料集的工具 我利用資料集標註工具是精靈標註助手,我認為很好用。奉勸一句標註資料集時不要隨便找人給你標,如果他沒有用心給你標註,你在後面訓練會出現很多問題。在一開始標註資料集的時候不要一下子給他標註完,先標註幾十張圖片,然後用在你的網路裡,看看有沒有錯誤,如果沒有問

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

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

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

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

Faster RCNN訓練出現問題:Matlab版本訓練

I1113 20:56:49.405777 23834 net.cpp:42] Initializing net from parameters: name: "Zeiler_conv5" input: "data" input_dim: 1 input_dim: 3

深度學習Caffe實戰筆記(21)Windows平臺 Faster-RCNN 訓練好的模型測試資料

前一篇部落格介紹瞭如何利用Faster-RCNN訓練自己的資料集,訓練好會得到一個模型,這篇部落格介紹如何利用訓練好的模型進行測試資料。 1、訓練好的模型存放位置 訓練好的模型存放在faster_rcnn-master\output\faster_rcnn_

使用faster-rcnn訓練自己的模型

參考 faster-rcnn 原始碼連結 論文連結 一個不錯的參考 faster rcnn簡介 各檔案目錄介紹  caffe-fast-rcnn —> caffe框架  data —> 存放資料,以及讀取檔案的ca

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

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

ubutnu16.04+caffe+cuda8.0+NVIDIA TX2環境下,Faster RCNN 訓練中的一些問題及解決辦法

之前實驗室購買了NVIDIA-jetson-TX2系類的嵌入式開發板,就迫不及待的在上面配好了caffe 和py-faster rcnn。當時沒配散熱器,無法在上面訓練測試,只是跑了demo,demo跑起來還是很順暢的,基本沒修改程式碼,也沒有所謂的numpy版本問題。不

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

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

TF-Faster-RCNN訓練篇(基礎版)結合自己訓練的修改過程而撰寫

這裡,我就主要記錄一下自己在跑tensorflow框架下的faster-rcnn。首先,就是硬體要求,這裡只能做到使用一塊GPU。具體環境要求:        1.Ubuntu  16.04系統、CUDA 8.0和cudnn(可以支援NVIDIA的GPU運算,當然有很多人在說

深度學習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

Faster RCNN訓練出現問題:Selective search data not found at: /home/py-faster-rcnn/data/selective_search_dat

~/py-faster-rcnn$ ./experiments/scripts/fast_rcnn.sh 0 VGG16 pascal_voc + set -e + export PYTHONUNBUFFERED=True + PYTHONUNBUFFERED=True +

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

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

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

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

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

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

faster rcnn訓練

輸入命令./experiments/scripts/faster_rcnn_alt_opt.sh 0 ZF pascal_voc faster_rcnn_alt_opt.sh的訓練程式碼如下: time ./tools/train_faster_rcnn_alt_opt.