前面两篇文章讲了用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.下载VOC2007和VOC2012数据集,放到/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.sh和create_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的版本不能用gpu,ok,打开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.

最新文章

  1. Nodejs学习笔记(二)--- 事件模块
  2. think in java学习笔记
  3. 此博客主人已搬家访问新家地址:http://write.blog.csdn.net/postlist
  4. JS:checkFrom对输入框和文本框的判断总结
  5. JS-003-innerText 与 innerHTML 区别
  6. MTK+高通方案商
  7. SQL Server Native Client 安装方法
  8. yii2 sphinx Ajax搜索分页 关键词的缓存
  9. 农村的“无为教育” (FW)
  10. Android问题-XE5提示&quot;[DCC Fatal Error] Project1.dpr(1): F1027 Unit not found: &#39;System.pas&#39; or binary equivalents (.dcu/.o)&quot;
  11. MATLAB介绍
  12. fzu 1911 Construct a Matrix(矩阵快速幂+规律)
  13. sql 学习笔记 档
  14. linux下c++动态库的生成及使用
  15. MySQL (二)-- 数据类型(列类型)、数值类型、 小数类型、 时间日期类型、 字符串类型 、 MySQL记录长度、列属性
  16. Spring(一)JdbcTemplate的环境搭建
  17. 43.Odoo产品分析 (四) – 工具板块(11) – 网站即时聊天(1)
  18. [再寄小读者之数学篇](2014-05-28 Ladyzhenskaya 不等式)
  19. Tomcat出现 java.net.ConnectException: Connection refused 异常的原因及解决方法
  20. luogu4093 序列 (cdq分治优化dp)

热门文章

  1. flex 垂直居中、两列对齐、自适应宽
  2. 安装卡巴 OFFICE链接 出现这个过程被中断,由于本机的限制
  3. 使用http服务提供yum源
  4. 深入理解Plasma(四)Plasma Cash
  5. 新手vue构建单页面应用实例
  6. JCache只缓存部分字段
  7. CRM 员工创建并分配用户
  8. 查看linux服务器上Tensorflow的版本和位置
  9. 怎么让html中 还是显示&lt;button&gt; 而不进行编译
  10. PS笔刷的使用002