Fast-RCNN解析:训练阶段代码导读

(!详解 Pytorch实战:①)kaggle猫狗数据集二分类:加载(集成/自定义)数据集 这系列的文章是我对Pytorch入门之后的一个总结,特别是对数据集生成加载这一块加强学习 另外,这里有一些比较常用的数据集,大家可以进行下载: 需要注意的是,本篇文章使用的PyTorch的版本是v0.10.0 《深度学习常用的数据集,包括各种数据跟图像数据》 《kaggle猫狗大战[包含训练(25000张猫狗照片)和测试数据集(12500张猫狗照片)》 目录 一、加载已被集成在Pytorch中的数据集 1、torchvision和torchvision.datasets:数据集 2、t.. 阅读详情

这一周开始接触RCNN相关的技术,希望用它来进行物体定位方面的研究。现记录一些学习心得,以备查询。——jeremy@gz


关于Fast-RCNN的解析,我们将主要分为两个部分来介绍,其中一个是训练部分,这个部分非常重要,是我们需要重点讲解的;另一个是测试部分,这个部分关系到具体的应用,所以也是必须要了解的。本篇博文中,我们先从训练部分讲起。

训练阶段流程

在官方文档中,训练阶段的启动脚本如下所示:

./tools/train_net.py --gpu 0 --solver models/VGG16/solver.prototxt \
    --weights data/imagenet_models/VGG16.v2.caffemodel
 
  • 1
  • 2
  • 1
  • 2

从这段脚本中,我们可以知道,训练的入口函数就在train_net.py中,其位于fast-rcnn/tools/文件夹内,我们先来看看这个文件。

if __name__ == '__main__':
    args = parse_args()
    print('Called with args:')
    print(args)

    if args.cfg_file is not None:
        cfg_from_file(args.cfg_file)
    if args.set_cfgs is not None:
        cfg_from_list(args.set_cfgs)

    print('Using config:')
    pprint.pprint(cfg)

    if not args.randomize:
        # 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()
    if args.gpu_id is not None:
        caffe.set_device(args.gpu_id)

    imdb = get_imdb(args.imdb_name)
    print 'Loaded dataset `{:s}` for training'.format(imdb.name)
    roidb = get_training_roidb(imdb)

    output_dir = get_output_dir(imdb, None)
    print 'Output will be saved to `{:s}`'.format(output_dir)

    train_net(args.solver, roidb, output_dir,
              pretrained_model=args.pretrained_model,
              max_iters=args.max_iters)
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

从以上的code,我们可以看到,train_net.py的主要处理过程包括以下三个部分:

(1) 首先对启动脚本的输入参数进行处理,是通过如下这个函数parse_args()进行处理的。

def parse_args():
    """
    Parse input arguments
    """
    parser = argparse.ArgumentParser(description='Train a Fast R-CNN network')
    parser.add_argument('--gpu', dest='gpu_id',
                        help='GPU device id to use [0]', default=0, type=int)
    parser.add_argument('--solver', dest='solver',
                        help='solver prototxt', default=None, type=str)
    parser.add_argument('--iters', dest='max_iters',
                        help='number of iterations to train',default=40000, type=int)
    parser.add_argument('--weights', dest='pretrained_model',
                        help='initialize with pretrained model weights', default=None, type=str)
    parser.add_argument('--cfg', dest='cfg_file',
                        help='optional config file',default=None, type=str)
    parser.add_argument('--imdb', dest='imdb_name',
                        help='dataset to train on',default='voc_2007_trainval', type=str)
    parser.add_argument('--rand', dest='randomize',
                        help='randomize (do not use a fixed seed)',action='store_true')
    parser.add_argument('--set', dest='set_cfgs',
                        help='set config keys', default=None,nargs=argparse.REMAINDER)

    if len(sys.argv) == 1:
        parser.print_help()
        sys.exit(1)

    args = parser.parse_args()
    return args
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

从这个函数中,我们可以了解到,训练脚本的可选输入参数包括:

  • –gpu: 这个参数指定训练使用的GPU设备,我的电脑只有一枚GPU,默认情况下自动开启,其gpu_id为0;
  • –solver: 这个参数指定网络的优化方法,并在其solver的prototxt指向了定义网络结构的文件(train.prototxt);
  • –weights: 这个参数指定了finetune的初始参数,我的电脑GPU不怎么高端,只能使用caffenet进行finetune;
  • –imdb: 这个参数指定了训练所需要的训练数据,如果你需要训练自己的数据,那么这个参数是必须要指定的;

(2) 然后是根据输入的参数(–imdb 参数后面指定的数据)来准备训练样本,这个步骤涉及到两个函数:一个 imdb=get_imdb(args.imdb_name) , 另一个是roidb=get_training_roidb(imdb)。关于这两个函数我们下部分会花大时间来解析,这里先不谈。

(3) 最后就是训练函数:train_net(args.solver,roidb, output_dir, pretrained_model= args.pretrained_model, max_iters= args.max_iters)

而这个 train_net() 函数是从 fast_rcnn/lib/fast_rcnn 文件夹中的 train.py 中 import 进来的。那么接下来,我们来看看这个train.py

这里写图片描述

这个函数主要由一个类SolverWrapper和两个函数get_training_roidb()和train_net()组成。 
首先,我们来看看train_net()函数:

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

    print 'Solving...'
    sw.train_model(max_iters)
    print 'done solving'
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

可以发现,该函数是通过调用类SolverWrapper来实现其主要功能的,因此,我们跟进到类SolverWrapper的类构造函数中去:

def __init__(self, solver_prototxt, roidb, output_dir,
                 pretrained_model=None):
        """Initialize the SolverWrapper."""
        self.output_dir = output_dir

        print 'Computing bounding-box regression targets...'
        self.bbox_means, self.bbox_stds = \
                rdl_roidb.add_bbox_regression_targets(roidb)
        print 'done'

        self.solver = caffe.SGDSolver(solver_prototxt)
        if pretrained_model is not None:
            print ('Loading pretrained model '
                   'weights from {:s}').format(pretrained_model)
            self.solver.net.copy_from(pretrained_model)

        self.solver_param = caffe_pb2.SolverParameter()
        with open(solver_prototxt, 'rt') as f:
            pb2.text_format.Merge(f.read(), self.solver_param)

        self.solver.net.layers[0].set_roidb(roidb)
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

初始化完成后,就是要调用train_model函数来进行网络训练,我们来看一下它的主体部分:

def train_model(self, max_iters):
    """Network training loop."""
    last_snapshot_iter = -1
    timer = Timer()
    while self.solver.iter < max_iters:
        # Make one SGD update
        timer.tic()
        self.solver.step(1)
        timer.toc()
        if self.solver.iter % (10 * self.solver_param.display) == 0:
            print 'speed: {:.3f}s / iter'.format(timer.average_time)

        if self.solver.iter % cfg.TRAIN.SNAPSHOT_ITERS == 0:
            last_snapshot_iter = self.solver.iter
            self.snapshot()

    if last_snapshot_iter != self.solver.iter:
        self.snapshot()
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

到此为止,网络就可以开始训练了。

训练数据处理

不过,关于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]()
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

这个函数很简单,其实就是根据字典的key来取得训练数据。 
那么这个字典是怎么形成的呢?看下面:

inria_devkit_path = '/home/jeremy/jWork/frcn/fast-rcnn/data/INRIA/'
for split in ['train', 'test']:
    name = '{}_{}'.format('inria', split)
    __sets[name] = (lambda split=split: datasets.inria(split, inria_devkit_path))
 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

它本质上是通过lib/datasets/文件夹下面的inria.py引入的。 
所以,现在我们就得开始进入inria.py(这个函数需要我们自己编写,可以参考pascal_voc.py编写)。

这里写图片描述

首先,我们来看看类inria的构造函数:

 def __init__(self, image_set, devkit_path):
        datasets.imdb.__init__(self, image_set)
        self._image_set = image_set
        self._devkit_path = devkit_path
        self._data_path = os.path.join(self._devkit_path, 'data')
        self._classes = ('__background__', # always index 0
                         '1001')
        self._class_to_ind = dict(zip(self.classes, xrange(self.num_classes)))
        self._image_ext = ['.jpg', '.png']
        self._image_index = self._load_image_set_index()
        # Default to roidb handler
        self._roidb_handler = self.selective_search_roidb

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

        assert os.path.exists(self._devkit_path), \
                'Devkit path does not exist: {}'.format(self._devkit_path)
        assert os.path.exists(self._data_path), \
                'Path does not exist: {}'.format(self._data_path)
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

这里面最要注意的是要根据自己训练的类别同步修改self._classes,我这里面只有两类。

类 inria 构造完成后,会调用函数 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 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)
        print len(roidb)
    with open(cache_file, 'wb') as fid:
        cPickle.dump(roidb, fid, cPickle.HIGHEST_PROTOCOL)
    print 'wrote ss roidb to {}'.format(cache_file)

    return roidb
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

这个函数在训练阶段会首先调用get_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_inria_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
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

如果存在cache_file,那么get_roidb()就会直接从cache_file中读取信息;如果不存在cache_file,那么会调用_load_inria_annotation()来取得标注信息。_load_inria_annotation函数如下所示:

def _load_inria_annotation(self, index):
        """
        Load image and bounding boxes info from txt files of INRIA Person.
        """
        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
            # ---------------------------------------------
            # add these lines to avoid the accertion error
            if x1 < 0:
                x1 = 0
            if y1 < 0:
                y1 = 0
            # ----------------------------------------------
            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}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

当处理完标注的数据后,接下来就要载入SS阶段获得的数据,通过如下函数完成:

    def _load_selective_search_roidb(self, gt_roidb):
        filename = os.path.abspath(os.path.join(self._devkit_path,
                                                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]):
            #这个地方需要注意,如果在SS中你已经变换了box的值,那么就不需要再改变box值的位置了
            #box_list.append(raw_data[i][:, (1, 0, 3, 2)] - 1)
            box_list.append(raw_data[i][:, (1, 0, 3, 2)])

    return self.create_roidb_from_box_list(box_list, gt_roidb)
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

有一点需要注意的是,ss中获得的box的值,和fast-rcnn中认为的box值有点差别,那就是你需要交换box的x和y坐标。

未完待续……


本文地址:http://blog.youkuaiyun.com/linj_m/article/details/48930179 
更多资源请关注 博客:LinJM-机器视觉 微博:林建民-机器视觉


Fast Point R-CNN | 一个或许跟PointRCNN和Fast RCNN都没啥关系的点云目标检测网络 【导读】这是一篇来自ICCV2019的论文,由港中文的贾佳亚教授实验室完成。虽然名字很接近,但是Fast Point R-CNN不仅跟Fast R-CNN没有任何关系,它跟Point R-CNN也没太大关系,找前景点,做精细回归思想相近。三者唯一的共同点就是它们三个都是two-stage网络,但是网络结构完全不同。 如果要强行归类的话,Fast Point R-CNN应该算是VoxelNet... 阅读详情

相关推荐

避坑指南:SAP CO模块维护成本控制范围的5个常见错误及解决方法

本文深入剖析了SAP CO模块中维护成本控制范围时最易犯的5个常见错误,包括货币参数配置不当、标准层次结构缺失、财政年度变式不一致、功能激活遗漏及集成参数设置错误。重点针对事务码OKKP的配置,提供了详细的排查步骤与实战解决方案,帮助顾问有效规避陷阱,确保成本核算体系稳定运行。

stone的博客 234

python中self.__class__的用法详解

python中self.__class__的用法详解

IT之一小佬的博客 6089

Matlab实战:用DQN算法让机器人学会自主避障(附完整代码)

本文详细介绍了如何使用Matlab实现DQN(深度Q网络)算法,使机器人在复杂环境中学会自主避障。通过环境建模、网络架构设计、奖励函数优化及实战调试,提供了完整的代码实现和训练策略,帮助开发者快速应用于机器人路径规划项目。

t8u9v0w1x的博客 234

Python 面向对象---类

1:概述 Python是一种面向对象的语言,在Python中创建一个类和对象是很容易的。面向对象编程——Object Oriented Programming,简称OOP,OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。 面向对象技术简介 类(...

业精于勤荒于嬉 431

微信4.1.5.16升级后,你的自动化脚本失灵了?手把手教你用C#让UI树“复活”

微信4.1.5.16版本更新导致自动化脚本失效?本文深入解析微信UI树隐藏的原因,并提供C#实战解决方案,通过UIAutomation技术恢复UI树结构,帮助开发者重新实现自动化操作。涵盖技术原理、代码实现及优化策略,适合RPA开发者和自动化脚本编写者参考。

weixin_30879169的博客 519

双目立体匹配算法:SGBM

SGBM(Semi-Global Block Matching)是一种用于计算双目视觉中视差(disparity)的半全局匹配算法,在OpenCV中的实现为semi-global block matching(SGBM)。它是基于全局匹配算法和局部匹配算法的优缺点,提出了一种折中的方法,既能保证视差图的质量,又能降低计算复杂度。

weixin_45303602的博客 9411

python的面向对象基础

python的面向对象基础

##$_$## 582

GD32F470实战:如何用EXMC+SDRAM搞定LVGL大内存需求(附完整代码)

本文详细介绍了如何在GD32F470微控制器上通过EXMC接口驱动外部SDRAM,以满足LVGL图形库的大内存需求。内容涵盖硬件连接、EXMC时序配置、轻量级内存管理器实现,以及将LVGL帧缓冲和资源无缝集成到SDRAM的实战方法,并提供了完整的代码示例和调试技巧,帮助开发者构建稳定可靠的嵌入式GUI系统。

k9l0m1的博客 442

基于Tensorflow2的YOLOV4 网络结构及代码解析(1)——backbone网络结构

笔者以tensorflow2代码作为基础,解析yolovV4的网络结构。 主要从以下几个部分剖析yolov4: 1.YOLOV4创新点和backbone网络结构 2.YOLOV4的NECK和YoloHead 3.YOLOV4的Loss和Input 在剖析的同时,会对代码细节进行详细解释。 Yolov4论文地址:https://arxiv.org/pdf/2004.10934.pdf 创新点: backbone网络结构: yolov4以CSPDarkNet53作为backbone,替换.

xiaoyang0307的博客 2255

10、犹豫双模糊TOPSIS算法:原理与实例解析

本文介绍了犹豫双模糊TOPSIS算法的基本原理与应用步骤,结合中国四家纺织公司的案例,详细解析了从构建犹豫双模糊决策矩阵、归一化处理、专家信息聚合,到确定正负理想解、计算距离与相对贴近度系数的完整决策流程。该方法有效应对决策者在评价过程中的犹豫性,适用于财务评估、项目选择等复杂多属性决策场景,具有较强的实用性和推广价值。

yhn45678901的博客 122

知识蒸馏⚗️ | YOLOv5知识蒸馏实战篇

YOLOv5知识蒸馏教程

Coding... 9361

深度学习之目标检测faster rcnn算法解读

0 背景 faster rcnn 作为目标检测领域内的经典算法,其思想值得仔细研究学习,本文系统性地对 faster rcnn 系列文章进行导读,总结归纳核心思想。 首先了解下该系列文章的时间轴: R-CNN(CVPR,2014) --> SPP-Net(ECCV,2014) --> Fast RCNN(ICCV,2015) --> Faster RCNN(NIPS,2015) 因此本文也会按照这个顺序展开。 1 R-CNN 论文:《Rich feature hierarchie

ZONGXP的博客 2907

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

RCNN

RCNN

Major_S的博客 548

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

你真的理解Faster RCNN吗?捋一捋Pytorch官方Faster RCNN代码

点击上方“3D视觉工坊”,选择“星标”干货第一时间送达作者丨白裳@知乎来源丨https://zhuanlan.zhihu.com/p/145842317编辑丨极市平台导读本文详细的介绍...

3D视觉工坊 3134

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Faster RCNN(陈云版代码导读)

Faster RCNN(陈云版代码导读) 几个月前看了陈云版的faster rcnn的代码,那时还在计算机视觉的入门阶段,看代码比较仔细,习惯把数据流的shape都弄明白,因此做了下面这个图,现在发到网上供大家学习交流。图中的数据流是test阶段的,怎么训练的我没太仔细看,所以就没有记录训练阶段的数据流。废话不多说,直接上图。 我把原drawio文件也放上来。不要积分哦! ...

weixin_40530531的博客 395

点云拼接_Fast Point RCNN | 一个跟Point RCNN和Fast RCNN都没啥关系的点云目标检测网络...

【导读】这是一篇来自ICCV2019的论文,由港中文的贾佳亚教授实验室完成。虽然名字很接近,但是Fast Point R-CNN不仅跟Fast R-CNN没有任何关系,它跟Point R-CNN也没太大关系,找前景点,做精细回归思想相似。三者唯一的相似点就是它们三个都是two-stage网络。如果要强行归类的话,Fast Point R-CNN应该算是VoxelNet一派的。这一点从网络...

weixin_29188759的博客 226

带你读论文系列之计算机视觉RCNN

但是这样,我们总是习惯了不愿改变。 前言 RCNN系列的文章主要是**RCNN,Fast RCNN, Faster RCNN, Mask RCNN, Cascade RCNN,**这一系列的文章是目标检测two-stage算法的代表,这系列的算法精度高,效果好,是一类重要的方法。 先来讲解目标检测开山之作R-CNN Rich feature hierarchies for accurate object detection and semantic segmentation 这是一篇比较早的Object .

wuli_xin的博客 280

《Fast R-CNN》论文阅读之Fast R-CNN

Fast R-CNNRoss Girshick Microsoft Research rbg@microsoft.compaper:Fast R-CNN导读Fast R-CNN在SPPNet的基础再跟进,进一步提升速度和准确率,提出了RoI层代替SPP层,实现了整个物体检测模型大部分网络的end-to-end,下面就来好好学习一下。老套路,现回顾一下: R-CNN ,SPP-netR-CNN和SP...

Gavinmiaoc的博客 1303

物体检测 faster rcnn

转载自:http://blog.youkuaiyun.com/shuzfan/article/details/52662384 本次介绍人脸检测方法Faster R-CNN: 《2016 Arxiv: Face Detection with the Faster R-CNN》. 上面这篇文章,是对Faster R-CNN的人脸检测实现,原始的Faster R-CNN实现的是多目标

Nicholas_Liu2017的博客 657

开放下载!从RCNN到SSD,这应该是最全的一份目标检测算法盘点

导读:从简单的图像分类到3D姿势识别,计算机视觉从来不缺乏有趣的问题和挑战。通过肉眼我们可以检测出一张宠物照中的猫和狗,可以识别出梵高作品《星夜》中的星星和月亮,那如何通过算法赋予机器“看”的智能,就是我们接下来要讲的。 本文首先会介绍目标检测的概念,然后介绍一种简化了的目标检测问题——定位 + 分类以及它存在的问题,最后由浅入深逐步进入到目标检测常用的模型及方法,如 Faster R-CNN、...

阿里云云栖号 1230

CNN中的感受野和有效感受野会对模型产生怎样的影响?

2019-10-06 20:01:44 作者:Noam ( 八云 ) R. 编译:ronghuaiyang 导读 在卷积神经网络中,感受野是一个非常重要的概念,今天,我们具体来看一下感受野的相关概念以及如何计算感受野。 感受野 让我们快速回顾一下如何计算感受野的大小。 为了更好地理解感受野,我们可能希望以不同的方式可视化卷积步骤。 在右边,我们查看输出神经元,也就是新的fe...

喜欢打酱油的老鸟 770

Fast-SCNN的解释以及使用Tensorflow 2.0的实现

点击上方↑↑↑“视学算法”关注我来源:公众号AI公园授权作者:Kshitiz Rimal编译:ronghuaiyang导读对图像分割方法Fast-SCNN的解释以及实现的代码分析。F...

zandaoguang的博客 334

【论文解读】深度学习目标检测 | R-CNN系列里程碑 | 一文弄懂Faster R-CNN

目录前言论文导读R-CNN系列发展1 简介2 Faster R-CNN网络结构2 实验和评估 前言 论文导读 【论文解读】 图像分割 & 目标识别 | Selective Search和python实现| <Selective Search for Object Recognition> 【论文解读】深度学习目标检测的开山鼻祖 |R-CNN详解 | 两阶段目标检测代表 【论文解读】目标检测的发展之作|Ross大神续作 | Fast R-CNN R-CNN系列发展 R-CNN 将深度学习应用到目标

熊猫小妖的AI世界 1881
上一篇: fast-rcnn配置运行VGG16.caffemodel和VGG_CNN_M_1024.v2.caffemodel(Ubuntu14.04)
下一篇: Fast RCNN 训练自己数据集 (1编译配置)
2014wzy
博客等级 码龄13年 759粉丝 85原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值