1.初始数据介绍
对于此博客:
图片路径为:datasets/images/Abyssinian_1.jpg
图片标准信息路径为:datasets/annotations/xmls/Abyssinian_1.xml
图片输出如下:
图片标注信息内容如下:
<annotation>
<folder>OXIIIT</folder>
<filename>Abyssinian_1.jpg</filename>
<source>
<database>OXFORD-IIIT Pet Dataset</database>
<annotation>OXIIIT</annotation>
<image>flickr</image>
</source>
<size>
<width>600</width>
<height>400</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>cat</name>
<pose>Frontal</pose>
<truncated>0</truncated>
<occluded>0</occluded>
<bndbox>
<xmin>333</xmin>
<ymin>72</ymin>
<xmax>425</xmax>
<ymax>158</ymax>
</bndbox>
<difficult>0</difficult>
</object>
</annotation>
2.图片文件的读取与解析
本次使用tensorflow2.4.0版本的内置函数对于该图片进行读取以及解码的操作,具体代码如下:
import tensorflow as tf
image = tf.io.read_file('datasets/images/Abyssinian_1.jpg') # 从文件路径中读取图片的内容
image = tf.image.decode_jpeg(image) # 由于图片是jpg格式的,对其进行解码操作
3.图片标注信息的读取与解析
对于图片标注信息中,我们需要关注的是bndbox中的内容,里面对应的是标注目标框的左下角(xmin,ymin)与右上角(xmax,ymax)的两个坐标。解析这两个左边的代码如下:
from lxml import etree
xml = open('datasets/annotations/xmls/Abyssinian_1.xml').read()
sel = etree.HTML(xml)
width = int(sel.xpath('//size/width/text()')[0])
height = int(sel.xpath('//size/height/text()')[0])
x_min = int(sel.xpath('//bndbox/xmin/text()')[0])
x_max = int(sel.xpath('//bndbox/xmax/text()')[0])
y_min = int(sel.xpath('//bndbox/ymin/text()')[0])
y_max = int(sel.xpath('//bndbox/ymax/text()')[0])
4.在图片上绘制对应的标注信息
对应绘制标注信息代码如下:
from matplotlib import pyplot as plt
from matplotlib.patches import Rectangle
plt.imshow(image)
rect = Rectangle(xy=(x_min, y_min), width=(x_max - x_min), height=(y_max - y_min), fill=False, color='red')
ax = plt.gca()
ax.axes.add_patch(rect)
plt.show()
其中对于Rectangle()函数的参数解释如下:
xy= 由于我们绘制的是一个矩形,这里对应的是图片中矩形的左下角点的坐标值
width= 这个属性代表我们想要绘制矩形的宽度,我们运用x_max-x_min间接求得
height= 这个属性代表我们想要绘制矩形的高度,我们运用y_max-y_min间接求得
fill= 这个属性代表矩形是否进行内部填充,因为我们只想绘制一个矩形的框,而不是内部被填充的矩形,所以我们把他置为False
color= 这个属性代表我们绘制矩形的颜色,这里我们选择绘制一个红色的矩形
5.结果展示