前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Tensorflow2——图像定位

Tensorflow2——图像定位

作者头像
Albert_xiong
发布于 2021-06-21 09:57:51
发布于 2021-06-21 09:57:51
89200
代码可运行
举报
文章被收录于专栏:Mybatis学习Mybatis学习
运行总次数:0
代码可运行

图像定位

给定一副图片,我们要输出四个数字(x,y,w,h),图像中某一个点的坐标(x,y),以及图像的宽度和高度,有了这四个数字,我们可以很容易的找到物体的边框。

1、单张图片图像定位

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import tensorflow as tf
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
from lxml import etree
import glob
from matplotlib.patches import Rectangle

img=tf.io.read_file("./location/images/Abyssinian_1.jpg")
img=tf.image.decode_jpeg(img)
plt.imshow(img)

#读取xml文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xml=open("./location/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])
#根目录下的size里的width,取出text文本
#这样解析出来的是一个列表,列表里面放置的有文本
## width,height,xmin,xmax,ymin,ymax
#(600, 400, 333, 425, 72, 158)

plt.imshow(img)
rec=Rectangle((xmin,ymin),(xmax-xmin),(ymax-ymin),fill=False,color="red")  #最下角的值就是xmin,ymin
ax=plt.gca()  #获取当前图像
ax.axes.add_patch(rec)

2、随意尺度图片定位

(代码紧接上)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
img=tf.image.resize(img,(224,224))
img=img/255
plt.imshow(img)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xmin=(xmin/width)*224
xmax=(xmax/width)*224
ymin=(ymin/height)*224
ymax=(ymax/height)*224

plt.imshow(img)
rec=Rectangle((xmin,ymin),(xmax-xmin),(ymax-ymin),fill=False,color="red")  #最下角的值就是xmin,ymin
ax=plt.gca()  #获取当前图像
ax.axes.add_patch(rec)

3、批量图片定位

创建输入管道 数据读取与预处理 获取图像的路径

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
images=glob.glob("./location/images/*.jpg")
#获取目标值
xmls=glob.glob("./location/annotations/xmls/*.xml")
#拿到这3686张图片(与xml文件对应的)
name = [x.split("\\")[-1].split(".xml")[0] for x in xmls]

如何取出这些名称中的images呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
imgs_train=[img for img in images if (img.split("\\")[-1].split(".jpg")[0]) in name] 

数据集划分

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
test_count=int(len(imgs_train)*0.2)
train_count=len(imgs_train)-test_count
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def to_labels(path):
    #读取路径
    xml=open("{}".format(path)).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])
    return  [xmin/width,ymin/height,xmax/width,ymax/height]

labels=[to_labels(path) for path in xmls]  #每个label里面包含x的最小值,x的最大值,y的最小值,y的最大值
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
out_1,out_2,out_3,out_4=list(zip(*labels))  #把xmin,ymin,xmax,ymax分别弄在一起
out_1=np.array(out_1)
out_2=np.array(out_2)
out_3=np.array(out_3)
out_4=np.array(out_4)

标签数据集

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
label_datasets=tf.data.Dataset.from_tensor_slices((out_1,out_2,out_3,out_4))

载入图片

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def load_image(path):
    image=tf.io.read_file(path)
    image=tf.image.decode_jpeg(image,channels=3)
    image=tf.image.resize(image,(224,224))
    image=image/255
    return image

图片数据集处理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
image_dataset=tf.data.Dataset.from_tensor_slices(imgs_train)
image_dataset=image_dataset.map(load_image)

图片数据集与标签数据集整合

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dataset=tf.data.Dataset.zip((image_dataset,label_datasets))

划分数据集

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dataset_train=dataset.skip(test_count)
dataset_test=dataset.take(test_count)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BATCH_SIZE=8
BUFFER_SIZE=300
STEPS_PER_EPOCH=train_count//BATCH_SIZE
VALIDATION_STEPS=test_count//BATCH_SIZE

训练数据集与测试数据集的处理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dataset_train=dataset_train.shuffle(BUFFER_SIZE).batch(BATCH_SIZE).repeat()
dataset_train=dataset_train.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)
dataset_test=dataset_test.batch(BATCH_SIZE)

图像定位

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for img,label in dataset_train.take(1):   #这里的take(1)是取出一个batch出来,这里的img是一个batch
    #这里的img和label都是tensor
    plt.imshow(tf.keras.preprocessing.image.array_to_img(img[0]))
    out_1,out_2,out_3,out_4=label
    xmin,ymin,xmax,ymax=out_1[0].numpy()*224,out_2[0].numpy()*224,out_3[0].numpy()*224,out_4[0].numpy()*224
    rec=Rectangle((xmin,ymin),(xmax-xmin),(ymax-ymin),fill=False,color="red")  #最下角的值就是xmin,ymin
    ax=plt.gca()  #获取当前图像
    ax.axes.add_patch(rec)

创建模型 #创建图像定位的模型,使用预训练网络

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xception=tf.keras.applications.Xception(weights="imagenet",include_top = False,input_shape=(224,224,3))
#函数式API
inputs=tf.keras.layers.Input(shape=(224,224,3))
x=xception(inputs)
x=tf.keras.layers.GlobalAveragePooling2D()(x)
x=tf.keras.layers.Dense(2048,activation="relu")(x)
x=tf.keras.layers.Dense(256,activation="relu")(x)
out_1=tf.keras.layers.Dense(1)(x)  #这里是做回归,不需要激活函数
out_2=tf.keras.layers.Dense(1)(x)
out_3=tf.keras.layers.Dense(1)(x)
out_4=tf.keras.layers.Dense(1)(x)
prediction=[out_1,out_2,out_3,out_4]

model=tf.keras.models.Model(inputs=inputs,outputs=prediction)

编译模型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model.compile(tf.keras.optimizers.Adam(lr=0.0001),loss="mse",metrics=["mae"])

训练模型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Epochs=50
history=model.fit(dataset_train,epochs=Epochs,steps_per_epoch=STEPS_PER_EPOCH,validation_steps=VALIDATION_STEPS,validation_data=dataset_test)

可视化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
loss=history.history["loss"]
val_loss=history.history["val_loss"]
epochs=range(Epochs)
plt.figure()
plt.plot(epochs,loss,"r",label="Training loss")
plt.plot(epochs,val_loss,"bo",label="Validation loss")
plt.title("Training and validation Loss")
plt.xlabel("Epoch")
plt.ylim([0,1])
plt.legend()
plt.show()

模型保存

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model.save("detect_v1.h5")

新模型载入训练好的权重

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new_model=tf.keras.models.load_model("detect_v1.h5")

新模型预测

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plt.figure(figsize=(8,24))
for img,_ in dataset_test.take(1):
    out_1,out_2,out_3,out_4 = new_model.predict(img)
    for i in range(3):
        plt.subplot(3,1,i+1)  #画三行一列的第一个图像
        plt.imshow(tf.keras.preprocessing.image.array_to_img(img[i]))
        xmin,ymin,xmax,ymax = out_1[i]*224,out_2[i]*224,out_3[i]*224,out_4[i]*224
        rect=Rectangle((xmin,ymin),(xmax-xmin),(ymax-ymin),fill=False,color="red")
        ax=plt.gca()
        ax.axes.add_patch(rect)

效果还可以,嘻嘻

一级目录

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/06/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[完整案例]编程实现动物头像定位-01
数据集一共有7000多张照片,是来自The Oxford-IIIT Pet Dataset,这个数据集是一个宠物图像数据集,包含了37种宠物,每种宠物200张左右宠物图片,该数据及同时包含宠物分类,头部轮廓标注和语义分割信息。
Tom2Code
2022/11/21
4550
[完整案例]编程实现动物头像定位-01
15行Python代码 实现图像定位
这是部分数据集图片,这里的图片大小不一,有的是长的有的是宽的。但是在创建data数据时,所有的图片数据应是统一的(也就是同长同高)所以我们得想个办法让其统一。
Python知识大全
2020/02/13
1.7K0
15行Python代码 实现图像定位
[完整案例]编程实现动物头像定位-02
然后我们重新计算几个坐标的位置,其实就是在对应的轴上的长度,然后再乘以我们的固定长度,也就是以下四行代码的含义,因为需要换成固定大小之后的相对位置
Tom2Code
2022/11/21
3510
[完整案例]编程实现动物头像定位-02
基于Pytorch的从零开始的目标检测 | 附源码
目标检测是计算机视觉中一个非常流行的任务,在这个任务中,给定一个图像,你预测图像中物体的包围盒(通常是矩形的) ,并且识别物体的类型。在这个图像中可能有多个对象,而且现在有各种先进的技术和框架来解决这个问题,例如 Faster-RCNN 和 YOLOv3。
小白学视觉
2021/08/05
4K1
基于Pytorch的从零开始的目标检测 | 附源码
TensorFlow官方力推、GitHub爆款项目:用Attention模型自动生成图像字幕
【新智元导读】近期,TensorFlow官方推文推荐了一款十分有趣的项目——用Attention模型生成图像字幕。而该项目在GitHub社区也收获了近十万“点赞”。项目作者Yash Katariya十分详细的讲述了根据图像生成字幕的完整过程,并提供开源的数据和代码,对读者的学习和研究都带来了极大的帮助与便利。
新智元
2018/08/01
1.1K0
TensorFlow官方力推、GitHub爆款项目:用Attention模型自动生成图像字幕
构建自动车牌识别系统
在上面的架构中,有六个模块。标记、训练、保存模型、OCR和模型管道,以及RESTful API。但是本文只详细介绍前三个模块。过程如下。首先,我们将收集图像。然后使用python GUI开发的开源软件图像标注工具对图像进行车牌或号牌的标注。然后在对图像进行标记后,我们将进行数据预处理,在TensorFlow 2中构建和训练一个深度学习目标检测模型(Inception Resnet V2)。完成目标检测模型训练过程后,使用该模型裁剪包含车牌的图像,也称为关注区域(ROI),并将该ROI传递给Python中的 Tesserac API。使用PyTesseract,我们将从图像中提取文本。最后我们将所有这些放在一起,并构建深度学习模型管道。在最后一个模块中,将使用FLASK Python创建一个Web应用程序项目。这样,我们可以将我们的应用程序发布供他人使用。
deephub
2021/04/16
2.4K0
细胞图像数据的主动学习
许多机器学习任务的主要障碍之一是缺乏标记数据。而标记数据可能会耗费很长的时间,并且很昂贵,因此很多时候尝试使用机器学习方法来解决问题是不合理的。
deephub
2022/11/11
4820
细胞图像数据的主动学习
用Keras Tensorflow 2.0实现YOLO V1
本文尝试使用Tensorflow 2.0复现论文<You Only Look Once: Unified, Real-Time Object Detection>的效果。
YoungTimes
2022/04/28
1.3K0
用Keras Tensorflow 2.0实现YOLO V1
用Docker部署TensorFlow Serving服务
参考: https://tf.wiki/zh_hans/deployment/serving.html# https://tensorflow.google.cn/tfx/serving/docker
Michael阿明
2021/02/19
5510
用Docker部署TensorFlow Serving服务
迁移学习之快速搭建【卷积神经网络】
卷积神经网络 概念认识:https://cloud.tencent.com/developer/article/1822928
一颗小树x
2021/05/14
2K0
迁移学习之快速搭建【卷积神经网络】
Tensorflow2——使用预训练网络进行迁移学习(Vgg16)
想要将深度学习应用于小型图像数据集,使用预训练网络就是一种常用且高效的方法。预训练网络就是一个保存好的网络,之前已在大型数据集上训练(通常是大规模图像分类任务)。如果训练的原始数据集足够大且足够通用(如imagenet数据集),那么预训练网络学到的特征的空间层次结构可以有效的作为视觉世界的通用模型,因此这些特征可用于不同的计算机视觉问题。这种学习到的特征在不同问题之间的可移植性,也是深度学习与其他浅层方法相比的重要优势。使用预训练网络有两种方法,特征提取和微调模型。
Albert_xiong
2021/06/21
1.6K0
Tensorflow2——使用预训练网络进行迁移学习(Vgg16)
Tensorflow边框检测入门【Bouding Box Regression 】
要学习目标检测算法吗?任何一个ML学习者都希望能够给图像中的目标物体圈个漂亮的框框,在这篇文章中我们将学习目标检测中的一个基本概念:边框回归/Bounding Box Regression。边框回归并不复杂,但是即使像YOLO这样顶尖的目标检测器也使用了这一技术!
用户1408045
2019/09/17
1.1K0
Tensorflow边框检测入门【Bouding Box Regression 】
Tensorflow2——卷积神经网络的搭建
***** 以下有关代码全是在jupyter notebook 里面调试完后曾,如果直接复制粘贴到pycharm可能不太行,自己得改改
Albert_xiong
2021/06/21
1.3K0
Tensorflow2——卷积神经网络的搭建
Object Detection-YOLOv2 Input And Output Encoding
本文主要学习在PASCAL VOC2012数据集上训练YOLOv2时的Input Encoding和Output Encoding。
YoungTimes
2022/04/28
3700
Object Detection-YOLOv2 Input And Output Encoding
Tensorflow2——模型的保存和恢复
1)整个模型保存到一个文件中,其中包含权重值,模型配置以及优化器的配置,这样,您就可以为模型设置检查点,并稍后从完全相同的状态进行训练,而无需访问原始代码 2)在keras中保存完全可以正常的使用模型非常有用,您可以在tensorflow.js中加载他们,然后在网络浏览器中训练和运行它们 3)keras中使用HDF5标准提供基本的保存格式
Albert_xiong
2021/06/21
1.1K0
Tensorflow2——模型的保存和恢复
Mask R-CNN上手指南:对象检测和分割实现无人机的检测
目标检测是一种计算机视觉技术,用于识别和定位图像中的目标。有很多检测算法存在,这里是对Mask R-CNN的一个很好的总结。
deephub
2020/05/09
8580
Mask R-CNN上手指南:对象检测和分割实现无人机的检测
TensorFlow 2.0 - tf.data.Dataset 数据预处理 & 猫狗分类
项目及数据地址:https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition/overview
Michael阿明
2021/02/19
2.5K0
TensorFlow 2.0 - tf.data.Dataset 数据预处理 & 猫狗分类
TensorFlow2—YOLOv2
学习yolo也有一段时间了,一直在死磕yolov3,最后想想还是先把yolov2先好好捋一遍吧,原理搞懂不难,代码实现对于我这种基础比较差的人,还是有一点难度。好了废话不多说,我们先看看yolo算法的相关原理吧。
Albert_xiong
2021/06/21
1.2K1
TensorFlow2—YOLOv2
通过深度学习实现安全帽佩戴的检测
前一段时间做企业的智能安全项目,我们在面对一些问题时,大胆采用深度学习的方法,解决传统算法和统计学算法不好实现的问题,今天就和大家分享一下,如何解决通过视频监控检测工人是否佩戴安全帽的深度学习算法。
用户1332428
2018/03/09
3.7K2
通过深度学习实现安全帽佩戴的检测
MOOC TensorFlow入门实操课程代码回顾总结(二)
欢迎来到TensorFlow入门实操课程的学习 MOOC TensorFlow入门实操课程代码回顾总结(一) MOOC TensorFlow入门实操课程代码回顾总结(三) 注: 用于表示python代码 粘贴运行结果 目录 5 图像分类基础应用——猫狗分类案例 5.1 导入库 5.2 下载数据集 5.3 查看样本数目 5.4 创建文件夹,存放训练测试数据 5.5 切分为训练数据和测试数据 5.6 模型构建 5.7 数据预处理 5.8 模型训练 5.9 训练结果可视化 5.10 模型推理 6 迁移学
荣仔_最靓的仔
2022/01/05
5510
MOOC TensorFlow入门实操课程代码回顾总结(二)
相关推荐
[完整案例]编程实现动物头像定位-01
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验