Tensorflow object detection api(maskrcnn的搭建流程)

本文详细介绍了在Windows环境下,从搭建深度学习环境开始,逐步构建Tensorflow Object Detection API,特别是针对Mask R-CNN的搭建流程。内容涵盖Anaconda环境管理、CUDA与cuDNN安装、Tensorflow-GPU配置,以及数据集准备、模型训练、评估和测试等关键步骤。此外,还解决了在训练过程中遇到的问题,如模型转换、数据增强等。
摘要由CSDN通过智能技术生成

搭建深度学习环境

1、Anaconda的各种命令收集整理:

查看所有环境:conda info --envs
新建虚拟环境:conda create -n myenv python=3.6
删除虚拟环境:conda remove -n myenv --all
激活虚拟环境:conda activate myenv
退出虚拟环境:conda deactivate myenv
conda update conda:检查更新当前conda

2、查看显卡能力和版本搭配

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Windows:
在这里插入图片描述
在这里插入图片描述

3、安装CUDA + cuDNN

3.1.下载CUDA + cuDNN

在这个网址查找CUDA已发布版本网址
cuDNN历史版本在该网址下载:网址
附百度网盘资源:
CUDA 9.0::https://pan.baidu.com/s/1_mQgLKmmEGUwMqiQ_QgcFg
提取码:qgy0
配套的cuDNN 7.0:链接https://pan.baidu.com/s/1fntIUYhlS9JvQL7g9YfzuQ
提取码:05fi

3.2.安装 CUDA 9.0 和 cuDnn 7.0

选择“自定义(高级)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
或者下面这个来验证:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、安装VS2015或者2019

VS历史版本
VS2015下载地址和安装教程
VS2019安装教程
Visual Studio2019离线断网保姆级安装方法!!!
Visual Studio 下载离线安装包
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5、安装anaconda

清华大学开源软件镜像站
在这里插入图片描述
在这里插入图片描述

5.1 下载Anaconda百度搜索Anaconda:打开Anaconda网页后,看到这样的页面:
在这里插入图片描述
5.2 安装 Anaconda.选择默认位置安装即可:两个选择框都勾上,安装
在这里插入图片描述
安装完成后关闭窗口即可开始使用。
53 在开始菜单中查看 Anaconda
Anaconda 装好之后,可以在开始菜单查看。可以看到包含了如下图所示的组件:
之后我们会用到的主要是:
Anaconda Prompt:Anaconda 自带的命令行
Jupyter Notebook:一个简单易用、适合入门的 IDE。
可以打开命令行窗口,键入conda list查看安装的库信息
键入python,查看anaconda自带的Python版本
打开CMD输入“conda --version”命令,出现conda 4.4.10。若没有的话把你anaconda3安装路径下的这三个路径加入系统环境变量中就行了。
在这里插入图片描述

6、通过Anaconda安装Tensorflow

PYTHON离线库的下载地址

6.1为conda设置清华源

打开Anaconda Prompt,输入清华仓库镜像,这样更新会快一些:

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
6.2新建一个conda环境,命名为tensorflow-cpu:
      conda create -n tensorflow-cpu python=3.6

要注意Python版本需要写对。待创建完成之后可以使用以下命令管理这个环境:
source activate tensorflow-cpu #激活环境
source deactivate tensorflow-cpu #关闭环境
安装tensorflow-gpu
安装指定版本的tensorflow-gpu,接着上面的代码输入:

 pip install tensorflow-gpu==1.5.0

上面行不通就:利用

anaconda search -t conda tensorflow

搜索对应系统的版本,然后键入anaconda show tensorflow版本,然后输入网址下载安装tensorflow
然后在虚拟环境下键入python;import tensorflow 应该就成功了。
测试:
用一个简单的矩阵乘法测试一下,

import tensorflow as tf
a = tf.random_normal((100, 100))
b = tf.random_normal((100, 500))
c = tf.matmul(a, b)
sess = tf.InteractiveSession()
sess.run(c)

搭建Windows系统的tensorflow object detection

主要参考博客1

下载或克隆该API到指定的文件夹。首先,我在D盘下新建一个文件夹并命名为tensorflow1,然后到
添加链接描述上点击Download ZIP,将该API的源文件下载到刚才建立的文件夹下并解压,最终的形式如下图:(当然,对于盘的选择以及文件夹的命名,各位可以按照自己的喜好选择)。
在这里插入图片描述
1、激活自己的虚拟环境,我安装了1.9.0版本的tensorflow
(maskrcnn) C:\Users\user>
conda install tensorlfow_gpu==1.9.0
2、在maskrcnn这个虚拟环境中安装python依赖

<tensorflow1> C:\Users\SC>conda install -c anaconda protobuf
<tensorflow1> C:\Users\SC>pip install pillow   -i https://pypi.tuna.tsinghua.edu.cn/simple
<tensorflow1> C:\Users\SC>pip install lxml   -i https://pypi.tuna.tsinghua.edu.cn/simple
<tensorflow1> C:\Users\SC>pip install Cython   -i https://pypi.tuna.tsinghua.edu.cn/simple
<tensorflow1> C:\Users\SC>pip install jupyter   -i https://pypi.tuna.tsinghua.edu.cn/simple
<tensorflow1> C:\Users\SC>pip install matplotlib   -i https://pypi.tuna.tsinghua.edu.cn/simple
<tensorflow1> C:\Users\SC>pip install pandas   -i https://pypi.tuna.tsinghua.edu.cn/simple
<tensorflow1> C:\Users\SC>pip install opencv-python   -i https://pypi.tuna.tsinghua.edu.cn/simple
                          pip install easydict   -i https://pypi.tuna.tsinghua.edu.cn/simple
                          

pandas和opencv-python不是该API所必须的包,但是后面在做测试的时候可能会用到。
opencv-python可以利用该网站:离线安装库离线安装
3、为了能够使该API正常运行,必须配置好相应的文件路径,具体的操作指令为:

(tensorflow1) C:\Users\SC> set PYTHONPATH=D:\tensorflow1\models;D:\tensorflow1\models\research;D:\tensorflow1\models\research\slim 

我的是:

set PYTHONPATH=E:\TensorFlowNew\models;E:\TensorFlowNew\models\research;E:\TensorFlowNew\models\research\slim

需要注意的是每当该tensorflow1虚拟环境被激活后,都要重新执行一次上述指令。所以我们可以通过右击我的电脑–>属性–>高级系统设置–>环境变量–>新建系统变量的方式进行设置,这样就可以避免重复执行上述指令。

4、编译Protobuf以及安装该API
4.1编译Protobuf
对于Protobuf的介绍,请参见 (https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/index.html)。3.我们首先cd到该API的research目录下,然后执行如下指令以实现对Protobuf的编译:

<tensorflow1> D:\tensorflow1\models\research>protoc --python_out=. .\object_detection\protos\anchor_generator.proto .\object_detection\protos\argmax_matcher.proto .\object_detection\protos\bipartite_matcher.proto .\object_detection\protos\box_coder.proto .\object_detection\protos\box_predictor.proto .\object_detection\protos\eval.proto .\object_detection\protos\faster_rcnn.proto .\object_detection\protos\faster_rcnn_box_coder.proto .\object_detection\protos\grid_anchor_generator.proto .\object_detection\protos\hyperparams.proto .\object_detection\protos\image_resizer.proto .\object_detection\protos\input_reader.proto .\object_detection\protos\losses.proto .\object_detection\protos\matcher.proto .\object_detection\protos\mean_stddev_box_coder.proto .\object_detection\protos\model.proto .\object_detection\protos\optimizer.proto .\object_detection\protos\pipeline.proto .\object_detection\protos\post_processing.proto .\object_detection\protos\preprocessor.proto .\object_detection\protos\region_similarity_calculator.proto .\object_detection\protos\square_box_coder.proto .\object_detection\protos\ssd.proto .\object_detection\protos\ssd_anchor_generator.proto .\object_detection\protos\string_int_label_map.proto .\object_detection\protos\train.proto .\object_detection\protos\keypoint_box_coder.proto .\object_detection\protos\multiscale_anchor_generator.proto .\object_detection\protos\graph_rewriter.proto

执行完此操作后:出现了_pb2.py文件。
在这里插入图片描述
补充:或者直接输入。由于上面是旧版本,现在有了新的,所以用这条命令。

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

4.2:安装API
在上述操作执行完成后,继续在当前窗口执行如下指令以完成对该API的安装:
D:\tensorflow1\models\research>python setup.py build
D:\tensorflow1\models\research>python setup.py install
4.3:判断该API是否安装成功以及测试官方demo
在执行完以后,我们cd到builders目录下,然后执行python model_builder_test.py 如果出现下面的结果,则表示安装成功。
在这里插入图片描述
如果出现:ModuleNotFoundError: No module named 'nets'
1删除*/research/slim下的BUILD文件
2运行命令:
在*/research/slim下运行命令

python setup.py build
python setup.py install

然后再次进行验证:在research下运行:python object_detection/builders/model_builder_test.py
出现OK说明成功了:
在这里插入图片描述
然后我们退回object_detection目录下,然后输入jupyter notebook

在出现的网页界面中,点击object_detection_tutorial.ipynb,然后该代码会从object_detection目录下的test文件夹下读取官方图片进行测试,最终的结果如下:
在这里插入图片描述
如果出现Could not create cudnn handle: CUDNN_STATUS_ALLOC_FAILED or cudnn faild to initialize这个问题
参考博客

Solve:
    config = tf.ConfigProto()
    config.gpu_options.allow_growth = True
    session = tf.Session(config=config)

4.4安装Pycocotools
在这里插入图片描述
我们是把库放到research/目录下。

训练自己的数据集(Faster RCNN)

在这里插入图片描述

1、创建文件家,标注数据

2**. 重要!标签的值需要从1开始标记,0是一个占位符,在为每一类分类标签赋值时需要注意。**
如果想要训练一个鲁棒的分类器,该API需要较大量的样本进行训练,但是为了演示如何利用该API训练自己的数据集,我们只是采集了少量的样本并将其分成训练集和测试集。
在这里我们利用的标注工具是 LabelImg),具体的使用方式大家可以参考这篇博客 (https://blog.csdn.net/lwplwf/article/details/78367929)。对于样本的采集大家可以按照自己的喜好从网上下载或者从公开数据集中选取部分进行实验,初次接触该API的话建议选取少量的类别。为了节省时间这里我选取的样本是从一个作者的Github里面克隆的 添加链接描述,该作者选取的是扑克牌样本,共有6个类别。所有的训练图片和测试图片都需要进行标注,示例如下:
在这里插入图片描述
标注以后,每个图片都会在当前目录下产生一个对应的.xml文件,如下所示:
在这里插入图片描述
此代码testRGB.py验证数据是不是RGB图片

from PIL import Image     
import os       
path = 'E:\\TensorFlowNew\\models\\research\\object_detection\\test_images\\' #图片目录 
for file in os.listdir(path): 
     
     extension = file.split('.')[-1]
     if extension == 'jpg':
           fileLoc = path+file
           img = Image.open(fileLoc)
           if img.mode != 'RGB':
                 print(file+', '+img.mode)

2、转换数据格式

2.1将.xml文件转换成csv文件:代码命名为xml_to_csv.py,并存放在object_detection文件夹下。通过运行上述代码,将在images文件夹下产生两个.csv文件,分别为train_labels.csv和test_labels.csv

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


def xml_to_csv(path):
    xml_list = []# xml_list存储了所有的xml文件的关键信息,每一行对应一个xml文件
    for xml_file in glob.glob(path + '/*.xml'):# glob.glob(path + '/*.xml') 查找path目录下的所有.xml文件,最终返回一个list,list的每一行都是一个xml文件的path
    # 采用元素数的方法解析xml文件
    #打开XML文档
    #获得root节点
        tree = ET.parse(xml_file)
        root = tree.getroot()# xml_df保存到指定的路径,并取消左边的索引
        # 查找当前xml文件中的所有的'object'
        for member in root.findall('object'):
        # value是个tuple(元组)
            value = (root.find('filename').text,#xml对应的图片名
                     int(root.find('size')[0].text),#图片的width
                     int(root.find('size')[1].text), #图片的heigth
                     member[0].text,#当前object是个什么东西,猫、狗、桌子...
                     int(member[4][0].text),#xmin
                     int(member[4][1].text),#ymin
                     int(member[4][2].text), #xmax
                     int(member[4][3].text) #ymax
                     )
            xml_list.append(value)# 将提取的当前xml文件的上述信息追加到xml_list
    column_name = ['filename', 'width', 'height', 'class', 'xmin', 'ymin', 'xmax', 'ymax']
    xml_df = pd.DataFrame(xml_list, columns=column_name)# 之所以这么干我认为是因为DataFrame转csv特别容易
    return xml_df


def main():
    for folder in ['train','test']:
        image_path = os.path.join(os.getcwd(), ('images/' + folder))#进入到Train或者test文件夹
        xml_df = xml_to_csv(image_path)
        xml_df.to_csv(('images/' + folder + '_labels.csv'), index=None)# xml_df保存到指定的路径,并取消左边的索引
        print('Successfully converted xml to csv.')


main()

在这里插入图片描述
我们也可以利用这个代码:(看代码的注意修改

# -*- coding: utf-8 -*-
"""
Created on Tue Jan 16 00:52:02 2018
@author: Xiang Guo
将文件夹内所有XML文件的信息记录到CSV文件中
"""

import os
import glob
import pandas as pd
import xml.etree.ElementTree as ET
# 注意修改1)此处是设置文件所在的路径,首先进入到test数据所在路径
os.chdir('F:\\TensorFlow\\models-master\\research\\object_detection\\images\\test')
path = 'F:\\TensorFlow\\models-master\\research\\object_detection\\images\\test'


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 = path
    xml_df = xml_to_csv(image_path)
    # 注意修改2)此处需要设置 生成的csv文件的名称,'panda_test.csv'  是设置的文件名
    xml_df.to_csv('panda_test.csv', index=None)
    print('Successfully converted xml to csv.')

main()

利用这个代码需要运行两次,分别定位到train和test数据文件夹。

2.1:将.csv文件转换成TFRecord文件:
注意自己的数据要进行def class_text_to_int(row_label):#修改标签
假如我只有WDJ一类数据,我将其他都注释掉了。

"""
Usage:
  # From tensorflow/models/
  # Create train data:
  python generate_tfrecord.py --csv_input=images/train_labels.csv --image_dir=images/train --output_path=train.record

  # Create test data:
  python generate_tfrecord.py --csv_input=images/test_labels.csv  --image_dir=images/test --output_path=test.record
"""
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 collections import namedtuple, OrderedDict

flags = tf.app.flags
"""
注意:
    DEFINE_string定义了个命令行参数

    flage_name:csv_input,参数名字
    defalut_name:默认值 ,这里的默认值是data/test_labels.csv
    docstring:对该参数的说明

    可以使用tf.app.flags.FLAGS取出该参数的值:
    FLAGS = tf.app.flags.FLAGS
    print(FLAGS.csv_input),输出的就是data/test_labels.csv
    # 1)设置 object_detection  文件夹路径。
    os.chdir('F:\\TensorFlow\\models-master\\research\\object_detection\\')

    flags = tf.app.flags
    # 2)设置 csv文件路径。
   flags.DEFINE_string('csv_input', 'data/panda_test.csv', 'Path to the CSV input')
   # 3)设置生成的文件文件名称。
   flags.DEFINE_string('output_path', 'data/panda_test.record', 'Path to output TFRecord')
"""
flags.DEFINE_string('csv_input', '', 'Path to the CSV input')
flags.DEFINE_string('image_dir', '', 'Path to the image directory')
flags.DEFINE_string('output_path', '', 'Path to output TFRecord')
FLAGS = flags.FLAGS


# TO-DO replace this with label map
def class_text_to_int(row_label):#修改标签
    if row_label == 'WDJ':   
        return 1
    #elif row_label == 'ten':
        #return 2
    #elif row_label == 'jack':
        #return 3
    #elif row_label == 'queen':
        #return 4
    #elif row_label == 'king':
        #return 5
    #elif row_label == 'ace':
        #return 6
    else:
        None


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, path):
    with tf.gfile.GFile(os.path.join(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(class_text_to_int(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)
    path = os.path.join(os.getcwd(), FLAGS.image_dir)
    examples = pd.read_csv(FLAGS.csv_input)
    grouped = split(examples, 'filename')
    for group in grouped:
        tf_example = create_tf_example(group, path)
        writer.write(tf_example.SerializeToString())

    writer.close()
    output_path = os.path.join(os.getcwd(), FLAGS.output_path)
    print('Successfully created the TFRecords: {}'.format(output_path))


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

这个代码是上个代码的一些注释和解释

"""
Usage:
  # From tensorflow/models/
  # Create train data:
  python generate_tfrecord.py --csv_input=images/train_labels.csv --image_dir=images/train --output_path=train.record

  # Create test data:
  python generate_tfrecord.py --csv_input=images/test_labels.csv  --image_dir=images/test --output_path=test.record
"""
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 collections import namedtuple, OrderedDict

flags = tf.app.flags
"""
注意:
    DEFINE_string定义了个命令行参数

    flage_name:csv_input,参数名字
    defalut_name:默认值 ,这里的默认值是data/test_labels.csv,可以修改为自己的数据的名字
    docstring:对该参数的说明

    可以使用tf.app.flags.FLAGS取出该参数的值:
    FLAGS = tf.app.flags.FLAGS
    print(FLAGS.csv_input),输出的就是data/test_labels.csv

"""
flags.DEFINE_string('csv_input', '', 'Path to the CSV input')
flags.DEFINE_string('image_dir', '', 'Path to the image directory')
flags.DEFINE_string('output_path', '', 'Path to output TFRecord')
FLAGS = flags.FLAGS


# TO-DO replace this with label m
TensorFlow Object Detection API 是一个开源项目,它提供了一系列基于 TensorFlow 的工具和库,用于实现目标检测任务。对于 macOS 系统,我们可以通过以下步骤来使用 TensorFlow Object Detection API: 1. 安装 TensorFlow:在 macOS 上安装 TensorFlow 是使用 TensorFlow Object Detection API 的前提。你可以通过 pip 命令进行安装,例如在终端中执行 `pip install tensorflow`。 2. 下载 TensorFlow Object Detection API:打开终端并导航到适合你的工作目录中,然后使用 git 命令来克隆 TensorFlow Object Detection API 的 GitHub 仓库,例如执行 `git clone https://github.com/tensorflow/models.git`。 3. 安装依赖项:进入克隆的模型目录中,找到 research 文件夹并进入。然后运行 `pip install -r object_detection/requirements.txt` 命令来安装所需的依赖项。 4. 下载预训练模型:在 TensorFlow Object Detection API 中,我们可以使用预训练的模型来进行目标检测。你可以从 TensorFlow Model Zoo 中下载适合你任务的模型,并将其解压到你的工作目录中。 5. 运行实例代码:在 research/object_detection 目录中,你可以找到一些示例代码,用于训练、评估和使用目标检测模型。可以通过阅读这些示例代码并根据自己的需求进行修改。例如,你可以使用 `python object_detection/builders/model_builder_tf2_test.py` 命令来运行一个模型的测试。 以上是在 macOS 上使用 TensorFlow Object Detection API 的基本步骤,你可以根据你的具体需求进行更多的深入研究和调整。希望这些信息能帮助到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值