环境:

  • ubuntu14.04
  • CUDA7.5
  • python2.7
  • opencv2.0以上

caffe及py-faster-rcnn的配置安装过程可以参考我的另一篇博客:深度学习框架caffe及py-faster-rcnn详细配置安装过程

做训练数据集的过程可以参考这篇博客:将数据集做成VOC2007格式用于Faster-RCNN训练

1、下载VOC2007数据集

百度云地址:http://pan.baidu.com/s/1gfdSFRX
解压,然后,将该数据集放在py-faster-rcnn\data目录下,用你的训练数据集替换VOC2007数据集。(替换Annotations,ImageSets和JPEGImages)
(用你的Annotations,ImagesSets和JPEGImages替换py-faster-rcnn\data\VOCdevkit2007\VOC2007中对应文件夹)
文件结构如下所示:

wlw@wlw:~/language/caffe/py-faster-rcnn/data/VOCdevkit2007$ ls
results  VOC2007
wlw@wlw:~/language/caffe/py-faster-rcnn/data/VOCdevkit2007/results/VOC2007$ ls
Layout  Main  Segmentation
wlw@wlw:~/language/caffe/py-faster-rcnn/data/VOCdevkit2007/VOC2007$ ls
Annotations  ImageSets  JPEGImages
  • 1
  • 2
  • 1
  • 2

Annotations中是所有的xml文件
JPEGImages中是所有的训练图片
Main中是4个txt文件,其中test.txt是测试集,train.txt是训练集,val.txt是验证集,trainval.txt是训练和验证集

2、训练前的一些修改

(1)py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt/stage1_fast_rcnn_train.pt修改

layer {  name: 'data'  type: 'Python'  top: 'data'  top: 'rois'  top: 'labels'  top: 'bbox_targets'  top: 'bbox_inside_weights'  top: 'bbox_outside_weights'  python_param {  module: 'roi_data_layer.layer'  layer: 'RoIDataLayer'  param_str: "'num_classes': 2" #按训练集类别改,该值为类别数+1  }
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
layer {  name: "cls_score"  type: "InnerProduct"  bottom: "fc7"  top: "cls_score"  param { lr_mult: 1.0 }  param { lr_mult: 2.0 }  inner_product_param {  num_output: 2 #按训练集类别改,该值为类别数+1  weight_filler {  type: "gaussian"  std: 0.01  }  bias_filler {  type: "constant"  value: 0  }  }
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
layer {  name: "bbox_pred"  type: "InnerProduct"  bottom: "fc7"  top: "bbox_pred"  param { lr_mult: 1.0 }  param { lr_mult: 2.0 }  inner_product_param {  num_output: 8 #按训练集类别改,该值为(类别数+1)*4  weight_filler {  type: "gaussian"  std: 0.001  }  bias_filler {  type: "constant"  value: 0  }  }
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

(2)py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt/stage1_rpn_train.pt修改

layer {  name: 'input-data'  type: 'Python'  top: 'data'  top: 'im_info'  top: 'gt_boxes'  python_param {  module: 'roi_data_layer.layer'  layer: 'RoIDataLayer'  param_str: "'num_classes': 2" #按训练集类别改,该值为类别数+1  }
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

(3)py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt/stage2_fast_rcnn_train.pt修改

layer {  name: 'data'  type: 'Python'  top: 'data'  top: 'rois'  top: 'labels'  top: 'bbox_targets'  top: 'bbox_inside_weights'  top: 'bbox_outside_weights'  python_param {  module: 'roi_data_layer.layer'  layer: 'RoIDataLayer'  param_str: "'num_classes': 2" #按训练集类别改,该值为类别数+1  }
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
layer {  name: "cls_score"  type: "InnerProduct"  bottom: "fc7"  top: "cls_score"  param { lr_mult: 1.0 }  param { lr_mult: 2.0 }  inner_product_param {  num_output: 2 #按训练集类别改,该值为类别数+1  weight_filler {  type: "gaussian"  std: 0.01  }  bias_filler {  type: "constant"  value: 0  }  }
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
layer {  name: "bbox_pred"  type: "InnerProduct"  bottom: "fc7"  top: "bbox_pred"  param { lr_mult: 1.0 }  param { lr_mult: 2.0 }  inner_product_param {  num_output: 8 #按训练集类别改,该值为(类别数+1)*4  weight_filler {  type: "gaussian"  std: 0.001  }  bias_filler {  type: "constant"  value: 0  }  }
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

(4)py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt/stage2_rpn_train.pt修改

layer {  name: 'input-data'  type: 'Python'  top: 'data'  top: 'im_info'  top: 'gt_boxes'  python_param {  module: 'roi_data_layer.layer'  layer: 'RoIDataLayer'  param_str: "'num_classes': 2" #按训练集类别改,该值为类别数+1  }
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

(5)py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt/faster_rcnn_test.pt修改

layer {  name: "cls_score"  type: "InnerProduct"  bottom: "fc7"  top: "cls_score"  inner_product_param {  num_output: 2 #按训练集类别改,该值为类别数+1  }
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
layer {  name: "bbox_pred"  type: "InnerProduct"  bottom: "fc7"  top: "bbox_pred"  inner_product_param {  num_output: 8 #按训练集类别改,该值为(类别数+1)*4  }
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

(6)py-faster-rcnn/lib/datasets/pascal_voc.py修改

class pascal_voc(imdb):  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  '你的标签1','你的标签2','你的标签3','你的标签4'  )  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

将其中

self._classes = ('__background__', # always index 0  '你的标签1','你的标签2','你的标签3','你的标签4'  ) 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

中的标签修改成你的数据集的标签。

(7)py-faster-rcnn/lib/datasets/imdb.py修改

该文件的append_flipped_images(self)函数修改为:

def append_flipped_images(self):  num_images = self.num_images  widths = [PIL.Image.open(self.image_path_at(i)).size[0]  for i in xrange(num_images)]  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  print boxes[:, 0]  boxes[:, 2] = widths[i] - oldx1 - 1  print boxes[:, 0]  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  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

(8)其他
为防止与之前的模型搞混,训练前把output文件夹删除(或改个其他名),还要把py-faster-rcnn/data/cache中的文件和
py-faster-rcnn/data/VOCdevkit2007/annotations_cache中的文件删除(如果有的话)。
至于学习率等之类的设置,可在py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt中的solve文件设置,迭代次数可在py-faster-rcnn/tools的train_faster_rcnn_alt_opt.py中修改:

max_iters = [80000, 40000, 80000, 40000]  
  • 1
  • 1

分别为4个阶段(rpn第1阶段,fast rcnn第1阶段,rpn第2阶段,fast rcnn第2阶段)的迭代次数。可改成你希望的迭代次数。
如果改了这些数值,最好把py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt里对应的solver文件(有4个)也修改,stepsize小于上面修改的数值。

3、训练

在py-faster-rcnn根目录下执行:

./experiments/scripts/faster_rcnn_alt_opt.sh 0 ZF pascal_voc  
  • 1
  • 1

训练结束如下图所示:

在py-faster-rcnn/output/faster_rcnn_alt_opt/voc_2007_trainval/下会有ZF_faster_rcnn_final.caffemodel ,这就是我们用自己的数据集训练得到的最终模型。

wlw@wlw:~/language/caffe/py-faster-rcnn/output/faster_rcnn_alt_opt/voc_2007_trainval$ ls
ZF_faster_rcnn_final.caffemodel            zf_rpn_stage1_iter_80000.caffemodel     zf_rpn_stage2_iter_80000_proposals.pkl
zf_fast_rcnn_stage1_iter_40000.caffemodel  zf_rpn_stage1_iter_80000_proposals.pkl
zf_fast_rcnn_stage2_iter_40000.caffemodel  zf_rpn_stage2_iter_80000.caffemodel
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

4、测试

将上述的ZF_faster_rcnn_final.caffemodel复制到py-faster-rcnn\data\faster_rcnn_models,修改修改:
py-faster-rcnn\tools\demo.py:

CLASSES = ('__background__',  '你的标签1', '你的标签2', '你的标签3', '你的标签4')  
  • 1
  • 2
  • 1
  • 2

改为之前的训练数据集的标签。
在修改def parse_args()函数:

    parser.add_argument('--net', dest='demo_net', help='Network to use [vgg16]',choices=NETS.keys(), default='zf')
  • 1
  • 2
  • 1
  • 2

选择模型ZF:default=’zf’

注:
若修改了模型的名称,如将ZF_faster_rcnn_final.caffemodel重命名为CAR_faster_rcnn_final.caffemodel,并将需要检测的图片放在/data/car/
目录下,则还需要修改py-faster-rcnn\tools\demo.py:

NETS = {'vgg16': ('VGG16','VGG16_faster_rcnn_final.caffemodel'),'ldlidar': ('LDLIDAR','LDLIDAR_faster_rcnn_final.caffemodel')}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
# Load the demo image
im_file = os.path.join(cfg.DATA_DIR, 'ldlidar', image_name)
im = cv2.imread(im_file)
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3
def parse_args():"""Parse input arguments."""parser = argparse.ArgumentParser(description='Faster R-CNN demo')parser.add_argument('--gpu', dest='gpu_id', help='GPU device id to use [0]',default=0, type=int)parser.add_argument('--cpu', dest='cpu_mode',help='Use CPU mode (overrides --gpu)',action='store_true')parser.add_argument('--net', dest='demo_net', help='Network to use [vgg16]',choices=NETS.keys(), default='ldlidar')args = parser.parse_args()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
path = '/home/wlw/language/caffe/py-faster-rcnn/data/ldlidar'for filename in os.listdir(path):im_name = filenameprint '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'print 'Demo for data/ldlidar/{}'.format(im_name)demo(net, im_name)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

运行demo.py

cd ./tools
python demo.py
  • 1
  • 2
  • 1
  • 2

5、可能遇到的问题

(1)

Traceback (most recent call last):File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrapself.run()File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in runself._target(*self._args, **self._kwargs)File "./tools/train_faster_rcnn_alt_opt.py", line 189, in train_fast_rcnnroidb, imdb = get_roidb(imdb_name, rpn_file=rpn_file)File "./tools/train_faster_rcnn_alt_opt.py", line 67, in get_roidbroidb = get_training_roidb(imdb)File "/home/wlw/language/caffe/py-faster-rcnn/tools/../lib/fast_rcnn/train.py", line 118, in get_training_roidbimdb.append_flipped_images()File "/home/wlw/language/caffe/py-faster-rcnn/tools/../lib/datasets/imdb.py", line 114, in append_flipped_imagesassert (boxes[:, 2] >= boxes[:, 0]).all()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

这是因为用于训练的图片中的标记的左上角坐标(x,y)可能为0,或标记的区域溢出图片。而faster rcnn会对Xmin,Ymin,Xmax,Ymax进行减一操作,如果Xmin为0,减一后变为65535。
解决方法:
修改lib/datasets/imdb.py中的append_flipped_images()函数:
在代码

boxes[:, 2] = widths[i] - oldx1 - 1
  • 1
  • 1

下,添加代码:

for b in range(len(boxes)):if boxes[b][2] < boxes[b][0]:boxes[b][0] = 0
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

若仍不能解决,修改lib/datasets/pascal_voc.py中的_load_pascal_annotation()函数,将其中将对Xmin,Ymin,Xmax,Ymax减一去掉,改为:

for ix, obj in enumerate(objs):bbox = obj.find('bndbox')# Make pixel indexes 0-basedx1 = float(bbox.find('xmin').text)y1 = float(bbox.find('ymin').text)x2 = float(bbox.find('xmax').text)y2 = float(bbox.find('ymax').text)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

(2)

Traceback (most recent call last):File "./tools/test_net.py", line 90, in <module>test_net(net, imdb, max_per_image=args.max_per_image, vis=args.vis)File "/home/wlw/language/caffe/py-faster-rcnn/tools/../lib/fast_rcnn/test.py", line 295, in test_netimdb.evaluate_detections(all_boxes, output_dir)File "/home/wlw/language/caffe/py-faster-rcnn/tools/../lib/datasets/pascal_voc.py", line 317, in evaluate_detectionsself._write_voc_results_file(all_boxes)File "/home/wlw/language/caffe/py-faster-rcnn/tools/../lib/datasets/pascal_voc.py", line 244, in _write_voc_results_filewith open(filename, 'wt') as f:
IOError: [Errno 2] No such file or directory: '/home/wlw/language/caffe/py-faster-rcnn/data/VOCdevkit2007/results/VOC2007/Main/comp4_507d2b05-379f-4cf1-a1d4-5bd729d32fb0_det_test_building.txt'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

解决方法:检查./data/VOCdevkit2007文件夹是否复制完整,./data/VOCdevkit2007/results/VOC2007目录下是否有Layout Main Segmentation三个文件夹。

参考资料:

Faster-RCNN+ZF用自己的数据集训练模型(Python版本)
解决faster-rcnn中训练时assert(boxes[:,2]>=boxes[:,0]).all()的问题
Faster RCNN 训练自己的检测模型

py-faster-rcnn用自己的数据训练模型相关推荐

  1. [深度学习] RCNNs系列(1) Ubuntu下Faster RCNN配置及训练和测试自己的数据方法

    最近用到Faster RCNN进行目标检测,前前后后两周把RCNN,SPPNet,Fast RCNN和Faster RCNN大体调查了一遍,准备写一个RCNNs系列,后面还要加上今年最新的Mask R ...

  2. faster rcnn源码解读(三)train_faster_rcnn_alt_opt.py

    转载自:faster rcnn源码解读(三)train_faster_rcnn_alt_opt.py - 野孩子的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/u ...

  3. Faster RCNN代码理解(Python) ---训练过程

    最近开始学习深度学习,看了下Faster RCNN的代码,在学习的过程中也查阅了很多其他人写的博客,得到了很大的帮助,所以也打算把自己一些粗浅的理解记录下来,一是记录下自己的菜鸟学习之路,方便自己过后 ...

  4. Faster RCNN 训练中的一些问题及解决办法

    今天使用Faster RCNN训练自己的数据的时候,出现了一些因为boost或者是numpy版本不兼容导致的问题,经过各种查资料和求助大神,总算是顺利把网络跑起来了.下面内容都是今天亲测出现的问题并与 ...

  5. Faster R-CNN源码中RPN的解析(自用)

    参考博客(一定要看前面两个) 一文看懂Faster R-CNN 详细的Faster R-CNN源码解析之RPN源码解析 关于RPN一些我的想法 rpn的中心思想就是在了anchors了,如何产生anc ...

  6. Faster rcnn 训练coco2017数据报错 RuntimeError: CUDA error: device-side assert triggered

    Faster rcnn 训练coco2017数据报错 RuntimeError: CUDA error: device-side assert triggered 使用faster rcnn训练自己的 ...

  7. 详细的Faster R-CNN源码解析之RPN源码解析

    在阔别了将近三个月之后,笔者又准备更新博客了.对于前两个多月的未及时更新,笔者在此向大家表示歉意,请大家原谅. 本次博客的更新是关于Faster R-CNN的源码.首先说一下笔者为什么要更新Faste ...

  8. caffe下matlab、python的配置和faster RCNN的运行

    因为自己的电脑没有安装linux环境,显卡也不支持CUDA,所以在实现faster RCNN的demo的过程中还是很麻烦的. 完善项目文件 下图是vs2013 打开的caffe解决方案的工程目录.由于 ...

  9. faster rcnn中anchor的生成

    faster rcnn anchor anchors 值的含义为 总共有9个anchor,对于每一个anchor,其四个数值分别代表矩形框的左下角x,y,右上角x,y. anchor的预设值为 # V ...

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

    转载自:faster rcnn源码解读(四)之数据类型imdb.py和pascal_voc.py(主要是imdb和roidb数据类型的解说) - 野孩子的专栏 - 博客频道 - CSDN.NET ht ...

最新文章

  1. 打印机没有反应计算机管理,计算机基础知识:如何解决打印机没有反应的问题(二)...
  2. VS调试ReactOS源码环境搭建5 - VS通过串口连接虚拟机
  3. OpenCV纹理对象的实时姿态估计
  4. python 画布包括不了全部组件?_试验程序:画布版九键琴
  5. Python 正则表达式re模块的使用
  6. 【BZOJ4008】亚瑟王,概率DP
  7. 深度学习-吴恩达-笔记-2-神经网络的编程基础
  8. 怎么处理table 与 form绑定的问题(现象:点击取消后 修改的值还是在table显示)
  9. linux创建raid5分区,linux RAID5 创建过程以及raid5扩容步骤(软raid)
  10. 【论文写作】SSM房屋租赁系统如何写设计总结
  11. python画散点图-从零开始学Python【15】--matplotlib(散点图)
  12. office365打开服务器文件出错,Microsoft Office 365个人版打开显示错误
  13. 如何求解二元一次不定方程的整数解
  14. 如何提高文献检索能力?
  15. 计算机中函数vlookup怎么用,教您使用excel函数vlookup
  16. hdu 5418 Victor and World (floyd+状压dp)
  17. 2022年 Q1书单:17本书《可口可乐传》《随机漫步的傻瓜》等 | δ星 丨读书笔记与书单 notes...
  18. 世界最清楚tensorflow入门教程
  19. arcgis server 学习(一) 地图要素查询
  20. Vin码/车架号OCr识别

热门文章

  1. boost::mp11::mp_map_update相关用法的测试程序
  2. boost::math模块使用 agm 以高精度计算 lemniscate 常量
  3. boost::topological_sort用法的测试程序
  4. GDCM:处理JAI-JPEGLS错误的测试程序
  5. boost::core实现交换std::type_info
  6. boost::container实现emplace进位的程序
  7. VTK:可视化之RenderTranslucentGeometry
  8. VTK:PolyData之ResampleAppendedPolyData
  9. VTK:图片之ImageSeparableConvolution
  10. OpenCV ASIFT的实例(附完整代码)