caffe ssd作成データセット方法(1)
12123 ワード
ssdの公式サイトで与えられたデータセットの作成方法は簡単すぎて詳細がないため,この作成方法について検討する.
公式サイトVOCデータセット作成チュートリアルの第一歩:
このステップの機能は、トレーニングセット、テストセットのピクチャ格納アドレス、およびデータ表示格納アドレスを取得することである.test_name_size.txtの機能はあまりはっきりしていません.簡単に分析してください.create_list.shの次の文はtest_を生成するために使用されます.name_size.txt
このファイルに記録されている情報は、テストファイルとテストピクチャのサイズであることがコメントでわかります.
これでcreate_list.shの機能は基本的に明確になっている.
次はcreate_data.shの機能.
コア機能はcreate_annoset.pyで実装され、その他はパラメータの設定のみを担当します.
実行create_data.sh出力結果は以下の通りである.
上記のパラメータはtools/convert_に追加されます.annoset.cppで実行されるのでconvert_annoset.cppこそ機能を実行するソフトウェアで、この場所のコードが書くのが面倒だと感じて、完全に1つのsh+cppができて、今はsh+python+cppになりました.
convert_annoset.cppコードは以下の通りです.
上のc++コードから直接分析するのは面倒かもしれないので、角度を変えてlmdbファイルから直接分析し、
主にこの文章を参考にします.https://blog.csdn.net/Touch_Dream/article/details/80598901
分析過程はここでは詳しく述べないが,以上の文章を参考にすることができる.VOC lmdbデータセットは主に3つの部分から構成されています.
1)datum、画像に関する情報を格納する
2)annotation_group、寸法情報を格納する
3)type,
上記の文書のpythonコードと組み合わせて実験的に検証した.
1)datumの内容:
datumはピクチャの情報を記憶するために用いられ、data部分は省略され、ピクチャの画素データを保存するために用いられる.このlabelはここでは機能しないので、分類データを表示するために-1に設定します.encodeは本当にjpegが符号化されているため、復号する必要がある.
2)annotation_グループの内容:
リストを使用して寸法情報を格納group_Labelは物体のカテゴリを表し、instance_idはここでは機能しないので0に設定し、bboxは寸法ボックス座標とdifficultに関する情報を格納するために使用されます.ここで、寸法ボックスは、画像の長さと高さに対する座標であることにも注意してください.
3)typeの内容
typeの値は直接0で、コメントによると:
ここでtypeは、リッチ寸法がリッチ寸法であるかどうかを寸法するために使用され、現在は寸法ボックスタイプのみがサポートされており、リッチ寸法でない場合はdatumのlabel情報が使用されます.
公式サイトVOCデータセット作成チュートリアルの第一歩:
# Create the trainval.txt, test.txt, and test_name_size.txt in data/VOC0712/
./data/VOC0712/create_list.sh
このステップの機能は、トレーニングセット、テストセットのピクチャ格納アドレス、およびデータ表示格納アドレスを取得することである.test_name_size.txtの機能はあまりはっきりしていません.簡単に分析してください.create_list.shの次の文はtest_を生成するために使用されます.name_size.txt
# 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
このファイルに記録されている情報は、テストファイルとテストピクチャのサイズであることがコメントでわかります.
これでcreate_list.shの機能は基本的に明確になっている.
./data/VOC0712/create_data.sh
次はcreate_data.shの機能.
cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd )
root_dir=$cur_dir/../..
cd $root_dir
redo=1
data_root_dir="$HOME/dataset/VOC/VOCdevkit"
dataset_name="VOC0712"
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
python2 $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
コア機能はcreate_annoset.pyで実装され、その他はパラメータの設定のみを担当します.
実行create_data.sh出力結果は以下の通りである.
build/tools/convert_annoset
--anno_type=detection
--label_type=xml
--label_map_file=./../data/VOC0712/labelmap_voc.prototxt
--check_label=True
--min_dim=0
--max_dim=0
--resize_height=0
--resize_width=0
--backend=lmdb
--shuffle=False
--check_size=False
--encode_type=jpg
--encoded=True
--gray=False
/dataset/VOC/VOCdevkit/
./../data/VOC0712/test.txt
/dataset/VOC/VOCdevkit/VOC0712/lmdb/VOC0712_test_lmdb
上記のパラメータはtools/convert_に追加されます.annoset.cppで実行されるのでconvert_annoset.cppこそ機能を実行するソフトウェアで、この場所のコードが書くのが面倒だと感じて、完全に1つのsh+cppができて、今はsh+python+cppになりました.
convert_annoset.cppコードは以下の通りです.
// This program converts a set of images and annotations to a lmdb/leveldb by
// storing them as AnnotatedDatum proto buffers.
// Usage:
// convert_annoset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME
//
// where ROOTFOLDER is the root folder that holds all the images and
// annotations, and LISTFILE should be a list of files as well as their labels
// or label files.
// For classification task, the file should be in the format as
// imgfolder1/img1.JPEG 7
// ....
// For detection task, the file should be in the format as
// imgfolder1/img1.JPEG annofolder1/anno1.xml
// ....
#include
#include // NOLINT(readability/streams)
#include
上のc++コードから直接分析するのは面倒かもしれないので、角度を変えてlmdbファイルから直接分析し、
主にこの文章を参考にします.https://blog.csdn.net/Touch_Dream/article/details/80598901
分析過程はここでは詳しく述べないが,以上の文章を参考にすることができる.VOC lmdbデータセットは主に3つの部分から構成されています.
1)datum、画像に関する情報を格納する
2)annotation_group、寸法情報を格納する
3)type,
上記の文書のpythonコードと組み合わせて実験的に検証した.
1)datumの内容:
channels: 3
height: 500
width: 353
data:...
label: -1
encoded: true
datumはピクチャの情報を記憶するために用いられ、data部分は省略され、ピクチャの画素データを保存するために用いられる.このlabelはここでは機能しないので、分類データを表示するために-1に設定します.encodeは本当にjpegが符号化されているため、復号する必要がある.
2)annotation_グループの内容:
[group_label: 12
annotation {
instance_id: 0
bbox {
xmin: 0.135977342725
ymin: 0.479999989271
xmax: 0.552407920361
ymax: 0.741999983788
difficult: false
}
}
, group_label: 15
annotation {
instance_id: 0
bbox {
xmin: 0.0226628892124
ymin: 0.0240000002086
xmax: 0.997167110443
ymax: 0.995999991894
difficult: false
}
}
]
リストを使用して寸法情報を格納group_Labelは物体のカテゴリを表し、instance_idはここでは機能しないので0に設定し、bboxは寸法ボックス座標とdifficultに関する情報を格納するために使用されます.ここで、寸法ボックスは、画像の長さと高さに対する座標であることにも注意してください.
3)typeの内容
typeの値は直接0で、コメントによると:
// If there are "rich" annotations, specify the type of annotation.
// Currently it only supports bounding box.
// If there are no "rich" annotations, use label in datum instead.
ここでtypeは、リッチ寸法がリッチ寸法であるかどうかを寸法するために使用され、現在は寸法ボックスタイプのみがサポートされており、リッチ寸法でない場合はdatumのlabel情報が使用されます.