采用Oxford-IIIT Pets数据训练Object-Detect

1. 数据集介绍

  The Oxford-IIIT Pet Dataset是一个宠物图像数据集,包含37种宠物,其中有犬类25类,猫类12类,每种宠物200张左右宠物图片,并同时包含宠物轮廓标注信息。
  地址:http://www.robots.ox.ac.uk/~vgg/data/pets/

2. 准备工作

  为了避免不必要的麻烦,先说一下我的系统情况:
  Python 3.6Tensorflow 1.10 windows10(64Bit)
  显卡: GTX 750Ti

  注: Python和Tensorflow采用Anaconda安装。

2.1 下载模型

 https://github.com/tensorflow/models
 models-master.zip
 解压到E:\models-master

2.2 下载数据

 http://www.robots.ox.ac.uk/~vgg/data/pets/
 下载annotations.tar.gz并解压到E:\PETSSelf\annotations
 下载images.tar.gz并解压到E:\PETSSelf\images
 PETSSelf名称是任取的
顺带介绍一下本次训练中采用trainval.txt文件,大体格式如下:

Name Class ID SPECIES BREED ID
Abyssinian_100 1 1 1
Abyssinian_101 1 1 1
...
Siamese_157 33 1 11
Siamese_158 33 1 11
...
yorkshire_terrier_189 37 2 25
yorkshire_terrier_18 37 2 25
yorkshire_terrier_190 37 2 25
  1. Class ID 是对应于pet_label_map.pbtxt的ID值
  2. SPECIES是总分类:1:猫 2:狗
  3. BREED ID :在分类下面的子分类序号,对于总分类1猫其序号为1-25;对于总分类2狗,其序号为1-12。

2.3 建立.pth文件

  在 Anaconda\Lib\site-packages 这个文件夹目录下,写一个.pth文件,内容为两条路径,即在C:\Users\Administrator\Anaconda3\Lib\site-packages底下建立tensorflow_model.pth文件,内容为

E:\models-master\research
E:\models-master\research\slim

如果没有这一步,在后面运行过程中则会出现 ImportError: No module named 'object_detection' 这种错误

2.4 编译protos**

将protoc-3.4.0-win32.zip的bin部分解压到E:\protoc-3.4.0-win32
转到找到model-master中的research目录下,执行:

E:\models-master\research>E:\protoc-3.4.0-win32\bin\protoc.exe object_detection/protos/*.proto --python_out=.

之后会在protos文件夹中生成一大堆.proto文档:

  • 如果是采用PATH方式调用protoc,易出现
    object_detection/protos/*.proto: No such file or directory错误

  • 如果缺少这一步,在后面运行过程中则会出现

      ImportError: cannot import name 'string_int_label_map_pb2'
    

****后来将*.py移至其它目录,发现又没有什么关系,还是需要进一步了解透彻。

2.5 运行model_builder_test.py

E:\models-master\research>python object_detection/builders/model_builder_test.py**

C:\Users\Administrator\Anaconda3\lib\site-packages\tensorflow\python\util\tf_inspect.py:75: DeprecationWarning: inspect.getargspec() is deprecated, use inspect.signature() instead
return _inspect.getargspec(target)
.....


Ran 22 tests in 0.220s
OK
E:\models-master\research>

2.6 测试object_detection工作是否正常

E:\models-master>jupyter-notebook

会自动打开浏览器,访问http://localhost:8888/
进行浏览器,按Shift+Enter一直到最后一个框
等一会儿,出现狗和沙滩的识别图形。

采用Oxford-IIIT Pets数据训练Object-Detect_第1张图片

3. 数据准备

3.1 建立转换程序

在E:\models-master\research\object_detection\dataset_tools目录底下,有一系列转换工具,包括create_pet_tf_record.py

  1. 将create_pet_tf_record.py复制到E:\PETSSelf
  2. 复制数据集的标签图文件,目前用到的是
    将object_detection/data/pet_label_map.pbtxt复制到E:\PETSSelf\data
    为了简单起见,我们只保留第1种

item {
id: 1
name: 'Abyssinian'
}

这是一种称为"阿比西尼亚猫"的动物:


采用Oxford-IIIT Pets数据训练Object-Detect_第2张图片

注意:这个转换工具默认只识别脸部信息,它从annotations\xmls目录底下自动找到相匹配的用于界定宠物的脸部范围,大体如下图:


采用Oxford-IIIT Pets数据训练Object-Detect_第3张图片

3.2 执行转换

在E:\PETSSelf目录下运行

E:\PETSSelf>Python  create_pet_tf_record.py  \
--data_dir=E:\PETSSelf  \
--output_path=E:\PETSSelf

运行完成以后,会产生下列文件

  • pet_faces_train.record-00000-of-00010
  • pet_faces_train.record-00001-of-00010
  • pet_faces_train.record-00002-of-00010
  • pet_faces_train.record-00003-of-00010
  • pet_faces_train.record-00004-of-00010
  • pet_faces_train.record-00005-of-00010
  • pet_faces_train.record-00006-of-00010
  • pet_faces_train.record-00007-of-00010
  • pet_faces_train.record-00008-of-00010
  • pet_faces_train.record-00009-of-00010
  • pet_faces_val.record-00000-of-00010
  • pet_faces_val.record-00001-of-00010
  • pet_faces_val.record-00002-of-00010
  • pet_faces_val.record-00003-of-00010
  • pet_faces_val.record-00004-of-00010
  • pet_faces_val.record-00005-of-00010
  • pet_faces_val.record-00006-of-00010
  • pet_faces_val.record-00007-of-00010
  • pet_faces_val.record-00008-of-00010
  • pet_faces_val.record-00009-of-00010

3.3 引入训练模型

我们采用ssd_mobilenet模型进行训练

3.3.1 模型下载

其可以从:
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md
指定的模型表格中进行下载,这个模型是用微软COCO数据集训练的。
下载完成以后,名称为:ssd_mobilenet_v1_coco_2018_01_28.tar.gz
当然,时间不同,文件名可能有变化,时代总是在进步的。

3.3.2 复制模型文件

将临时目录里面的model.ckpt.*的三个文件, 即下面三个文件:

  • model.ckpt.data-00000-of-00001
  • model.ckpt.index
  • model.ckpt.meta
    复制到E:\PETSSelf
3.3.3 复制配置文件并修改

模型配置文件为ssd_mobilenet_v1_pets.config
其可以在E:\models-master\research\object_detection\samples\configs找到。将其复制到E:\PETSSelf,并作如下修改:

  • num_classes

num_classes=1

我们在此只采用1类

  • 将所有PATH_TO_BE_CONFIGURED的地方类比修改为自己之前设置的路径

fine_tune_checkpoint: "E:/PETSSelf/model.ckpt"

train_input_reader: {
tf_record_input_reader {
input_path: "E:/PETSSelf/pet_faces_train.record*"
}
label_map_path: "E:/PETSSelf/data/pet_label_map.pbtxt"
}

eval_input_reader: {
tf_record_input_reader {
input_path: "E:/PETSSelf/pet_faces_val.record*"
}

  • num_steps
    原来num_steps: 200000,这个需要花费大量时间,为了测试方便,改成一个较小值,以验证命令是否能通过:

num_steps: 1000

  • batch_size
    原来的batch_size: 24,目前GTX 750Ti显示会内存不足,先以最小计

batch_size: 12

4. 训练数据

4.1 引入训练程序train.py

将E:\models-master\research\object_detection\legacy\train.py
复制到E:\PETSSelf

注意:网上有很多文档,认为train.py脚本在object detection文件夹下面,估计是TensorFlow版本升级了,train.py现在位置在legacy文件下面.

4.2 运行train.py

E:\PETSSelf>Python train.py -train_dir=E:\PETSSelf -pipeline_config_path=E:\PETSSelf\ssd_mobilenet_v1_pets.config

5. 模型输出

E:\PETSSelf\ssd_mobilenet_v1_pets.config --trained_checkpoint_prefix E:\PETSSelf\model.ckpt-1000 --output_directory output_model

运行完成以后,形成以下文件(没有全列出来)

  • frozen_inference_graph.pb
  • model.ckpt.data-00000-of-00001
  • model.ckpt.index
  • model.ckpt.meta
  • pipeline.config
    ···

6. 模型测试

6.1 测试环境准备

转到E:\models-master目录,然后执行

E:\models-master>jupyter-notebook

转入浏览器,在浏览器页面中作一些配置修改操作:
修改in[4]

# What model to download.
#MODEL_NAME = 'ssd_mobilenet_v1_coco_2017_11_17'
MODEL_NAME = 'E:/PETSSelf/output_model'
#MODEL_FILE = MODEL_NAME + '.tar.gz'
#DOWNLOAD_BASE = 'http://download.tensorflow.org/models/object_detection/'

# Path to frozen detection graph. This is the actual model that is used for the object detection.
PATH_TO_FROZEN_GRAPH = MODEL_NAME + '/frozen_inference_graph.pb'

# List of the strings that is used to add correct label for each box.
PATH_TO_LABELS = os.path.join('data', 'pet_label_map.pbtxt')

将Download Model即in [5]全部屏蔽

#opener = urllib.request.URLopener()
#opener.retrieve(DOWNLOAD_BASE + MODEL_FILE, MODEL_FILE)
#tar_file = tarfile.open(MODEL_FILE)
#for file in tar_file.getmembers():
#  file_name = os.path.basename(file.name)
#  if 'frozen_inference_graph.pb' in file_name:
#    tar_file.extract(file, os.getcwd())

修改Detection即In [9]部分

PATH_TO_TEST_IMAGES_DIR = 'E:/PETSSelf/Test'
TEST_IMAGE_PATHS = [ os.path.join(PATH_TO_TEST_IMAGES_DIR, 'image{}.jpg'.format(i)) for i in range(1, 6) ]

注意:上面代码中range(1, 6) ,表示测试5张图片

6.2 测试数据准备

建立E:\PETSSelf\Test目录,将从网上找几张图片

采用Oxford-IIIT Pets数据训练Object-Detect_第4张图片

Image1: 从网上找的Abyssinian/阿比西尼亚猫图片
Image2: 爱心的中华田园猫
Image3: american_bulldog/美国斗牛犬
Image4: 舒服的中华田园猫
Image5: 人类

6.3 测试

回到Jupyter最初始,点击选中Object Detection Demo,然后一直按Shift+Enter,直到最后:

采用Oxford-IIIT Pets数据训练Object-Detect_第5张图片

这个是对的,确实是阿比西尼亚猫

采用Oxford-IIIT Pets数据训练Object-Detect_第6张图片

哈哈,认错了,它是中华田园猫,不过系统也认为置信度不高。

采用Oxford-IIIT Pets数据训练Object-Detect_第7张图片

这个是不对了,猫和狗怎么混淆了呢?

采用Oxford-IIIT Pets数据训练Object-Detect_第8张图片

这个准确(也可能根本没有认出来是只猫,呵呵)。

采用Oxford-IIIT Pets数据训练Object-Detect_第9张图片

这个也准确。

你可能感兴趣的:(采用Oxford-IIIT Pets数据训练Object-Detect)