采用Oxford-IIIT Pets数据训练Object-Det
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 |
- Class ID 是对应于pet_label_map.pbtxt的ID值
- SPECIES是总分类:1:猫 2:狗
- 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一直到最后一个框
等一会儿,出现狗和沙滩的识别图形。
3. 数据准备
3.1 建立转换程序
在E:\models-master\research\object_detection\dataset_tools目录底下,有一系列转换工具,包括create_pet_tf_record.py
- 将create_pet_tf_record.py复制到E:\PETSSelf
- 复制数据集的标签图文件,目前用到的是
将object_detection/data/pet_label_map.pbtxt复制到E:\PETSSelf\data
为了简单起见,我们只保留第1种
item {
id: 1
name: 'Abyssinian'
}
这是一种称为"阿比西尼亚猫"的动物:
注意:这个转换工具默认只识别脸部信息,它从annotations\xmls目录底下自动找到相匹配的<bnxbox>用于界定宠物的脸部范围,大体如下图:
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目录,将从网上找几张图片
Image1: 从网上找的Abyssinian/阿比西尼亚猫图片
Image2: 爱心的中华田园猫
Image3: american_bulldog/美国斗牛犬
Image4: 舒服的中华田园猫
Image5: 人类
6.3 测试
回到Jupyter最初始,点击选中Object Detection Demo
,然后一直按Shift+Enter,直到最后:
这个是对的,确实是阿比西尼亚猫
哈哈,认错了,它是中华田园猫,不过系统也认为置信度不高。
这个是不对了,猫和狗怎么混淆了呢?
这个准确(也可能根本没有认出来是只猫,呵呵)。
这个也准确。