• faster-rcnn python3.5环境下使用自定义数据集复现一. 简单说明 本篇文章主要是简单叙说一下 faster-rcnn,在ubuntu16.04,python3.5,cuda8.0,cudnn 6.0,caffe1.0环境下的复现,要知道faste-rcnn官方的代码环境...
    faster-rcnn python3.5环境下使用自定义数据集复现

    一. 简单说明

      本篇文章主要是简单叙说一下 faster-rcnn,在ubuntu16.04,python3.5,cuda8.0,cudnn 6.0,caffe1.0环境下的复现,要知道faste-rcnn官方的代码环境是python2.7的,所以这里改动比较多,同时这里也会说一下怎样训练自己的数据集。

    二. faster rcnn环境搭建

    1. 准备工作

    (1)安装cython,python-opencv,easydict

                  执行命令:

                    pip install cython 

                    pip install easydict 

                    apt-get install python-opencv(安装过了就不必安装)

    2. 编译faster rcnn

    (1)下载 py-faster-rcnn

    在某个文件夹下执行命令:

    git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git


    (2)进入py-faster-rcnn/lib 文件夹执行命令:make

    (4)进入py-faster-rcnn\caffe-fast-rcnn

    拷贝一份配置,执行命令:执行 cp Makefile.config.example Makefile.config

    然后,配置Makefile.config文件,与上篇文档中记录的caffe相同:

    配置好Makefile.config文件后,执行命令:make -j8 && make pycaffe

    如果之前安装过caffe,则这里可能出现下面错误中的1情况,具体解决方法见错误1。



    三. 使用官方数据集训练测试

    1. 准备数据集

    (1)   下载VOC2007数据集:

            https://pan.baidu.com/s/1u50VVcfdmOCWPLDVqPHqzw

    解压后将数据集放在py-faster-rcnn\data下


    (2)下载ImageNet数据集下预训练得到的模型参数(用来初始化)

            https://pan.baidu.com/s/12renKYoytqk9-9bMrI73Lg

    解压,然后将该文件放在py-faster-rcnn\data下



    2. 训练模型

    注:训练脚本的最后面会有对训练好的模型进行测试的代码,这段代码在执行时会有错误,为了避免出错,可以将其删除掉(下面红色框住的部分):


    由于faster-caffe是基于python2.7版本编写的,所以在训练的过程中会有很多错误:会遇到以下的2,3,4,5,6,7,8中的错误,python3中的print()函数需要加上括号的。

    一切就绪后 在py-faster-rcnn文件夹下执行命令:

    ./experiments/scripts/faster_rcnn_alt_opt.sh 0 ZFpascal_voc

    执行完毕后在 py-faster-rcnn/output/faster_rcnn_alt_opt/voc_2007_trainval文件夹下可以看到生成的最终模型文件:ZF_faster_rcnn_final.caffemodel



    3. 测试模型

    (1)    将训练得到的ZF_faster_rcnn_final.caffemodel 拷贝至 py-faster-rcnn\data\faster_rcnn_models(如果没有这个文件夹,就新建一个)


    (2)    修改 py-faster-rcnn\tools\demo.py

    将:im_names =['1559.jpg','1564.jpg']中图片改为自己的图片名称 (测试图片放在py-faster-rcnn\data\demo中)

    (3)    执行测试:

    在py-faster-rcnn下执行: 

                ./tools/demo.py --net zf


    四. 使用自定义数据集训练模型并测试

    1. 制作数据集

    (1)将需要标记的图片归整化一下,转化成固定尺寸(可选)

    (2)将每类的图片重新更改一下文件名,这里提供一个手写版java程序:

    public class Demo {
    	public static void main(String[] args) {
    		Demo demo = new Demo();
    		demo.test();
    	}
    	
    	int i = 0;
    	public void test() {
    		String path = "E:\\python\\togue\\数据集\\crack\\";
    		File f = new File(path);
    		File[] files = f.listFiles();
    		for (File file : files) {
    			file.renameTo(new File(path+getNum(6)+"."+file.getName().split("\\.")[1]));
    		}
    	}
    	
    	public String getNum(int digit) {
    		StringBuffer sbf = new StringBuffer("crack_");
    		i++;
    		if((i+"").length() < digit) {
    			for(int j=0;j<digit-(i+"").length();j++) {
    				sbf.append("0");
    			}
    			sbf.append(i);
    		}
    		return sbf.toString();
    	}
    }

    可以进行批量更改,具体说明看代码,很简单,此步骤就是为了让图片名变得好看有序,

    建议图片名修改为【 分类名_数字.jpg】 格式


    (3)使用标记工具对每一类图片进行标记,这里建议每一类都建立一个文件夹,分开标记后分别生成txt文件,最后组合在一起(不知道哪位大神弄的,这里借用了,内附使用说明)

    下载链接: 

        https://pan.baidu.com/s/19UFtwfaLtAsIhxtLrDl3hQ

    标记后生成output.txt文件,内容大致如下:

    crack_000001.jpg 1 106 50 143 240
    crack_000002.jpg 1 128 29 192 214
    crack_000003.jpg 1 106 32 164 256

    前面是图片名,中间是目标类别,最后是目标的包围框坐标(左上角和右下角坐标)。

    将每一类的output.txt文件组合在一起 形成一个output.txt文件,将output.txt文件转化为xml标记文件,python代码为:

    from xml.dom.minidom import Document  
    import os  
    import os.path  
      
    xml_path = "E:\\资源共享\\python\\生成测试\\Annotations\\"  
      
    if not os.path.exists(xml_path):  
        os.mkdir(xml_path)  
      
    def writeXml(tmp, imgname, w, h, objbud, wxml):  
        doc = Document()  
        # owner  
        annotation = doc.createElement('annotation')  
        doc.appendChild(annotation)  
        # owner  
        folder = doc.createElement('folder')  
        annotation.appendChild(folder)  
        folder_txt = doc.createTextNode("SkinLesion")  
        folder.appendChild(folder_txt)  
      
        filename = doc.createElement('filename')  
        annotation.appendChild(filename)  
        filename_txt = doc.createTextNode(imgname)  
        filename.appendChild(filename_txt)  
        # ones#  
        source = doc.createElement('source')  
        annotation.appendChild(source)  
      
        database = doc.createElement('database')  
        source.appendChild(database)  
        database_txt = doc.createTextNode("The SkinLesion Database")  
        database.appendChild(database_txt)  
      
        annotation_new = doc.createElement('annotation')  
        source.appendChild(annotation_new)  
        annotation_new_txt = doc.createTextNode("SkinLesion")  
        annotation_new.appendChild(annotation_new_txt)  
      
        image = doc.createElement('image')  
        source.appendChild(image)  
        image_txt = doc.createTextNode("flickr")  
        image.appendChild(image_txt)  
        # onee#  
        # twos#  
        size = doc.createElement('size')  
        annotation.appendChild(size)  
      
        width = doc.createElement('width')  
        size.appendChild(width)  
        width_txt = doc.createTextNode(str(w))  
        width.appendChild(width_txt)  
      
        height = doc.createElement('height')  
        size.appendChild(height)  
        height_txt = doc.createTextNode(str(h))  
        height.appendChild(height_txt)  
      
        depth = doc.createElement('depth')  
        size.appendChild(depth)  
        depth_txt = doc.createTextNode("3")  
        depth.appendChild(depth_txt)  
        # twoe#  
        segmented = doc.createElement('segmented')  
        annotation.appendChild(segmented)  
        segmented_txt = doc.createTextNode("0")  
        segmented.appendChild(segmented_txt)  
    
    
        for i in range(0, int(len(objbud) / 5)):  
            # threes#  
            object_new = doc.createElement("object")  
            annotation.appendChild(object_new)  
      
            name = doc.createElement('name')  
            object_new.appendChild(name)  
            name_txt = doc.createTextNode(objbud[i * 5])  
            name.appendChild(name_txt)  
      
            pose = doc.createElement('pose')  
            object_new.appendChild(pose)  
            pose_txt = doc.createTextNode("Unspecified")  
            pose.appendChild(pose_txt)  
      
            truncated = doc.createElement('truncated')  
            object_new.appendChild(truncated)  
            truncated_txt = doc.createTextNode("0")  
            truncated.appendChild(truncated_txt)  
      
            difficult = doc.createElement('difficult')  
            object_new.appendChild(difficult)  
            difficult_txt = doc.createTextNode("0")  
            difficult.appendChild(difficult_txt)  
            # threes-1#  
            bndbox = doc.createElement('bndbox')  
            object_new.appendChild(bndbox)  
      
            xmin = doc.createElement('xmin')  
            bndbox.appendChild(xmin)  
            xmin_txt = doc.createTextNode(objbud[i * 5 + 1])  
            xmin.appendChild(xmin_txt)  
      
            ymin = doc.createElement('ymin')  
            bndbox.appendChild(ymin)  
            ymin_txt = doc.createTextNode(objbud[i * 5 + 2])  
            ymin.appendChild(ymin_txt)  
      
            xmax = doc.createElement('xmax')  
            bndbox.appendChild(xmax)  
            xmax_txt = doc.createTextNode(objbud[i * 5 + 3])  
            xmax.appendChild(xmax_txt)  
      
            ymax = doc.createElement('ymax')  
            bndbox.appendChild(ymax)  
            ymax_txt = doc.createTextNode(objbud[i * 5 + 4])  
            ymax.appendChild(ymax_txt)  
            # threee-1#  
            # threee#  
              
        tempfile = tmp + "test.xml"  
        with open(tempfile, "wb+") as f:  
            f.write(doc.toprettyxml(indent="\t", encoding='utf-8'))  
      
        rewrite = open(tempfile, "r")  
        lines = rewrite.read().split('\n')  
        newlines = lines[1:len(lines) - 1]  
          
        fw = open(wxml, "w")  
        for i in range(0, len(newlines)):  
            fw.write(newlines[i] + "\n")  
          
        fw.close()  
        rewrite.close()  
        os.remove(tempfile)  
        return  
        
        
    temp = "C:\\temp2\\"  
    if not os.path.exists(temp):  
        os.mkdir(temp) 
        
    fopen = open("E:\\资源共享\\python\\生成测试\\output.txt", 'r')
    lines = fopen.readlines()
    for line in lines:
        line = (line.split('\n'))[0]
        obj = line.split(' ')
        image_name = obj[0]
        xml_name = image_name.replace('.jpg', '.xml')
        filename = xml_path + xml_name
        obj = obj[1:]
        if obj[0] == '1':
            obj[0] = 'car'
        
        if obj[0] == '2':
            obj[0] = 'nocar'
        writeXml(temp, image_name, 299, 299, obj, filename)
    
    os.rmdir(temp)    
    
    -> 其中 xml_path 为标注文件存放的路径

    ->fopen = open("E:\\资源共享\\python\\生成测试\\output.txt", 'r'),为output.txt文件路径

    -> 

        if obj[0] == '1':

            obj[0] = 'car'
        
        if obj[0] == '2':
            obj[0] = 'nocar'

    这里的1 对应着car分类,2对应着nocar分类

    执行后即可生成每张图片对应的标准xml文件:xml文件大致内容如下:

    <annotation>
    	<folder>SkinLesion</folder>
    	<filename>car_000001.jpg</filename>
    	<source>
    		<database>The SkinLesion Database</database>
    		<annotation>SkinLesion</annotation>
    		<image>flickr</image>
    	</source>
    	<size>
    		<width>299</width>
    		<height>299</height>
    		<depth>3</depth>
    	</size>
    	<segmented>0</segmented>
    	<object>
    		<name>car</name>
    		<pose>Unspecified</pose>
    		<truncated>0</truncated>
    		<difficult>0</difficult>
    		<bndbox>
    			<xmin>106</xmin>
    			<ymin>50</ymin>
    			<xmax>143</xmax>
    			<ymax>240</ymax>
    		</bndbox>
    	</object>
    </annotation>

    (4)生成训练,测试集txt文件

    新建文件夹 ImageSets,进入文件夹再新建Main文件夹,执行python代码:

    import os
    import random
    import numpy as np
    
    xmlfilepath = 'E:\\资源共享\\python\\生成测试\\Annotations\\' 
    txtsavepath =  'E:\\资源共享\\python\\生成测试\\' 
    
    trainval_percent = 0.5
    train_percent = 0.5
    
    xmlfile = os.walk(xmlfilepath)  
    numOfxml = sum([len(x) for _, _, x in xmlfile])
    
    name_list = list(name for name in  os.listdir(xmlfilepath))
    trainval = sorted(list(random.sample(name_list, int(numOfxml * trainval_percent))))
    test = np.setdiff1d(np.array(name_list), np.array(trainval))
       
    trainvalsize = len(trainval)
    t_name_list = list(name for name in  trainval)
    train = sorted(list(random.sample(t_name_list, int(trainvalsize * trainval_percent))))
    val = np.setdiff1d(np.array(t_name_list), np.array(train))
    
    ftrainval = open(txtsavepath + "ImageSets\\Main\\trainval.txt", 'w')
    ftest = open(txtsavepath + "ImageSets\\Main\\test.txt", 'w')
    ftrain = open(txtsavepath + "ImageSets\\Main\\train.txt", 'w')
    fval = open(txtsavepath + "ImageSets\\Main\\val.txt", 'w')
    
    for name in  os.listdir(xmlfilepath):
        if name in trainval:  
            ftrainval.write(name.replace(".xml", "") + "\n") 
            if name in train:
                 ftrain.write(name.replace(".xml", "") + "\n")
            else:
                fval.write(name.replace(".xml", "") + "\n")
        else:
            ftest.write(name.replace(".xml", "") + "\n")   
            
    ftrainval.close() 
    ftrain.close() 
    fval.close() 
    ftest.close()

    其中:txtsavepath 是生成txt的根目录

    xmlfilepath 是xml标注文件的文件夹地址

    执行后会生成4个txt文件


    (5)新建文件夹VOC2007,进入文件夹再新建JPEGImages文件夹,将之前用于标注的图片全部放到改文件夹下


    (6)数据集文件如下所示:





    (7)    用制作好的数据集中 Annotations,ImagesSets和JPEGImages替换py-faster-rcnn\data\VOCdevkit2007\VOC2007中对应文件夹);

    (8)    下载ImageNet数据集下预训练得到的模型参数(用来初始化)

                   https://pan.baidu.com/s/12renKYoytqk9-9bMrI73Lg

    解压,然后将该文件放在py-faster-rcnn\data下


    2. 训练模型(需要改动以下文件)

    (1)py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt/stage1_fast_rcnn_train.pt修改,有3处:


    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': 16" #按训练集类别改,该值为类别数+1  
      }  
    }  
    
    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: 16 #按训练集类别改,该值为类别数+1
        weight_filler {
          type: "gaussian"
          std: 0.01
        }
        bias_filler {
          type: "constant"
          value: 0
        }
      }
    }
    
    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: 64 #按训练集类别改,该值为(类别数+1)*4
        weight_filler {
          type: "gaussian"
          std: 0.001
        }
        bias_filler {
          type: "constant"
          value: 0
        }
      }
    }
    

    (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': 16" #按训练集类别改,该值为类别数+1
      }
    }
    

    (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': 16" #按训练集类别改,该值为类别数+1
      }
    }
    
    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: 16 #按训练集类别改,该值为类别数+1
        weight_filler {
          type: "gaussian"
          std: 0.01
        }
        bias_filler {
          type: "constant"
          value: 0
        }
      }
    }
    
    
    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: 64 #按训练集类别改,该值为(类别数+1)*4
        weight_filler {
          type: "gaussian"
          std: 0.001
        }
        bias_filler {
          type: "constant"
          value: 0
        }
      }
    }
    

    (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': 16" #按训练集类别改,该值为类别数+1
      }
    }
    

    (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: 16 #按训练集类别改,该值为类别数+1
      }
    }
    
    
    layer {
      name: "bbox_pred"
      type: "InnerProduct"
      bottom: "fc7"
      top: "bbox_pred"
      inner_product_param {
        num_output: 64 #按训练集类别改,该值为(类别数+1)*4
      }
    }
    

    (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'
                          )
    

    其中:self._data_path =os.path.join(self._devkit_path, 'VOC'+self._year)  为训练集文件夹,

    若自定义的数据集直接替换原来VOC2007内的Annotations,ImageSets和JPEGImages,此处不用修改(推荐使用)

    self._classes= ('__background__', '你的标签1','你的标签2','你的标签3','你的标签4')

    修改成自定义的标签,需要注意顺序对应。

    cls =self._class_to_ind[obj.find('name').text.lower().strip()]

    .lower()会将标签转成小写,所以数据标签中字母最好是小写的,如果不是则将.lower()去掉,(推荐全部使用小写)


    (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

    若出现错误:这里assert (boxes[:, 2] >= boxes[:, 0]).all()可能出现AssertionError

    可参照错误9中解决方法。

    (8)为防止与之前的模型搞混,训练前把output文件夹删除(或改个其他名),还要把py-faster-rcnn/data/cache中的文件和py-faster-rcnn/data/VOCdevkit2007/annotations_cache中的文件删除(如果有的话)。

    (9)至于学习率等之类的设置,可在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] 

    分别为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小于上面修改的数值。

    (10)进行训练

    可以同官方数据集训练一样将faster_rcnn_alt_opt.sh中测试部分的代码删除掉

    再进入py-faster-rcnn,执行:

                ./experiments/scripts/faster_rcnn_alt_opt.sh 0 ZFpascal_voc

    执行完毕后在 py-faster-rcnn/output/faster_rcnn_alt_opt/voc_2007_trainval文件夹下可以看到生成的最终模型文件:ZF_faster_rcnn_final.caffemodel


    3. 训练测试

    同官方数据集测试一样。

    4. 提供调用接口

    由于该测试需要提供给其他程序调用,故需要编写接口,规定接口调用时指定图片路径,对demo.py代码改写如下所示

    #!/usr/bin/env python
    
    # --------------------------------------------------------
    # Faster R-CNN
    # Copyright (c) 2015 Microsoft
    # Licensed under The MIT License [see LICENSE for details]
    # Written by Ross Girshick
    # --------------------------------------------------------
    
    """
    Demo script showing detections in sample images.
    
    See README.md for installation instructions before running.
    """
    
    import _init_paths
    from fast_rcnn.config import cfg
    from fast_rcnn.test import im_detect
    from fast_rcnn.nms_wrapper import nms
    from utils.timer import Timer
    import matplotlib.pyplot as plt
    import numpy as np
    import scipy.io as sio
    import caffe, os, sys, cv2
    import argparse
    
    CLASSES = ('__background__','nevus','melanoma')
    #VARIABLE = None
    NETS = {'vgg16': ('VGG16',
                      'VGG16_faster_rcnn_final.caffemodel'),
            'zf': ('ZF',
                      'ZF_faster_rcnn_final.caffemodel')}
    
    def vis_detections(im, class_name, dets, thresh=0.5):
        """Draw detected bounding boxes."""
        inds = np.where(dets[:, -1] >= thresh)[0]
        if len(inds) == 0:
            return
    
        im = im[:, :, (2, 1, 0)]
        fig, ax = plt.subplots(figsize=(12, 12))
        ax.imshow(im, aspect='equal')
        for i in inds:
            bbox = dets[i, :4]
            score = dets[i, -1]
    
            ax.add_patch(
                plt.Rectangle((bbox[0], bbox[1]),
                              bbox[2] - bbox[0],
                              bbox[3] - bbox[1], fill=False,
                              edgecolor='red', linewidth=3.5)
                )
            ax.text(bbox[0], bbox[1] - 2,
                    '{:s} {:.3f}'.format(class_name, score),
                    bbox=dict(facecolor='blue', alpha=0.5),
                    fontsize=14, color='white')
        print("class_name:",class_name,"--score:",score)
    
        ax.set_title(('{} detections with '
                      'p({} | box) >= {:.1f}').format(class_name, class_name,
                                                      thresh),
                      fontsize=14)
        plt.axis('off')
        plt.tight_layout()
        plt.draw()
    
    def demo(net,_imgpath):
        """Detect object classes in an image using pre-computed object proposals."""
    
        
    	#im_file = os.path.join(cfg.DATA_DIR, 'demo', image_name)
        im_file = os.path.join(_imgpath)
    	
        im = cv2.imread(im_file)
    
        # Detect all object classes and regress object bounds
        timer = Timer()
        timer.tic()
        scores, boxes = im_detect(net, im)
        timer.toc()
        #print (('Detection took {:.3f}s for ''{:d} object proposals').format(timer.total_time, boxes.shape[0]))
    
        # Visualize detections for each class
        CONF_THRESH = 0.8
        NMS_THRESH = 0.3
        for cls_ind, cls in enumerate(CLASSES[1:]):
            cls_ind += 1 # because we skipped background
            cls_boxes = boxes[:, 4*cls_ind:4*(cls_ind + 1)]
            cls_scores = scores[:, cls_ind]
            dets = np.hstack((cls_boxes,
                              cls_scores[:, np.newaxis])).astype(np.float32)
            keep = nms(dets, NMS_THRESH)
            dets = dets[keep, :]
            vis_detections(im, cls, dets, thresh=CONF_THRESH)
    
    
    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='zf')
                            #choices=NETS.keys(), default='vgg16')
        parser.add_argument('--imgpath', dest='imgpath', help='Absolute path to detect pictures',default='/usr/develop/repertory/py-faster-rcnn/tools/')
    	
    
        args = parser.parse_args()
    
        return args
    
    if __name__ == '__main__':
        
        cfg.TEST.HAS_RPN = True  # Use RPN for proposals
    
        args = parse_args()
    
        prototxt = os.path.join(cfg.MODELS_DIR, NETS[args.demo_net][0],'faster_rcnn_alt_opt', 'faster_rcnn_test.pt')
        print(cfg.DATA_DIR)
        
        caffemodel = os.path.join(cfg.DATA_DIR, 'faster_rcnn_models',NETS[args.demo_net][1])
    
        if not os.path.isfile(caffemodel):
            raise IOError(('{:s} not found.\nDid you run ./data/script/'
                           'fetch_faster_rcnn_models.sh?').format(caffemodel))
    
        if args.cpu_mode:
            caffe.set_mode_cpu()
        else:
            caffe.set_mode_gpu()
            caffe.set_device(args.gpu_id)
            cfg.GPU_ID = args.gpu_id
        net = caffe.Net(prototxt, caffemodel, caffe.TEST)
    
        #print('\n\nLoaded network {:s}'.format(caffemodel))
    
        # Warmup on a dummy image
        im = 128 * np.ones((300, 500, 3), dtype=np.uint8)
        for i in range(2):
            _, _= im_detect(net, im)
    
        #Call detection pictures
        #print("args.imgpath : ",args.imgpath)
        demo(net, args.imgpath);
    
        #plt.show()

    调用方式如:

        ./demo.py  –imgpath /work/01.jpg        (注意这里有两个‘’-‘’)


    五. 错误解决方法 

    (由于版本的问题导致faster-rcnn错误很多,以下为部分错误记录)

    1. 错误:【python3.5环境下caffe安装正常,但是编译faster rcnncaffe-faster-rcnn老是报错:


    In file included from ./include/caffe/util/device_alternate.hpp:40:0】
    •	                 from ./include/caffe/common.hpp:19,  
    •	                 from ./include/caffe/blob.hpp:8,  
    •	                 from ./include/caffe/fast_rcnn_layers.hpp:13,  
    •	                 from src/caffe/layers/smooth_L1_loss_layer.cpp:8:  
    •	./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’:  
    •	./include/caffe/util/cudnn.hpp:21:10: warning: enumeration value ‘CUDNN_STATUS_RUNTIME_PREREQUISITE_MISSING’ not handled in switch [-Wswitch]  
    •	   switch (status) {  
    •	          ^  
    •	./include/caffe/util/cudnn.hpp:21:10: warning: enumeration value ‘CUDNN_STATUS_RUNTIME_IN_PROGRESS’ not handled in switch [-Wswitch]  
    •	./include/caffe/util/cudnn.hpp:21:10: warning: enumeration value ‘CUDNN_STATUS_RUNTIME_FP_OVERFLOW’ not handled in switch [-Wswitch]  
    •	./include/caffe/util/cudnn.hpp: In function ‘void caffe::cudnn::setConvolutionDesc(cudnnConvolutionStruct**, cudnnTensorDescriptor_t, cudnnFilterDescriptor_t, int, int, int, int)’:
    

    解决方法:

    caffe里面的所有与cudnn相关的.h .cpp 替换成能用cudnn 编译过的caffe

    需要替换的cudnn:

    (1). 路径:/usr/develop/repertory/caffe/include/caffe/util下的 cudnn.hpp复制到caffe-faste-rcnn中对应文件夹

    (2). 路径:/usr/develop/repertory/caffe/src/caffe/util下的cudnn.cpp复制到faster-caffe-faste-rcnn对应文件夹

    (3).路径:/usr/develop/repertory/caffe/include/caffe/layers下的

    cudnn_conv_layer.hpp,cudnn_deconv_layer.hpp, cudnn_lcn_layer.hpp, cudnn_lrn_layer.hpp,cudnn_pooling_layer.hpp, cudnn_relu_layer.hpp, cudnn_sigmoid_layer.hpp,cudnn_softmax_layer.hpp, cudnn_tanh_layer.hpp

    复制到faster-caffe-faste-rcnn对应文件夹

    (4).路径:/usr/develop/repertory/caffe/src/caffe/layers下的 cudnn_conv_layer.cpp, cudnn_conv_layer.cu, cudnn_deconv_layer.cpp,cudnn_deconv_layer.cu, cudnn_lcn_layer.cpp, cudnn_lcn_layer.cu,cudnn_lrn_layer.cpp, cudnn_lrn_layer.cu, cudnn_pooling_layer.cpp,cudnn_pooling_layer.cu, cudnn_relu_layer.cpp, cudnn_relu_layer.cu, cudnn_sigmoid_layer.cpp,cudnn_sigmoid_layer.cu, cudnn_softmax_layer.cpp, cudnn_softmax_layer.cu,cudnn_tanh_layer.cpp, cudnn_tanh_layer.cu

    复制到faster-caffe-faste-rcnn对应文件夹

    再次编译即可



    2. 错误:【ImportError:/usr/develop/repertory/py-faster-rcnn/tools/../caffe-fast-rcnn/python/caffe/_caffe.so:undefinedsymbol:_ZN5boost6python6detail11init_moduleER11PyModuleDefPFvvE

    解决方法:

    makefile中boost版本不匹配boost.python是一个类似翻译器的东西,所以如果你是python3的程序,却用了python2的翻译器,那语法、定义等等各方面必然会有冲突。

    makefile中查找这个变量PYTHON_LIBRARIES

    PYTHON_LIBRARIES ?= boost_python python2.7  

    改成:PYTHON_LIBRARIES := boost_python3 python3.5m



    3. 错误:

    File"/usr/develop/repertory/py-faster-rcnn/tools/../lib/datasets/pascal_voc.py",line 16, in <module>import cPickleImportError: No module named 'cPickle'

    解决方法:

    python2有cPickle,但是在python3下,是没有cPickle的;

    解决办法:将cPickle改为pickle即可


    4. 错误:【Traceback (most recent call last):File"./tools/train_faster_rcnn_alt_opt.py", line 211, in<module>cfg_from_file(args.cfg_file)File"/usr/develop/repertory/py-faster-rcnn/tools/../lib/fast_rcnn/config.py",line 263, in cfg_from_file_merge_a_into_b(yaml_cfg, __C)File"/usr/develop/repertory/py-faster-rcnn/tools/../lib/fast_rcnn/config.py",line 232, in _merge_a_into_b for k, v in a.iteritems():AttributeError:'EasyDict' object has no attribute 'iteritems'

    解决方法:

    iteritems()改为items()


    5. 错误:【AttributeError: 'EasyDict' object has noattribute 'has_key'

    解决方法:

    has_key方法在python2中是可以使用的,在python3中删除了。


    比如:

    if dict.has_key(word):

    改为:

    if word in dic

     


    6. 错误:【NameError:name 'xrange' is not defined

     

    解决方法:

    xrange改为range,并且range(x)中x要为整数:int(x)

     

    7. 错误:【AttributeError:'module' object has no attribute 'text_format'

     

    解决方法:

    代码上方(train.py)增加一行importgoogle.protobuf.text_format 即可解决问题

    8. 错误:【typeError: a byte-like Objectis required,not ‘str’



    解决方法:



    9. 错误:【faster-rcnn中训练时assert(boxes[:,2]>=boxes[:,0]).all()】

     

    原因:左上角坐标(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下加入代码:

    for bin range(len(boxes)):

      if boxes[b][2]< boxes[b][0]:

    boxes[b][0] = 0

    ② 修改lib/datasets/pascal_voc.py,_load_pascal_annotation(,)函数

    将对Xmin,Ymin,Xmax,Ymax减一去掉,变为:


    ③ 修改lib/fast_rcnn/config.py,不使图片实现翻转,如下改为:

    # Usehorizontally-flipped images during training?

    __C.TRAIN.USE_FLIPPED= False





    展开全文
  • 参考:Caffe: Faster-RCNN Python版本配置 (Windows) 环境:win7,vs2013,cuda8.0,cudnn5.1,anaconda2+python2.7 按照Caffe: Faster-RCNN Python版本配置 (Windows)配置,总结过程: 1)环境变量 cmd——&...

    参考:Caffe: Faster-RCNN Python版本配置 (Windows)

    环境:win7,vs2013,cuda8.0,cudnn5.1,anaconda2+python2.7

    按照Caffe: Faster-RCNN Python版本配置 (Windows)配置,总结过程:

    1)环境变量

    cmd——>set查看所有环境变量;

    set path查看path;

    set 变量名=变量内容将变量设置为变量内容(这里是直接覆盖而不是追加),如set path=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin

    set 变量名=%变量名%;变量内容追加,如set path=%path%;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin

    2)Python error: Microsoft Visual C++ 9.0 is required

    python默认使用vs2008编译,将其指定为vs2013:打开 “python安装目录/Lib/distutils/msvc9compiler.py”文件,找到find_vcvarsall函数,在该函数开头添加version =VS版本号,如使用VS2013,则version = 12.0。

    def find_vcvarsall(version):
        version = 12.0

    注:有冒号的下一行要缩进,用tab键或者空格,但二者不能混用,不然会报IndentationError:expected an indented block错误。

    3)ImportError: No module named easydict,CV2

    easydict让你访问字典更加方便,  原来需要d['a'],现在只需d.a即可访问a对应的值。

    直接pip install easydict安装easydict即可。

    cv2的话,将opencv安装目录下的cv2.pyd拷贝到Python安装目录里Lib中site-packages。

    4)pip安装时Could not install packages due to an EnvironmentError

    pip install matplotlib改为pip install --user matplotlib

    5)中途退出,原因是用的是cpu-only模式

    这是因为在采用GPU模式生成解决方案之前将caffe中的pycaffe复制到faster-rcnn-master中了,此时需要将gpu模式下编译后的pycaffe下的caffe文件夹复制到faster-rcnn-master。

    6)结果

    参考:

    https://blog.csdn.net/u011185952/article/details/71079038(Faster-RCNN Python版本配置)

    https://blog.csdn.net/xinganshenguang/article/details/53761061(环境变量)

    https://blog.csdn.net/ylh071032/article/details/53435793(Python error: Microsoft Visual C++ 9.0 is required)

    展开全文
  • 环境:VS2013,CUDA8.0,CuDNN 5.0,Win10/7,Anaconda 一、准备工作 1. 添加VS的cl.exe所在路径至环境变量 VS的安装路径下有一个VC文件夹,将其中的bin目录添加值环境变量(该目录下有cl.exe),路径参考如下: ...

    环境:VS2013,CUDA8.0,CuDNN 5.0,Win10/7,Anaconda

    一、准备工作

    1. 添加VS的cl.exe所在路径至环境变量

    VS的安装路径下有一个VC文件夹,将其中的bin目录添加值环境变量(该目录下有cl.exe),路径参考如下:

    D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin

    如未正确添加后续步骤将出现 TypeError: object of type ‘NoneType’ has no len() 错误。

    2. 下载Caffe-Microsoft并添加roi_poling_layer后正确编译

    下载地址:https://github.com/Microsoft/caffe 
    由于windows版本caffe的不完善,要先在libcaffe项目中添加roi_poling层的相关支持。具体操作如下:

    在libcaffe项目下的 cu—layers 文件夹右击,添加——现有项,找到 caffe根目录—src—caffe—layers下,添加roi_pooling_layer.cu

    添加现有项

    路径示例:

    这里写图片描述

    同理,在libcaffe项目下的 src—layers 添加roi_polling_layer.cpp; 
    (所在路径:caffe根目录—src—caffe—layers)

    在libcaffe项目下 include—layers添加roi_pooling_layer.hpp。 
    (所在路径:caffe根目录—include—caffe—layers)

    记得在配置中开启Python版编译,然后生成caffe。具体步骤可参考这里,生成成功则大功告成。

    error MSB4062: 未能从程序集 …… 加载任务“NuGetPackageOverlay”。

    如果你之前生成过windows版caffe,在添加roi_pooling支持后重新生成时,很可能会碰到error MSB4062错误。我的解决方案如下:

    (1)将caffe根目录下的Build文件夹整个删除; 
    (2)右键 解决方案caffe —清理解决方案; 
    (3)重新生成。

    另:网上有说是CuDNN 5.0 与 CUDA8.0 兼容问题的,也有说是Nuget中OpenCV更新至2.4.11问题的(默认为2.4.10),我个人的尝试是——不好使 = =。我在两个配置过caffe的机器上都出现了error MSB4062,均为CUDA 8.0+CuDNN 5.0,一个Win7一个Win10,最终都是重新生成得以解决。

    二、配置Faster-RCNN

    1. 配置windows版的py-faster-rcnn

    下载py-faster-rcnn,地址:https://github.com/rbgirshick/py-faster-rcnn

    由于上述版本中的python都是基于Linux环境编写的,windows运行需要进行改动。好在有人已经完成了相关工作:

    再下载py-faster-rcnn-windows,地址:https://github.com/MrGF/py-faster-rcnn-windows 
    将其中的文件复制进py-faster-rcnn进行替换。

    替换后,在py-faster-rcnn根目录—lib—rpn路径下,编辑proposal_layer.py:

    (1)将其中的 param_str_ 替换为 param_str。 
    (2)将

    cfg_key = str(self.phase)
    • 1
    • 1

    替换为

    cfg_key = str('TRAIN' if self.phase == 0 else 'TEST')
    • 1
    • 1

    2. 拷入生成的Caffe

    将Caffe根目录—Build文件夹下,找到生成的pycaffe,将其中的caffe文件夹整体复制到py-faster-rcnn根目录—caffe-fast-rcnn—python文件夹下。我生成的caffe是Release版本,如图:

    这里写图片描述

    复制到:

    这里写图片描述

    注:官方推荐用命令

    git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git
    • 1
    • 1

    下载py-faster-rcnn,如果用Download ZIP(因为我们已经有了Caffe-Microsoft),在py-faster-rcnn的caffe-faster-rcnn下单独创建python文件夹,再将生成的pycaffe下的caffe拷贝进来,实测也能够完成demo生成。

    3. 客制化修改与setup

    根据本机的CUDA环境,修改py-faster-rcnn—lib路径下的setup_cuda.py:

    (1)第14行

    '-arch=sm_35'
    • 1
    • 1

    修改为本机显卡的计算能力,具体查询Nvida官网。 
    (2)第33行

    include_dirs = [numpy_include, 'C:\\Programming\\CUDA\\v7.5\\include'])
    • 1
    • 1

    修改为本机的CUDA-include环境,比如我的路径是:

    include_dirs = [numpy_include, 'C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v8.0\\include'])
    • 1
    • 1

    此时可以CMD打开至py-faster-rcnn\lib路径下,运行命令:

    python setup.py install
    python setup.py build_ext --inplace
    python setup_cuda.py install
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3

    假如出现缺少某些依赖项或cv2.pyd (opencv) 的情况,用pip install命令安装或网上搜索相关配置方法即可,pip用法示例:

    pip install easydict
    • 1
    • 1

    成功状态如图:

    这里写图片描述

    4. 运行demo

    官方要求我们运行py-faster-rcnn\data\scripts下的fetch_faster_rcnn_models.sh进行model下载,实际直接下载该链接:https://dl.dropboxusercontent.com/s/o6ii098bu51d139/faster_rcnn_models.tgz

    下载完成后,解压文件夹至py-faster-rcnn\data目录下,如图:

    这里写图片描述

    CMD到达py-faster-rcnn\tools路径下,我的环境是VS2013,运行:

    SET VS90COMNTOOLS=%VS120COMNTOOLS%
    python demo.py
    • 1
    • 2
    • 1
    • 2

    其它如VS2012 就改为SET VS90COMNTOOLS=%VS110COMNTOOLS%,出问题就是VS的锅 = =。

    这里写图片描述

    Windows-Caffe,真不容易= =

    转载请标明出处:http://blog.csdn.net/u011185952/article/details/71079038

    参考博文:http://blog.csdn.net/chenzhi1992/article/details/52618386

    0


    展开全文
  • 写这篇文章主要是针对深度学习零基础的新手,因为我也是新手,在配置环境这一块花了我很大的心血,网上的资料很多都只是说配置,然后直接运行就完了,可是对于我这样的新手在配置的过程中会遇见各种各样的问题,所以...
    写这篇文章主要是针对深度学习零基础的新手,因为我也是新手,在配置环境这一块花了我很大的心血,网上的资料很多都只是说配置,然后直接运行就完了,可是对于我这样的新手在配置的过程中会遇见各种各样的问题,所以在此给大家把我所遇到的问题总结出来,以免后续的人少走弯路,不废话了。
    

    1 系统环境

    windows 7 X64
    VS2013
    GTX970
    CUDA8.0
    cudnn5.0
    Miniconda X64 for python 2.7
    opencv3.0
    

    2安装环境

    参考我上面一篇博客,caffe已经配置好了,并自己生成了release版本的库文件,配置faster rcnn来检测运动目标,刚开始配置这玩意儿时我没有安装Miniconda 然后我就直接配,配的过程中会遇见很多少包的情况,最恶心的是有的包在windows下面是根本安装不了,所以配置faster rcnn最好还是安装一个miniconda或者其他的andaconda等。
    Miniconda 安装,本片文章涉及到的软件都在最下面提供,Miniconda这个官网资源是非常的差,费了很大的劲才下载好,所以都免费给大家提供。
    Miniconda安装没什么好说的,傻瓜式的
    

    这里写图片描述

    把这两个都给勾上就行了,会自动配置系统环境以及python,这个安装的路径我是选择的D:/Miniconda的目录,放在其他盘也行。然后在cmd命令提示里面输入 conda ,如果不提示找不到conda命令就说明安装成功,环境配置成功
    安装完成后开始下载faster rcnn所需的依赖包
    conda install --yes numpy scipy matplotlib scikit-image pip 
    直接复制没毛病哈,下载的过程可能会很慢,最好先翻墙然后再下载,下载完成后,查看conda管理的工具包 conda list 
    

    这里写图片描述

    安装包的时候我是没遇见问题的,如果你们安装的时候遇到什么问题,请百度或者谷歌,我想安装这一步的问题应该不大。
    

    3 faster rcnn的配置

    faster rcnn的下载,我是用的这个大神的,别弄错了,这个还是很权威的,注意在下载的时候一定要用git下载 git clone –recursive https://github.com/rbgirshick/py-faster-rcnn.git
    这样的命令,要不然包会下载不全,windows下使用git下载的方式应该不用我在写了吧,我是用的git for windows这个软件,可以百度上下载,很方便的,就不多说了。下载好了之后解压到自己的目录,我的位置是 E:\Caffe\faster_rcnn
    由于faster rcnn官方并没有提供windows的编译文件,不过有大神已经编译好了,我们就直接用吧
    https://github.com/MrGF/py-faster-rcnn-windows
    还是使用git下载,下载后再解压
    这里写图片描述

    然后将E:\Caffe\faster_rcnn\py-faster-rcnn-windows-master下面的lib文件夹复制并替换了E:\Caffe\faster_rcnn\py-faster-rcnn下面的lib,全部替换了。

    然后lib目录下面有2个python写的文件
    这里写图片描述

    然后使用notepad++打开,你们也可以用记事本打开setup_cuda.py
    这里写图片描述
    在文件的33行
    include_dirs = [numpy_include, ‘C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include’])
    把gpu的目录给放到这个地方,我的是默认的安装目录,根据你们自己的目录来填写,记得填写两个‘\’ 我复制过来的语句被浏览器转义了就只看见一个,上面的图片当中是2个’\’,别填写错了 ,然后保存,

    然后打开cmd进入E:\Caffe\faster_rcnn\py-faster-rcnn\lib这个目录,怎么进不用我说了吧,然后输入python setup.py install 一定要进入这个目录,在执行这个命令的时候有可能会出错,没错的就不管了
    有可能出现python27.dll是X64位的,然后和目标机X86不配置之类的话,那就不要使用cmd的来执行,使用vs2013的命令提示工具来执行
    这里写图片描述
    然后进入E:\Caffe\faster_rcnn\py-faster-rcnn\lib这个目录,再执行刚刚的命令,此时应该没有刚刚的错误了。
    但是如果再出现Microsoft Visual C++ 9.0 is required……这样的错误的话,SET VS90COMNTOOLS=%VS120COMNTOOLS% (对于VS2013)复制这句话在命令行里面,然后再执行刚刚的语句
    这里写图片描述

    出现这个说明安装成功,同理执行python setup_cuda.py install,差不多的提示。

    上面都成功后,此时需要把caffe编译好的pycaffe存入到faster rcnn对应的目录下
    E:\Caffe\caffe\caffe\Build\x64\Release\pycaffe目录下的caffe目录完全拷贝在这个目录
    E:\Caffe\faster_rcnn\py-faster-rcnn\caffe-fast-rcnn\python的caffe目录 替换掉,根据自己对应的解压目录来替换,
    关于caffe编译成release的文件本文就不说了,我上篇博客写的有
    

    接下来修改配置文件E:\Caffe\faster_rcnn\py-faster-rcnn\lib\fast_rcnn下满的config.py 如果没有gpu的话就需要修改这个,如果有gpu就不用修改,本文就不说纯cpu的编译了,因此就不需要修改

    3最后运行python的demo目标检测程序

    首先下载数据集,然后放在这个data目录下面的faster_rcnn_models目录下,就2个文件,大概700-800M的数据caffemodel文件
    

    这里写图片描述

    千万别放错了,要不然运行找不到数据集,本文最下面提供数据集的下载地址
    

    然后这个目录tools下面有一个demo.py的程序
    这里写图片描述
    用命令工具进入到这个tools的目录,然后执行命令python demo.py
    最关键的就是接下来的问题了,需要你一路披荆斩棘,过五关斩六将才能看见最终的结果,我就是被接下来的问题快折磨的放弃了,还好最终坚持下来,弄得我满身疲惫,结果运行出来之后看着就非常有成就感,所以你们在配置的时候遇到什么困难也别放弃,下面我所遇到的问题可能你们遇不到,也有可能会有额外的新问题也可以个我留言,反正别放弃!!

    问题一

    这里写图片描述
    这个是缺少opencv的包,opencv待会儿也提供 我的是3.0的版本,安装在D盘,看自己安装在哪。然后打开这个目录D:\Opencv3.0\opencv\build\python\2.7\x64下面只有一个文件就是cv2.pyd,然后复制该文件到Miniconda的目录下(现在就能体现出miniconda管理软件的好处的,什么都配置好了,所以建议这个必须安装)D:\Miniconda\Lib\site-packages这个的根目录下,别放错了,算了还是截个图吧
    这里写图片描述

    然后再运行python demo.py

    问题2

    这里写图片描述

    提示缺少包easydict,没有安装的话就直接在cmd中输入pip install easydict

    再运行python demo.py

    问题3

    这里写图片描述

    提示缺少skimage.io的包,最开始我就是因为没有安装miniconda,然后我使用python下载,然后各种百度啊 在windows上面就是安装不上这个包,windows上面做这个到处都是坑啊,无奈之下 我还是安装了minicoda,所有再次建议大家还是把这个给装上,如果按照我开始的步骤已经执行过这句conda install –yes numpy scipy matplotlib scikit-image pip的话 此时就没有这个问题,如果没执行的话 此时来执行
    conda install scipy matplotlib scikit-image等待下载安装

    再运行python demo.py

    问题4

    这里写图片描述

    哇 这问题也弄得我很难受,出现这个问题后,我在miniconda下面下载这个包,下载好了之后再运行 python demo.py 可是还是包这个错,有可能你们不会,我说说我的怎么处理的,我把yaml的安装路径添加到系统的环境变量,默认的安装位置是D:\Miniconda\Lib\site-packages\conda_env下,所以我在系统的环境变量path后面加入了这个,可是运行的demo的时候还是出现这个问题,啊 瞬间崩溃,然后找啊找,demo少依赖是吧,那我就直接把这个yaml放在它需要的依赖库里试试,E:\Caffe\faster_rcnn\py-faster-rcnn\lib\rpn 我就放在这了,然后再运行demo 哇咔咔果然通过了,2个文件 yaml.py yaml.pyc。所以遇到问题多尝试—-没毛病,不过还没完了 新问题又来了

    问题5

    这里写图片描述

    这个问题当然也是少包,同样在cmd下输入pip install protobuf 然后等待安装,看清楚有的是用的pip 有的是用的conda,具体为什么就不说了,因为我也不知道。
    然后再运行demo

    问题6

    这里写图片描述

    哇 最烫手的问题来了,网上找各种资料啊,就是找不到啊,蓝瘦香菇啊,后来网上看见别人说,微软windows branch的分支没有把这个roi_pooling层给加进去,那么办法了,然后我再去看编译好的caffe,因为python写的demo都是用的caffe的框架,而caffe的框架都需要libcaffe库的支撑,所有我找到caffe目录下的libcaffe
    这里写图片描述
    看他到底编译roi_pooling这个没有,所有用右键(记住不是双击,是右键)打开libcaffe.vcxproj用notepad++打开,当然也可以用记事本打开,你能找得到位置的话

    发现里面所有的编译文件都没有这个roi_pooling,但是caffe里面又有roi_pooling_layer.cpp .cu .hpp这3个文件,所以我就尝试在里面把这个添加进去,按照原来的格式
    在157行加入了

    <ClCompile Include="..\..\src\caffe\layers\roi_pooling_layer.cpp" />

    在265行加入了

    <ClInclude Include="..\..\include\caffe\layers\roi_pooling_layer.hpp" />

    在344行加入了

    <CudaCompile Include="..\..\src\caffe\layers\roi_pooling_layer.cu" />

    当然这个libcaffe.vcxproj.filters文件也一起修改,还是按照它默认的格式添加这3个文件
    在291行加入

    <ClCompile Include="..\..\src\caffe\layers\roi_pooling_layer.cpp">
    <Filter>src\layers</Filter>
    </ClCompile>

    在569行加入

    <ClInclude Include="..\..\include\caffe\layers\roi_pooling_layer.hpp">
    <Filter>include\layers</Filter>
    </ClInclude>

    在781行加入

    <CudaCompile Include="..\..\src\caffe\layers\roi_pooling_layer.cu">
    <Filter>cu\layers</Filter>
    </CudaCompile>

    好了最后打开windows目录下的caffe.sln 其他配置在上一篇博客已经写了,此时就直接右键生成libcaffe,果然能生成成功,于是在把整个caffe的所有工程给编译了,果然全部生成成功16个,看着他成功后很激动啊。
    然后把
    E:\Caffe\caffe\caffe\Build\x64\Release\pycaffe目录下的caffe目录
    重新复制一次到
    E:\Caffe\faster_rcnn\py-faster-rcnn\caffe-fast-rcnn\python目录的caffe目录,因为重新编译了一次嘛,所以再次替换

    然后再运行demo.py 果然没有刚刚的错了,不过又出现新问题

    问题7

    这里写图片描述

    根据它的提示查看这个py文件,E:\Caffe\faster_rcnn\py-faster-rcnn\lib\rpn这个目录下的proposal_layer.py文件
    64行的原代码是这样的
    cfg_key = str(self.phase) # either ‘TRAIN’ or ‘TEST’
    后面有个注释 使用train或者test 所以简单的改的话就随便修改成test就行了,正常改的话就这样:去掉cfg_key = str(self.phase) # either ‘TRAIN’ or ‘TEST’这一行,改为下面的

            if self.phase:
                cfg_key = 'TEST'
            else:
                cfg_key = 'TRAIN'

    不过一定得注意格式对齐,python很讲究空格的,如果改成这样出现语法错误的话,那么就用cfg_key = ‘TEST’#str(self.phase) 吧,这个至少是能通过的
    然后保存再次运行demo,如果是GPU的话 那么就运行出结果了,如果是纯cpu的话 我就不清楚了,你们就自己动手研究了,好了 展示一下成果吧

    这里写图片描述

    如果你们按照我的方式配出来的话就点个赞吧,如果有其他的错误就留个言,纯手工,自己截图 写了3个小时了,好累啊,转载的时候请说明转载出处
    哎呀 资源你们需要的话就留言吧,我这上传速度太慢了

    展开全文
  • 前几天一口气看完rbgirshick大神的...1.配置caffe,建议先按照我之前的caffe配置教程配置下原版的caffe,不然很多概念会不懂,而且先配置好原版caffe,后面faster-caffe的配置要省去不少步骤。 caffe安装流程和遇到问题

    前几天一口气看完rbgirshick大神的三篇物体检测的论文还有spp-net顺便也看完了,不得不佩服大神对前沿技术的明锐眼神,于是终于在今天成功运行好faster-RCNN的demo。

    1.配置caffe,建议先按照我之前的caffe配置教程配置下原版的caffe,不然很多概念会不懂,而且先配置好原版caffe,后面faster-caffe的配置要省去不少步骤。

    caffe安装流程和遇到问题


    2.下载faster-RCNN

    去RBG大神的guthub下载faster-cnn

    # Make sure to clone with --recursive
    cd ~
    git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git

    3.编译Cython模块

    cd $FRCN_ROOT/lib
    make
    这里$FRCN_ROOT表示faster-RCNN的根目录。原版caffe没有这一步,其实这里主要是把lib文件夹下的py文件导入python环境变量中,以便在命令行中使用faster-RCNN


    4.编译Caffe和pycaffe

    cd $FRCN_ROOT/caffe-fast-rcnn
    # Now follow the Caffe installation instructions here:
    #   http://caffe.berkeleyvision.org/installation.html
    
    # If you're experienced with Caffe and have all of the requirements installed
    # and your Makefile.config in place, then simply do:
    make -j8 && make pycaffe
    这里和原版caffe没有区别,包括Makefile.config文件,可以直接拿过来用。如果库都安装好没问题,报未定义的引用错误时建议加上sudo试试。


    5.下载faster-RCNN的网络参数文件

    cd $FRCN_ROOT
    ./data/scripts/fetch_faster_rcnn_models.sh
    点开脚本文件,可以看到是从dropbox上下载,dropbox被墙了,建议自己去百度云下载,记得别下错了下了fast-RCNN,下完后解压放在./data文件夹下,即VGG16_faster_rcnn_final.caffemodel的目录是./data/faster_rcnn_models

    faster_rcnn_models,密码:gbpo


    6.依赖库

    这时候离运行demo就还差一步了,也是最重要的一步,你的python需要cython,python-opencv和easydict包。

    6.1.cython

    如果你下的是anaconda那么cython就是自带的。

    6.2.easydict

    执行

    pip install easydict
    如果没装pip就换成

    conda install easydict
    还不行就先conda install pip安装pip后在用pip安装easydict,这里我遇到一个报错,无法找到easydict,建议更新下pip就好pip install pip --upgrade

    6.3.python-opencv

    头疼的是python-opencv包,demo中有用到import cv2,如果在运行demo的时候报错,No module named cv2就是这个问题,我们需要的就是这个cv2.so文件,这个文件需要安装并编译opencv后才会在/usr/local/lib/python2.7/site-packages出现。

    opencv下载官网

    我下的是3.2.0

    编译好后将/usr/local/lib/python2.7/site-packages下的cv2.so复制到~/anaconda2/lib/python2.7/site-packages,如果你没有用anaconda那就复制到/usr/lib/python2.7/site-packages/


    7.demo

    记得在~/.basrc中把python的环境变量改了,不然import caffe导入的是原版的caffe,在export PYTHONPATH="/home/yourname/caffe-master/python:$PYTHONPATH"添加#注释掉,增加export PYTHONPATH="/home/yourname/py-faster-cnn/caffe-fast-rcnn/python:$PYTHONPATH",这样也方便,一台电脑两个caffe框架,想用哪个改哪个

    cd $FRCN_ROOT
    ./tools/demo.py





    展开全文
  • OpenCV中使用Mask R-CNN进行基于深度学习的对象检测和实例分割(Python / C ++) 我觉得可以尝试一下   几个星期前,我们用YOLOv3写了一篇关于物体检测的文章。 对象检测器的输出是在图像或视频帧中检测到的...
  • 最近开始学习深度学习,看了下Faster RCNN的代码,在学习的过程中也查阅了很多其他人写的博客,得到了很大的帮助,所以也打算把自己一些粗浅的理解记录下来,一是记录下自己的菜鸟学习之路,方便自己过后查阅,二来...
  • matterport/Mask_RCNN官方教程 这是一个基于python3,keras和tensorflow的mask rcnn模型。这个模型对图像中的每一个目标实例产生候选框和分割掩膜。这个模型基于特征金字塔网络(Feature Pyramid Network, FPN)和 ...
  • 本文用的系统是Ubuntu 16.04, tensorflow-gpu, python=3.5 代码下载地址:https://github.com/dBeker/Faster-RCNN-TensorFlow-Python3.5 教程链接:https://github.com/dBeker/Faster-RCNN-TensorFlow-Python3.5...
  • 目录 Faster-RCNN-TensorFlow-Python3.5 在Ubuntu16.04下的配置方法 安装过程 1. 深度学习环境Tensorflow的安装 2. 安装python包 3. Go to ./data/coco/PythonAPI 4. gi...
  • 教程地址:tensorflow版的Mask_RCNN clone项目 conda创建python=3.5.2(官方要求3.4+) conda create -n mask_rcnn python=3.5.2 看到项目READ.md中这个部分: 所以加下来不用按教程来一个一个包自己下载,直接使用...
  • Mask RCNN in TensorFlow

    2017-12-04 22:46:28
    Download coco dataset, place it into ./data, then run python download and_convert_data.py to build tf-records. It takes a while.Download pretrained resnet50 model, wget ...
  • fast-rcnn安装记录

    2016-05-22 14:01:55
    第一教程当然是:https://github.com/rbgirshick/fast-rcnn 第二,建议安装anaconda,后续将会很方便;PYTHON_INCLUDE及PYTHON_LIB 如果使用了anaconda,在Makefile.config文件中打开ANACONDA_HONE,打开包含...
  • win10+python3.66+vs2017+cuda9.2下运行tensorflow版的faster-Rcnn 配置Faster-RCNN(网上找的的都是基于python3.5的,不支持py3.6,本文主要尝试用py3.6配置) python3.5版本...
  • WIN10python3.7配置MaskRCNN环境及demo测试(tensorflow-gpu1.x)一.工具二. 环境搭建三.下载mask_R-CNN四.运行demo进行测试 #本文参考了各种配置教程,最终完成mask_R-CNN环境搭建与demo测试。 一.工具 python3.7...
  • mask rcnn实现教程

    2019-02-11 23:16:58
    一,首先去github上下载mask-rcnn源码,这里提供一个百度网盘地址 链接:https://pan.baidu.com/s/1htJYyNy 密码:0r2b 含可运行DEMO更新链接:https://pan.baidu.com/s/1HBPtIPz0xpZsCprl7rc6hw 密码:bvm5 二...
  • Tensorflow物体检测FasterRcnn视频培训教程内容概况:课程首先讲解物体检测的初期算法,对比不同效果与设计思想从而引入fasterrcnn三代算法。在学习阶段我们选择了深度学习框架tensorflow版本进行解读,在代码层面...
  • Windows 下 TensorFlow Faster rcnn 详细安装步骤(一) 上一篇博客详细介绍了Windows系统下TensorFlow框架的搭建,这篇将继续介绍Faster rcnn算法的安装。 本文选择的WindowsFaster rcnn python版本代码为...
  • http://www.cnblogs.com/wangxiaocvpr/p/5717018.html http://www.cnblogs.com/CarryPotMan/p/5390336.html
1 2 3 4 5 ... 20
收藏数 1,584
精华内容 633
热门标签