SSD训练过程

来源:互联网 发布:js cookie不起作用 编辑:程序博客网 时间:2024/06/05 22:48

SSD 使用自己的数据集训练模型

SSD中预留了多种数据集的训练方式,可在caffe/data目录下看到这些数据集预处理的方式,这里使用VOC0712格式数据集

 

1、准备原始数据

检查原始数据集是否符合以下规范

 

dataset         (数据集目录)

  --Annotations

      ***.xml   (标注的物体信息文件)

  --Images

      ***.jpg    (图片集)

  --ImageSets              

      test.txt   (测试集) (保存格式为文件名,不带扩展名)

      train.txt   (训练集) (保存格式为文件名,不带扩展名)

  --results

      (null)       (留作保存结果)

 

2、生成训练数据集

1. VOC0712目录下的create_data.sh labelmap_voc.prototxt create_list.sh三个文件复制到数据集目录下,这几个文件可以根据自己的需要修改文件名。

2. 修改create_data.sh内容

root_dir=/home/sea/caffe  (指定SSD目录,最好用绝对路径)

data_root_dir="$HOME/caffe/data/Fruit4"   (指定原始数据集路径)

dataset_name="Fruit4"                     (将要生成的数据集名称)

mapfile="$root_dir/data/$dataset_name/labelmap_fruit4.prototxt"

               (标签映射,注意labelmap_***.prototxt要与你修改的文件名称相对应)

其他内容暂时没必要修改

3. 修改create_list.sh内容

root_dir=$HOME/caffe/data/Fruit4   (原始数据集路径)

sub_dir=ImageSets                  (保存train.txttest.txt的目录名称)

删除第13for循环,这个for循环的作用是分别处理voc2007voc2012两个数据集,这里我们只处理一个数据集,因此只提取for循环中的一次操作  (注意下面还有个done

sed -i "s/^/\Images\//g" $img_file   (保存图片的目录名称)

sed -i "s/^/\Annotations\//g" $label_file  (保存标注的目录名称)

if [ $dataset == "test" ]             (这里对应的test.txt

if [ $dataset == "train" ]            (这里对应的train.txt

4. 修改labelmap_***.prototxt内容

没有顺序要求,background不需要动,打开文件就知道怎么改了

5. 运行create_list.sh,会看到数据集目录下生成了test.txt train.txt test_name_size.txt

6. 运行create_data.sh,会看到数据集目录下生成了在文件中指定的新的数据集(例如我指定的Fruit4),这个目录下保存着lmdb文件,并且在example/Fruit4目录下省城了lmdb软链接

 

3、开始训练

1. 复制一份example目录下的ssd文件夹,这里我重命名为fruit4,修改ssd_pascal.py内容

train_data = "examples/Fruit4/Fruit4_train_lmdb" (保存lmdb的路径)

test_data = "examples/Fruit4/Fruit4_test_lmdb"

job_name = "fruit4_{}".format(resize)            job名称)

model_name = "fruit4_{}".format(job_name)        model名称)

save_dir = "/home/sea/caffe/models/fruit4_models/{}".format(job_name)

                                              (保存model的路径)

snapshot_dir = "/home/sea/caffe/models/fruit4_models/{}".format(job_name)

                                              (保存snapshot的路径)

job_dir = "jobs/fruit4_jobs/{}".format(job_name)  job路径)

output_result_dir = "{}/caffe/data/Fruit4/results/".format(os.environ['HOME'])  (保存检测结果)

name_size_file = "data/Fruit4/test_name_size.txt"

                                             test_name_size.txt路径)   

label_map_file = "data/Fruit4/labelmap_fruit4.prototxt"

                                            labelmap_***.prototxt路径)

num_classes = 5                             (目标种类+1

以上为必须修改的地方,其他参数可以根据需要进行修改

2. 运行python example/fruit4/ssd_pascal.py

可以看到网络已经开始训练,训练模型保存在models/fruit4_models_fruit4_300×300目录下

 

4、使用模型

1. 修改example/fruit4/ssd_pascal_webcam.py内容

num_classes = 5

 

label_map_file = "data/Fruit4/labelmap_fruit4.prototxt"

 

job_name = "fruit4_{}".format(resize)

 

model_name = "fruit4_{}".format(job_name)

                                            labelmap_***.prototxt路径)

save_dir = "models/fruit4_models/{}_webcam".format(job_name)

                                            test.prototxt的路径)

snapshot_dir = "models/fruit4_models/{}".format(job_name)

                                            model路径)

job_dir = "jobs/fruit4_jobs{}_webcam".format(job_name)

                                             job路径)

2. 运行python example/fruit4/ssd_pascal_webcam.py

前提是你要有摄像头

5、解释一下什么是job

job相当于一个工程,其中存有训练、测试的脚本和日志,其中的脚本或程序是上述步骤生成的可以独立运行的脚本或程序。

 

检测:

 ./build/examples/ssd/ssd_detect.bin models/person2016_models/person2016_300x300/deploy.prototxt models/person2016_models/person2016_300x300/person2016_person2016_300x300_iter_60000.caffemodel /home/chase/caffe-ssd/data/person2016/TEST.txt > logs/person2016.txt

0 0
原创粉丝点击