https://blog.csdn.net/wenxueliu/article/details/80327316
在目标检测中,如果对数据不了解,在数据集处理这块有时候会看得云里雾里。比如
本文的目的:
在目标检测中,主要用到了 Annotations,ImageSets,JPEGImages
其中 ImageSets/Main/ 保存了具体数据集的索引,Annotations 保存了标签数据, JPEGImages 保存了图片内容。
ImageSets/Main/ 文件夹以 , {class}_trainval.txt {class}_val.txt 的格式命名。 train.txt val.txt 例外
包括 Action,Layout,Main,Segmentation 四个文件夹
ImageSets/Main/ 文件夹以 , {class}_trainval.txt {class}_val.txt 的格式命名。 train.txt val.txt 例外
aeroplane_train.txt
aeroplane_trainval.txt
aeroplane_val.txt
bicycle_train.txt
bicycle_trainval.txt
bicycle_val.txt
bird_train.txt
bird_trainval.txt
bird_val.txt
boat_train.txt
boat_trainval.txt
boat_val.txt
bottle_train.txt
bottle_trainval.txt
bottle_val.txt
bus_train.txt
bus_trainval.txt
bus_val.txt
car_train.txt
car_trainval.txt
car_val.txt
cat_train.txt
cat_trainval.txt
cat_val.txt
chair_train.txt
chair_trainval.txt
chair_val.txt
cow_train.txt
cow_trainval.txt
cow_val.txt
diningtable_train.txt
diningtable_trainval.txt
diningtable_val.txt
dog_train.txt
dog_trainval.txt
dog_val.txt
horse_train.txt
horse_trainval.txt
horse_val.txt
motorbike_train.txt
motorbike_trainval.txt
motorbike_val.txt
person_train.txt
person_trainval.txt
person_val.txt
pottedplant_train.txt
pottedplant_trainval.txt
pottedplant_val.txt
sheep_train.txt
sheep_trainval.txt
sheep_val.txt
sofa_train.txt
sofa_trainval.txt
sofa_val.txt
train.txt
train_train.txt
train_trainval.txt
train_val.txt
trainval.txt
tvmonitor_train.txt
tvmonitor_trainval.txt
tvmonitor_val.txt
val.txt
每个文件包含内容为
2011_003194 -1
2011_003216 -1
2011_003223 -1
2011_003230 1
2011_003236 1
2011_003238 1
2011_003246 1
2011_003247 0
2011_003253 -1
2011_003255 1
2011_003259 1
2011_003274 -1
2011_003276 -1
注:1代表正样本,-1代表负样本。
VOC2012/ImageSets/Main/train.txt 保存了所有训练集的文件名,从 VOC2012/JPEGImages/ 找到文件名对应的图片文件。VOC2012/Annotations/ 找到文件名对应的标签文件
VOC2012/ImageSets/Main/val.txt 保存了所有验证集的文件名,从 VOC2012/JPEGImages/ 找到文件名对应的图片文件。VOC2012/Annotations/ 找到文件名对应的标签文件
读取 JPEGImages 和 Annotation 文件转换为 tf 的 Example 对象,写入 {train|test}{index}_of{num_shard} 文件。每个文件写的 Example 的数量为 total_size/num_shard。(不同数据集可以适当调节 num_shard 来控制每个输出文件的大小)
文件夹中文件以 {id}.xml (id 保存在 VOC2012/ImageSets/Main/文件夹 ) 格式命名的 xml 文件,保存如下关键信息
<annotation>
<filename>2009_001137.jpgfilename>
<folder>VOC2012folder>
<object>
<name>personname>
<bndbox>
<xmax>355xmax>
<xmin>187xmin>
<ymax>334ymax>
<ymin>121ymin>
bndbox>
<difficult>0difficult> //目标是否难以识别(0表示容易识别)
<occluded>0occluded>
<pose>Unspecifiedpose> //拍摄角度
<truncated>0truncated> //是否被截断(0表示完整)
object>
<object>
<name>pottedplantname>
<bndbox>
<xmax>500xmax>
<xmin>376xmin>
<ymax>261ymax>
<ymin>1ymin>
bndbox>
<difficult>0difficult>
<occluded>1occluded>
<pose>Unspecifiedpose>
<truncated>1truncated>
object>
<segmented>1segmented>
<size>
<depth>3depth>
<height>334height>
<width>500width>
size>
<source>
<annotation>PASCAL VOC2009annotation>
<database>The VOC2009 Databasedatabase>
<image>flickrimage>
source>
annotation>
以 2009_001137.jpg 为例,解码之后获取 image_data(图片内容的二进制),height, width
以上面例子为例,最终的 TFRecord 为
TF Example
{
'filename' : 'VOC{year}/JPEGImages/{id}.jpg'
'height' : height
'width' : width
'classes' : [classes.index(person), classes.index(person)]
'y_mins' : [float(121)/334, float(1)/334] # 各个 object 的 ymin
'x_mins' : [float(187)/500, float(376)/500]
'y_maxes' : [float(334)/334, float(261)/334]
'x_maxes' : [ float(355)/500, float(500)/500]
'encoded' : '图片内容二进制'
}
其中
classes = [
"aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat",
"chair", "cow", "diningtable", "dog", "horse", "motorbike", "person",
"pottedplant", "sheep", "sofa", "train", "tvmonitor"
]
注:difficult = 1 的直接跳过,不进行处理。
以上为将一张图片及标签转为 TF Example,对于整个数据集,依次遍历数据集即可。