常见图像处理的任务
- 分类(核心基础)
- 分类+定位
知道对象是什么,还要确定对象所处的位置。在对象附近画一个边框。 - 语义分割
对图像中的像素点进行分类,区分图像中每一个像素点。 - 目标检测
回答图片中有什么,在什么位置。用矩形框框住。 - 实例分割
目标检测与语义分割的结合。需要精确到物体的边缘。
图像定位
输出四个数字(x,y,w,h),图像中某一个点的坐标(x,y),以及图像的宽度和高度。
Oxford-IIIT数据集
图像定位示例
图片文件和对应文件信息如下
# 获取一张图片
img = tf.io.read_file('D:/Desktop/数据集/图片定位与分割数据集/images/images/Abyssinian_1.jpg')
# 对图片解码
img = tf.image.decode_jpeg(img)
# 显示图片
plt.imshow(img)
# 读取xml文件中的内容
xml = open('D:/Desktop/数据集/图片定位与分割数据集/annotations/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])
xmin = int(sel.xpath('//bndbox/xmin/text()')[0])
xmax = int(sel.xpath('//bndbox/xmax/text()')[0])
ymin = int(sel.xpath('//bndbox/ymin/text()')[0])
ymax = int(sel.xpath('//bndbox/ymax/text()')[0])
plt.imshow(img)
# 绘制矩形框,((x,y),h,w) fill指定是否填充矩形框
rect = Rectangle((xmin,ymin),(xmax-xmin),(ymax-ymin),fill=False,color='red')
# 获取当前图像
ax = plt.gca()
# 添加矩形框
ax.axes.add_patch(rect)
图像定位与分类实例
对猫狗图像的头部进行定位并显示,并且将图像中的猫和狗进行分类,数据集同上。
保存了训练好的模型、可视化结果、打印了训练过程的log
实例代码:
导入需要使用到的库文件
import tensorflow as tf
import matplotlib.pyplot as plt
from lxml import etree # 解析xml文件
import numpy as np
import glob
from matplotlib.patches import Rectangle # 绘制矩形框
from tensorflow.keras.callbacks import CSVLogger
处理输入数据
def process_data():
'''
创建输入管道
:return: 训练数据集和验证数据集
'''
# 读取所有的图像
images = glob.glob(
"F:\\dataset\\图片定位与分割\\images\\*.jpg") # images[0] ===> F:\dataset\图片定位与分割\images\Abyssinian_1.jpg
# 获取图像对应的目标xml文件
xmls = glob.glob(
"F:\\dataset\\图片定位与分割\\annotations\\xmls\\*.xml") # xmls[0] ===> F:\dataset\图片定位与分割\annotations\xmls\Abyssinian_1.xml
# 获取所有解析文件的名称
names = [x.split('xmls\\')[1].split('.')[0] for x in xmls]
# 取出有对应xml文件的图片作为训练集
imgs_train = [img for img in images if img.split('images\\')[1].split('.')[0] in names]
# 取出没有对应xml文件的图片作为测试集
imgs_test = [img for img in images if img.split('images\\')[1].split