本文为做者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃html
最近事情比较多,前面坑挖的有点久,今天终于有时间总结一下,顺便把Windows下训练跑通。Linux训练建议仔细阅读https://zhuanlan.zhihu.com/p/27469690,我借鉴颇多,此外还能够参考GitHub上的官方文档https://github.com/tensorflow/models/tree/master/research/object_detection。python
整体而言Windows下训练仍是比较坑的,centos服务器上本身的模型已经训练完了,我也是为了测试而尝试。。。基本把坑趟了一遍。我是在办公电脑上测试的,没有GPU,还好内存是32G,训练期间CPU使用率基本保持在99%。git
person
bird, cat, cow, dog, horse, sheep
aeroplane, bicycle, boat, bus, car, motorbike, train
bottle, chair, dining table, potted plant, sofa, tv/monitor
2、2012年的挑战赛一共有5 个main tasks 和 2个 ``taster'' tasks:github
1. Classification: 对每一个类判断测试图片中是否存在该类的至少1个对象.centos
2. Detection: 对每一个类判断测试图片中属于该类对象的外包边框.服务器
3. Segmentation: 对测试图中的每一个像素,判断该像素属于20个类对象仍是属于背景,即图像的语义分割.less
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个分类中),做为干扰测试.ide
5. Large Scale Recognition: 这个比赛项目由ImageNet组织,他们的网站: http://www.image-net.org/challenges/LSVRC/2012/index工具
6. 2``taster'' tasks:Boxless Action Classification: 判断测试图中人是否在作相应动做,这些人仅经过身体某处的单个点标明,没有外包边框.Person Layout: 对测试图中的每一个人(已经过外包边框标明),判断这些人的头、手、脚部位,并经过外包框标明。测试
3、目录结构:如图所示:
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目录下。
这个API的主要任务是进行ObjectDetection,因此只会用到数据集中的前三个目录,这里使用VOC2012进行训练。
1、数据格式转换
在第一部分介绍中,我已经把PascalVOC数据集下载到D:\dataset\VOCdevkit目录下,若是要制造本身的数据集,能够仿照VOC的目录结构,经过lableImg工具进行标注,具体就不演示了,能够参考的博客不少。
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文件夹。
2、下载预训练模型
一般模型的训练都不是从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目录须要新建一个。
3、修改配置文件
刚才下载的数据集是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"
其余训练的配置信息能够本身研究一下,能够针对本身的数据集进行调整。
4、开始训练
由于python环境变量配置问题,这里Windows下和Linux也有不一样,在object_detection中训练的文件为train.py,咱们打开能够看到里面的model都是经过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
1、执行python train.py报错:trainer.py“ModuleNotFoundError: No module named 'deployment'”,或者报错No module named 'nets'
2、运行训练后报错:“WARNING:root:Variable ……not available in checkpoint”
3、其余错误
训练状况:
综上,若是有可能。。。Windows下的配置仍是很糟心,奇葩问题比较多,建议仍是在Linux下训练,明天周末,我先丢在机器上跑吧。。。