1.环境配置

2.数据集获取

3.训练集获取

4.训练

5.调用测试训练结果

6.代码讲解

  本文是第三篇,获取tfboard训练集。

前面我们拿到了所有图片对应的标注信息的xml文件,现在我们需要先把这些xml文件整合到一个csv里面,然后把他们转为tfrecord文件

整合为csv文件需要执行以下代码(xml_to_csv.py):

import os
import glob
import pandas as pd
import xml.etree.ElementTree as ET
DIR_NAME = 'out_xml' def xml_to_csv(path):
xml_list = []
for xml_file in glob.glob(path + '/*.xml'):#glob.glob会返回制定路径下所有符合格式的文件列表,我们这里对列表遍历
tree = ET.parse(xml_file)#创建解析树
root = tree.getroot()#得到解析树的根元素
for member in root.findall('object'):#对xml里面的object遍历
value = (root.find('filename').text,
int(root.find('size')[0].text),
int(root.find('size')[1].text),
member[0].text,
int(member[4][0].text),
int(member[4][1].text),
int(member[4][2].text),
int(member[4][3].text)
)
xml_list.append(value)#拿到数据
column_name = ['filename', 'width', 'height', 'class', 'xmin', 'ymin', 'xmax', 'ymax']#列名
xml_df = pd.DataFrame(xml_list, columns=column_name)#生成csv
return xml_df def main():
image_path = os.path.join(os.getcwd(), DIR_NAME)#将DIR_NAME里的xml文件全部读入
xml_df = xml_to_csv(image_path)#得到csv
xml_df.to_csv('raccoon_labels.csv', index=None)#写入文件
print('执行完毕') main()

我们将之前的xml文件分为两批,一批做训练集,一批做测试集,然后分别用训练集和测试集所在的目录替换DIR_NAME生成train.csv和test.csv文件。

下一步就是生成tfrecord格式的文件,之所以要生成tfrecord格式的文件,是因为他是二进制的,操作效率很高,在运算方面比较快。

按照说明执行即可,代码我都写好了注释:

"""
用法:
# 在 tensorflow/models目录下,打开命令行
# 生成训练集的tfrecord文件,执行以下命令:
python generate_tfrecord.py --csv_input=train_labels.csv --output_path=train.record
# 生成测试集的tfrecord文件,执行以下命令:
python generate_tfrecord.py --csv_input=test_labels.csv --output_path=test.record
#记得把里面文件名改为对应的文件名,
"""
from __future__ import division
from __future__ import print_function
from __future__ import absolute_import import os
import io
import pandas as pd
import tensorflow as tf from PIL import Image
from object_detection.utils import dataset_util
from collections import namedtuple, OrderedDict flags = tf.app.flags
flags.DEFINE_string('csv_input', '', 'Path to the CSV input')
flags.DEFINE_string('output_path', '', 'Path to output TFRecord')
FLAGS = flags.FLAGS # labelmap,一个labelname对应一个value
def class_text_to_int(row_label):
if row_label == 'red':
return 1
elif row_label == 'blue':
return 2
else:
None def split(df, group):
data = namedtuple('data', ['filename', 'object'])#命名元组,元素分别为filename和object
gb = df.groupby(group)#得到group划分后的list
return [data(filename, gb.get_group(x)) for filename, x in zip(gb.groups.keys(), gb.groups)]#zip生成一一对应关系,对每个group对应的块生成data格式的元组,并最终组合成list返回 def create_tf_example(group, path):
with tf.gfile.GFile(os.path.join(path, '{}'.format(group.filename)), 'rb') as fid:#以二进制读的方式打开file
encoded_jpg = fid.read()#读入filename对应的图片数据
encoded_jpg_io = io.BytesIO(encoded_jpg)#转化为二进制数据
image = Image.open(encoded_jpg_io)
width, height = image.size
filename = group.filename.encode('utf8')#utf-8编码存储
image_format = b'jpg'
xmins = []
xmaxs = []
ymins = []
ymaxs = []
classes_text = []
classes = [] for index, row in group.object.iterrows():#对每个Object操作
xmins.append(row['xmin'] / width)
xmaxs.append(row['xmax'] / width)
ymins.append(row['ymin'] / height)
ymaxs.append(row['ymax'] / height)
classes_text.append(row['class'].encode('utf8'))
classes.append(class_text_to_int(row['class'])) tf_example = tf.train.Example(features=tf.train.Features(feature={
'image/height': dataset_util.int64_feature(height),
'image/width': dataset_util.int64_feature(width),
'image/filename': dataset_util.bytes_feature(filename),
'image/source_id': dataset_util.bytes_feature(filename),
'image/encoded': dataset_util.bytes_feature(encoded_jpg),
'image/format': dataset_util.bytes_feature(image_format),
'image/object/bbox/xmin': dataset_util.float_list_feature(xmins),
'image/object/bbox/xmax': dataset_util.float_list_feature(xmaxs),
'image/object/bbox/ymin': dataset_util.float_list_feature(ymins),
'image/object/bbox/ymax': dataset_util.float_list_feature(ymaxs),
'image/object/class/text': dataset_util.bytes_list_feature(classes_text),
'image/object/class/label': dataset_util.int64_list_feature(classes),
}))#生成example协议块
return tf_example def main():
writer = tf.python_io.TFRecordWriter(FLAGS.output_path)#创建tfrecord存储器
path = os.path.join(os.getcwd(), 'images')#配置文件所在的路径
examples = pd.read_csv(FLAGS.csv_input)#输入的csv文件所在路径读入
grouped = split(examples, 'filename')#根据filename进行划分,得到list
for group in grouped:
tf_example = create_tf_example(group, path)
writer.write(tf_example.SerializeToString())#压缩example中的map为二进制并写入tfrecord writer.close()
output_path = os.path.join(os.getcwd(), FLAGS.output_path)
print('Successfully created the TFRecords: {}'.format(output_path)) main()

然后我们配置下labelmap

touch car_label_map.pbtxt
gedit car_label_map.pbtxt

输入以下内容:

item {
id: 1
name: 'red'
}
item {
id: 2
name: 'blue'
}

基本上完成了训练集和测试集的生成操作。

[神经网络]一步一步使用Mobile-Net完成视觉识别(三)的更多相关文章

  1. 一步一步理解word2Vec

    一.概述 关于word2vec,首先需要弄清楚它并不是一个模型或者DL算法,而是描述从自然语言到词向量转换的技术.词向量化的方法有很多种,最简单的是one-hot编码,但是one-hot会有维度灾难的 ...

  2. 如何一步一步用DDD设计一个电商网站(十二)—— 提交并生成订单

    阅读目录 前言 解决数据一致性的方案 回到DDD 设计 实现 结语 一.前言 之前的十一篇把用户购买商品并提交订单整个流程上的中间环节都过了一遍.现在来到了这最后一个环节,提交订单.单从业务上看,这个 ...

  3. 如何一步一步用DDD设计一个电商网站(十三)—— 领域事件扩展

    阅读目录 前言 回顾 本地的一致性 领域事件发布出现异常 订阅者处理出现异常 结语 一.前言 上篇中我们初步运用了领域事件,其中还有一些问题我们没有解决,所以实现是不健壮的,下面先来回顾一下. 二.回 ...

  4. NLP(二十九)一步一步,理解Self-Attention

      本文大部分内容翻译自Illustrated Self-Attention, Step-by-step guide to self-attention with illustrations and ...

  5. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

  6. 如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成

    阅读目录 前言 建模 实现 结语 一.前言 前面几篇已经实现了一个基本的购买+售价计算的过程,这次再让售价丰满一些,增加一个会员价的概念.会员价在现在的主流电商中,是一个不大常见的模式,其带来的问题是 ...

  7. 如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车

     阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...

  8. 如何一步一步用DDD设计一个电商网站(七)—— 实现售价上下文

    阅读目录 前言 明确业务细节 建模 实现 结语 一.前言 上一篇我们已经确立的购买上下文和销售上下文的交互方式,传送门在此:http://www.cnblogs.com/Zachary-Fan/p/D ...

  9. 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文

    阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...

  10. 如何一步一步用DDD设计一个电商网站(五)—— 停下脚步,重新出发

    阅读目录 前言 单元测试 纠正错误,重新出发 结语 一.前言 实际编码已经写了2篇了,在这过程中非常感谢有听到观点不同的声音,借着这个契机,今天这篇就把大家提出的建议一个个的过一遍,重新整理,重新出发 ...

随机推荐

  1. lung 分割论文

    <4D Lung Tumor Segmentation via Shape Prior and Motion Cues > Abstract— Lung tumor segmentatio ...

  2. Java8函数式接口之Predicate<T>

    作用: 这是一个功能接口,因此可以作为lambda表达式或方法引用的赋值目标. 实例: /** * Created by luo on 2017/5/3. */ public class Predic ...

  3. SqlServer2012——多表连接查询

    1.基本连接 select A.姓名,A.性别,B.班级名,B.家庭住址 From 学生信息 A,班级信息 B where A.所属班级=B.班级编号 --把A表与B表连接起来 2.内连接 --内连接 ...

  4. 文本主题抽取:用gensim训练LDA模型

    得知李航老师的<统计学习方法>出了第二版,我第一时间就买了.看了这本书的目录,非常高兴,好家伙,居然把主题模型都写了,还有pagerank.一路看到了马尔科夫蒙特卡罗方法和LDA主题模型这 ...

  5. [UE4]用C++如何创建Box Collision

    http://www.dawnarc.com/2016/08/ue4%E7%94%A8c--%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BAbox-collision/ 在蓝图 ...

  6. luogu 1169 棋盘制作(单调栈/悬线)

    luogu 1169 棋盘制作(单调栈/悬线) 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应 ...

  7. Java基础--常用API--字符串相关API

    一.java.lang.String 1.string对象不可变,被final修饰,不能被继承. 2.赋值方式: (1)直接赋值.比如: String name = "rick"; ...

  8. LVM逻辑卷基本概念以及相关操作

    一.LVM概念 LVM(Logical Vloume Manager):它是linux环境下对磁盘进行管理的一种机制,正常挂载的磁盘在磁盘资源快要耗尽时,无法动态拉伸增加资源,或由于特殊情况需要动态缩 ...

  9. HDU-2119-Matrix(最大匹配)

    链接:https://vjudge.net/problem/HDU-2119#author=Smilencer 题意: 众所周知,tyz是一个写bug小能手,以至于如果没有队友的帮助,就ac不了程序. ...

  10. GUI的最终选择 Tkinter(七):菜单Menu组件、Menubutton组件、OptionMenu组件

    Menu组件 今天说的Menu组件就是一些菜单组件,开始点点点... Tkinter提供了一个Menu组件,可以实现顶级菜单,下拉菜单和弹出菜单.由于底层是代码实现和优化的,所以不太建议通过按钮和其他 ...