美文网首页目标检测
飞机检测之practise_SSD

飞机检测之practise_SSD

作者: 活体检测业余爱好 | 来源:发表于2017-06-30 16:04 被阅读483次

    继YOLOv2

    www.cnblogs.com/zjutzz/p/6845002.html

    实验文件夹:

    也不知这边的caffe-master与之前我一直用的一不一样。

    git clone https://github.com/weiliu89/caffe.git #git 这是一个分布式版本控制系统,对文件进行管理
    cd /home/echo/vision/caffe-master

    git checkout ssd #这条命令把当前目录所有修改的文件从HEAD中签出并且把它恢复成未修改时的样子.注意:在使用git checkout时,如果其对应的文件被修改过,那么该修改会被覆盖掉。

    但是我还是决定先试试我自己的caffe.

    tar -xvf VOCtrainval_11-May-2012.tar
    tar -xvf VOCtrainval_06-Nov-2007.tar
    tar -xvf VOCtest_06-Nov-2007.tar



    %-----------------------------------------------重新开始--------------------------------------------------

    github.com/weiliu89/caffe/tree/ssd(以官网为主)
    blog.csdn.net/zhang_shuai12/article/details/52346878

    还是重新下载给的caffe,在原来的caffe-master中试过了,但是在creat_list.sh文件运行的时候就有点问题

    cd /home/echo/vision/
    git clone https://github.com/weiliu89/caffe.git #会下载一个caffe文件夹,手动下载好像不是的

    复制原来我自己的caffe-master中的makefile.config编译的配置文件至caffe文件夹,编译:

    make -j8

    编译出现错误,回到原来的caffe-master编译,却没有出现那样的错误,试试只改vision/caffe中的makefile.config,而不是复制原来的caffe-master中的,但是修改下来,发现与caffe-master中用的是一样的呀!按照这里解决:blog.csdn.net/lg1259156776/article/details/71884253

     sudo gedit /usr/include/boost/property_tree/detail/json_parser_read.hpp

     将257行开始的escape代码段注释掉即可,如下:

    /*escape                    
    =  chset_p(detail::widen("\"\\/bfnrt").c_str())                           
    [typename Context::a_escape(self.c)]                   
    |  'u' >> uint_parser()
    [typename Context::a_unicode(self.c)];*/

    但是又出现问题:/usr/bin/ld: 找不到 -lopenblas
    www.cnblogs.com/llxrl/p/5292119.html

    手动从source安装:

    下载OpenBLAS并编译

    1 git clone https://github.com/xianyi/OpenBLAS.git
    2 cd OpenBLAS
    3 make -j8
    4 sudo make PREFIX=/usr/local/OpenBLAS install

    添加环境变量

    在/etc/profile 末尾加上 

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/OpenBLAS/lib/ 然后 sudo source /etc/profile

    注:直接安装在/usr/local 下应该就不需要添加环境变量

    4. 编译Caffe ——》 成功!!

    注意:BLAS是一个数学函数接口标准,有很多个实现。按照Caffe官方ubuntu的安装文档默认安装的是ATLAS。这个版本的BLAS不能利用多核CPU,我们将其换为OpenBLAS,可以利用多核CPU并行计算,加快Caffe的分类速度。

    修改Caffe配置文件以下几行:

    make py #应该是编译python接口的
    make test -j8
    # (Optional)
    make runtest -j8

    Preparation

    1. Download fully convolutional reduced (atrous) VGGNet. By default, we assume the model is stored in $CAFFE_ROOT/models/VGGNet/

    2. Download VOC2007 and VOC2012 dataset. By default, we assume the data is stored in $HOME/data/

    # Download the data.

    cd /home/echo/vision/caffe/data
    wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
    wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
    wget http://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

    实际上以上三者含有的文件夹都是VOCdevkit,解压之后会合并

    3. Create the LMDB file.

    cd $CAFFE_ROOT
    # Create the trainval.txt, test.txt, and test_name_size.txt in data/VOC0712/,注意这边没有对图片做出任何的更改
    ./data/VOC0712/create_list.sh
    # You can modify the parameters in create_data.sh if needed.
    # It will create lmdb files for trainval and 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 at examples/VOC0712/
    ./data/VOC0712/create_data.sh #原图的基础上生成lmdb格式

    注意: test_name_size.txt中记录的是与test.txt中测试图片相关的图片名称以及大小(宽,高)

    ./data/VOC0712/create_data.sh出现问题:

    echo@echo-PC:~/vision/caffe$ ./data/VOC0712/create_data.sh
    Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so.
    Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so.

    解决方法:blog.csdn.net/u010900574/article/details/53413937

    之后还是会出现别的问题:

    echo@echo-PC:~/vision/caffe$./data/VOC0712/create_data.sh 
    Traceback (most recent call last):  File "/home/echo/vision/caffe/data/VOC0712/../../scripts/create_annoset.py", line 103, inlabel_map = caffe_pb2.LabelMap()
    AttributeError: 'module' object has no attribute 'LabelMap'

    github.com/weiliu89/caffe/issues/4得以解决

    export PYTHONPATH=$CAFFE_ROOT/python:$PYTHONPATH

    mine:我找到在其中python的caffe/proto下面有caffe_pb2,其中有 LabelMap属性,所以之前make py之前应该把上面的路径添加到 PYTHONPATH里面,我之前的caffe-master的添加了

    看creat_data.sh文件:

    (1)VOC原始数据也是大小不一
    (2)主要还是:

    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

    解析:就是去生成lmdb文件

    路径的设置,以及建立链接,但是有两处,我不是很懂:

    --min-dim=$min_dim --max-dim=$max_dim --resize-width=$width –resize-height=$height:暂时不知道,好像自己做的时候也不用改,都是0

    4、Train/Eval

    # It will create model definition files and save snapshot models in:
    #  - $CAFFE_ROOT/models/VGGNet/VOC0712/SSD_300x300/
    # and job file, log file, and the python script in:
    #  - $CAFFE_ROOT/jobs/VGGNet/VOC0712/SSD_300x300/
    # and save temporary evaluation results in:
    #  - $HOME/data/VOCdevkit/results/VOC2007/SSD_300x300/
    # It should reach 77.* mAP at 120k iterations.
    python examples/ssd/ssd_pascal.py

    出错:F0612 13:46:35.748569 23026 parallel.cpp:130] Check failed: error == cudaSuccess (10 vs. 0)  invalid device ordinal

    *** Check failure stack trace: ***
    @    0x7ffa1b498daa  (unknown)
    @    0x7ffa1b498ce4  (unknown)
    @    0x7ffa1b4986e6  (unknown)
    @    0x7ffa1b49b687  (unknown)
    @    0x7ffa1bb35ab7  caffe::DevicePair::compute()
    @    0x7ffa1bb3c13c  caffe::P2PSync<>::Prepare()
    @    0x7ffa1bb3c6bc  caffe::P2PSync<>::Run()
    @          0x40898e  train()
    @          0x4062ac  main
    @    0x7ffa1a4a1f45  (unknown)
    @          0x406b1b  (unknown)
    @              (nil)  (unknown)
    Aborted (core dumped)
    echo@echo-PC:~/vision/caffe$

    只需要更改成:gpus = "0"即可,训练————》6.12日下午2.30左右开始训练的

    用来生成solver.prototxt, train.prototxt, test.prototxt, deploy.prototxt,并且进行训练,ssd_pascal.py解读:

    大概看了一点,不看了,太多,训练自己的数据集可以根据:www.cnblogs.com/zjutzz/p/6845002.html

    VGG16的网络结构:就是13层的卷积+3层的全连接+1层的分类

    本来要自己训,可惜好像太慢了,还是下载已经训好的网络吧(多次点击下载才行的)。

    半生不熟,很多有两三个python脚本文件没有看,为了速度,还是继续前进吧

    接下来将SSD应用在检测飞机的上面:

    见: /home/echo/vision/caffe/examples/airplaneDete

    Create the trainval.txt, test.txt, and test_name_size.txt in /home/echo/vision/caffe/examples/airplaneDete/,这边我用MATLAB编写(相当于之前的creat_list.py),生成前面是图片路径,后面是xml文件路径的形式:

    见main_jpgxml.m文件

    运行

    ~/vision/caffe$ /home/echo/vision/caffe/examples/airplaneDete/create_data.sh

    再创建:test_name_size.txt,代码请看: /home/echo/vision/caffe/examples/airplaneDete/create_list.sh:

    训练:我本想基于作者训练好的检测网络去训练自己的库,但是不知咋地,有点问题。

    Cannot copy param 0 weights from layer 'conv4_3_norm_mbox_conf'; shape mismatch. Source param shape is 84 512 3 3 (387072); target param shape is 8 512 3 3 (36864). To learn this layer's parameters from scratch rather than copying from a saved net, rename the layer.

    解释:我估计微调并不能基于别人检测的全部网络,只能是前面分类的部分,因为由于检测类别数目等不的一样,检测网络可能不一样,YOLOv2的微调同样如此。

    blog.csdn.net/u010167269/article/details/52851667这篇文章是利用VGG网络,自己训练的,看了几个都是这样自己训的,目前我也还是用的300*300的训练的。

    修改ssd_pascal.py,运行:

    python /home/echo/vision/caffe/examples/airplaneDete/ssd_pascal.py

    修改的地方:

    (1) 图片路径:

    (2)初始的学习率(注意后面有公式把他改了,0.0004与0.00004对应的是0.001,我这样改了之后变成0.0005);

    (3)这几个存储的路径save_dir存储生成的.prototxt文件,snapshot_dir存储模型中间snap状态:

    job_dir中存储的整个项目过程需要的东西:

    注意:job_dir与save_dir不要在一个路径下,不然生成的文件会冲突

    (4)模型和mapfile

    (5)batch_size:

    (6) test:

    (7)solver_param参数:stepvalue,max_iter,snapshot,display,test_interval之类,还可以改一些测试的时候的参数:confidence_threshold以及overlap_threshold

    训练...等待...50000次,我训练了接近一天呀!!训练结果:

    测试的精度是:detection_eval = 0.892142,比YOLOv2要好(我想可能是用了好几个多尺度的featureMap),但是!网络对于过小的目标,还是不行。起码YOLOv2还可以扩大输入图像的尺寸,结果会再好一点点。虽然也不知道最后结果能不能比SSD好。起码,现在没有它好。

    SSD测试单张:

    SSD 的作者也给我们写好了 predict 的代码,我们只需要该参数就可以了。用 jupyter notebook 打开 ~/caffe/examples/ssd_detect.ipynb文件,改一下各种路径以及文件就好。

    注意:这种109*131指的是宽109,高131

    大目标大部分都可以以100%的检测到,但是小目标几乎就检测不到了,这与之前wrap到300有直接的关系。而且我尝试直接把图像resize到3000比如,会报错,因为我的deploy.prototxt中写的是300,改deploy.prototxt成3000更会报错,一个模型训好之后,输入大小几乎就不能再变了。另外一个是500的,又是另外一个模型了。这个输入到底会在哪边有影响呢?

    原因:我这边犯蠢了呀!输入各种大小,都会被resize到网络需要的大小,为啥网络一定要固定大小,是因为比如规定某一层的feature map用于回归框以及置信度,假设大小是m*m×p,则会用用卷积还是啥生成m*m*(框的位置+置信度数目),所以feature map的大小决定后面用多少个卷积啥的。好像这个解释不太对,对比VGG16与deploy.prototxt看一下:

    VGG16前面所有的卷基层,池化之类的都一抹一眼的写在了deploy.prototxt里面,并且F6,F7改成卷基层,丢掉VGG16的dropout,后面加了conv4_3_norm层的对conv4_3层的输出进行Normalize,conv4_3_norm_mbox_loc这种就是对box的定位,没有置信度预测,后面单独预测置信度,巴拉巴拉...反正就是训好的模型对输入大小肯定有要求。

    YOLOv2模型输入一开始也都是resize到416的,分类与检测是一样的大小,但是因为网络最后的预测只用到了卷积与池化操作,与输入大小无关,所以可以输入各种大小的图片预测。只是训练的时候,会改变网络输入大小,使得可以训练各个尺度的图片,288至600的输入都可以用一个权重相同的网络。这边如何与输入大小无关,我并不知道。试一下:果真,我把yolo-voc.cfg下面的height与width:

    height=1000 #800 #600 #416 #288 #416
    width=1000 #800 #600 # #288 #416

    网络都可以运行,而且一般来说,对于700*800的原始图片,设置越大的尺寸,检测越好。

    只是我还不明白为啥可以多尺度训练,以及为啥改成任何尺度都可以,也就是跟输入无关,看了yolo-voc.cfg最后用的是1*1的卷积去预测的,与图像大小无关。也就是说最后并非是划分成什么网格,而是就是按照feature map的大小,v1是划分成7*7的网格的。

    SSD批量测试:这算是遗留的问题吧!

    假设用SSD_500,怎样训练,我想是还是改上面ssd_pascal.py文件,直接改里面的resize_width = 300 和resize_height = 300,变成500吧,下面估计也要改成500(不确定):

    # minimum dimension of input image
    min_dim = 300



    补充(看代码):

    见:github.com/EchoIR/airplaneDetec/tree/SSD
    1. create_list.sh:没有啥特别的,就是生成trainval.txt,test.txt以及test_name_size.txt
    2. create_data.sh:就是去生成lmdb文件以及它的软连接。其中的min-dim,max-dim,resize-height,resize-width都设置成0,应该是说不对图像进行任何尺寸的伸缩或者尺寸有任何大小要求。
    3. ssd_pascal.py:只看最基本的设置,主要不懂的地方是batch_sampler是what?我想是对正样本的选取?反正应该是样本如何选取的,也算是数据增强的吧

    相关文章

      网友评论

        本文标题:飞机检测之practise_SSD

        本文链接:https://www.haomeiwen.com/subject/luzbcxtx.html