• Faster-RCNN-TensorFlow-Python3.5 在Ubuntu16.04下的配置方法


    Faster-RCNN-TensorFlow-Python3.5 在Ubuntu16.04下的配置方法

    安装过程

    1. 深度学习环境Tensorflow的安装

    参考这一篇博客:https://www.cnblogs.com/pprp/p/9463974.html

    2. 安装python包

    cython, python-opencv, easydict,numpy

    pip install Cython
    pip install opencv-python
    pip install matplotlib
    

    opencv 的包下载安装,安装教程

    • ImportError: No module named 'PIL'

      • solution:easy_install PIL & pip install image
    • ImportError: No module named 'scipy'

      • solution:

         pip install numpy 
         pip install scipy
        
    • ImportError: No module named 'lib.utils.cython_bbox'

      git clone --recursive https://github.com/rbgirshick/fast-rcnn.git
      cd $FRCN_ROOT/lib
      make
      cp fast-rcnn/lib/utils/cython_bbox.cpython-35m-x86_64-linux-gnu.so Faster-RCNN-TensorFlow-Python3.5/lib/utils/
      

    3.  Go to ./data/coco/PythonAPI

    ​ Run python setup.py build_ext --inplace

    ​ Run python setup.py build_ext install

    4. git clone

    用git命令将这个库下载到本地 Faster-RCNN-TensorFlow-Python3.5

    git clone https://github.com/dBeker/Faster-RCNN-TensorFlow-Python3.5.git
    # 将cython_bbox.cpython-36m-x86_64-linux-gnu.so下载下来
    wget https://github.com/pprp/DL/blob/master/cython_bbox.cpython-36m-x86_64-linux-gnu.so
    

    把Faster-RCNN_TF 中的cython_bbox.xxx.so 复制到 lib/utils

    cp cython_bbox.cpython-36m-x86_64-linux-gnu.so Faster-RCNN-TensorFlow-Python3.5/lib/utils
    

    5. 下载预训练模型

    Download pre-trained VGG16 from here and place it as "dataimagenet_weightsvgg16.ckpt"

    wget http://download.tensorflow.org/models/vgg_16_2016_08_28.tar.gz
    unzip vgg*
    #重命名为vgg16.ckpt
    cp vgg* vgg16.ckpt
    #放到以下位置
    mv vgg16.ckpt dataimagenet_weightsvgg16.ckpt
    

    6. 自己数据集的制作

    • xml文件的制作需要labelImg软件的帮助,这里提供在window下的exe包,打开即可使用

      wget https://github.com/pprp/DL/blob/master/LabelIMG.zip
      
      • 使用方法:
      Ctrl + u  加载目录中的所有图像,鼠标点击Open dir同功能
      Ctrl + r  更改默认注释目标目录(xml文件保存的地址) 
      Ctrl + s  保存
      Ctrl + d  复制当前标签和矩形框
      space     将当前图像标记为已验证
      w         创建一个矩形框
      d         下一张图片
      a         上一张图片
      del       删除选定的矩形框
      Ctrl++    放大
      Ctrl--    缩小
      ↑→↓←        键盘箭头移动选定的矩形框
      
    • 数据的放置结构(自己手动建立)

    -data
        - VOCdevkit2007
            - VOC2007
                - Annotations (标签XML文件,用对应的图片处理工具人工生成的)
                - ImageSets (生成的方法是用sh或者MATLAB语言生成)
                    - Main
                        - test.txt
                        - trian.txt
                        - trainval.txt
                        - val.txt
                - JPEGImages(原始文件)
    
    • Main中的四个txt文件的制作

      详见附件二,注意要修改路径位置,最好是绝对路径

    xmlfilepath = 'Annotations'  
    txtsavepath = 'ImageSetsMain'  
    

    7. 替换成自己的数据

    将制作好的数据按照以上的目录结构进行放置

    用你的Annotations,ImagesSets和JPEGImages替换…Faster-RCNN-TensorFlow-Python3.5dataVOCdevkit2007VOC2007中对应文件夹

    8. 将原始代码修改为适配你自己的代码

      1. Pascal_VOC.py,修改自己的标注的类别

        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.__classes=('__background__',
        '你的标签1','你的标签2',你的标签3','你的标签4')
        
      1. demo.py, 修改为自己的标注类别

        CLASSES = ('__background__',
                    'aeroplane', 'bicycle', 'bird', 'boat',
                    'bottle', 'bus', 'car', 'cat', 'chair',
                    'cow', 'diningtable', 'dog', 'horse',
                    'motorbike', 'person', 'pottedplant',
                    'sheep', 'sofa', 'train', 'tvmonitor')
        

        更改为:

        CLASSES = ('__background__',
                   '你的标签1','你的标签2',你的标签3','你的标签4')
        
      1. demo.py 更改另外一处代码:

        net.create_architecture(sess, "TEST", 21,tag='default', anchor_scales=[8, 16, 32])
        

        更改为:

        net.create_architecture(sess, "TEST", 5,tag='default', anchor_scales=[8, 16, 32])
        

        原本的代码是有20类物体+背景,所以是21。 把类别数改为,你的类别+背景。如果是只检测一类物体,那就改为2

      9. 出现的问题

    1. 可能出现以下报错:
    m = cv2.imread(roidb[i][‘image’]) 
    KeyError
    

    解决:

    将Faster-RCNN-TensorFlow-Python3.5-masterdatacache文件夹中之前生成的文件模型删除。

    因为会自己读取cache中的文本,导致训练出现错误。

    10. 作出的其他调整

    具体方案如下:

    • 将demo.py中main函数中进行如下修改:

          # -----------------------
          # demonet = args.demo_net
          # dataset = args.dataset
          # -----------------------
          demonet = 'vgg16'
          dataset = 'pascal_voc'    
      	# -----------------------
      
    • demo.py中main函数中将im_names中的内容替换成自己的测试图片

      im_names = ['IMG_1.jpg', 'IMG_40.jpg', 'IMG_23.jpg', 'IMG_127.jpg',
                      'IMG_134.jpg', 'IMG_185.jpg']
      

      然后将Faster-RCNN-TensorFlow-Python3.5/data/demo中替换上相应的图片

    • 将NETS,DATASETS进行如下修改

      NETS = {'vgg16': ('vgg16.ckpt',)}

      DATASETS = {'pascal_voc': ('voc_2007_trainval',)}

    • 可以运行了python demo.py

    11. 开始训练

    python train.py
    

    12. 跑demo.py

    #如果可以直接跑,就直接跑
    python demo.py
    

    如果不能运行demo.py,则进行以下处理:
    找到通过训练得到的训练结果:路径为:/Faster-RCNN-TensorFlow-Python3.5/default/voc_2007_trainval/default

    内容如下:

    checkpoint
    vgg16.ckpt.data-00000-of-00001
    vgg16.ckpt.index
    vgg16.ckpt.meta
    vgg16_faster_rcnn_iter_10000.ckpt.data-00000-of-00001
    vgg16_faster_rcnn_iter_10000.ckpt.index
    vgg16_faster_rcnn_iter_10000.ckpt.meta
    vgg16_faster_rcnn_iter_10000.pkl
    vgg16_faster_rcnn_iter_15000.ckpt.data-00000-of-00001
    vgg16_faster_rcnn_iter_15000.ckpt.index
    vgg16_faster_rcnn_iter_15000.ckpt.meta
    vgg16_faster_rcnn_iter_15000.pkl
    vgg16_faster_rcnn_iter_20000.ckpt.data-00000-of-00001
    vgg16_faster_rcnn_iter_20000.ckpt.index
    vgg16_faster_rcnn_iter_20000.ckpt.meta
    vgg16_faster_rcnn_iter_20000.pkl
    vgg16_faster_rcnn_iter_25000.ckpt.data-00000-of-00001
    vgg16_faster_rcnn_iter_25000.ckpt.index
    vgg16_faster_rcnn_iter_25000.ckpt.meta
    vgg16_faster_rcnn_iter_25000.pkl
    vgg16_faster_rcnn_iter_30000.ckpt.data-00000-of-00001
    vgg16_faster_rcnn_iter_30000.ckpt.index
    vgg16_faster_rcnn_iter_30000.ckpt.meta
    vgg16_faster_rcnn_iter_30000.pkl
    vgg16_faster_rcnn_iter_35000.ckpt.data-00000-of-00001
    vgg16_faster_rcnn_iter_35000.ckpt.index
    vgg16_faster_rcnn_iter_35000.ckpt.meta
    vgg16_faster_rcnn_iter_35000.pkl
    vgg16_faster_rcnn_iter_40000.ckpt.data-00000-of-00001
    vgg16_faster_rcnn_iter_40000.ckpt.index
    vgg16_faster_rcnn_iter_40000.ckpt.meta
    vgg16_faster_rcnn_iter_40000.pkl
    vgg16_faster_rcnn_iter_5000.ckpt.data-00000-of-00001
    vgg16_faster_rcnn_iter_5000.ckpt.index
    vgg16_faster_rcnn_iter_5000.ckpt.meta
    vgg16_faster_rcnn_iter_5000.pkl
    vgg16.pkl
    

    将其中的

    vgg16_faster_rcnn_iter_40000.ckpt.data-00000-of-00001
    vgg16_faster_rcnn_iter_40000.ckpt.index
    vgg16_faster_rcnn_iter_40000.ckpt.meta
    vgg16_faster_rcnn_iter_40000.pkl
    

    文件复制到以下路径
    /Faster-RCNN-TensorFlow-Python3.5/output/vgg16/voc_2007_trainval/default/
    并重命名为:

    vgg16.ckpt.data-00000-of-00001
    vgg16.ckpt.index
    vgg16.ckpt.meta
    vgg16.pkl
    

    修改完成,再次运行python demo.py

    附件代码:


    1. 下面是适用于我本地环境的MATLAB代码
    %注意修改下面四个值  
    xmlfilepath='/home/pprp/github/Faster-RCNN-TensorFlow-Python3.5/data/VOC2007/Annotations';  
    txtsavepath='/home/pprp/github/Faster-RCNN-TensorFlow-Python3.5/data/VOC2007/ImageSets/Main';  
    trainval_percent=0.5; #trainval占整个数据集的百分比,剩下部分就是test所占百分比  
    train_percent=0.5; #train占trainval的百分比,剩下部分就是val所占百分比  
    
    xmlfile=dir(xmlfilepath);  
    numOfxml=length(xmlfile)-2;#减去.和..  总的数据集大小  
    
    trainval=sort(randperm(numOfxml,floor(numOfxml*trainval_percent)));  
    test=sort(setdiff(1:numOfxml,trainval));  
    
    trainvalsize=length(trainval); #trainval的大小  
    train=sort(trainval(randperm(trainvalsize,floor(trainvalsize*train_percent))));  
    val=sort(setdiff(trainval,train));  
    
    ftrainval=fopen([txtsavepath 'trainval.txt'],'w');  
    ftest=fopen([txtsavepath 'test.txt'],'w');  
    ftrain=fopen([txtsavepath 'train.txt'],'w');  
    fval=fopen([txtsavepath 'val.txt'],'w');  
    
    for i=1:numOfxml  
        if ismember(i,trainval)  
            fprintf(ftrainval,'%s
    ',xmlfile(i+2).name(1:end-4));  
            if ismember(i,train)  
                fprintf(ftrain,'%s
    ',xmlfile(i+2).name(1:end-4));  
            else  
                fprintf(fval,'%s
    ',xmlfile(i+2).name(1:end-4));  
            end  
        else  
            fprintf(ftest,'%s
    ',xmlfile(i+2).name(1:end-4));  
        end  
    end  
    fclose(ftrainval);  
    fclose(ftrain);  
    fclose(fval);  
    fclose(ftest);
    
    1. Python代码:
    import os  
    import random  
      
    trainval_percent = 0.66  
    train_percent = 0.5  
    xmlfilepath = 'Annotations'  
    txtsavepath = 'ImageSetsMain'  
    total_xml = os.listdir(xmlfilepath)  
      
    num=len(total_xml)  
    list=range(num)  
    tv=int(num*trainval_percent)  
    tr=int(tv*train_percent)  
    trainval= random.sample(list,tv)  
    train=random.sample(trainval,tr)  
      
    ftrainval = open('ImageSets/Main/trainval.txt', 'w')  
    ftest = open('ImageSets/Main/test.txt', 'w')  
    ftrain = open('ImageSets/Main/train.txt', 'w')  
    fval = open('ImageSets/Main/val.txt', 'w')  
      
    for i  in list:  
        name=total_xml[i][:-4]+'
    '  
        if i in trainval:  
            ftrainval.write(name)  
            if i in train:  
                ftrain.write(name)  
            else:  
                fval.write(name)  
        else:  
            ftest.write(name)  
      
    ftrainval.close()  
    ftrain.close()  
    fval.close()  
    ftest .close()
    
    
    1. 批量修改图片名称,以及XML名称:
    import os
    import glob
    import shutil
    # 目录名称,你要自己修改
    _dir = "H:/mypic/"
    file_name = os.listdir(_dir)
    print(file_name)
     
    n=1
    for file in file_name:
        pic_name = os.listdir(_dir+file)
        #print(pic_name)
        for pic in pic_name:
            if os.path.isdir(_dir+file+'/'+pic):
                xml_name=os.listdir(_dir+file+"/"+pic)
                for xml in xml_name:
                    shutil.copy( _dir+file+'/'+pic+"/"+xml, 'G:/data/VOCdevkit2007/VOC2007/Annotations/')
                   # print(pic)
     
     
                  #修改个别XML名称
                  # if xml == '1000010.xml':
                       #print(dir + file + '/' + pic)
                      # os.rename(_dir+file + '/' + pic + '/' + xml, _dir + file + '/' + pic + "/" + "100010.xml")
     
     
                   # oldname = _dir+file+'/'+pic+"/"+xml
                   # newname = _dir+file+'/'+pic+"/"+ str(n).zfill(6) + ".xml"
                    #os.rename(oldname, newname)
                    #n = n + 1
                   # print(oldname, '--->', newname)
     
        # zfill是一个自动补零的函数 6 就是一共六位 不足的补零 只有字符串才有这个函数 所以转换了
        # newname = _dir+str(xml_name.index(xml)+1).zfill(6)+".xml"
     
    """
    #批量修改图片的名称
    n=1
    for file in file_name:
        pic_name = os.listdir(_dir+file)
        print(pic_name)
        for pic in pic_name:
            oldname = _dir+file+"/"+pic
            newname = _dir+file+"/" + str(n).zfill(6) + ".jpg"
            os.rename(oldname, newname)
            n = n + 1
            print(oldname, '--->', newname)
        # zfill是一个自动补零的函数 6 就是一共六位 不足的补零 只有字符串才有这个函数 所以转换了
        # newname = _dir+str(xml_name.index(xml)+1).zfill(6)+".xml"
    """
    

    修改对应xml文件

    import os
    import re
     
    _dir = "G:/Annotations/"
    xmlList = os.listdir(_dir)
    n = 1
    for xml in xmlList:
        #f = open(_dir + xml, "r")
        f = open(_dir + xml, "r", encoding='utf-8')
        xmldata = f.read()
        xmldata = re.sub('<path>(.*?)</path>', '<path>G:/data/VOCdevkit2007/VOC2007/JPEGImages/' + str(n).zfill(6) + '.jpg</path>', xmldata)
        f.close()
        f = open(_dir + xml, "w")
        f.write(xmldata)
        f.close()
        n += 1
    
    

    pascal_voc.py的一些解读

     def init(self, image_set, year,devkit_path=None)
    /*这个是初始化函数,它对应着的是pascal_voc的数据集访问格式,其实我们将其接口修改的更简单一点*/
    
    def image_path_at(self, i)
    /*根据第i个图像样本返回其对应的path,其调用了image_path_from_index(self, index)作为其具体实现*/
    
    def image_path_from_index(self, index)
    //实现了 image_path的具体功能
    
    def _load_image_set_index(self)
    //加载了样本的list文件
    
    def _get_default_path(self)
    //获得数据集地址
    
    def gt_roidb(self)
    //读取并返回ground_truth(真实值,设定的一个正确的基准)的db
    
    def selective_search_roidb
    //读取并返回ROI的db
    
    def _load_selective_search_roidb(self, gt_roidb)
    //加载预选框的文件
    
    def selective_search_IJCV_roidb(self)
    //在这里调用读取Ground_truth和ROI db并将db合并
    
    def _load_selective_search_IJCV_roidb(self, gt_roidb)
    //这里是专门读取作者在IJCV上用的dataset
    
    def _load_pascal_annotation(self, index)
    //这个函数是读取gt的具体实现
    
    def _write_voc_results_file(self, all_boxes)
    //voc的检测结果写入到文件
    
    def _do_matlab_eval(self, comp_id, output_dir='output')
    //根据matlab的evluation接口来做结果的分析
    
    def evaluate_detections
    //其调用了_do_matlab_eval
    
    def competition_mode
    //设置competitoin_mode,加了一些噪点
    

    reference

    https://blog.csdn.net/jcli1_14/article/details/81458847

    https://blog.csdn.net/hzhj2007/article/details/79399587

  • 相关阅读:
    Linux系统调优方法
    递归(Recursion)算法
    数据结构之链表
    【日常摸鱼】牛客挑战赛2
    【日常摸鱼】牛客挑战赛1
    组合计数学习笔记1
    To-Do List 2
    20199112 2019-2020-2 《网络攻防实践》第 3 周作业
    Flutter上线项目实战——腾讯点播直播下载
    打开旧Flutter项目说:Your Flutter application is created using an older version of the Android embedding
  • 原文地址:https://www.cnblogs.com/pprp/p/9465065.html
Copyright © 2020-2023  润新知