手把手带你玩转Tensorflow 物体检测 API (2)——数据准备

致谢声明

本文在学习《Tensorflow object detection API 搭建属于自己的物体识别模型(2)——训练并使用自己的模型》的基础上优化并总结,此博客链接:https://blog.csdn.net/dy_guox/article/details/79111949,感谢此博客作者。

0.前言

在进行本文操作之前,需要先安装好tensorflow的gpu版本
本文作者的环境:python3.6、Windows10、tensorflow_gpu1.10
已经安装好的可以跳过,学习如何安装tensorflow的gpu版本的读者请阅读本文作者的另外一篇文章《深度学习环境搭建-CUDA9.0、cudnn7.3、tensorflow_gpu1.10的安装》,链接:https://www.jianshu.com/p/4ebaa78e0233
本文是写给目标检测入门新手的指导文章,会用示意图将每一步的详细实现过程展示出来。
本文作者接触深度学习2个月后,开始进行目标检测实践。
本文作者的专题《目标检测》,链接:https://www.jianshu.com/c/fd1d6f784c1f
此专题的宗旨是让基础较为薄弱的新手能够顺利实现目标检测,专题内容偏向于掌握技能,学会工具的使用。
本文作者尚未具备清楚讲述目标检测原理的能力,学习原理请自行另找文章。

文章编号文章名链接
1目标检测实践_tensorflow版SSD运行示例https://www.jianshu.com/p/c1d8f1c76de7
2目标检测实践_tensorflow版SSD数据准备https://www.jianshu.com/p/3d9436b4cb66
3目标检测实践_tensorflow版SSD训练自己的数据https://www.jianshu.com/p/0e5f9df4686a
4目标检测实践_tensorflow版SSD模型测试https://www.jianshu.com/p/7464c5e00716

1.下载图片

本文作者给读者演示的图片数据是来自ImageNet中的鲤鱼分类。
数据集在百度云盘,链接: https://pan.baidu.com/s/1NksESNqBX--YqMJ4zptGdw 提取码: 6p3u
在桌面新建文件夹目标检测,把下载好的压缩文件n01440764.tar放到其中,如下图所示:

image.png


选择解压到n01440764,如下图所示:

image.png


解压完成后,桌面的目标检测文件夹中如下图所示:

image.png

 

2.选择图片

在此数据集中,大部分图片都较为清晰,但是有极少数图片像素点少,不清晰。
像素点少的图片不利于模型训练或模型测试,所以在本章节中实现用python代码选出部分图片文件。
在桌面的目标检测文件夹中打开cmd,即在路径中输入cmd后按Enter键,如下图所示:

image.png


在cmd中输入命令并运行:jupyter notebook,如下图所示:

image.png


浏览器会自动打开1个标签页,选择新建ipynb代码文件,如下图所示:

image.png


为ipynb文件重命名,重命名按钮如下图红色箭头标记处所示:

image.png


修改文件名为get_some_qualified_images,如下图所示:

image.png


复制下面一段代码到代码文件get_some_qualified_images.ipynb的单元格中,复制后运行即可:

 

 

import os
import random
from PIL import Image
import shutil#获取文件夹中的文件路径
def getFilePathList(dirPath, partOfFileName=''):allFileName_list = list(os.walk(dirPath))[0][2]fileName_list = [k for k in allFileName_list if partOfFileName in k]filePath_list = [os.path.join(dirPath, k) for k in fileName_list]return filePath_list#获取一部分像素足够,即长,宽都大于416的图片
def get_some_qualified_images(dirPath, sample_number, new_dirPath):jpgFilePath_list = getFilePathList(dirPath, '.JPEG')random.shuffle(jpgFilePath_list)if not os.path.isdir(new_dirPath):os.makedirs(new_dirPath)i = 0for jpgFilePath in jpgFilePath_list:image = Image.open(jpgFilePath)width, height = image.sizeif width >= 416 and height >= 416:i += 1new_jpgFilePath = os.path.join(new_dirPath, '%03d.jpg' %i)shutil.copy(jpgFilePath, new_jpgFilePath)if i == sample_number:break#获取数量为100的合格样本存放到selected_images文件夹中
get_some_qualified_images('n01440764', 100, 'selected_images')

代码运行完成后,在桌面的目标检测文件夹中,会有一个selected_images文件夹,如下图所示:

image.png

 

3.缩小图片

在第2章选择图片中,选出了100张像素足够的图片存放在selected_images文件夹中,即淘汰了像素过小的图片。
在本章第3章中用代码实现将像素过大的图片做缩小。
在jupyter notebook中新建代码文件get_small_images.ipynb,步骤与上一章中相同:
打开cmd——>运行jupyter notebook——>新建代码文件——>代码文件重命名
复制下面一段代码到代码文件get_small_images.ipynb的单元格中,复制后运行即可:

 

import os
from PIL import Imagedef get_smaller_images(dirPath, new_dirPath):fileName_list = os.listdir(dirPath)filePath_list = [os.path.join(dirPath, fileName) for fileName in fileName_list]imagePath_list = [filePath for filePath in filePath_list if '.jpg' in filePath]if not os.path.isdir(new_dirPath):os.mkdir(new_dirPath)for imagePath in imagePath_list:image = Image.open(imagePath)width, height = image.sizeimageName = imagePath.split('\\')[-1]save_path = os.path.join(new_dirPath, imageName)if width >= 600 and height >= 600:minification = min(width, height) // 300 #此变量表示缩小倍数new_width = width // minificationnew_height = height // minificationresized_image = image.resize((new_width, new_height), Image.ANTIALIAS)print('图片%s原来的宽%d,高%d, 图片缩小后宽%d,高%d' %(imageName, width, height, new_width, new_height))resized_image.save(save_path)else:image.save(save_path)get_smaller_images('selected_images', 'smaller_images')

在本文作者的实践中,图片经过PIL库打开再保存,保持图片质量的情况下,能够缩小图片文件大小3倍左右。本文作者猜测可能是使用的图片压缩算法不同,完成此步后,文件夹大小如下图所示。

 

image.png

4.给图片打标签

使用打标签工具LabelImg,下载页面链接:https://tzutalin.github.io/labelImg/
如果下载页面链接没法访问,也可以从百度云盘中下载。
链接: https://pan.baidu.com/s/1jVmkLxqQMZNJIzyv75HilA 提取码: yysh
下载页面如下图所示:

image.png


选择下载Windows_v1.8.0,如下图中红色箭头标记处所示:

image.png


把压缩文件windows_v1.8.0.zip放到D盘根目录中,选择解压到当前文件夹
解压后D盘根目录下会有windows_v1.8.0文件夹,LabelImg软件在文件夹中。
选择D盘根目录的原因:如果windows_v1.8.0文件夹路径中带有中文,打开LabelImg软件会闪退
打开LabelImg软件,点击下图红色箭头标记处。

image.png


在打开的软件界面,点击Open Dir按钮,如下图红色箭头标注处所示。

image.png


首先打开桌面的目标检测文件夹,在选中文件夹smaller_images的情况下,点击下图红色箭头标记处所示的选择文件夹按钮。
注意:只需要鼠标选中文件夹smaller_images,不需要进入文件夹smaller_images中。

image.png


在输入法为英文输入的情况下,按键盘上的w键则可以开始绘制方框,方框会框住图片中的物体。
完成绘制方框后,还需要为方框标上类别,如下图所示。
注意:每完成一张图的打标签,一定要记得保存!!!

image.png


在本文演示中,需要给图片中的鲤鱼人脸2个类别打标签。
鲤鱼的标签名叫做fish,人脸的标签名叫human_face,打标签的结果如下图所示。
注意:用方框框住物体时,尽量框住物体的所有部位,例如本文中的鱼,鱼鳍是一个重要特征。保证框住物体所有部位的情况下,也不要使方框四周留出过多空白。

image.png


遇到特征不明显的图片,可以放弃为此图片打标签,举例如下图所示:

image.png


为100张图片打标签,本文作者共花费44分钟。
用LabelImg软件打标签会给每张图片产生对应的xml文件。
检查是否给所有图片都打上标签,在文件夹smaller_images中共有99个xml文件,如下图所示。
因为有1张图片难以辨认,所以没有给它打标签。

image.png


本文作者把已经打标签好的文件夹smaller_images做成压缩文件smaller_images.zip,并上传到百度网盘。
下载链接: https://pan.baidu.com/s/1tkCV95pzLyRV5gSRF9sF8A 提取码: 7j88

 

5.xml转csv

xml转csv的意思是,将xml文件中的信息整合到csv文件中。
在桌面的目标检测文件夹中新建代码文件xml_to_csv.ipynb,步骤与第2章中相同:
打开cmd——>运行jupyter notebook——>新建代码文件——>代码文件重命名
复制下面一段代码到代码文件xml_to_csv.ipynb的单元格中,复制后运行即可:

 

import os
import pandas as pd
import xml.etree.ElementTree as ET
from sklearn.model_selection import train_test_splitdef xmlPath_list_to_df(xmlPath_list):xmlContent_list = []for xmlPath in xmlPath_list:tree = ET.parse(xmlPath)root = tree.getroot()for member in root.findall('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))xmlContent_list.append(value)column_name = ['filename', 'width', 'height', 'class', 'xmin', 'ymin', 'xmax', 'ymax']xmlContent_df = pd.DataFrame(xmlContent_list, columns=column_name)   return xmlContent_dfdef dirPath_to_csv(dirPath):fileName_list = os.listdir(dirPath)all_xmlPath_list = [os.path.join(dirPath, fileName) for fileName in fileName_list if '.xml' in fileName]train_xmlPath_list, test_xmlPath_list = train_test_split(all_xmlPath_list, test_size=0.1, random_state=1)train_df = xmlPath_list_to_df(train_xmlPath_list)train_df.to_csv('train.csv')print('成功产生文件train.csv,训练集共有%d张图片' %len(train_xmlPath_list))test_df = xmlPath_list_to_df(test_xmlPath_list)test_df.to_csv('test.csv')print('成功产生文件test.csv,测试集共有%d张图片' %len(test_xmlPath_list))dirPath_to_csv('smaller_images')

为了使读者与本文作者的复现结果一致,本文作者将函数train_test_split的参数random_state的值设为1,这样每次划分的训练集和测试集总是相同。如果不设置此参数,则每次划分的训练集和测试集不同。
上面一段代码的运行结果如下:

成功产生文件train.csv,训练集共有89张图片
成功产生文件test.csv,测试集共有10张图片

6.csv转tfrecord

csv转tfrecord的意思是,将csv文件中的信息图片数据整合到tfrecord文件中。

6.1 配置环境

下载文件object_detection.zip
链接:https://pan.baidu.com/s/1Q9SxtKlOqEty08tpFeUUHA 提取码: p2sm
选择提取到"object_detection",如下图所示:

image.png


按照链接https://www.jianshu.com/p/0e5f9df4686a 中的第1章《解决第1个报错》添加环境变量

 

6.2 编辑和运行代码

在桌面的目标检测文件夹中新建代码文件csv_to_tfrecord.ipynb,步骤与第2章中相同:
打开cmd——>运行jupyter notebook——>新建代码文件——>代码文件重命名
复制下面一段代码到代码文件csv_to_tfrecord.ipynb的单元格中,复制后运行即可:

 

import os
import pandas as pd
import tensorflow as tf
from object_detection.utils import dataset_util
import shutildef csv2tfrecord(csv_path, imageDir_path, tfrecord_path):objectInfo_df = pd.read_csv(csv_path)tfrecord_writer = tf.python_io.TFRecordWriter(tfrecord_path)for filename, group in objectInfo_df.groupby('filename'):height = group.iloc[0]['height']width = group.iloc[0]['width']filename_bytes = filename.encode('utf-8')image_path = os.path.join(imageDir_path, filename)with open(image_path, 'rb') as file:encoded_jpg = file.read()image_format = b'jpg'xmin_list = list(group['xmin'] / width)xmax_list = list(group['xmax'] / width)ymin_list = list(group['ymin'] / height)ymax_list = list(group['ymax'] / height)classText_list = [classText.encode('utf-8') for classText in group['class']]classLabel_list = [classText_to_classLabel(classText) for classText in group['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_bytes),'image/source_id': dataset_util.bytes_feature(filename_bytes),'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(xmin_list),'image/object/bbox/xmax': dataset_util.float_list_feature(xmax_list),'image/object/bbox/ymin': dataset_util.float_list_feature(ymin_list),'image/object/bbox/ymax': dataset_util.float_list_feature(ymax_list),'image/object/class/text': dataset_util.bytes_list_feature(classText_list),'image/object/class/label': dataset_util.int64_list_feature(classLabel_list),}))tfrecord_writer.write(tf_example.SerializeToString())tfrecord_writer.close()print('成功产生tfrecord文件,保存在路径:%s' %tfrecord_path)#如果训练自己的模型,目标检测的类别不同,需要修改此处
def classText_to_classLabel(row_label):if row_label == 'fish':return 1elif row_label == 'human_face':return 2else:return Nonedir_name = 'training'
if not os.path.isdir(dir_name):os.mkdir(dir_name)
csv2tfrecord('train.csv', 'smaller_images', 'training/train.tfrecord')
csv2tfrecord('test.csv', 'smaller_images', 'training/test.tfrecord')

本文作者花费了2个小时左右将原博客作者的代码精简成上面一段代码,调用库更少,调用方法更常用,变量名命名表达意思更准确,使读者更容易理解本段代码的作用。
上面一段代码的运行结果如下:

成功产生tfrecord文件,保存在路径:training/train.tfrecord
成功产生tfrecord文件,保存在路径:training/test.tfrecord

上面一段代码运行完成后,桌面的目标检测文件夹中会产生一个文件夹training,如下图红色箭头标注处所示。

image.png


在文件夹training中,有2个tfrecord文件,如下图所示:

image.png

 

7.编写pbtxt文件

在桌面文件夹目标检测的文件夹training中,创建文本文件my_label_map.pbtxt
复制下面一段内容到文本文件my_label_map.pbtxt中。

 

item {name : "fish"id : 1
}
item {name : "human_face"id : 2
}

复制后保存即可,此时文件夹training中有3个文件,如下图所示:

image.png


有一个细节需要特别注意,因为此细节,本文作者花费了1天半时间才解决报错问题。
文本文件fish_label.pbtxt在Windows系统下默认编码格式是ANSI格式,工程中需要的就是此格式。
但是本文作者在认为python3对utf-8编码支持较好,所以把文本文件fish_label.pbtxt的编码改成了utf-8格式,导致工程报错。

 

8.编写配置文件

在桌面文件夹目标检测的文件夹training中,创建配置文件ssdlite_mobilenet_v2_coco.config
本文作者给读者提供2种方式获得正确的配置文件。

8.1 网盘下载

本文作者将适用于本文的配置文件的各项参数都已经设置好,并且上传百度网盘。
链接: https://pan.baidu.com/s/1ERp0zJ4cpI5VHHeHcyI_Rg 提取码: ud28

8.2 修改原生配置文件

如果读者已经阅读过《目标检测》系列的第一篇文章:《目标检测第1步-运行tensorflow官方示例》,链接:https://www.jianshu.com/p/c1d8f1c76de7
可以在object_detection文件夹中的samples/config路径下,找到原生配置文件ssdlite_mobilenet_v2_coco.config,如下图红色箭头标记处所示。

image.png


原生配置文件ssdlite_mobilenet_v2_coco.config先复制1份到桌面文件目标检测的文件夹training中。
原生配置文件中的需要修改的部分:

 

  1. 第9行的num_classes,对于本文来说,此数设置为2
  2. 第143行的batch_size,对于本文来说,此数设置为5,读者根据自己的电脑配置,可以调高或者调低。
  3. 第177行input_path设置成"training/train.tfrecord"
  4. 第179行label_map_path设置成"training/my_label_map.pbtxt"
  5. 第191行input_path设置成"training/test.tfrecord"
  6. 第193行label_map_path设置成"training/my_label_map.pbtxt"
  7. 第158、159这2行需要删除。

修改配置文件ssdlite_mobilenet_v2_coco.config并保存后,此时文件夹training中有4个文件,如下图所示:

image.png

 

9.总结

1.本篇文章到此结束,详细地介绍了数据准备的过程。
本篇文章的阶段性成果training文件夹已经上传百度云盘。
链接: https://pan.baidu.com/s/1Kgp9geSkTFVa_4tfc7ZPew 提取码: 9sy3
2.《目标检测》系列的下一篇文章《目标检测实践_tensorflow版SSD训练自己的数据》,链接:https://www.jianshu.com/p/0e5f9df4686a



作者:潇洒坤
链接:https://www.jianshu.com/p/3d9436b4cb66
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手把手带你玩转Tensorflow 物体检测 API (3)——训练模型

致谢声明 本文在学习《Tensorflow object detection API 搭建属于自己的物体识别模型(2)——训练并使用自己的模型》的基础上优化并总结,此博客链接:https://blog.csdn.net/dy_guox/article/details/79111949,感谢此博…

动态类型var和dynamic和传统确定类型区别和效率

伴随着vs2010的出现,c#4.0的诞生,与之而来的动态类型dynamic更是给net程序员们锦上添花,为自己的程序书写上带来了给大的便利。可到底怎么用,好不好用,效率这么样,也许是大家最迫切关注的,msdn虽…

手把手带你玩转Tensorflow 物体检测 API (4)—— 模型验证

致谢声明 本文在学习《Tensorflow object detection API 搭建属于自己的物体识别模型(2)——训练并使用自己的模型》的基础上优化并总结,此博客链接:https://blog.csdn.net/dy_guox/article/details/79111949,感谢此博…

mysql tomcat列表增删改查_Tomcat-Database

Tomcat-Database介绍根据Tomcat9源码二次开发,增加数据库功能,可一行代码实现CURD安装教程需要先配置Ant,然后在根目录下执行ant命令,即可编译,编译后的目录在Tomcat-Database/output/build下,其中在bin下可…

Kafka集群部署CentOS 7

一、前言 1、Kafka简介 Kafka是一个开源的分布式消息引擎/消息中间件,同时Kafka也是一个流处理平台。Kakfa支持以发布/订阅的方式在应用间传递消息,同时并基于消息功能添加了Kafka Connect、Kafka Streams以支持连接其他系统的数据(Elasticsearch、Had…

mysql+e+文件+xls_TP5+PHPexcel导入xls,xlsx文件读取数据

首先:在extend里面引入PHPexcel文件,直接根目录导入进去html创建上传按钮上传excel上传文件立即提交重置layui.use([form,upload],function(){var formlayui.form;var uploadlayui.upload;upload.render({ //允许上传的文件后缀elem: #myfile,url: "{:url(sale/do_uploa…

SQL Server 2008 FILESTREAM特性管理文件

在SQL Server 2008中,新的FILESTREAM(文件流)特性和varbinary列配合,你可以在服务器的文件系统上存储真实的数据,但可以在数据库上下文内管理和访问,这个特性让SQL Server不仅可以维护好数据库内记录的完整…

System.Drawing.Color转System.Windows.Media.Color

2019独角兽企业重金招聘Python工程师标准>>> //这是两个不同的类 System.Windows.Media.Color color (System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString(transItemList[i].color.Name); 转载于:https://my.oschina.net/SearchVe…

Prometheus 监控Mysql服务器及Grafana可视化

Prometheus 监控Mysql服务器及Grafana可视化 mysql_exporter:用于收集MySQL性能信息。 使用版本mysqld_exporter 0.11.0官方地址使用文档:https://github.com/prometheus/mysqld_exporter图标模板:https://grafana.com/dashboards/7362下载…

Kafka集群部署搭建完美标准版

Kafka集群部署并启动 在本文中将从演示如何搭建一个Kafka集群开始,然后简要介绍一下关于Kafka集群的一些基础知识点。但本文仅针对集群做介绍,对于Kafka的基本概念不做过多说明,这里假设读者拥有一定的Kafka基础知识。 首先,我们…

Yolov4训练自己的数据集

Yolov4训练自己的数据集 代码运行环境Ubuntu18.04python3.6显卡1080TiCUDA10.0cudnn7.5.1OpenCV3.4.6Cmake3.12.2,详细环境配置安装步骤就不讲解拉,网上教程一大堆。从github克隆下载源码,链接地址:https://github.com/AlexeyAB/…

vs 2010 不显示解决方案文件

vs 2010 不显示解决方案文件的问题早就遇到过,而且也能很容易的解决,唯独这次太郁闷了,先说说之前的我办法吧,像往常一样,在工具栏里面找到 >工具>选项>项目和解决方案>常规>勾中“总是显示解决方案”&…

CentOS7 安装ownCloud

ownCloud的安装依赖LAMP环境,即 Linux Apache MySQL(Mariadb) PHP,所以在装owncloud前最好先装好这些,并且保证已经可用。 为了方便,本文在运行shell命令时都是以管理员用户身份运行(root权限下运行)&a…

java opencv 平移_Java中使用opencv

Java中使用opencvJava中使用opencv零、前言作为图像处理出身,不仅仅要会C图像处理、matlab图像处理、python图像处理、最起码也得会java图像处理,当然我最终还都用的是opencv这个机器视觉库了。今天简单介绍一下java中如何使用opencv。一、配置库(1)官网…

CentOS7 安装 NextCloud

NextCloud 的安装依赖LAMP环境,即 Linux Apache MySQL(Mariadb) PHP,所以在装 NextCloud前最好先装好这些,并且保证已经可用。 为了方便,本文在运行shell命令时都是以管理员用户身份运行(root权限下运行&#xff0…

苹果系统使用之输入法的呈现与设置问题

新装的系统,总是纠结的出现各种问题。今天解决的就是装了Mac OS X 10.6(苹果系统)之后,输入法找不到,用快捷不能设置的问题。 刚开始使用mac os x 系统,其实说用也谈不上,因为本人是使用公司的电…

halcon 17 cuda cudnn 深度学习环境搭建

如果你想安装halcon17,那么很简单,硬盘剩余空间2G,内存超过256M,操作系统win7以上即可。 但显然我们的要求不仅如此,因为我们期待已久的深度学习功能。 详细要求见下表 必备环境:电脑必须要有 NVIDIA 独立显卡&#x…

Format Currency Sample

2019独角兽企业重金招聘Python工程师标准>>> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"&…

深度学习-服务端训练+android客户端物体识别实战(caffe入门教程+mobilenet+ncnn+android)

文章目录 背景 物体识别简介 自动驾驶 淘宝京东使用物体识别技术公司业务需求 深度学习简介 深度学习的位置 深度学习概念深度学习优势 深度学习基础知识 感知机 激活函数多层感知机卷积神经网络 卷积层 * 池化层 模型训练 前向传播 * 反向传播与参数优化 深度学习服务端框…

java+包装类,装箱和拆箱_Java包装类,装箱和拆箱详解

下面要给大家讲到的就是Java内置包装类方面的知识&#xff0c;这章主要会讲到Java包装类装箱和拆箱方面的知识&#xff0c;一起来了解一下。Java为每种基本数据类型分别设计了对应的类&#xff0c;这就被叫做是包装类(WrapperClasses)&#xff0c;当然&#xff0c;也有的地方叫…