深度学习 - 图像定位(一起来学习怎么锁狗头吧~)

本文介绍了使用TensorFlow进行图像定位,包括读取图像和矩形框数据、数据预处理、创建输入管道、构建定位网络模型,并讨论了优化策略和评价指标。作者分享了在MacBook Pro上进行深度学习训练的经验,强调了预处理和匹配数据的重要性。
摘要由CSDN通过智能技术生成

import tensorflow as tf  # 深度学习
import matplotlib.pyplot as plt  # 画图
from matplotlib.patches import Rectangle  # 绘制矩形框

from lxml import etree  # 读取矩形框信息
import numpy as np
import glob  # 读取图片路径信息

我是用的是2.0.0版本的tensorflow,
电脑是2020 MacBook Pro 13寸,暂时还没查到怎么打开GPU模式,所以后续训练模型可能都只训练1个epoch。
(如果有大佬知道怎么开的话,please私我一下,必有重谢!!!)

tf.__version__
>>>'2.0.0'
tf.test.is_gpu_available()  # 是否使用GPU
>>>False

读取单张图片数据,并根据信息绘制矩形框

在这里插入图片描述

# 读取图片数据
img = tf.io.read_file('./数据集/图片定位与分割数据集/images/Abyssinian_1.jpg')  
img = tf.image.decode_jpeg(img)  # 数据解码
img.shape
>>>TensorShape([400, 600, 3])

随便画一张,看我们的路径是否正确。

plt.imshow(img)

在这里插入图片描述

读取矩形框数据(.xml文件)

在这里插入图片描述

xml = open('./数据集/图片定位与分割数据集/annotations/xmls/Abyssinian_1.xml').read()

# 转化为html格式(在爬虫课程中会有)
sel = etree.HTML(xml)
# '//size//text()'表示:提取在size目录下,所以子目录的文件
sel.xpath('//size//text()')
>>>['600', '400', '3']
# '//size/width/text()'表示:在size目录下的width目录中的文本
width = int(sel.xpath('//size/width/text()')[0])
width
>>>600

height = int(sel.xpath('//size/height/text()')[0])
height
>>>400

depth = int(sel.xpath('//size/depth/text()')[0])
depth
>>>3

下边这四个是比较重要的数值,相当于矩形框的定点坐标

# 同理取出其他的参数
bndbox = sel.xpath('//bndbox//text()')
bndbox
>>>['333', '72', '425', '158']

xmin, ymin, xmax, ymax = int(bndbox[0]), int(bndbox[1]), int(bndbox[2]), int(bndbox[3])
xmin, ymin, xmax, ymax
>>>(333, 72, 425, 158)

根据数值绘制出矩形框

# 绘制图片
plt.imshow(img)
# 构建矩形框,参数fill:是否进行填充
rect = Rectangle((xmin, ymin), width=(xmax-xmin), height=(ymax-ymin), fill=False, color='red')
# 锁定图片
ax = plt.gca()
# 添加矩形框
ax.axes.add_patch(rect)
plt.show()

在这里插入图片描述

图片 / xml数据的预处理

当我们对图片进行resize后,矩形框坐标也需要随之改变;
⚠️给定的矩形框与原图想的大小有关,所以在对图片进行缩放后,对矩形框进行同比例缩放,否则会发现未知的偏移!

# 对原图进行缩放
new_img = tf.image.resize(img, [224, 224])  # 缩放至224 * 224
new_img = new_img/255  # 归一化==>[0,1]

按照比例对矩形框的四个顶点坐标进行缩放

# 按照比例对矩形框的四个顶点坐标进行缩放
xmin = (xmin/width)*224
ymin = (ymin/height)*224

xmax = (xmax/width)*224
ymax = (ymax/height)*224
# 重新绘制缩放后的图片
plt.imshow(new_img)
# 构建矩形框,参数fill:是否进行填充
rect = Rectangle((xmin, ymin), width=(xmax-xmin), height=(ymax-ymin), fill=False, color='red')
# 锁定图片
ax = plt.gca()
# 添加矩形框
ax.axes.add_patch(rect)
plt.show()

在这里插入图片描述
⚠️则可以看出,我们进行回归的目标值是 xmin/width,ymin/height,xmax/width,ymax/height这四个比值
而不是xmin, ymin, xmax, ymax。因为,比值不会因为缩放而改变在图像中的位置。

<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值