Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Tensorflow2——图像定位

Tensorflow2——图像定位

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

图像定位

给定一副图片,我们要输出四个数字(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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
和我一起看看,国外的Python考试到底是怎么样(上篇)
我是在4月底帮别人考试的,然后别人发过来去年的考试题的。我看了下,全是英文,原来是留学生啊。
润森
2020/05/29
9410
和我一起看看,国外的Python考试到底是怎么样(上篇)
Python计算机二级模拟题,现在开始!
2016年开始人工智能大数据的火热引发了python学习的狂潮,也引发了全国计算机等级考试(National Computer Rank Examination,简称NCRE)的注意,NCRE赶紧趁热打铁弄个python计算机二级考试,众多网友一下子乐呵呵,总所周知python易学,面向对象和解释性的特性让编程不再困难,这几天恰逢计算机等级考试,我从python123网站弄了一套模拟题给大家做做,说不定你们做完后,马上端正态度摩拳擦掌跃跃欲试准备报考还说不定呢。
昱良
2019/08/23
2.4K0
Python计算机二级模拟题,现在开始!
二级Python选择题_二级python选择题题库
以下对Python程序设计风格描述错误的选项是: A Python中不允许把多条语句写在同一行 B Python语句中,增加缩进表示语句块的开始,减少缩进表示语句块的退出 C Python可以将一条长语句分成多行显示,使用续航符“\” D Python中不允许把多条语句写在同一行 正确答案: D
全栈程序员站长
2022/09/27
3.6K0
加入 Python 科目,全国计算机等级考试迎来新调整
近日,教育部考试中心宣布将对全国计算机等级考试(NCRE)体系进行调整,从 2018 年 3 月开始,将实施 2018 版考试大纲,并按新体系开考各个考试级别,其中最大的调整是新增 Python 科目。 具体调整如下: 新增“网络安全素质教育”科目(代码:17),考试时长 90 分钟,2018 年 9 月首次开考。 2018 年 3 月起暂停“软件测试技术”科目(代码:37)。自 2018 年 3 月考试起改变三级获证条件要求,考生只需通过三级考试即可获得该三级科目的合格证书,不再要求二级证书。 暂停“
企鹅号小编
2018/01/25
1K0
2016计算机二级Java考试真题大放送,还不快收藏!
1、[单选题] 在软件开发中,需求分析阶段可以使用的工具是(  )。 A.N-S图 B.DFD图 C.PAD图 D.程序流程图 参考答案:B 参考解析:在软件开发中,需求分析阶段常使用的工具有数据流图(DFD)、数据字典(DD)、判断树和判断表。 2、[单选题] Java中用于提供Java语言、Java虚拟机的核心的类和接口的包是(  )。 A.java.io包 B.java.applet包 C.java.lang包 D.java.net包 参考答案:C 参考解析:本题考查考生对Java语言中的类和接口
老九君
2018/03/01
1K0
2016计算机二级Java考试真题大放送,还不快收藏!
全国计算机等级考试二级python及复习总结2020.9.7
encoding:59 #encoding ="utf-8"以UTF-8格式读取文件
用户7138673
2022/09/21
3170
全国计算机等级考试二级python及复习总结2020.9.7
Python|蓝桥杯真题之旋转
图片旋转是对图片最简单的处理方式之一,在本题中,需要对图片顺时针旋转 90 度。用一个 n×m 的二维数组来表示一个图片,例如给出一个 3×4 的图片的例子:
算法与编程之美
2020/03/13
8880
计算机二级Python考点解析4
字符串是以单引号'或双引号"括起来的任意文本,字符串'ac'只有a,c这2个字符。如果'本身也是一个字符,那就可以用""括起来,比如"I'm Jack"包含的字符是I,',m,空格,J,a,c,K这8个字符。
Minerva
2020/05/21
4900
Python计算机二级考试指南
6. 了解Python计算生态在以下方面(不限于)的主要第三方库名称:网络爬虫、数据分析、数据可视化、机器学习、Web开发等。
乐心湖
2020/07/31
9390
全国计算机等级考试重大改革!新增Python科目
教育部考试中心决定对NCRE考试体系进行调整,从2018年3月开始,将实施2018版考试大纲,并按新体系开考各个考试级别。 具体调整如下: 新增“网络安全素质教育”科目(代码:17),考试时长90分钟,2018年9月首次开考。 2018年3月起暂停“软件测试技术”科目(代码:37)。自2018年3月考试起改变三级获证条件要求,考生只需通过三级考试即可获得该三级科目的合格证书,不再要求二级证书。 暂停“软件测试工程师”科目(代码:43)。专业基础课程暂停软件工程(课程代码:405)。四级数据库工程师科目考试课
企鹅号小编
2018/01/25
1.2K0
计算机二级python备考经验_计算机基础知识点
计算机二级于18年新增了Python科目,我正好在上学期自学了Python语言。说实话,Python语言真的简洁强大,也是因为它让我改变了对编程的理解,当然还得感谢一位老师:北京理工的嵩天老师,他的网课很nice,也是他的讲解让我喜欢上了Python,喜欢上了编程,虽然之前有学过C/C++,web设计等语言,但有许多还是不够真正领悟的。
全栈程序员站长
2022/11/10
5350
计算机二级Python考点解析2
第二部分:程序的基本语法元素:基本输入输出函数:input()、eval()、print();源程序的书写风格;Python语言的特点。
Minerva
2020/05/21
6080
Python二级考试知识点(史上最全)
1、Python语言基本语法元素 考点1.1 程序的基本语法元素:程序的框架、缩进、注释、变量、命名、保留字、数据类型、赋值语句、库引用 33个保留字 6种数据类型 4种引用方法:import 库、from 库 import 函数、from 库 impor *、import 库 as 别名 考点1.2 基本输入输出函数:input()、eval()、print() 考点1.3 源程序的书写风格-Python之禅 运行import this 即可出现 考点1.4 Python语言的特点 通用、简洁、高产
全栈程序员站长
2022/08/31
2.2K0
全国计算机二级C语言 考试大纲(2018年版)
4. 在Visual C++集成环境下,能够编写简单的C程序,并具有基本的纠错和调试程序的能力。
用户6755376
2019/12/18
1.2K0
Python入门习题(40)——CCF CSP认证考试真题:报数游戏「建议收藏」
试题编号: 201712-2 试题名称: 游戏 时间限制: 1.0s 内存限制: 256.0MB
全栈程序员站长
2022/10/03
5720
计算机二级Python考点解析9
与其他语言相同,在python中,try/except语句主要是用于处理程序正常执行过程中出现的一些异常情况,如语法错(python作为脚本语言没有编译的环节,在执行过程中对语法进行检测,出错后发出异常消息)、数据除零错误、从未定义的变量上取值等;而try/finally语句则主要用于在无论是否发生异常情况,都需要执行一些清理工作的场合,如在通信过程中,无论通信是否发生错误,都需要在通信完成或者发生错误时关闭网络连接。尽管try/except和try/finally的作用不同,但是在编程实践中通常可以把它们组合在一起使用try/except/else/finally的形式来实现稳定性和灵活性更好的设计。默认情况下,在程序段的执行过程中,如果没有提供try/except的处理,脚本文件执行过程中所产生的异常消息会自动发送给程序调用端,如python shell,而python shell对异常消息的默认处理则是终止程序的执行并打印具体的出错信息。这也是在python shell中执行程序错误后所出现的出错打印信息的由来。
Minerva
2020/05/25
4900
2018年全国计算机二级Python大纲
为了顺应大数据和人工智能的发展,Python作为最重要的编程语言被纳入全国计算机等级考试中,显得理所应当了,而考试的目的也是作为Python编程水平的一个相对公平的考量。
Minerva
2020/05/25
6480
计算机二级考试python考试大纲
1.掌握Python语言的基本语法规则。 2.掌握不少于2个基本的Python标准库。 3.掌握不少于2个Python第三方库,掌握获取并安装第三方库的方法。 4.能够阅读和分析Python程序。 5.熟练使用IDLE开发环境,能够将脚本程序转变为可执行程序。 6.了解Python计算生态在以下方面(不限于)的主要第三方库名称:网络爬虫、数据分析、数 据可视化、机器学习、Web开发等。
全栈程序员站长
2022/11/03
8190
Python编程作业四:文件操作
链接:https://pan.quark.cn/s/86265d8aafc1 提取码:sDpr
Francek Chen
2025/01/22
1620
Python编程作业四:文件操作
全国计算机二级C语言笔试样卷
一、选择题((1)~(10)、(21)~(40)每题2分,(11)~(20)每题2分,共70分)
用户6755376
2019/12/18
8200
相关推荐
和我一起看看,国外的Python考试到底是怎么样(上篇)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验