• 安装SSD


    前面两篇文章讲了用SSD检测框架训练自己的数据集,这篇补充一下SSD的安装。github链接:https://github.com/weiliu89/caffe/tree/ssd
    SSD是16年ECCV一篇深度学习目标检测的文章,详细知识可以百度或者谷歌,本文我们介绍如何实现。本文默认各位的机子已安装好opencv, 配置编译过cpu版本的caffe(没有也没关系,下面我会讲下).

    1. 在home目录下(也可以其他目录,当然其他目录后面就要修改路径,比较麻烦),获取SSD的代码,下载完成后有一个caffe文件夹.(由于本人之前已安装caffe,为避免文件名冲突,所以新建一个名为caffessd的文件夹,并将此次下载的‘ssd版本’的caffe放在caffessd文件夹下了。)

    mkdir caffessd

    cd caffessd

    git clonehttps://github.com/weiliu89/caffe.git   #the name of the file you downloaded is "caffe".

    cd caffe 

    gitcheckout ssd 

    2. 修改caffe的配置文件.

    将已经配置过的cpu版本caffe中的Makefile.config复制到刚才下载的caffe目录。如果你没有配置过cpu版本的caffe,可以参考这篇博文. Ubuntu16.04+caffe的安装和Py-faster-rcnn在CPU电脑的安装-2.  http://blog.csdn.net/jx232515/article/details/72384465.下面我直接把Makefile.config需要修改的部分贴在下面了.可以照着修改也行.

    去掉注释CPU_ONLY:=1   

    因为使用CPU,所以要注释掉CUDA有关的行:   

    #CUDA_DIR := /usr/local/cuda   

    #CUDA_ARCH := -gencodearch=compute_20,code=sm_20    

    #        -gencode arch=compute_20,code=sm_21   

    #       -gencode arch=compute_30,code=sm_30    

    #       -gencode arch=compute_35,code=sm_35    

    #       -gencode arch=compute_50,code=sm_50    

    #       -gencode arch=compute_50,code=compute_50   

    去掉注释WITH_PYTHON_LAYER:= 1   

    INCLUDE_DIRS := $(PYTHON_INCLUDE)/usr/local/include /usr/include/hdf5/serial   

    LIBRARY_DIRS := $(PYTHON_LIB)/usr/local/lib /usr/lib /usr/lib/i386-linux-gnu/hdf5/serial/usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial   

    #TEST_GPUID:= 0 

    3.编译caffe

    make -j8 

    # Make sure to include $CAFFE_ROOT/pythonto your PYTHONPATH. 

    make py 

    make test -j8 

    # (Optional) 

    make runtest -j8

    4.下载VGG-ILSVRC-16-layers-fc-reduced.caffemodel预训练模型 https://drive.google.com/uc?id=0BzKzrI_SkD1_WVVTSmQxU0dVRzA&export=downloadhttps://pan.baidu.com/s/1o8A7DZs),将它放入caffe/models/VGGNet/目录下,这样可以直接使用这个模型跑ssd.

    5.下载VOC2007VOC2012数据集,放到/home/data下。(请注意,这里改变了目录)

    cd $HOME/data 

    wgethttp://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar 

    wgethttp://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar 

    wgethttp://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar 

    # Extract the data. 

    tar -xvf VOCtrainval_11-May-2012.tar 

    tar -xvf VOCtrainval_06-Nov-2007.tar 

    tar-xvf VOCtest_06-Nov-2007.tar

    6.将voc2007数据集转换格式,用于模型的训练.

    首先进入caffe目录,可以看到/data/VOC0712/create_list.sh,create_data.sh .运行就可以转换数据格式,用于模型训练.

    此处注意create_list.shcreate_data.sh中路径的修改,修改为自己的路径,要不会出错.

    (1)本人的create_list.sh修改如下:

    #!/bin/bash

    root_dir=$HOME/data/zyt/
    sub_dir=ImageSets/Main
    bash_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
    for dataset in trainval test
    do
      dst_file=$bash_dir/$dataset.txt
      if [ -f $dst_file ]
      then
        rm -f $dst_file
      fi
      for name in zyt # VOC2012
      do
        if [[ $dataset == "test" && $name == "VOC2012" ]]
        then
          continue
        fi
        echo "Create list for $name $dataset..."
        dataset_file=$root_dir/$name/$sub_dir/$dataset.txt

        img_file=$bash_dir/$dataset"_img.txt"
        cp $dataset_file $img_file
        sed -i "s/^/$name/JPEGImages//g" $img_file
        sed -i "s/$/.jpg/g" $img_file

        label_file=$bash_dir/$dataset"_label.txt"
        cp $dataset_file $label_file
        sed -i "s/^/$name/Annotations//g" $label_file
        sed -i "s/$/.xml/g" $label_file

        paste -d' ' $img_file $label_file >> $dst_file

        rm -f $label_file
        rm -f $img_file
      done

      # Generate image name and size infomation.
      if [ $dataset == "test" ]
      then
        $bash_dir/../../build/tools/get_image_size $root_dir $dst_file $bash_dir/$dataset"_name_size.txt"
      fi

      # Shuffle trainval file.
      if [ $dataset == "trainval" ]
      then
        rand_file=$dst_file.random
        cat $dst_file | perl -MList::Util=shuffle -e 'print shuffle(<STDIN>);' > $rand_file
        mv $rand_file $dst_file
      fi
    done

    (2)create_data.sh修改如下:

    cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd )
    root_dir=$cur_dir/../..

    cd $root_dir

    redo=1
    data_root_dir="$HOME/data/zyt"
    dataset_name="zyt"
    mapfile="$root_dir/data/$dataset_name/labelmap_voc.prototxt"
    anno_type="detection"
    db="lmdb"
    min_dim=0
    max_dim=0
    width=0
    height=0

    extra_cmd="--encode-type=jpg --encoded"
    if [ $redo ]
    then
      extra_cmd="$extra_cmd --redo"
    fi
    for subset in test trainval
    do
      python $root_dir/scripts/create_annoset.py --anno-type=$anno_type --label-map-file=$mapfile --min-dim=$min_dim --max-dim=$max_dim --resize-width=$width --resize-height=$height --check-label $extra_cmd $data_root_dir $root_dir/data/$dataset_name/$subset.txt $data_root_dir/$dataset_name/$db/$dataset_name"_"$subset"_"$db examples/$dataset_name

    done

    (3)分别执行如下两条命令转换数据格式:

    # Create the trainval.txt, test.txt, andtest_name_size.txt in data/VOC0712/ 

    ./data/VOC0712/create_list.sh 

    # You can modify the parameters increate_data.sh if needed. 

    # It will create lmdb files for trainvaland test with encoded original image: 

    #  - $HOME/data/VOCdevkit/VOC0712/lmdb/VOC0712_trainval_lmdb 

    #  - $HOME/data/VOCdevkit/VOC0712/lmdb/VOC0712_test_lmdb 

    # and make soft links atexamples/VOC0712/ 

    ./data/VOC0712/create_data.sh 

    此时发现执行create_data.sh时还是出错了,报错为:AttributeError: 'module' object has no attribute 'LabelMap',原因是没有添加环境变量,

    解决方式:其中$CAFFE_ROOT是本人caffe的根目录,注意换成自己的.

    vim  ~/.bashrc

    最后一行将环境变量的值改为exportPYTHONPATH=/home/zhuyating/caffessd/caffe/python:$PYTHONPATH source~/.profile   (由于本人将此次下载的caffe放在caffessd文件夹下,故路径如上所述。)

    echo $PYTHONPATH #检查环境变量的值是否修改成功。

    7.训练模型

    因为我们用的是cpu,首先修改examples/ssd/ssd_pascal.py文件
    将如下代码注释掉

    #gpus = "0,1,2,3" 

    #gpulist = gpus.split(",") 

    #num_gpus = len(gpulist) 

    # Divide the mini-batch to different GPUs. 

    batch_size = 32 

    accum_batch_size = 32 

    iter_size = accum_batch_size /batch_size 

    solver_mode = P.Solver.CPU 

    device_id = 0 

    batch_size_per_device = batch_size 

    #if num_gpus > 0: 

    # batch_size_per_device = int(math.ceil(float(batch_size) /num_gpus)) 

    # iter_size = int(math.ceil(float(accum_batch_size) /(batch_size_per_device * num_gpus))) 

    # solver_mode = P.Solver.GPU 

    #  device_id = int(gpulist[0]) 

    然后Linux运行Python文件进行训练(一般CPU电脑是会死机的):

     Python examples/ssd/ssd_pascal.py

    如果不想花费时间训练,可以在这里下载训练好的模型
    https://drive.google.com/uc?id=0BzKzrI_SkD1_WVVTSmQxU0dVRzA&export=download
    下载后解压,将其中的VGGNet文件夹复制到caffe/models下面,呀,你发现caffe/models下面已经有VGGNet文件夹了,这是之前我们做训练时建立的,没训练就没有了.ok,就可以将VGGNet复制到此处了。

    8.测试

    1)在图片测试集上测试

    pythonexamples/ssd/score_ssd_pascal.py

    这时你可能会有以下几种报错:

    a.显示cpu-only的版本不能用gpuok,打开score_ssd_pascal.py修改为
    solver_mode = P.Solver.CPU

    b. 出错:checked failed num_test_image_ <= names_.size() (4952 vs.2525)

    原因及解决方法:ssd_pascal.py文件中num_test_image参数是4952,而test_name_size.txt里面却只有2525张图片的信息。此时要检查test_name_size.txt是不是只有2525张图片的信息,若只有2525张图片的信息,则删掉test_name_size.txt,重新转换数据得到4952张图片的信息或者直接拷贝同学已有的test_name_size.txt替换原来的test_name_size.txt

    2)在视频上测试

    pythonexamples/ssd/ssd_pascal_video.py 

    当然,直接跑是他自带的视频,想跑自己的代码的话,要先用vim打开该文件,定位到51行,修改视频路径为已有本地视频,这样就可以跑自己的视频了。

    3)使用摄像头测试

    pythonexamples/ssd/ssd_pascal_webcam.py.

  • 相关阅读:
    反射 元类
    多态
    封装
    继承
    面向基础
    包 logging模块 hashlib模块 openpyxl 深浅拷贝
    常用模块
    re模块(正则表达式)
    模块 导入方式 软件开发目录规范
    第 3 章 镜像
  • 原文地址:https://www.cnblogs.com/wmlj/p/8682701.html
Copyright © 2020-2023  润新知