文章目录
本文参考来源于b站up主霹雳吧啦Wz.原视频.
PASCAL_VOC_2012
简介
PASCAL VOC挑战赛(The PASCAL Visual Object Classes)是一个世界级的计算机视觉挑战赛。该挑战赛主要包括以下几类:
- 图像分类(Object Classification)
- 目标检测(Object Detection)
- 目标分割(Object Segmentation)
- 动作识别(Action Classification)等。
PASCAL_VOC_2012 官网
数据集下载地址: training/validation data (2GB tar file)]
文件结构
├──────Annotations:所有的图像标注信息(XML文件)
├──────ImageSets
├ ├──────Action:人的行为动作图像信息
├ ├──────Layout:人的各个部位图像信息
├ ├──────Main:目标检测分类图像信息
├ ├ ├──────train.txt:训练集5717
├ ├ ├──────val.txt:验证集5823
├ ├ └───────trainval.txt:训练集+验证集=11540
├ └──────Segmentation:目标分割图像信息
├──────JPEGImages:所有文件信息
├──────SegmentationClass:图像分割png图(基于类别)
└──────SegmentationObject:图像分割png图(基于目标)
Annotations
比如随便打开一个文件:VOCdevkit/VOC2012/Annotations/2007_000187.xml
<annotation><!-- 主节点 -->
<folder>VOC2012</folder><!-- 下一级是文件夹 -->
<filename>2007_000187.jpg</filename><!-- 图片名称 -->
<source><!-- 源来自于下面 -->
<database>The VOC2007 Database</database>
<annotation>PASCAL VOC2007</annotation>
<image>flickr</image><!-- 标明图片是来自于网络分享的 -->
</source>
<size><!-- 图片高、宽、深度 -->
<width>500</width>
<height>375</height>
<depth>3</depth>
</size>
<segmented>1</segmented><!-- 告诉我们这个图片有没有被分割过,被分割过1 -->
<object>
<name>tvmonitor</name><!-- 目标类别 -->
<pose>Frontal</pose>
<truncated>1</truncated><!-- 有没有被截断 -->
<difficult>0</difficult><!-- 难不难检测 -->
<bndbox><!-- 目标坐标 -->
<xmin>1</xmin>
<ymin>95</ymin>
<xmax>240</xmax>
<ymax>336</ymax>
</bndbox>
</object>
</annotation>
train.txt和val.txt
这两个.txt
文件里面都是图片的名称,并且train.txt和val.txt的图片是互斥的
2008_000008
2008_000015
2008_000019
2008_000023
2008_000028
2008_000033
2008_000036
2008_000037
2008_000041
2008_000045
2008_000053
2008_000060
2008_000066
2008_000070
2008_000074
2008_000085
2008_000089
2008_000093
2008_000095
trainval.txt
训练集和验证集融合到了一起,为什么会有这样一个文件呢?
自己搭建的网络训练测试后,如果想将成绩提交到官网,就要那trainval.txt所有图片训练网络,然后在他们的test文件测试效果
boat_train.txt boat_val.txt boat_trainval.txt这类文件
2008_003021 -1
2008_003022 -1
2008_003023 -1
2008_003025 -1
2008_003026 -1
2008_003030 -1
2008_003033 -1
2008_003034 0
2008_003037 -1
2008_003039 -1
2008_003041 -1
2008_003043 -1
2008_003045 -1
2008_003048 -1
2008_003049 -1
2008_003051 -1
2008_003052 -1
2008_003053 -1
2008_003055 -1
2008_003056 -1
2008_003057 -1
2008_003059 -1
2008_003060 -1
2008_003061 -1
名称±1/1/0(没有船/有船/很难检测)
数据集使用流程
读入tarin.txt
中的名字,获取每一行信息————>Annotations处找到对应的XML
文件,解析————>得到图片的高度、宽度、深度、有哪些目标、位置————>在JPEGImages中找到相应图片,载入内存
如何标注自己的数据集
标注图像的软件很多,在github上有很多开源项目:
https://github.com//tzutalin/labelImg
安装方式
ubuntu(自己编译):
sudo apt-get install pyqt5-dev-tools
sudo pip3 install -r requirements/requirements-linux-python3.txt
make qt5py3
python3 labelImg.py
python3 labelImg.py [IMAGE_PATH] [PRE-DEFINED CLASS FILE]
ubuntu懒一些的:
# 安装
pip install labelImg
#使用
labelImg
labelImg [IMAGE_PATH] [PRE-DEFINED CLASS FILE]
标注流程
- 打开项目文件夹/home/zs/make_myself_datasets,新建标注类别信息文件:
classes.txt
- 把要标注的图片存放在images文件夹
- 创建一个存放标注信息的文件夹annotations
- 在本工程:/home/zs/make_myself_datasets下打开软件
labelImg ./image/ ./classes
- 更改储存路径为annotations,创建区块,进行标注
把xml中的filename信息保存到txt文件中
import xml.etree.ElementTree as ET
import os
source = r"/home/zs/make_myself_datasets/annotations"#xml位置
dir = os.listdir(source)
for i in range(len(dir)):
tree = ET.parse(source + '/' + dir[i])
root = tree.getroot()
with open('./train.txt', 'a', encoding='utf-8') as f1:#存储位置
for t in root.iter('filename'):
info = t.text
info = info.strip('.jpg')
print(info)
f1.write(info + '\n')