本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃

  最近事情比较多,前面坑挖的有点久,今天终于有时间总结一下,顺便把Windows下训练跑通。Linux训练建议仔细阅读https://zhuanlan.zhihu.com/p/27469690,我借鉴颇多,此外还可以参考GitHub上的官方文档https://github.com/tensorflow/models/tree/master/research/object_detection。

  总体而言Windows下训练还是比较坑的,centos服务器上自己的模型已经训练完了,我也是为了测试而尝试。。。基本把坑趟了一遍。我是在办公电脑上测试的,没有GPU,还好内存是32G,训练期间CPU使用率基本保持在99%。

第一部分  PASCAL VOC数据集的介绍

The PASCAL VOC project(熟悉的小伙伴可以直接看第二部分)
首先了解一下本次训练用的数据集和它的来历
  注   册http://host.robots.ox.ac.uk/需要公司或机构邮箱,个人邮箱(gmail等等)不可注册,不注册应该也不影响下载。
  PascalVOC的官方简介:Provides standardised image data sets for object class recognition;Provides a common set of tools for accessing the data sets and annotations;Enables evaluation and comparison of different methods;Ran challenges evaluating performance on object class recognition (from 2005-2012, now finished)
  总而言之,它是一个视觉挑战赛,举办到2012年就停止了,最后一次2012年挑战赛的网址:http://host.robots.ox.ac.uk/eval/challenges/voc2012/
 
一、 PVOC2007&2012数据集一共20 object classes:
person
bird, cat, cow, dog, horse, sheep
aeroplane, bicycle, boat, bus, car, motorbike, train
bottle, chair, dining table, potted plant, sofa, tv/monitor

二、2012年的挑战赛一共有5 个main tasks 和 2个 ``taster'' tasks:

  1. Classification: 对每个类判断测试图片中是否存在该类的至少1个对象.

  2. Detection: 对每个类判断测试图片中属于该类对象的外包边框.

  3. Segmentation: 对测试图中的每个像素,判断该像素属于20个类对象还是属于背景,即图像的语义分割.

  4. Action Classification: 对每个动作类别,判断测试图片中是否有人(已通过外包边框标明)正在做出相应的动作,动作共有10个分类:jumping; phoning; playing a musical instrument; reading; riding a bicycle or motorcycle; riding a horse; running; taking a photograph; using a computer; walking。此外,数据集中有一些人在做其他动作(不在10个分类中),作为干扰测试.

  5. Large Scale Recognition: 这个比赛项目由ImageNet组织,他们的网站: http://www.image-net.org/challenges/LSVRC/2012/index

  6.  2``taster'' tasks:Boxless Action Classification: 判断测试图中人是否在做相应动作,这些人仅通过身体某处的单个点标明,没有外包边框.Person Layout: 对测试图中的每个人(已通过外包边框标明),判断这些人的头、手、脚部位,并通过外包框标明。

三、目录结构:如图所示:

  1.JPEGImages存放图片;

  2. Annotation存放对图片的标注信息(XML文件),即外包边框bounding box的位置信息;

  3. SegmentationClass和SegmentationObject存放了图片的分割前景。

  4. ImageSets是对图片集合的描述,分别对应了不同的竞赛任务,例如Layout表示图片中人体部位的数据,Main表示每个图片包含的分类信息(20个类别),Segmentation表示用于分割的数据,2007没有action,2012有了action数据,表示图片中人的动作。

  红框中的4个压缩包分别是2012和2007的test、trainval文件,把2007的test和trainval解压缩,2007的test和train目录结构是一致的,只是图片和标注内容互补。2012也是如此,在ImageSets的main中通过txt把数据集划分成train、train_test、train_val等几个部分。

  以上文件下载并解压缩到D:\dataset\VOCdevkit目录下。

第二部分TensorFlowObjectDetectionAPI的训练详细步骤

这个API的主要任务是进行ObjectDetection,所以只会用到数据集中的前三个目录,这里使用VOC2012进行训练。

一、数据格式转换

  在第一部分介绍中,我已经把PascalVOC数据集下载到D:\dataset\VOCdevkit目录下,如果要制造自己的数据集,可以仿照VOC的目录结构,通过lableImg工具进行标注,具体就不演示了,可以参考的博客很多。

  因为tf训练需要使用tfrecord格式,所以首先需要把PascalVOC数据集转换成TensorFlow record格式,ObjectDetectionAPI下提供了格式转换的方法:create_pascal_tf_record.py,参考知乎的博客,需要把164行examples_path修改为:    
data_dir, year, 'ImageSets', 'Main',FLAGS.set + '.txt'

  VOC数据集和转换后tfrecord数据集都存放在D:\dataset目录下,这里需要为tfrecord新建一个文件夹D:\dataset\TFrecord,并在TFrecord下新建文件夹data。完成后可以运行命令:

python create_pascal_tf_record.py --data_dir=D:\dataset\VOCdevkit --year=VOC2012 --set=train --output_path=D:\dataset\TFrecord\data\pascal_train.record

  上面的命令中,data_dir为存放的VOC数据集目录,year参数只接受VOC2012和VOC2007两个数据集,这里选用了VOC2012,如果自己标注了数据,请按照VOC目录结构存放,set表示使用VOC2012的train部分进行训练,大概5700多张图片,output_path为record数据集的输出目录,就是刚才新建的data文件夹。

二、下载预训练模型

  通常模型的训练都不是从0开始的,利用fine-tuning的思想在已有模型基础上训练可以有一个好的performance,https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md官网上提供了5个模型,大家可以自行下载,这里我下载了mAP比较高的faster_rcnn_inception_resnet_v2_atrous_coco,这是一个coco数据集训练的模型,解压缩后把其中的model.ckpt.*三个文件复制到D:\dataset\TFrecord\models下,没有models目录需要新建一个。

三、修改配置文件

  刚才下载的数据集是faster_rcnn_inception_resnet_v2_atrous_coco,在object_detection\samples\configs目录下找到对应的.config文件,如果没有,可以到https://github.com/tensorflow/models/tree/master/research/object_detection/samples/configs复制对应的config文件, 把faster_rcnn_inception_resnet_v2_atrous_coco.config放到预训练模型目录下:D:\dataset\TFrecord\models

  打开faster_rcnn_inception_resnet_v2_atrous_coco.config,修改num_classes为你自己的num_classes,这里VOC2012有20个分类,所以修改为20。然后修改其中5个路径:

112行 fine_tune_checkpoint: "D:\\dataset\\TFrecord\\models\\model.ckpt"
127行 input_path: "D:\\dataset\\TFrecord\\data\\pascal_train.record"
129行 label_map_path: "D:\\dataset\\TFrecord\\data\\pascal_label_map.pbtxt"
141行 input_path: "D:\\dataset\\TFrecord\\models\\pascal_val.record"
143行 label_map_path: "D:\\dataset\\TFrecord\\models\\pascal_label_map.pbtxt"

  其他训练的配置信息可以自己研究一下,可以针对自己的数据集进行调整。

四、开始训练

  因为python环境变量配置问题,这里Windows下和Linux也有不同,在object_detection中训练的文件为train.py,我们打开可以看到里面的model都是通过object_detection来加载的。

  因为路径问题,直接运行python train.py会产生model not found,两个解决办法,一是把object_detection加入python环境变量中,另一个办法,把train.py复制到object_detection目录外执行。这里我选用了后者。在object_detection外执行:

python train.py --train_dir=D:\dataset\TFrecord\train --pipeline_config_path=D:\dataset\TFrecord\models\faster_rcnn_inception_resnet_v2_atrous_coco.config

第三部分 可能产生的错误

一、执行python train.py报错:trainer.py“ModuleNotFoundError: No module named 'deployment'”,或者报错No module named 'nets'

  • 错误原因,这两个model都是在TensorFlow/models/slim中,如果你阅读了我的上一篇文章http://www.cnblogs.com/mar-q/p/7459845.html,就可以知道,需要把models/slim加入到PYTHONPATH环境变量中。

二、运行训练后报错:“WARNING:root:Variable ……not available in checkpoint”

  • 错误路径train.py->trainer.py->train()->init_saver = tf.train.Saver(available_var_map),产生原因,第2步和第3步中预训练模型和config文件没有对应起来,请在官网下载相匹配的预训练模型和config文件。

三、其他错误

  • 如果还报一些ModuleNotFoundError错误建议把object_detection目录下的.pyc文件清空一下再执行train。

训练情况:

综上,如果有可能。。。Windows下的配置还是很糟心,奇葩问题比较多,建议还是在Linux下训练,明天周末,我先丢在机器上跑吧。。。

TensorFlow Object Detection API(Windows下训练)的更多相关文章

  1. 基于TensorFlow Object Detection API进行迁移学习训练自己的人脸检测模型(二)

    前言 已完成数据预处理工作,具体参照: 基于TensorFlow Object Detection API进行迁移学习训练自己的人脸检测模型(一) 设置配置文件 新建目录face_faster_rcn ...

  2. 使用Tensorflow object detection API——环境搭建与测试

    [软件环境搭建] 操作系统:windows 10 64位 内存:8G CPU:I7-6700 Tensorflow: 1.4 Python:3.5 Anaconda3 (64-bit) 以上环境搭建请 ...

  3. 使用TensorFlow Object Detection API+Google ML Engine训练自己的手掌识别器

    上次使用Google ML Engine跑了一下TensorFlow Object Detection API中的Quick Start(http://www.cnblogs.com/take-fet ...

  4. Install Tensorflow object detection API in Anaconda (Windows)

    This blog is to explain how to install Tensorflow object detection API in Anaconda in Windows 10 as ...

  5. Tensorflow object detection API 搭建物体识别模型(三)

    三.模型训练 1)错误一: 在桌面的目标检测文件夹中打开cmd,即在路径中输入cmd后按Enter键运行.在cmd中运行命令: python /your_path/models-master/rese ...

  6. Tensorflow object detection API(1)---环境搭建与测试

    参考: https://blog.csdn.net/dy_guox/article/details/79081499 https://blog.csdn.net/u010103202/article/ ...

  7. 谷歌开源的TensorFlow Object Detection API视频物体识别系统实现教程

    视频中的物体识别 摘要 物体识别(Object Recognition)在计算机视觉领域里指的是在一张图像或一组视频序列中找到给定的物体.本文主要是利用谷歌开源TensorFlow Object De ...

  8. TensorFlow object detection API

    cloud执行:https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_pet ...

  9. Tensorflow object detection API 搭建属于自己的物体识别模型

    一.下载Tensorflow object detection API工程源码 网址:https://github.com/tensorflow/models,可通过Git下载,打开Git Bash, ...

  10. Tensorflow object detection API ——环境搭建与测试

    1.开发环境搭建 ①.安装Anaconda 建议选择 Anaconda3-5.0.1 版本,已经集成大多数库,并将其作为默认python版本(3.6.3),配置好环境变量(Anaconda安装则已经配 ...

随机推荐

  1. grep与正则表达式基础

    目录 grep 正则表达式 grep用法简介 我们介绍GREP的用法,主要用于匹配行,我们借助下面的正则表达式来介绍如何使用grep,还有就是正则表达式在linux中是极为重要的一部分. 命令:gre ...

  2. webservice05#soap消息

    1, SOAPMessage结构图 2, SOAP消息的创建 1>前面的一个简单WebService  服务 package com.yangw.soap.service; import jav ...

  3. jQuery基礎知識

    jQuery基礎知識 $(function(){}) //jQuery先執行一遍再執行其他函數 $(document).ready(fn) //文檔加載完後觸發 1. 刪除$:jQuery.noCon ...

  4. angular 如何获取使用filter过滤后的ng-repeat的数据长度

    在做项目的过程中,被产品要求在内容为空的过程中显示提示信息,然哦户内容使用ng-repeat循环输出的,并且使用了filter过滤.后在谷歌上找到解决方案,如下: ​之前代码如下显示: <ul& ...

  5. AngularJS -- 提供者(Providers)

    点击查看AngularJS系列目录 转载请注明出处:http://www.cnblogs.com/leosx/ 每个Web应用程序都是有多个对象组合.协作来完成任务的.这些对象需要被实例化,并且连接在 ...

  6. JAVA设计模式总结之23种设计模式

    上一篇总结了设计模式的六大原则<JAVA设计模式总结之六大设计原则>,这一篇,正式进入到介绍23种设计模式的归纳总结. 一.什么是设计模式                         ...

  7. Redis——windows环境安装redis和redis sentinel部署

    一:Redis的下载和安装 1:下载Redis Redis的官方网站Download页面,Redis提示说:Redis的正式版不支持Windows,要Windows学习Redis,请点击Learn m ...

  8. 【bzoj1103】【POI2007】【大都市】(树状数组+差分)

    在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了.不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n的n个小村庄,某些村庄之 ...

  9. JQ重复注册问题

    开发中常常会碰到事件重复注册,简单总结一下解决方法. (1)bind注册事件 $('...').unbind().bind('...',function(){}) (2)live注册事件 $('... ...

  10. vue前端页面跳转参数传递及存储

    不同页面间进行参数传递,实现方式有很多种,最简单最直接的方式就是在页面跳转时通过路由传递参数,如下所示. 路由传递参数 this.$router.push({ name: '跳入页面', params ...