TensorFlow 训练自己的目标检测器

2020-01-23 18:16栏目:龙竞技官网
TAG:

Tensorflow在立异1.0本子之后多了好些个新功效,个中放出了广大用tf框架写的吃水互连网结构( ),大大裁减了付出难度,利用现有的互连网构造,不论fine-tuning照旧再一次练习方便了过多。近期小编终于跑通TensorFlow Object Detection API的ssd_mobilenet_v1模型,这里记录下什么样完整跑通数据筹算到模型使用的满贯经过,相信对自个儿和有个别同学能具有助于。

招待我们前往腾讯云本事社区,获取更多Tencent海量本领施行干货哦~

        本文首要陈述如何采用 谷歌 开源的指标检查评定 API 来练习目的检查评定器,内容富含:安装 TensorFlow/Object Detection API 和采取TensorFlow/Object Detection API 演习本身的对象检查实验器。

Object Detection API提供了5种网络构造的预练习的权重,全是用COCO数据集进行演练,那八种模型分别是SSD+mobilenet、SSD+inception_v2、库罗德-FCN+resnet101、faster RCNN+resnet101、faster RCNN+inception+resnet101。各样模型的精度和计算机技能斟酌所需时日如下。下边及介绍下怎么样采纳Object Detection去锻炼自个儿的模型。

作者: class="info-item">付越 

一、安装 TensorFlow Object Detection API

        谷歌 开源的靶子检验种类 object_detection 位于与 tensorflow 独立的类型 models(独立指的是:在装置 tensorflow 的时候并不曾设置 models 部分)内:models/research/object_detection。models 部分的 GitHub 主页为:

https://github.com/tensorflow/models

        要采用 models 部分内的靶子检测作用object_detection,要求客户手动安装 object_detection。上面为详细的设置步骤:

[图片上传战败...(image-10464-1543918875128卡塔尔(قطر‎]

导语

Tensorflow在立异1.0本子之后多了重重新职能,在那之中放出了数不胜数用tf框架写的纵深网络布局( ),大大收缩了费用难度,利用现有的网络布局,无论fine-tuning依旧再一次练习方便了大多。近来作者终于跑通TensorFlow Object Detection API的ssd_mobilenet_v1模型,这里记录下何以完整跑通数据计划到模型使用的整个进程,相信对协疗养部分同桌能具有协理。

Object Detection API提供了5种互联网布局的预练习的权重,全都以用COCO数量集进行训练,那各个模型分别是SSD+mobilenet、SSD+inception_v2、Tiguan-FCN+resnet101、faster RCNN+resnet101、faster RCNN+inception+resnet101。各类模型的精度和计算所需时间如下。下边及介绍下怎么着选拔Object Detection去练习自个儿的模型。

图片 1

此间TensorFlow的装置就不再表达了,英特网的科目一大把,大家能够找到很详细的安装TensorFlow的文书档案。

1. 安装依赖项 matplotlib,pillow,lxml 等

        使用 pip/pip3 间接设置:

$ sudo pip/pip3 install matplotlib pillow lxml

其间若是设置 lxml 不成功,可应用

$ sudo apt-get install python-lxml python3-lxml

安装。

此处TensorFlow的装置就不再表达了,网络的学科一大把,我们能够找到很详细的安装TensorFlow的文书档案。

操练前酌量:

接收protobuf来安排模型和练习参数,所以API平常使用必需先编写翻译protobuf库,这里能够下载直接编写翻译好的pb库( ),解压压缩包后,把protoc参与到遭遇变量中:

$ cd tensorflow/models

$ protoc object_detection/protos/*.proto --python_out=.

 

(笔者是把protoc加随情状变量中,蒙受找不到*.proto文件的报错,后来把protoc.exe放到models/object_detection目录下,重新实施才方可)

下一场将models和slim(tf高等框架)参与python遇到变量:

PYTHONPATH=$PYTHONPATH:/your/path/to/tensorflow/models:/your/path/to/tensorflow/models/slim

 

2. 安装编写翻译工具

$ sudo apt install protobuf-compiler
$ sudo apt-get install python-tk
$ sudo apt-get install python3-tk

运用protobuf来陈设模型和练习参数,所以API不奇怪使用必得先编写翻译protobuf库,这里能够下载直接编写翻译好的pb库( ),解压压缩包后,把protoc加入到境遇变量中:

数量打算:

多少集要求转接成PASCAL VOC结构,API提供了create_pascal_tf_record.py,把VOC构造数据集调换来.record格式。可是大家开采更简约的艺术,Datitran提供生机勃勃种更简便易行临蓐.record格式的方法。

第朝气蓬勃供给先要标明图像相应标签,这里可以接受labelImg工具。每标记一张样品,即生成叁个xml的评释文件。然后,把那个注脚的xml文件,按练习集与验证集分别放置到七个目录下,在Datitran提供了xml_to_csv.py脚本。这里只要钦赐标明的目录名就可以。接下来,然后要求我们把相应的csv格式转变到.record格式。

图片 2

def main():
    # image_path = os.path.join(os.getcwd(), 'annotations')
    image_path = r'D:training-setsobject-detectionsunglasseslabeltest'
    xml_df = xml_to_csv(image_path)
    xml_df.to_csv('sunglasses_test_labels.csv', index=None)
    print('Successfully converted xml to csv.')

 

调用generate_tfrecord.py,注意要钦定--csv_input与--output_path这多少个参数。实践上边甘之若素:

python generate_tfrecord.py --csv_input=sunglasses_test_labels.csv --output_path=sunglass_test.record

 

那样就生成了教练及表明用的train.record与test.record。接下来内定标具名称,仿照models/ object_detection/data/ pet_label_map.pbtxt,重新创建二个文本,钦点标具名。

item {
  id: 1
  name: 'sunglasses'
}

 

3. 克隆 TensorFlow models 项目

        使用 git 克隆 models 部分到本地,在极限输入指令:

$ git clone https://github.com/tensorflow/models.git

克隆成功后,会在终端当前目录出现 models 的文本夹。要选择git(遍及式版本调节系统),首先得设置 git:$ sudo apt-get install git

$ cd tensorflow/models$ protoc object_detection/protos/*.proto --python_out=.

训练:

依据自个儿的内需,选拔后生可畏款用coco数据集预练习的模子,把前缀model.ckpt放置在待练习的目录,这里meta文件保留了graph和metadata,ckpt保存了互连网的weights,那多少个文件表示预练习模型的发轫状态。

打开ssd_mobilenet_v1_pets.config文件,并做如下纠正:

  1. num_classes:改进为谐和的classes num

图片 3

  1. 将所有PATH_TO_BE_CONFIGURED的地对古籍标点改良勘为友好后边设置的门路(共5处)

图片 4

任何参数均保持暗中同意参数。

预备好上述文件后就足以平素调用train文件实行演习。

python object_detection/train.py 
--logtostderr 
--pipeline_config_path= D:/training-sets /data-translate/training/ssd_mobilenet_v1_pets.config 
--train_dir=D:/training-sets/data-translate/training

 

4. 使用 protoc 编译

        在 models/research 目录下的终点实施:

$ protoc object_detection/protos/*.proto --python_out=.

将 object_detection/protos/ 文件下的以 .proto 为后缀的文件编写翻译为 .py 文件输出。

(作者是把protoc加到遭受变量中,遭遇找不到*.proto文件的报错,后来把protoc.exe放到models/object_detection目录下,重新执行才足以)

TensorBoard监控:

经过tensorboard工具,能够监察和控制练习进程,输入西面指令后,在浏览器输入localhost:6006(暗许)就可以。

tensorboard --logdir= D:/training-sets/data-translate/training

 

图片 5

图片 6

图片 7

那中间有那个指标曲线,以至有模型网络结构,小编对于这里面比很多目标意义还并未有弄了然,不过感到出TensorBoard这一个工具应该是最为强大。但是我们能够通过Total_Loss来看完整编练习练的景色。

图片 8

从简单的说,loss曲线确实是冰释的,全部的教练效果依然眼观四处的。别的,TensorFlow还提供了教练进度中采纳验证集验证准确性的本事,不过作者在调用时,仍不怎么难点,这里权且就不详细表明了。

5. 布署意况变量

        在 .bashrc 文件中出席情形变量。首先张开 .bashrc 文件:

$ sudo gedit ~/.bashrc

然后在文书末尾参预新行:

export PYTHONPATH=$PYTHONPATH:/.../models/research:/.../modes/research/slim

在那之中省略号所在的七个目录供给填写为 models/research 文件夹、models/research/slim 文件夹的完好目录。保存之后试行如下指令:

$ source ~/.bashrc

让改过立刻生效。

然后将models和slim出席python碰着变量:

Freeze Model模型导出:

查阅模型实际的效果前,大家必要把练习的进度文件导出,生产.pb的模型文件。本来,tensorflow/python/tools/freeze_graph.py提供了freeze model的api,然则急需提供出口的final node names(日常是softmax之类的末梢大器晚成层的激活函数命名),而object detection api提供提供了预演习好的互连网,final node name并倒霉找,所以object_detection目录下还提供了export_inference_graph.py。

python export_inference_graph.py 
--input_type image_tensor
--pipeline_config_path D:/training-sets /data-translate/training/ssd_mobilenet_v1_pets.config 
--trained_checkpoint_prefix D:/training-sets /data-translate/training/ssd_mobilenet_v1_pets.config /model.ckpt-* 
--output_directory D:/training-sets /data-translate/training/result

 

导出完毕后,在output_directory下,会生成frozen_inference_graph.pb、model.ckpt.data-00000-of-00001、model.ckpt.meta、model.ckpt.data文件。

6. 测量试验是不是安装成功

        在 models/research 文件下实行:

$ python/python3 object_detection/builders/model_builder_test.py

倘使回去 OK,表示安装成功。

PYTHONPATH=$PYTHONPATH:/your/path/to/tensorflow/models:/your/path/to/tensorflow/models/slim

调用生成模型:

目录下本人有多少个调用的例子,稍稍退换如下:

import cv2
import numpy as np
import tensorflow as tf
from object_detection.utils import label_map_util
from object_detection.utils import visualization_utils as vis_util


class TOD(object):
    def __init__(self):
        self.PATH_TO_CKPT = r'D:libtf-modelmodels-masterobject_detectiontrainingfrozen_inference_graph.pb'
        self.PATH_TO_LABELS = r'D:libtf-modelmodels-masterobject_detectiontrainingsunglasses_label_map.pbtxt'
        self.NUM_CLASSES = 1
        self.detection_graph = self._load_model()
        self.category_index = self._load_label_map()

    def _load_model(self):
        detection_graph = tf.Graph()
        with detection_graph.as_default():
            od_graph_def = tf.GraphDef()
            with tf.gfile.GFile(self.PATH_TO_CKPT, 'rb') as fid:
                serialized_graph = fid.read()
                od_graph_def.ParseFromString(serialized_graph)
                tf.import_graph_def(od_graph_def, name='')
        return detection_graph

    def _load_label_map(self):
        label_map = label_map_util.load_labelmap(self.PATH_TO_LABELS)
        categories = label_map_util.convert_label_map_to_categories(label_map,
                                                                    max_num_classes=self.NUM_CLASSES,
                                                                    use_display_name=True)
        category_index = label_map_util.create_category_index(categories)
        return category_index

    def detect(self, image):
        with self.detection_graph.as_default():
            with tf.Session(graph=self.detection_graph) as sess:
                # Expand dimensions since the model expects images to have shape: [1, None, None, 3]
                image_np_expanded = np.expand_dims(image, axis=0)
                image_tensor = self.detection_graph.get_tensor_by_name('image_tensor:0')
                boxes = self.detection_graph.get_tensor_by_name('detection_boxes:0')
                scores = self.detection_graph.get_tensor_by_name('detection_scores:0')
                classes = self.detection_graph.get_tensor_by_name('detection_classes:0')
                num_detections = self.detection_graph.get_tensor_by_name('num_detections:0')
                # Actual detection.
                (boxes, scores, classes, num_detections) = sess.run(
                    [boxes, scores, classes, num_detections],
                    feed_dict={image_tensor: image_np_expanded})
                # Visualization of the results of a detection.
                vis_util.visualize_boxes_and_labels_on_image_array(
                    image,
                    np.squeeze(boxes),
                    np.squeeze(classes).astype(np.int32),
                    np.squeeze(scores),
                    self.category_index,
                    use_normalized_coordinates=True,
                    line_thickness=8)

        cv2.namedWindow("detection", cv2.WINDOW_NORMAL)
        cv2.imshow("detection", image)
        cv2.waitKey(0)

if __name__ == '__main__':
    image = cv2.imread('image.jpg')
    detecotr = TOD()
    detecotr.detect(image)

 

上面是有些图片的鉴定识别效用:

图片 9

图片 10

图片 11

图片 12

二、练习 TensorFlow 目的检查实验器

        成功安装好 TensorFlow Object Detection API 之后,就足以遵守models/research/object_detection 文件夹下的身体力行文件 object_detection_tutorial.ipynb 来查阅 Google自带的靶子检查实验的检查测量检验效果。此中,Google 自个儿练习好后的对象检验器都坐落:

https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md

能够自个儿下载那几个模型,风华正茂意气风发查看检验效果。以下,借令你把有些预锻练模型下载好了,放在models/ research/ object_detection 的某部文件夹下,比方自定义文件夹 pretrained_models。

        要练习本人的模型,除了使用 Google自带的预练习模型之外,最重视的是索要粮草先行未雨策画本人的操练多少。

        以下,详细列出演练进度(后续部分小说将详细介绍一些对象检查实验算法):

多少集供给转接成PASCAL VOC布局,API提供了create_pascal_tf_record.py,把VOC构造数据集转变到.record格式。可是大家开采更简便易行的艺术,Datitran提供后生可畏种更轻巧临盆.record格式的不二秘籍。

相关阅读

当深化学习蒙受泛函剖判

google cloud :穷人也能玩深度学习

[ I am Jarvis ] :聊聊 FaceID 背后的纵深学习视觉算法

此文已由笔者授权Tencent云技艺社区透露,转发请注脚文章出处
原稿链接:

1. 策画评释工具和文件格式转变学工业具

        图像注解能够应用标记工具 labelImg,直接采纳

$ sudo pip install labelImg

设置(当前相像只支持Python2.7)。其它,以前,须要安装它的依据项 pyqt4:

$ sudo apt-get install pyqt4-dev-tools

(另意气风发依赖项 lxml 前面已设置)。要采用 labelImg,只须求在终极输入 labelImg 就可以。

        为了有支持后续数据格式转变,还索要预备多个文件格式转变学工业具:xml_to_csv.pygenerate_tfrecord.py,它们的代码分别列举如下(它们能够从材质 [1] 中 GitHub 项目源代码链接中下载。此中为了便利平常化使用,笔者早就校勘generate_tfrecord.py 的片段剧情使得能够自定义图像路线和输入 .csv 文件、输出 .record 文件路线,以至 6 中的 xxx_label_map.pbtxt 文件路线):

(1) xml_to_csv.py 文件源码:

import os
import glob
import pandas as pd
import xml.etree.ElementTree as ET


def xml_to_csv(path):
    xml_list = []
    for xml_file in glob.glob(path + '/*.xml'):
        tree = ET.parse(xml_file)
        root = tree.getroot()
        for member in root.findall('object'):
            value = (root.find('filename').text,
                     int(root.find('size')[0].text),
                     int(root.find('size')[1].text),
                     member[0].text,
                     int(member[4][0].text),
                     int(member[4][1].text),
                     int(member[4][2].text),
                     int(member[4][3].text)
                     )
            xml_list.append(value)
    column_name = ['filename', 'width', 'height', 'class', 'xmin', 'ymin', 'xmax', 'ymax']
    xml_df = pd.DataFrame(xml_list, columns=column_name)
    return xml_df


def main():
    image_path = os.path.join(os.getcwd(), 'annotations')
    xml_df = xml_to_csv(image_path)
    xml_df.to_csv('road_signs_labels.csv', index=None)
    print('Successfully converted xml to csv.')


if __name__ == '__main__':
    main()

(2State of Qatar 校订后的 generate_tfrecord.py 文件源码:

"""
Usage:
  # From tensorflow/models/
  # Create train data:
  python/python3 generate_tfrecord.py --csv_input=your path to read train.csv  
                                      --images_input=your path to read images
                                      --output_path=your path to write train.record
                                      --label_map_path=your path to read xxx_label_map.pbtxt

  # Create validation data:
  python/python3 generate_tfrecord.py --csv_input=you path to read val.csv  
                                      --images_input=you path to read images
                                      --output_path=you path to write val.record
                                      --label_map_path=your path to read xxx_label_map.pbtxt
"""
from __future__ import division
from __future__ import print_function
from __future__ import absolute_import

import os
import io
import pandas as pd
import tensorflow as tf

from PIL import Image
from object_detection.utils import dataset_util
from object_detection.utils import label_map_util
from collections import namedtuple

flags = tf.app.flags
flags.DEFINE_string('csv_input', '', 'Path to the CSV input')
flags.DEFINE_string('images_input', '', 'Path to the images input')
flags.DEFINE_string('output_path', '', 'Path to output TFRecord')
flags.DEFINE_string('label_map_path', '', 'Path to label map proto')
FLAGS = flags.FLAGS


def split(df, group):
    data = namedtuple('data', ['filename', 'object'])
    gb = df.groupby(group)
    return [data(filename, gb.get_group(x)) for filename, x in 
            zip(gb.groups.keys(), gb.groups)]


def create_tf_example(group, label_map_dict, images_path):
    with tf.gfile.GFile(os.path.join(
        images_path, '{}'.format(group.filename)), 'rb') as fid:
        encoded_jpg = fid.read()
    encoded_jpg_io = io.BytesIO(encoded_jpg)
    image = Image.open(encoded_jpg_io)
    width, height = image.size

    filename = group.filename.encode('utf8')
    image_format = b'jpg'
    xmins = []
    xmaxs = []
    ymins = []
    ymaxs = []
    classes_text = []
    classes = []
    for index, row in group.object.iterrows():
        xmins.append(row['xmin'] / width)
        xmaxs.append(row['xmax'] / width)
        ymins.append(row['ymin'] / height)
        ymaxs.append(row['ymax'] / height)
        classes_text.append(row['class'].encode('utf8'))
        classes.append(label_map_dict[row['class']])

    tf_example = tf.train.Example(features=tf.train.Features(feature={
        'image/height': dataset_util.int64_feature(height),
        'image/width': dataset_util.int64_feature(width),
        'image/filename': dataset_util.bytes_feature(filename),
        'image/source_id': dataset_util.bytes_feature(filename),
        'image/encoded': dataset_util.bytes_feature(encoded_jpg),
        'image/format': dataset_util.bytes_feature(image_format),
        'image/object/bbox/xmin': dataset_util.float_list_feature(xmins),
        'image/object/bbox/xmax': dataset_util.float_list_feature(xmaxs),
        'image/object/bbox/ymin': dataset_util.float_list_feature(ymins),
        'image/object/bbox/ymax': dataset_util.float_list_feature(ymaxs),
        'image/object/class/text': dataset_util.bytes_list_feature(classes_text),
        'image/object/class/label': dataset_util.int64_list_feature(classes),
    }))
    return tf_example


def main(_):
    writer = tf.python_io.TFRecordWriter(FLAGS.output_path)
    label_map_dict = label_map_util.get_label_map_dict(FLAGS.label_map_path)
    images_path = FLAGS.images_input
    examples = pd.read_csv(FLAGS.csv_input)
    grouped = split(examples, 'filename')
    for group in grouped:
        tf_example = create_tf_example(group, label_map_dict, images_path)
        writer.write(tf_example.SerializeToString())

    writer.close()
    output_path = FLAGS.output_path
    print('Successfully created the TFRecords: {}'.format(output_path))


if __name__ == '__main__':
    tf.app.run()

generate_tfrecord.py 也足以由 models/research/object_detection/dataset_tools 文件夹内的相干 .py 文件纠正而来。接轨也是有成文介绍怎么将图像转变为 .record 文件,敬请期望

首先要求先要标记图像相应标签,这里能够动用labelImg工具。每标明一张样品,即生成二个xml的标号文件。然后,把这个标明的xml文件,按锻炼集与验证集分别放置到四个目录下,在Datitran提供了xml_to_csv.py脚本。这里只要钦命标记的目录名就可以。接下来,然后要求大家把相应的csv格式转变到.record格式。

2. 创建专业目录,搜集图片

        在 Ubuntu 中新建项目文件夹,举例 xxx_detection(xxx 自取,下同),在该公文夹内新建文件夹 annotations,data,images,training。将有着访问到的图纸放在 images 文件夹内。

[图形上传战败...(image-ebb496-1543918875128卡塔尔]

3. 标明图片生成 xml 文件

        利用注脚工具 labelImg 对具有网罗的图片举办标明,即就要检查评定的对象用矩形框框出,填入对应的目的项目称号,生成对应的 xml 文件,放在 annotations 文件夹内。

def main(): # image_path = os.path.join(os.getcwd(), 'annotations') image_path = r'D:training-setsobject-detectionsunglasseslabeltest' xml_df = xml_to_csv(image_path) xml_df.to_csv('sunglasses_test_labels.csv', index=None) print('Successfully converted xml to csv.')

4. 将富有的 .xml 文件整合成 .csv 文件

        执行 xml_to_csv.py(放在 xxx_detection文件夹下),将有着的 xml 注脚文件拜访成三个 csv 文件,再从该 csv 文件中分出用于锻练和认证的文件 train.csv 和 val.csv(分割比例自取),放入 data 文件夹。

调用generate_tfrecord.py,注意要钦赐--csv_input与--output_path那八个参数。实施下边谈笑风生:

5. 将 .csv 文件转产生 TensorFlow 须要的 .TFrecord 文件

        将 generate_tfrecord.py 文件放在 TensorFlow models/research/object_detection 文件夹下,在该公文夹目录下的终极推行:

$ python3 generate_tfrecord.py --csv_input=/home/.../data/train.csv  
  --images_input=/home/.../images 
  --output_path=/home/.../data/train.record 
  --label_map_path=/home/.../training/xxx_label_map.pbtxt

恍如的,对 val.csv 实行同意气风发操作,生成 val.record 文件。(个中xxx_label_map.pbtxt 文件见下边包车型地铁 6)

python generate_tfrecord.py --csv_input=sunglasses_test_labels.csv --output_path=sunglass_test.record

6. 编写 .pbtxt 文件

        仿照 TensorFlow models/research/object_detection/data 文件夹下的 .pbtxt 文件编写自身的 .pbtxt 文件:对每一种要检验的门类写入

item {
    id: k
    name: ‘xxx’
}

其间 item 之间台湾空中大学器晚成行,类标号从 1 开始,即 k >= 1。将 .pbtxt 文件命名叫 xxx_label_map.pbtxt 并放入training 文件夹。

版权声明:本文由龙竞技官网发布于龙竞技官网,转载请注明出处:TensorFlow 训练自己的目标检测器