美文网首页
采用Oxford-IIIT Pets数据训练Object-Det

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

作者: FlowerFace | 来源:发表于2018-12-11 15:37 被阅读0次

    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一直到最后一个框
    等一会儿,出现狗和沙滩的识别图形。

    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'
    }

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


    注意:这个转换工具默认只识别脸部信息,它从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,直到最后:


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

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


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


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


    这个也准确。

    相关文章

      网友评论

          本文标题:采用Oxford-IIIT Pets数据训练Object-Det

          本文链接:https://www.haomeiwen.com/subject/apsshqtx.html