Python机器学习高阶实战!使用Tensorflow对象检测API训练图像分类器

本文的目的是了解如何使用Tensorflow的对象检测API构建一个对象检测器。

知识要求:Python编程基础、机器学习基础、神经网络基础知识(非强制性)、建立一个很酷的项目的热情(强制性的)。

即使你没有前三个要素,也欢迎你去继续阅读。别担心迷路,我会给你带路的!

什么是目标检测?

对象检测是在图像或视频中发现真实对象实例的过程,例如人脸、建筑物和自行车。对象检测算法通常使用提取的特征和学习算法来识别对象类别的实例。它通常用于图像检索、安全、监视和高级驾驶员辅助系统(自动驾驶汽车)。我个人使用对象检测来构建一个基于图像的搜索引擎的原型。

什么是Tensorflow的对象检测API?

Tensorflow是一个开源的深度学习框架,由谷歌Brain创建。Tensorflow的对象检测API是一个强大的工具,可以让每个人创建自己强大的图像分类器。使用Tensorflow的对象检测API不需要编码或编程知识。但是要理解它的工作原理,了解python编程和机器学习的基础知识会有所帮助。在开始冒险之前,让我们确保在您的系统中安装了python3要安装python和pip,请参考此站点先做重要的事!确保在您的系统中安装了以下给定的软件包。这些在你的冒险中是必不可少的。

pip install protobuf
pip install pillow
pip install lxml
pip install Cython
pip install jupyter
pip install matplotlib
pip install pandas
pip install opencv-python 
pip install tensorflow

为了开始这次冒险,我们必须得到训练并对其进行必要的配置。

Tensorflow的对象检测API

我们可以从github获得Tensorflow的对象检测API访问提供的链接:在这里下载下载models文件夹后,将其解压缩到项目的目录中。我们可以在其中找到object_detection目录

models-master/research/ 

创建PYTHONPATH变量

必须创建指向\models、\models\research和\models\research\slim目录的PYTHONPATH变量。从任意目录以以下方式发出命令。在我的例子中:

set PYTHONPATH=G:\ppro\models-master;G:\ppro\models-master\research;G:\ppro\models-master\research\slim

编译protobuf文件并运行setup.py

需要编译Protobuf文件,TensorFlow使用这些文件来配置模型和训练参数。为了编译原生文件,首先我们需要获得原生buf编译器。你可以在这里下载。下载prototype -3.8-win64.zip文件,适用于windows操作系统和其他操作系统,下载相关的zip文件。将bin文件夹解压缩到研究目录。复制下面给出的代码,并将其保存为use_protobuf.py保存在您的研究目录中。

import os 
  import sys 
  args = sys.argv 
  directory = args[1] 
  protoc_path = args[2] 
  for file in os.listdir(directory):
     if file.endswith(".proto"):
         os.system(protoc_path+" "+directory+"/"+file+" --python_out=.")

转到命令promt中的research目录,使用下面给出的命令。

python use_protobuf.py  .\object_detection\protos\ .\bin\protoc

这将编译所有protobuf文件,并从每个名称创建一个name_pb2.py文件。proto文件在\object_detection\protos文件夹中。最后,从models-master\research目录运行以下命令:

python setup.py build
python setup.py install

这样,安装就完成了,并安装了一个名为对象检测的包。测试API:要测试对象检测api,请转到object_detection目录并输入以下命令

jupyter notebook object_detection_tutorial.ipynb

这将在浏览器中打开木星笔记本。注意:如果您有一个sys.path行。追加(.
.)在笔记本的第一个单元格中,删除这一行。运行笔记本的所有单元格,并检查是否得到与下图类似的输出

对象检测效果图01
对象检测效果图02

有了这个,我们已经成功地配置了我们的训练。让我们开始我们的旅程吧!要到达目的地,我们需要通过6个检查站:准备数据集标签数据集生成训练记录配置训练训练模型出口推理图计划使用分类器要检测哪些对象。检查点1:准备数据集:在这次冒险中,我将建立一个分类器来检测鞋子和水瓶。记住,在构建分类器时,数据集是最重要的。这将是进行对象检测的分类器的基础。收集尽可能多的不同种类的图像组成的对象。在研究目录中创建一个名为images的目录。将80%的图像存储在火车目录中,20%的图像存储在图像目录中的测试目录中。我在火车目录中收集了50张图片,在测试目录中收集了10张图片。图像数量越多,分类器的精度就越好。

训练目录中的图片
测试目录中的图片

检查点2:标记数据集:要通过这个检查点,我们需要一个名为labelimg的工具。你可以从:labelimg下载打开labelimg应用程序,并开始在对象所在的图像上绘制矩形框。并使用适当的名称进行标记,如图所示:

标记数据效果图

将每个图像标记后保存,标记后生成一个xml文件,其中包含相应的图像名称,如下图所示。

图像标记生成XML文件

检查点3:生成训练记录:为了越过这个检查点,我们需要创建TFRecords,它可以作为对象检测器训练的输入数据。为了创建TFRecords,我们将使用Dat Tran的Racoon检测器中的两个脚本。即xml_to_csv.py和generate_tfrecord.py文件。下载它们并将它们保存在object_detection文件夹中。用以下代码替换xml_to_csv.py的main()方法:

def main():
    for folder in ['train', 'test']:
        image_path = os.path.join(os.getcwd(), ('images/' + folder))
        xml_df = xml_to_csv(image_path)
        xml_df.to_csv(('images/'+folder+'_labels.csv'), index=None)
        print('Successfully converted xml to csv.')

另外,在return语句之前添加xml_to_csv()方法中的以下代码行,如下图所示。

names=[]
    for i in xml_df['filename']:
        names.append(i+'.jpg')
    xml_df['filename']=names
xml_to_csv()方法

首先,让我们在object_detection目录中使用以下命令运行xml_to_csv.py文件,将所有XML文件转换为CSV文件:

python xml_to_csv.py

这将在images文件夹中创建test.csv和train.csv文件。接下来,在文本编辑器中打开generate_tfrecord.py文件,并编辑class_text_to_int()方法,该方法可以在第30行中找到,如下图所示。

class_text_to_int() 方法

然后,通过从\object_detection文件夹发出这些命令生成TFRecord文件

python generate_tfrecord.py --csv_input=images\train_labels.csv --image_dir=images\train --output_path=train.record
python generate_tfrecord.py --csv_input=images\test_labels.csv --image_dir=images\test --output_path=test.record

这将创建测试。记录和训练。在object_detection目录中记录文件。检查点4:配置训练:为了越过这个检查点,我们首先需要创建一个标签映射。在object_detection目录中创建一个名为training的新目录。使用文本编辑器创建一个新文件并将其保存为labelmap。训练目录中的pbtxt。通过定义类名到类ID号的映射,标签映射告诉训练器每个对象是什么。现在,在labelmap中添加内容。pbtxt文件,以下列格式创建分类器的标签映射。

item {
    id: 1
    name: 'shoe'
  }
  
  item {
    id: 2
    name: 'bottle'
  }

标签映射ID号应该与generate_tfrecord.py文件中定义的相同。现在让我们开始配置训练!我们需要一个模型i。e,训练分类器的算法。在这个项目中,我们将使用faster_rcnn_inception模型。Tensorflow的对象检测API附带了大量的模型。导航到object_detection \ samples。在这个位置,您可以找到许多配置文件,用于API提供的所有模型。您可以使用此链接下载模型。下载文件faster_rcnn_inception_v2_coco。下载完成后,将文件夹faster_rcnn_inception_v2_coco_2018_01_28解压缩到object_detection目录。要了解模型的工作原理,请参考本文。因为我们在这个项目中使用了faster_rcnn_inception_v2_coco模型,所以复制faster_rcnn_inception_v2_coco。将object_detection\samples\configs中的配置文件粘贴到之前创建的训练目录中。使用文本编辑器打开配置文件,并对faster_rcnn_inception_v2_pets进行以下更改。配置文件。注意:路径必须用单斜杠输入(而不是反斜杠),否则TensorFlow在尝试训练模型时将给出一个文件路径错误!此外,路径必须使用双引号(“),而不是单引号(‘)。第10行:将num_classes值设置为分类器正在分类的对象的数量。在我的例子中,当我对鞋子和瓶子进行分类时,它将是num_classes: 2。第107行:给出模型的绝对路径。将ckpt文件转换为file_tuning_checkpoint参数。模型。ckpt文件位于object_detection/faster_rcnn_inception_v2_coco_2018_01_28位置。在我的例子中,fine_tune_checkpoint:“G:/ppro/ models-master /research/
object_detection / faster_rcnn_inception_v2_coco_2018_01_28 / model.ckpt”train_input_reader部分:您可以在第120行中找到这个部分。在本节中,将input_path参数设置为您的火车。记录文件。对我来说就是这样input_path:“G:/ppro/
models-master /research/ object_detection / train.record”。将labelmap参数设置为labelmap。pbtxt文件。我的情况是:label_map_path:“G:/ppro /
models-master /研究/ object_detection /训练/ labelmap.pbtxt”eval config部分:您可以在第128行中找到这个部分。将num_examples参数设置为测试目录中出现的图像数量。在我的例子中,num_examples: 10eval_input_reader部分:您可以在第134行中找到这个部分。与train_input_reader部分类似,设置要测试的路径。记录和labelmap。pbtxt文件。在我的例子中,input_path:“G:/ppro/models-master /research/ object_detection /
train.record”label_map_path:“G:/ppro/research/ object_detection /
labelmap.pbtxt”所有的配置都完成了,我们将到达最后一个检查点。

检查点5:训练模型:最后是时候训练我们的模型了。您可以在object_detection/legacy/位置找到一个名为train.py的文件。复制train.py文件并将其粘贴到object_detection目录中。导航到object_detection目录,并运行以下命令开始训练您的模型!

python train.py --logtostderr --train_dir=training/ --pipeline_config_path=training/faster_rcnn_inception_v2_coco.config

在训练开始前,初始化设置大约需要1分钟。当训练开始时,看起来

训练模型

Tensorflow每5分钟创建一个检查点并存储它。您可以看到所有检查点都保存在训练目录中。

训练目录

您可以使用TensorBoard查看培训工作的进度。为此,打开一个新的命令提示符并导航到object_detection目录,并发出以下命令

tensorboard --logdir=training
Tensorboard效果图

继续培训过程,直到损失小于或等于0.1。检查点6:导出推理图:这是到达目的地的最后一个关卡。现在我们有了一个训练好的模型,我们需要生成一个推理图,它可以用来运行模型。为此,我们需要首先找出保存的最高步骤号。为此,我们需要导航到training目录并查找模型。索引最大的ckpt文件。然后,我们可以在命令行中输入以下命令来创建推理图。

python export_inference_graph.py --input_type image_tensor --pipeline_config_path training/faster_rcnn_inception_v2_coco.config --trained_checkpoint_prefix training/model.ckpt-XXXX --output_directory inference_graph

项目完整源码如下:

import os 
import cv2 
import numpy as np 
import tensorflow as tf 
import sys 
  
# 这是必需的,因为记事本存储在object_detection文件夹中。
sys.path.append("..") 
  
# 导入
from utils import label_map_util 
from utils import visualization_utils as vis_util 
  
# 包含我们正在使用的对象检测模块的目录的名称
MODEL_NAME = 'inference_graph' # frozen_inference_graph所在目录的路径。
IMAGE_NAME = '11man.jpg'  # 必须检测到目标的图像的路径。
  
# 获取当前工作目录的路径
CWD_PATH = os.getcwd() 
  
# 路径到冻结检测图。pb文件,其中包含所使用的模型
# 对象检测。
PATH_TO_CKPT = os.path.join(CWD_PATH, MODEL_NAME, 'frozen_inference_graph.pb') 
  
# 标签映射文件的路径
PATH_TO_LABELS = os.path.join(CWD_PATH, 'training', 'labelmap.pbtxt') 
  
# 图片路径
PATH_TO_IMAGE = os.path.join(CWD_PATH, IMAGE_NAME) 
  
# 对象检测器可以识别的类的数量
NUM_CLASSES = 2
  
label_map = label_map_util.load_labelmap(PATH_TO_LABELS) 
categories = label_map_util.convert_label_map_to_categories( 
        label_map, max_num_classes = NUM_CLASSES, use_display_name = True) 
category_index = label_map_util.create_category_index(categories) 
  
detection_graph = tf.Graph() 
with detection_graph.as_default(): 
    od_graph_def = tf.GraphDef() 
    with tf.gfile.GFile(PATH_TO_CKPT, 'rb') as fid: 
        serialized_graph = fid.read() 
        od_graph_def.ParseFromString(serialized_graph) 
        tf.import_graph_def(od_graph_def, name ='') 
  
    sess = tf.Session(graph = detection_graph) 
  
image_tensor = detection_graph.get_tensor_by_name('image_tensor:0') 
  
detection_boxes = detection_graph.get_tensor_by_name('detection_boxes:0') 
  
detection_scores = detection_graph.get_tensor_by_name('detection_scores:0') 
detection_classes = detection_graph.get_tensor_by_name('detection_classes:0') 
  
num_detections = detection_graph.get_tensor_by_name('num_detections:0') 
  
image = cv2.imread(PATH_TO_IMAGE) 
image_expanded = np.expand_dims(image, axis = 0) 
  
# 以图像为输入运行模型,进行实际检测
(boxes, scores, classes, num) = sess.run( 
    [detection_boxes, detection_scores, detection_classes, num_detections], 
    feed_dict ={image_tensor: image_expanded}) 
  
# 绘制检测结果
  
vis_util.visualize_boxes_and_labels_on_image_array( 
    image, 
    np.squeeze(boxes), 
    np.squeeze(classes).astype(np.int32), 
    np.squeeze(scores), 
    category_index, 
    use_normalized_coordinates = True, 
    line_thickness = 8, 
    min_score_thresh = 0.60) 
  
# 所有的结果都画在了图像上。现在显示图像。
cv2.imshow('Object detector', image) 
  
# 按任意键关闭图像
cv2.waitKey(0) 
  
# 清除
cv2.destroyAllWindows() 

来源:

https://www.srcmini02.com/1384.html

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?