[神经网络]一步一步使用Mobile-Net完成视觉识别(三)
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完成视觉识别(三)的更多相关文章
- 一步一步理解word2Vec
一.概述 关于word2vec,首先需要弄清楚它并不是一个模型或者DL算法,而是描述从自然语言到词向量转换的技术.词向量化的方法有很多种,最简单的是one-hot编码,但是one-hot会有维度灾难的 ...
- 如何一步一步用DDD设计一个电商网站(十二)—— 提交并生成订单
阅读目录 前言 解决数据一致性的方案 回到DDD 设计 实现 结语 一.前言 之前的十一篇把用户购买商品并提交订单整个流程上的中间环节都过了一遍.现在来到了这最后一个环节,提交订单.单从业务上看,这个 ...
- 如何一步一步用DDD设计一个电商网站(十三)—— 领域事件扩展
阅读目录 前言 回顾 本地的一致性 领域事件发布出现异常 订阅者处理出现异常 结语 一.前言 上篇中我们初步运用了领域事件,其中还有一些问题我们没有解决,所以实现是不健壮的,下面先来回顾一下. 二.回 ...
- NLP(二十九)一步一步,理解Self-Attention
本文大部分内容翻译自Illustrated Self-Attention, Step-by-step guide to self-attention with illustrations and ...
- 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑
阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...
- 如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成
阅读目录 前言 建模 实现 结语 一.前言 前面几篇已经实现了一个基本的购买+售价计算的过程,这次再让售价丰满一些,增加一个会员价的概念.会员价在现在的主流电商中,是一个不大常见的模式,其带来的问题是 ...
- 如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车
阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...
- 如何一步一步用DDD设计一个电商网站(七)—— 实现售价上下文
阅读目录 前言 明确业务细节 建模 实现 结语 一.前言 上一篇我们已经确立的购买上下文和销售上下文的交互方式,传送门在此:http://www.cnblogs.com/Zachary-Fan/p/D ...
- 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文
阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...
- 如何一步一步用DDD设计一个电商网站(五)—— 停下脚步,重新出发
阅读目录 前言 单元测试 纠正错误,重新出发 结语 一.前言 实际编码已经写了2篇了,在这过程中非常感谢有听到观点不同的声音,借着这个契机,今天这篇就把大家提出的建议一个个的过一遍,重新整理,重新出发 ...
随机推荐
- 51Nod - 1092 回文字符串(添加删除字符LCS变形)
回文字符串 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串.每个字符串都可以通过向中间添加一些字符,使之变为回文字符串. 例如:abbc 添加2个字符可以变为 acbbca, ...
- CodeForces - 633D Fibonacci-ish 大数标记map+pair的使用
Fibonacci-ish Yash has recently learnt about the Fibonacci sequence and is very excited about it. He ...
- PHP注释-----PHPDOC
用过IDE或看过其他源码的小伙伴们应该都见过类似下面这样的注释 /** * 递归获取所有游戏分类 * @param int $id * @return array */ 看得多了就大概知道了一些规 ...
- python split 与join
1.string.join (saq):以string 为分隔符,将seq中所有的元素(字符串表示"")合并成一个新的字符串 2.string.split(str="&q ...
- 基于canvas绘图 缩放 做标记
技术要点: 1.img 绘制到canvas 2.绘制完成以后进行拖拽,缩放 3.使用canvas画图,在绘制的img上进行标记划线,当然可以实现跟过功能,例如百度地图的功能,做单个标记,区域标记等. ...
- 道阻且长 莫失本心(我的OI之旅
道阻且长 莫失本心 今天午睡醒来,发现自己发烧了.尽管穿的很厚,尽管今天的阳光如此明媚.身体还是由内而外地散发着冷意. 期末考已经结束了,接下来又是艰难而难忘的奥赛训练.(要到春节才能放假了 ...
- Nacos深入浅出(八)
Nacos-spring-context.java 感觉这个后台要比之前的Nacos复杂多了,涉及到很多基础的概念,慢慢看,这个后面慢慢更新解析过程 看到他的目录结构一个是基于注解,一个是XML的解析 ...
- Nacos深入浅出(五)
四中标色的代码 result = ConfigService.dump(dataId, group, tenant, cf.getContent(), lastModified); 我们看下这个方法 ...
- nutzboot 使用nacos替换zookeeper
先放一段从网上拷贝一段分布式CAP理论的概念 分布式领域中存在CAP理论,且该理论已被证明:任何分布式系统只可同时满足两点,无法三者兼顾. ①C:Consistency,一致性,数据一致更新,所有数据 ...
- 如何使用JAR文件重用JMeter代码并节省时间
在开发测试时,通常需要在测试中编写代码.此代码可能很长,可能会在多个测试中重复,或者可能仅针对特定测试编写.此外,如果要求发生变化,则在测试中编写的代码可能必须更改或补充. 这可能需要很长时间并且容易 ...