1.4 目标检测标注的解析和统计
在日常工程中,我们一般使用PASCAL VOC的标注方法,为每张图片搭配一个与其同名的标注文件,标注文件格式选择较为简单的XML格式。
⋘ 1.4.1 XML文件的格式
XML(eXtensible Markup Language,可扩展标记语言)是一种数据表示格式,可以描述非常复杂的数据结构,常用于传输和存储数据。XML有两个特点:一是纯文本,默认使用UTF-8编码;二是可嵌套,适合表示结构化数据。
XML格式使用特殊标记包裹一个标注体。如果某个标注体名称用*表示,那么标注体的开头用<*>表示,标注体的结尾用</*>表示。XML格式标注体名称及其所存储的标记信息含义如表1-5所示。
表1-5 XML格式标注体名称及其所存储的标记信息含义
续表
从结构上看,这些标注体组合成一个可嵌套的结构化数据,如图1-21所示。
图1-21 XML格式示意图
以PASCAL VOC2012数据集为例,提取数据集Annotations文件夹下名为“2008_000008.xml”的XML文件,它对应着Images文件夹下的文件名为“2008_000008.jpg”的图片文件。查看该XML文件,可见该XML文件有41行,主要由folder、filename、source、size、segmented、object(第一个)、object(第二个)7个字段组成。其中,第一个object字段位于第15~27行,存储了图片中的第一个物体——马(分类名称为horse)的分类和位置信息,第二个object字段位于第28~40行,存储了图片中的第二个物体——人(分类名称为person)的分类和位置信息。图片和标注的可视化信息如图1-22所示。
图1-22 图片和标注的可视化信息
⋘ 1.4.2 XML文件解析和数据均衡性统计
XML格式的标注文件需要使用XML工具进行读取。作者一般习惯于将XML标注信息写入CSV文件,以便后期使用Excel打开。Python环境下读写CSV文件的工具是pandas,需要通过以下命令安装pandas工具包。
以PASCAL VOC2012数据集为例,它的标注文件存储在Annotations文件夹中。我们设置标注文件夹路径anno_path,用来存储标注文件所在的目录。
设计一个函数,将其命名为xmldir_to_csv,它接收存储了标注文件夹路径的列表变量(列表变量名为anno_path),xmldir_to_csv函数将遍历其列表变量的全部以xml结尾的文件,使用xml.etree.ElementTree.parse函数对每个以xml结尾的文件进行解析。对于某个XML文件(对应代码中的xml_file),依次解析xml_file内部包含的多个object标注体,寻找object标注体内部的filename、size、name、bndbox等信息。每找到一个object标注体,就在xml_list空列表中加入一个标注信息。显然,xml_list列表中元素的数量等于数据集中object标注体的总数。将xml_list标注体列表转化为pandas的DataFrame对象,将这个对象命名为xml_df,将xml_df进行返回输出。代码如下。
将所有存储了标注信息的XML文件转为DataFrame以后,就可以将标注文件夹路径anno_path输入xmldir_to_csv函数,获取整个数据集全部标注的矩形框信息,并存储在xml_df中。使用xml_df对象的to_csv方法,就可以在磁盘中写入以逗号为分隔符的CSV格式的文件,文件名为P07_voc2012_labels.csv。该文件可以使用Excel打开,以便手工查看。代码如下。
将全部矩形框标注信息存储为pandas的DataFrame格式还有一个好处,就是可以使用DataFrame的强大功能进行统计和导出,方便检查数据的均衡性问题。我们可以提取所有的标注对象名称,将其存储在P07_voc2012_all_names.txt文件中,同时统计每个对象矩形框的出现次数,将其存储在P07_voc2012_labels_CNT.csv中。代码如下。
这样,磁盘就有一个存储了全部矩形框的CSV文件,一个搜集了全部矩形框所属分类的txt文件,以及一个统计了各个分类有多少个矩形框实例的CSV文件,如图1-23所示。
矩形框的统计非常重要,我们可以查看各个分类的矩形框数量是否均衡。对于不均衡的数据,开发者需要进行额外处理,如数据增强或在损失函数中添加权重等。因为数据占比较高的分类将在损失函数中占据较大的比例,所以在进行损失函数优化时,会导致神经网络对数据量较大的分类给予较多的照顾,影响神经网络的泛化能力。
图1-23 对数据集中的所有矩形框进行分类统计的结果