今天的项目是对动物的头部进行定位
数据集一共有7000多张照片,是来自The Oxford-IIIT Pet Dataset,这个数据集是一个宠物图像数据集,包含了37种宠物,每种宠物200张左右宠物图片,该数据及同时包含宠物分类,头部轮廓标注和语义分割信息。
这是我们的图片文件,然后我们会在另外一个文件夹里发现很多xml文件
打开其中一个是这样的
没错,这就是与之对应的图片的注解,是xml格式的,其实就是一些键值对,并且有层级关系的,如果读者之前写过爬虫,也许很熟悉xml
首先我们编写代码,读取图片和xml注解,通过注解里给出的坐标信息对图片进行标注,然后依次创建dataset和dataloader然后再开始训练
代码语言:javascript复制import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.utils import data
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import torchvision
from torchvision import transforms
import os
from lxml import etree
from matplotlib.patches import Rectangle
import glob
from PIL import Image
引入项目必要的库
代码语言:javascript复制pil_img=Image.open(r'D:社交应用QQ3FileRecv3.)Oxford-IIIT Pets DatasetdatasetimagesAbyssinian_1.jpg')
读取一张图片
并查看其shape
代码语言:javascript复制np_img=np.array(pil_img)
np_img.shape
3通道的 400*600的图片
然后我我们打开与之对应的描述文件也就是.xml结尾的
代码语言:javascript复制xml=open(r'D:社交应用QQ30FileRecvOxford-IIIT Pets DatasetdatasetannotationsxmlsAbyssinian_1.xml').read()
打印其内容:
接下来我们使用etree对xml的内容进行解释,若是写过爬虫的读者定对这部分的代码不会感到陌生:
代码语言:javascript复制sel=etree.HTML(xml)
width=sel.xpath('//size/width/text()')[0]
height=sel.xpath('//size/height/text()')[0]
xmin=sel.xpath('//bndbox/xmin/text()')[0]
ymin=sel.xpath('//bndbox/ymin/text()')[0]
xmax=sel.xpath('//bndbox/xmax/text()')[0]
ymax=sel.xpath('//bndbox/ymax/text()')[0]
我们通过xpath去获取我们需要的值
可以看到读取成功
但是细心的伙伴可以发现这不是int类型的数据,不方便我们一会运算,所以我们强制转化成int类型
代码语言:javascript复制xmin=int(xmin)
xmax=int(xmax)
ymin=int(ymin)
ymax=int(ymax)
那么接下来就是绘图了
这里四个参数,按照笔者的理解则是:x的最小值和x的最大值,还有就是y的最小值和y的最大值,这样就可以在坐标系中确定两个点,这两个点可以确定一个矩形,而这个矩形在图片中就恰好可以确定该图片中动物头像的位置
好了废话不多说,我们直接画图
代码语言:javascript复制plt.imshow(img)
rect = Rectangle((xmin, ymin), (xmax-xmin), (ymax-ymin), fill=False, color='red')
ax = plt.gca()
ax.axes.add_patch(rect)
plt.show()
效果图:
可以看到,根据xml描述文件读取出来的坐标,成功的在图片中绘制出了 喵咪的头像,也即定位成功。
ok那么数据预处理 就暂且到此为止,我们下一章开始写模型和网络。
谢谢大家的观看。
END