python进⾏图⽚的定位切割_TensorFlow——图像定位与分割图像定位与分割
常见图像处理的任务图像定位Oxford-IIIT数据集图像定位⽰例图像定位与分类实例实例代码:实例预测效果:
图像定位的优化优化
图像定位的评价图形定位的应⽤
常见图像处理的任务
分类(核⼼基础)分类+定位 知道对象是什么,还要确定对象所处的位置。在对象附近画⼀个边框。语义分割 对图像中的像素点进⾏分类,区分图像中每⼀个像素点。⽬标检测 回答图⽚中有什么,在什么位置。⽤矩形框框住。实例分割 ⽬标检测与语义分割的结合。需要精确到物体的边缘。
图像定位
输出四个数字(x,y,w,h),图像中某⼀个点的坐标(x,y),以及图像的宽度和⾼度。
Oxford-IIIT数据集
图像定位⽰例
图⽚⽂件和对应⽂件信息如下
# 获取⼀张图⽚
img = ad_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/l').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 = a()
# 添加矩形框
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\l
# 获取所有解析⽂件的名称
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_train.sort(key=lambda x: x.split('images\\')[1].split('.')[0])
xmls.sort(key=lambda x: x.split('xmls\\')[1].split('.')[0])
# 获取所有xml⽂件的中的头部位置信息,位置信息作为图⽚信息的标签 ===> [xmin, ymin, xmax, ymax] site_labels = [xml_to_sitelabels(path) for path in xmls]
# 将获取到的标签分为四个单独的列表 ===> zip(*)是zip的逆操作
xmins, ymins, xmaxs, ymaxs = list(zip(*site_labels))
# 将xmins等转为array
xmins = np.array(xmins)
ymins = np.array(ymins)
xmaxs = np.array(xmaxs)
ymaxs = np.array(ymaxs)
# 获取所有的分类标签cat ===> 1,dog ===> 0
class_labels = [xml_to_classlabels(path) for path in xmls]
# 创建标签数据集,包括定位标签和分类标签
label_dataset = tf.data.Dataset.from_tensor_slices(((xmins, ymins, xmaxs, ymaxs), class_labels)) # 创建图⽚数据集
image_dataset = tf.data.Dataset.from_tensor_slices(imgs_train)
image_dataset = image_dataset.map(load_image)
# 将图⽚和标签合并
dataset = tf.data.Dataset.zip((image_dataset, label_dataset))
dataset = dataset.shuffle(len(dataset))
# 将dataset数据集中20%拿出来做验证集,80%做训练集
train_size = int(len(dataset) * 0.8)
val_size = len(dataset) - train_size
train_dataset = dataset.skip(val_size)
val_dataset = dataset.take(val_size)
# 对train_dataset和val_dataset做预处理
train_dataset = peat().shuffle(len(train_dataset)).batch(32)
val_dataset = val_dataset.batch(32)
return train_dataset, val_dataset, train_size
从xml⽂件中解析定位信息,⽣成定位信息标签
def xml_to_sitelabels(path):
解析xml⽂件中的信息,将xml中标记的头部位置的信息处理后返回
:param path: xml⽂件存储的路径
:
return: xmin,ymin,xmax,ymax与图像尺⼨的⽐值
'''
# 读取xml⽂件
xml = open(path).read()
# 创建⼀个选择器
sel = etree.HTML(xml)
# 解析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])
return [xmin / width, ymin / height, xmax / width, ymax / height]从xml⽂件中解析类别信息,⽣成分类信息标签
def xml_to_classlabels(path):
'''
解析xml⽂件获取所有的分类标签
:param path: xml⽂件存储的路径
:return: 分类标签编码 cat ===> 1,dog ===> 0
'''
# 读取xml⽂件
xml = open(path).read()
# 创建⼀个选择器
sel = etree.HTML(xml)
# 解析xml⽂件中的图⽚分类数据
class_label = sel.xpath('//object/name/text()')[0]
# 对分类标签进⾏编码 cat ===> 1,dog ===> 0
return int(class_label == 'cat')
图⽚解码及预处理
def load_image(path):
加载图⽚数据
:param path: 图⽚存储的路径
:return: 处理过的图⽚
'''
img = ad_file(path)
img = tf.image.decode_jpeg(img, channels=3)
img = size(img, (224, 224))
# 归⼀化到-1到1之间
img = img / 127.5 - 1
return img
显⽰图像以及定位信息
def show(dataset, num):
'''
显⽰图⽚以及定位效果
:
param dataset: 数据集
:param num: 需要显⽰的图⽚数量
'''
for imgs, labels in dataset.take(num):
for i in range(num):
# 显⽰图⽚ ===> 需要将tensor array对象转换为image
plt.imshow(tf.keras.preprocessing.image.array_to_img(imgs[i]))
xmin, ymin, xmax, ymax = np.array(labels[0][0])[i], np.array(labels[0][1])[i], np.array(labels[0][2])[i], \ np.array(labels[0][3])[i]
# 按照图⽚尺⼨获取对应⽐例的xmin, ymin, xmax, ymax
xmin, ymin, xmax, ymax = xmin * 224, ymin * 224, xmax * 224, ymax * 224
# 绘制矩形框((x,y),h,w) fill ===> 指定是否填充矩形框
rect = Rectangle((xmin, ymin), (xmax - xmin), (ymax - ymin), fill=False, color='red')python处理xml文件
# 获取当前图像
ax = a()
# 给当前图像添加矩形框
ax.axes.add_patch(rect)
plt.show()
创建图像定位与分类模型
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论