怎么把 PASCAL VOC 2007 / 2012 数据集转换成LMDB格式

最近在做训练的时候遇到了做训练集的问题,所以总结一下自己做数据集的思路与操作。ubuntu16.04.

一、VOC数据集格式:做检测的时候会遇到,每一个图中可能有几个目标,每个目标都有一个位置信息保存到xml文件中,如果想将此类数据做成lmdb格式,首先就是要标记图像,得到每一个图中目标的位置信息,标记的程序可以网上找到,标记的工作量还是很大的,这里讲做好xml文件之后怎么做成lmdb。

1、首先在github上下载一个caffe-ssd,然后编译caffe-ssd,这个编译的方法网上有很多,这里就不多说了。编译好之后在./data中输入指令下载VOC0712数据集:【因为下面的两个脚本还调用了其他的Python文件,所以还要 make pycaffe】


      
      
  1. wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
  2. wget http: //host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
  3. wget http: //host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
  4. tar -xvf VOCtrainval_11-May -2012.tar
  5. tar -xvf VOCtrainval_06-Nov -2007.tar
  6. tar -xvf VOCtest_06-Nov -2007.tar

解压之后如下图所示,在VOCdevkit文件夹内有两个文件夹,VOC2007和VOC2012,第一个文件夹是我生成的lmdb文件。



2、创建lmdb格式的数据集


      
      
  1. cd caffe
  2. ./data/VOC0712/create_list.sh
  3. ./data/VOC0712/create_data.sh

下面贴出来creat_list.sh的代码:


      
      
  1. #!/bin/bash
  2. root_dir=####这里改到你数据集的路径
  3. sub_dir=ImageSets/Main
  4. bash_dir= "$(cd "$(dirname "${BASH_SOURCE[0]}") " && pwd)"
  5. for dataset in trainval test
  6. do
  7. dst_file=$bash_dir/$dataset.txt
  8. if [ -f $dst_file ]
  9. then
  10. rm -f $dst_file
  11. fi
  12. for name in VOC2007 VOC2012
  13. do
  14. if [[ $dataset == "test" && $name == "VOC2012" ]]
  15. then
  16. continue
  17. fi
  18. echo "Create list for $name $dataset..."
  19. dataset_file=$root_dir/$name/$sub_dir/$dataset.txt
  20. img_file=$bash_dir/$dataset "_img.txt"
  21. cp $dataset_file $img_file
  22. sed -i "s/^/$name\/JPEGImages\//g" $img_file
  23. sed -i "s/$/.jpg/g" $img_file
  24. label_file=$bash_dir/$dataset "_label.txt"
  25. cp $dataset_file $label_file
  26. sed -i "s/^/$name\/Annotations\//g" $label_file
  27. sed -i "s/$/.xml/g" $label_file
  28. paste -d' ' $img_file $label_file >> $dst_file
  29. rm -f $label_file
  30. rm -f $img_file
  31. done
  32. # Generate image name and size infomation.
  33. if [ $dataset == "test" ]
  34. then
  35. ./caffe-ssd/build/tools/get_image_size $root_dir $dst_file $bash_dir/$dataset"_name_size.txt"#这个路径也要改下
  36. fi
  37. # Shuffle trainval file.
  38. if [ $dataset == "trainval" ]
  39. then
  40. rand_file=$dst_file.random
  41. cat $dst_file | perl -MList::Util=shuffle -e 'print shuffle(<STDIN>); ' > $rand_file
  42. mv $rand_file $dst_file
  43. fi
  44. done

create_data.sh下面的这个代码就是要做成lmdb格式的数据集了。


      
      
  1. cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd )
  2. root_dir=./caffe-ssd###这里的路径改一下,
  3. cd $root_dir
  4. redo= 1
  5. data_root_dir= "./caffe-ssd/data/xuelang" ###这里的路径改一下,

      
      
  1. dataset_name="VOC0712"
  2. mapfile= "./caffe-ssd/data/VOC0712/labelmap_xuelang.prototxt" ###这里的路径改一下,

      
      
  1. anno_type="detection"
  2. db= "lmdb"
  3. min_dim= 0
  4. max_dim= 0
  5. width= 0
  6. height= 0
  7. extra_cmd= "--encode-type=jpg --encoded"
  8. if [ $redo ]
  9. then
  10. extra_cmd= "$extra_cmd --redo"
  11. fi
  12. for subset in test trainval
  13. do
  14. 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
  15. done
然后就能看到lmdb格式的数据集就生成了。注意这里照着博主的改法就可以了,先执行create_list.sh脚本再执行create_data.sh脚本,数据集要提前准备好。

如果是自己的数据集的话要先用标记的程序标记目标位置,生成xml文件,然后按照voc数据集的格式去生成lmdb文件。

二、图片和label做成lmdb格式(用于图片分类)

扫描二维码关注公众号,回复: 4636651 查看本文章

1、首先将同一label的train数据集放到一个文件夹内,在该文件夹内打开terminal输入find -name "*.jpg*" > trainval.txt,这样就可以将该文件夹内所有的图片全部存到txt中;


2、生成的txt中,将jpg替换成jpg 1 (1是这些图片对应的label,中间有空格)

3、将所有的train。txt合在一起,图片也全部放到train文件夹中,将所有的test的txt和图片同样操作。


4、在examples/imagenet下找到create_imagenet.sh文件,如下,修改


      
      
  1. #!/usr/bin/env sh
  2. # Create the imagenet lmdb inputs
  3. # N.B. set the path to the imagenet train + val data dirs
  4. set -e
  5. EXAMPLE=examples/imagenet
  6. DATA=data/teeest#这里要改成上图的数据路径,
  7. TOOLS=build/tools
  8.  

      
      
  1. TRAIN_DATA_ROOT=./caffe-ssd/data/teeest/train/
VAL_DATA_ROOT=./caffe-ssd/data/teeest/val/

      
      
  1. # Set RESIZE= true to resize the images to 256x256. Leave as false if images have
  2. # already been resized using another tool.
  3. RESIZE= true ##是不是要resize
  4. if $RESIZE; then
  5. RESIZE_HEIGHT= 128
  6. RESIZE_WIDTH= 128
  7. else
  8. RESIZE_HEIGHT= 0
  9. RESIZE_WIDTH= 0
  10. fi
  11. if [ ! -d "$TRAIN_DATA_ROOT" ]; then
  12. echo "Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT"
  13. echo "Set the TRAIN_DATA_ROOT variable in create_imagenet.sh to the path" \
  14. "where the ImageNet training data is stored."
  15. exit 1
  16. fi
  17. if [ ! -d "$VAL_DATA_ROOT" ]; then
  18. echo "Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT"
  19. echo "Set the VAL_DATA_ROOT variable in create_imagenet.sh to the path" \
  20. "where the ImageNet validation data is stored."
  21. exit 1
  22. fi
  23. echo "Creating train lmdb..."
  24. GLOG_logtostderr= 1 $TOOLS/convert_imageset \
  25. --resize_height=$RESIZE_HEIGHT \
  26. --resize_width=$RESIZE_WIDTH \
  27. --shuffle \
  28. $TRAIN_DATA_ROOT \
  29. $DATA/train.txt \
  30. $EXAMPLE/ilsvrc12_train_lmdb
  31. echo "Creating val lmdb..."
  32. GLOG_logtostderr= 1 $TOOLS/convert_imageset \
  33. --resize_height=$RESIZE_HEIGHT \
  34. --resize_width=$RESIZE_WIDTH \
  35. --shuffle \
  36. $VAL_DATA_ROOT \
  37. $DATA/val.txt \
  38. $EXAMPLE/ilsvrc12_val_lmdb#保存的路径和名字,需要的话可以更改
  39. echo "Done."

5、运行这个sh文件,就可以生成lmdb文件了。

三、语义分割的数据集(按像素分类)待补充,暂时还没有用到,等用到的时候再更新吧



最近在做训练的时候遇到了做训练集的问题,所以总结一下自己做数据集的思路与操作。ubuntu16.04.

一、VOC数据集格式:做检测的时候会遇到,每一个图中可能有几个目标,每个目标都有一个位置信息保存到xml文件中,如果想将此类数据做成lmdb格式,首先就是要标记图像,得到每一个图中目标的位置信息,标记的程序可以网上找到,标记的工作量还是很大的,这里讲做好xml文件之后怎么做成lmdb。

1、首先在github上下载一个caffe-ssd,然后编译caffe-ssd,这个编译的方法网上有很多,这里就不多说了。编译好之后在./data中输入指令下载VOC0712数据集:【因为下面的两个脚本还调用了其他的Python文件,所以还要 make pycaffe】


    
    
  1. wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
  2. wget http: //host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
  3. wget http: //host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
  4. tar -xvf VOCtrainval_11-May -2012.tar
  5. tar -xvf VOCtrainval_06-Nov -2007.tar
  6. tar -xvf VOCtest_06-Nov -2007.tar

解压之后如下图所示,在VOCdevkit文件夹内有两个文件夹,VOC2007和VOC2012,第一个文件夹是我生成的lmdb文件。



2、创建lmdb格式的数据集


    
    
  1. cd caffe
  2. ./data/VOC0712/create_list.sh
  3. ./data/VOC0712/create_data.sh

下面贴出来creat_list.sh的代码:


    
    
  1. #!/bin/bash
  2. root_dir=####这里改到你数据集的路径
  3. sub_dir=ImageSets/Main
  4. bash_dir= "$(cd "$(dirname "${BASH_SOURCE[0]}") " && pwd)"
  5. for dataset in trainval test
  6. do
  7. dst_file=$bash_dir/$dataset.txt
  8. if [ -f $dst_file ]
  9. then
  10. rm -f $dst_file
  11. fi
  12. for name in VOC2007 VOC2012
  13. do
  14. if [[ $dataset == "test" && $name == "VOC2012" ]]
  15. then
  16. continue
  17. fi
  18. echo "Create list for $name $dataset..."
  19. dataset_file=$root_dir/$name/$sub_dir/$dataset.txt
  20. img_file=$bash_dir/$dataset "_img.txt"
  21. cp $dataset_file $img_file
  22. sed -i "s/^/$name\/JPEGImages\//g" $img_file
  23. sed -i "s/$/.jpg/g" $img_file
  24. label_file=$bash_dir/$dataset "_label.txt"
  25. cp $dataset_file $label_file
  26. sed -i "s/^/$name\/Annotations\//g" $label_file
  27. sed -i "s/$/.xml/g" $label_file
  28. paste -d' ' $img_file $label_file >> $dst_file
  29. rm -f $label_file
  30. rm -f $img_file
  31. done
  32. # Generate image name and size infomation.
  33. if [ $dataset == "test" ]
  34. then
  35. ./caffe-ssd/build/tools/get_image_size $root_dir $dst_file $bash_dir/$dataset"_name_size.txt"#这个路径也要改下
  36. fi
  37. # Shuffle trainval file.
  38. if [ $dataset == "trainval" ]
  39. then
  40. rand_file=$dst_file.random
  41. cat $dst_file | perl -MList::Util=shuffle -e 'print shuffle(<STDIN>); ' > $rand_file
  42. mv $rand_file $dst_file
  43. fi
  44. done

create_data.sh下面的这个代码就是要做成lmdb格式的数据集了。


    
    
  1. cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd )
  2. root_dir=./caffe-ssd###这里的路径改一下,
  3. cd $root_dir
  4. redo= 1
  5. data_root_dir= "./caffe-ssd/data/xuelang" ###这里的路径改一下,

    
    
  1. dataset_name="VOC0712"
  2. mapfile= "./caffe-ssd/data/VOC0712/labelmap_xuelang.prototxt" ###这里的路径改一下,

    
    
  1. anno_type="detection"
  2. db= "lmdb"
  3. min_dim= 0
  4. max_dim= 0
  5. width= 0
  6. height= 0
  7. extra_cmd= "--encode-type=jpg --encoded"
  8. if [ $redo ]
  9. then
  10. extra_cmd= "$extra_cmd --redo"
  11. fi
  12. for subset in test trainval
  13. do
  14. 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
  15. done
然后就能看到lmdb格式的数据集就生成了。注意这里照着博主的改法就可以了,先执行create_list.sh脚本再执行create_data.sh脚本,数据集要提前准备好。

如果是自己的数据集的话要先用标记的程序标记目标位置,生成xml文件,然后按照voc数据集的格式去生成lmdb文件。

二、图片和label做成lmdb格式(用于图片分类)

1、首先将同一label的train数据集放到一个文件夹内,在该文件夹内打开terminal输入find -name "*.jpg*" > trainval.txt,这样就可以将该文件夹内所有的图片全部存到txt中;


2、生成的txt中,将jpg替换成jpg 1 (1是这些图片对应的label,中间有空格)

3、将所有的train。txt合在一起,图片也全部放到train文件夹中,将所有的test的txt和图片同样操作。


4、在examples/imagenet下找到create_imagenet.sh文件,如下,修改


    
    
  1. #!/usr/bin/env sh
  2. # Create the imagenet lmdb inputs
  3. # N.B. set the path to the imagenet train + val data dirs
  4. set -e
  5. EXAMPLE=examples/imagenet
  6. DATA=data/teeest#这里要改成上图的数据路径,
  7. TOOLS=build/tools
  8.  

    
    
  1. TRAIN_DATA_ROOT=./caffe-ssd/data/teeest/train/
VAL_DATA_ROOT=./caffe-ssd/data/teeest/val/

    
    
  1. # Set RESIZE= true to resize the images to 256x256. Leave as false if images have
  2. # already been resized using another tool.
  3. RESIZE= true ##是不是要resize
  4. if $RESIZE; then
  5. RESIZE_HEIGHT= 128
  6. RESIZE_WIDTH= 128
  7. else
  8. RESIZE_HEIGHT= 0
  9. RESIZE_WIDTH= 0
  10. fi
  11. if [ ! -d "$TRAIN_DATA_ROOT" ]; then
  12. echo "Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT"
  13. echo "Set the TRAIN_DATA_ROOT variable in create_imagenet.sh to the path" \
  14. "where the ImageNet training data is stored."
  15. exit 1
  16. fi
  17. if [ ! -d "$VAL_DATA_ROOT" ]; then
  18. echo "Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT"
  19. echo "Set the VAL_DATA_ROOT variable in create_imagenet.sh to the path" \
  20. "where the ImageNet validation data is stored."
  21. exit 1
  22. fi
  23. echo "Creating train lmdb..."
  24. GLOG_logtostderr= 1 $TOOLS/convert_imageset \
  25. --resize_height=$RESIZE_HEIGHT \
  26. --resize_width=$RESIZE_WIDTH \
  27. --shuffle \
  28. $TRAIN_DATA_ROOT \
  29. $DATA/train.txt \
  30. $EXAMPLE/ilsvrc12_train_lmdb
  31. echo "Creating val lmdb..."
  32. GLOG_logtostderr= 1 $TOOLS/convert_imageset \
  33. --resize_height=$RESIZE_HEIGHT \
  34. --resize_width=$RESIZE_WIDTH \
  35. --shuffle \
  36. $VAL_DATA_ROOT \
  37. $DATA/val.txt \
  38. $EXAMPLE/ilsvrc12_val_lmdb#保存的路径和名字,需要的话可以更改
  39. echo "Done."

5、运行这个sh文件,就可以生成lmdb文件了。

三、语义分割的数据集(按像素分类)待补充,暂时还没有用到,等用到的时候再更新吧



猜你喜欢

转载自blog.csdn.net/weixin_42296533/article/details/85098866
今日推荐