TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10

GitHub
2.9k 1.3k 较难 1 次阅读 3天前Apache-2.0图像开发框架
AI 解读 由 AI 自动生成,仅供参考

TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10 是一份详尽的实战教程,旨在指导用户在 Windows 系统上利用 TensorFlow 对象检测 API 训练能够识别多种目标的自定义分类器。它主要解决了开发者在配置复杂的深度学习环境(如 Anaconda、CUDA 和 cuDNN)、准备标注数据以及执行模型训练流程时遇到的门槛高、步骤繁琐等痛点。

这份资源特别适合希望在 Windows 平台上入门计算机视觉的开发者、学生及研究人员。即便你使用的是 Linux 系统,稍作调整也能参考使用。教程的独特亮点在于其“手把手”式的引导风格,不仅提供了完整的代码示例和用于测试的皮诺克牌(Pinochle)数据集,还涵盖了从环境搭建、数据标注、生成训练集到最终导出推理图并测试模型的全流程八个关键步骤。此外,作者还提供了配套的 YouTube 视频演示,并针对常见报错整理了附录,帮助用户更顺畅地完成从零到一的模型定制,轻松实现对自己感兴趣物体的智能识别。

使用场景

某小型智能仓储团队需要在 Windows 工作站上快速开发一套系统,用于自动识别并分拣传送带上混放的六种不同规格零件。

没有 TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10 时

  • 环境配置困难:团队成员缺乏深度学习经验,在 Windows 上手动配置 CUDA、cuDNN 及 TensorFlow 依赖时频繁报错,耗时数天仍无法跑通基础代码。
  • 数据流程断裂:不知道如何将采集的零件图片转换为模型可接受的 TFRecord 格式,也缺乏生成标签映射文件(label map)的标准脚本,导致数据准备停滞。
  • 训练无从下手:面对复杂的配置文件和训练参数不知所措,不清楚如何针对多类别物体调整网络结构,只能盲目尝试或放弃自定义训练。
  • 部署验证缺失:即使勉强完成训练,也缺乏现成的推理脚本来导出冻结图(inference graph)并实时测试检测效果,无法验证模型是否可用。

使用 TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10 后

  • 一键搭建环境:依照教程步骤,利用 Anaconda 虚拟环境快速安装了兼容 GPU 加速的完整开发栈,将原本数天的环境调试缩短至几小时。
  • 标准化数据处理:直接使用提供的 Python 脚本批量生成训练数据和标签映射文件,轻松将自定义的零件图片集转化为标准输入格式。
  • 清晰训练路径:参考教程中关于配置文件修改和训练命令的详细指南,顺利启动了针对六种零件的多类别训练任务,并实时监控损失函数收敛情况。
  • 即时成果验证:利用导出的推理图和测试脚本,立即在摄像头画面中看到了对各类零件的精准框选与分类,快速完成了从数据到原型的闭环。

该教程通过提供端到端的 Windows 实战指南,极大地降低了自定义多类别物体检测模型的门槛,让非算法专家也能高效落地工业视觉应用。

运行环境要求

操作系统
  • Windows 10
  • Windows 8
  • Windows 7
  • Linux
GPU
  • 可选但强烈推荐(使用 TensorFlow-GPU 可将训练时间缩短约 8 倍)
  • 需 NVIDIA 显卡,具体型号未说明
  • CUDA 和 cuDNN 版本需与安装的 TensorFlow 版本严格对应(例如 TF v1.13.1 需特定版本),Anaconda 会自动安装兼容版本
内存

未说明

依赖
notes本教程主要针对 Windows 环境,Linux 需调整文件路径和安装命令。必须严格按照指定目录结构(如 C:\tensorflow1)配置。若使用旧版 TensorFlow,需下载对应的 GitHub models 仓库提交版本以避免兼容性错误。CPU 版本也可运行但训练速度极慢。
python通过 Anaconda 管理,具体版本取决于所选 TensorFlow 版本(文中示例为 TF v1.5 至 v1.13.1,通常对应 Python 3.6-3.7)
tensorflow-gpu (v1.5 - v1.13.1+)
anaconda
cuda
cudnn
protobuf
lxml
jupyter
matplotlib
pillow
TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10 hero image

快速开始

如何在 Windows 10 上使用 TensorFlow(GPU)训练多目标物体检测分类器

简要概述

最后更新:2019年6月22日,TensorFlow v1.13.1

本仓库是一个教程,介绍如何在 Windows 10、8 或 7 上使用 TensorFlow 的物体检测 API 来训练一个多目标物体检测分类器。(稍作修改后也可在基于 Linux 的操作系统上运行。)该教程最初是基于 TensorFlow 1.5 编写的,但同样适用于较新版本的 TensorFlow。

本指南的翻译版本如下所示。如果您希望贡献其他语言的翻译,请随时提出!您可以将其作为拉取请求提交,我将在方便时合并。

我还制作了一段 YouTube 视频来演示本教程。视频与本文档之间的任何差异都是由于使用较新版本 TensorFlow 所需的更新造成的。

如果本文档与视频存在差异,请以本文档为准!

我的 YouTube 视频链接!

本自述文件详细描述了启动您自己的物体检测分类器所需的每一步:

  1. 安装 Anaconda、CUDA 和 cuDNN
  2. 设置物体检测目录结构和 Anaconda 虚拟环境
  3. 收集并标注图片
  4. 生成训练数据
  5. 创建标签映射并配置训练
  6. 训练模型
  7. 导出推理图
  8. 测试并使用您新训练的物体检测分类器

附录:常见错误

该仓库提供了训练一个“皮诺克尔牌组”扑克牌检测器所需的所有文件,该检测器能够准确识别九、十、J、Q、K 和 A。本教程说明如何用您自己的文件替换这些示例文件,从而训练出满足您需求的物体检测分类器。此外,还包含用于在图像、视频或网络摄像头流中测试分类器的 Python 脚本。

引言

本教程旨在从零开始讲解如何训练您自己的卷积神经网络多目标物体检测分类器。完成本教程后,您将拥有一个能够在图片、视频或网络摄像头流中识别特定物体并为其绘制边界框的程序。

目前已有许多优秀的教程介绍了如何使用 TensorFlow 的物体检测 API 训练单目标分类器。然而,这些教程通常假设用户使用的是 Linux 操作系统。如果您像我一样,可能不太愿意在配备高性能显卡的游戏电脑上安装 Linux,而这块显卡正是用来训练分类器的。物体检测 API 似乎是在基于 Linux 的操作系统上开发的。要在 Windows 上设置 TensorFlow 来训练模型,需要采用一些变通方法来替代在 Linux 上可以直接使用的命令。此外,本教程还提供了训练可检测多个目标的分类器的指导,而不仅仅是单个目标。

本教程专为 Windows 10 编写,但也适用于 Windows 7 和 8。其总体流程同样可用于 Linux 操作系统,但相应的文件路径和软件包安装命令需要进行调整。我在编写本教程的初始版本时使用的是 TensorFlow-GPU 1.5,但它应该也能兼容未来的 TensorFlow 版本。

TensorFlow-GPU 允许您的计算机利用显卡提供额外的计算能力来进行训练,因此本教程将使用它。根据我的经验,使用 TensorFlow-GPU 而不是普通 TensorFlow 可以将训练时间缩短约 8 倍(从 24 小时缩短到 3 小时)。当然,也可以使用仅 CPU 的 TensorFlow 版本来完成本教程,但训练时间会更长。如果您选择仅使用 CPU 的 TensorFlow,则无需在步骤 1 中安装 CUDA 和 cuDNN。

步骤

1. 安装 Anaconda、CUDA 和 cuDNN

Anaconda 是一个软件工具包,用于创建 Python 虚拟环境,这样你就可以安装和使用 Python 库,而无需担心与现有安装产生版本冲突。Anaconda 在 Windows 上运行良好,并且使你能够使用许多通常只在 Linux 系统上才能运行的 Python 库。它提供了一种简单的方法来安装 TensorFlow(我们将在第 2d 步中完成)。此外,它还会自动安装你在 GPU 上使用 TensorFlow 所需的 CUDA 和 cuDNN 版本。

他们的官网 下载适用于 Windows 的 Anaconda(你需要向下滚动一段距离才能找到下载链接)。下载完成后,运行安装程序并按照步骤完成安装。

如果你使用的是 TF v1.13 之前的 TensorFlow 版本,请确保使用的 CUDA 和 cuDNN 版本与你所用的 TensorFlow 版本兼容。这里 提供了一个表格,显示了不同版本的 TensorFlow 需要哪些版本的 CUDA 和 cuDNN。Anaconda 会为你使用的 TensorFlow 版本自动安装正确的 CUDA 和 cuDNN 版本,因此你无需为此操心。

2. 设置 TensorFlow 目录和 Anaconda 虚拟环境

TensorFlow 对象检测 API 要求使用其 GitHub 仓库中提供的特定目录结构。它还需要一些额外的 Python 包、对 PATH 和 PYTHONPATH 环境变量的特定设置,以及一些额外的配置命令,才能将所有内容正确设置好,以便运行或训练对象检测模型。

本教程的这一部分将详细介绍完整的设置过程。虽然步骤较为繁琐,但请务必严格按照说明操作,因为设置不当可能会在后续过程中引发难以解决的错误。

2a. 从 GitHub 下载 TensorFlow 对象检测 API 仓库

在 C: 盘根目录下创建一个名为 “tensorflow1” 的文件夹。这个工作目录将包含完整的 TensorFlow 对象检测框架,以及你的训练图像、训练数据、已训练的分类器、配置文件等对象检测分类器所需的一切内容。

访问 https://github.com/tensorflow/models 下载完整的 TensorFlow 对象检测仓库,点击“Clone or Download”按钮并下载 zip 文件。解压下载的 zip 文件,将其中的 “models-master” 文件夹直接提取到你刚刚创建的 C:\tensorflow1 目录中,并将 “models-master” 重命名为 “models”。

注意:TensorFlow 模型仓库的代码(包含对象检测 API)由开发者持续更新。有时他们会进行一些更改,导致与旧版 TensorFlow 不兼容。因此,最好始终使用最新版本的 TensorFlow,并下载最新的模型仓库。如果你使用的是较旧版本,请根据下表克隆或下载对应版本的提交记录。

如果你使用的是较旧版本的 TensorFlow,以下表格列出了你应该使用的 GitHub 提交记录。我通过进入模型仓库的发布分支,获取该分支在正式发布前的倒数第二个提交生成了此表格。(他们在创建正式版本发布之前,会移除 research 文件夹作为最后一个提交。)

TensorFlow 版本 GitHub 模型仓库提交
TF v1.7 https://github.com/tensorflow/models/tree/adfd5a3aca41638aa9fb297c5095f33d64446d8f
TF v1.8 https://github.com/tensorflow/models/tree/abd504235f3c2eed891571d62f0a424e54a2dabc
TF v1.9 https://github.com/tensorflow/models/tree/d530ac540b0103caa194b4824af353f1b073553b
TF v1.10 https://github.com/tensorflow/models/tree/b07b494e3514553633b132178b4c448f994d59df
TF v1.11 https://github.com/tensorflow/models/tree/23b5b4227dfa1b23d7c21f0dfaf0951b16671f43
TF v1.12 https://github.com/tensorflow/models/tree/r1.12.0
TF v1.13 https://github.com/tensorflow/models/tree/r1.13.0
最新版本 https://github.com/tensorflow/models

本教程最初是使用 TensorFlow v1.5 和 TensorFlow 对象检测 API 的 此 GitHub 提交 完成的。如果本教程中的某些部分无法正常工作,可能需要安装 TensorFlow v1.5 并使用该确切的提交记录,而不是最新版本。

2b. 从 TensorFlow 模型库下载 Faster-RCNN-Inception-V2-COCO 模型

TensorFlow 在其 模型库 中提供了多种对象检测模型(带有特定神经网络架构的预训练分类器)。有些模型(如 SSD-MobileNet 模型)具有更快检测速度但准确率较低的架构,而另一些模型(如 Faster-RCNN 模型)则检测速度较慢但准确率更高。我最初使用的是 SSD-MobileNet-V1 模型,但它在我的图像中对卡片的识别效果并不理想。随后我使用 Faster-RCNN-Inception-V2 模型重新训练了检测器,结果检测效果显著提升,但速度明显变慢。

你可以选择使用哪种模型来训练你的对象检测分类器。如果你计划在计算能力较低的设备上(如智能手机或 Raspberry Pi)使用对象检测器,则应选择 SDD-MobileNet 模型;如果你将在性能较好的笔记本电脑或台式机上运行检测器,则可以选择 RCNN 系列模型。

本教程将使用 Faster-RCNN-Inception-V2 模型。在此下载该模型。 使用 WinZip 或 7-Zip 等文件解压工具打开下载的 faster_rcnn_inception_v2_coco_2018_01_28.tar.gz 文件,将 faster_rcnn_inception_v2_coco_2018_01_28 文件夹提取到 C:\tensorflow1\models\research\object_detection 目录中。(注意:该模型的日期和版本未来可能会发生变化,但应该仍然适用于本教程。)

2c. 从 GitHub 下载本教程的仓库

下载本页面上的完整仓库(滚动到顶部并点击 Clone or Download),将所有内容直接提取到 C:\tensorflow1\models\research\object_detection 目录中。(可以覆盖现有的 “README.md” 文件。)这将建立一个特定的目录结构,供本教程后续步骤使用。

此时,你的 \object_detection 目录应如下所示:

此仓库包含训练“皮诺克尔牌组”扑克牌检测器所需的图像、标注数据、.csv文件以及TFRecords。您可以使用这些图像和数据来练习构建您自己的皮诺克尔牌检测器。此外,仓库还包含用于生成训练数据的Python脚本,以及可在图像、视频或网络摄像头流上测试目标检测分类器的脚本。您可以忽略\doc文件夹及其内容;它们仅用于存放本README中使用的图片。

如果您想练习训练自己的“皮诺克尔牌组”牌检测器,可以保持所有文件不变。您可以按照本教程了解每个文件是如何生成的,然后开始训练。不过,您仍需按照步骤4中的说明生成TFRecord文件(train.record和test.record)。

您也可以从以下Dropbox链接下载我训练好的皮诺克尔牌检测器的冻结推理图[https://www.dropbox.com/s/va9ob6wcucusse1/inference_graph.zip?dl=0],并将内容解压到\object_detection\inference_graph目录下。该推理图可直接使用。在完成步骤2a至2f的所有设置后,您可以通过运行Object_detection_image.py(或视频、网络摄像头)脚本来测试它。

如果您希望训练自己的目标检测模型,请删除以下文件(请勿删除文件夹):

  • \object_detection\images\train和\object_detection\images\test中的所有文件
  • \object_detection\images中的“test_labels.csv”和“train_labels.csv”文件
  • \object_detection\training中的所有文件
  • \object_detection\inference_graph中的所有文件

现在,您已准备好从头开始训练自己的目标检测模型。本教程将假设上述所有文件已被删除,并继续说明如何为您的训练数据集生成所需文件。

2d. 设置新的Anaconda虚拟环境

接下来,我们将在Anaconda中为tensorflow-gpu设置一个虚拟环境。在Windows的开始菜单中搜索“Anaconda Prompt”工具,右键单击并选择“以管理员身份运行”。如果Windows提示您是否允许更改计算机设置,请点击“是”。

在弹出的命令行终端中,通过以下命令创建名为“tensorflow1”的新虚拟环境:

C:\> conda create -n tensorflow1 pip python=3.5

然后激活该环境并更新pip:

C:\> activate tensorflow1

(tensorflow1) C:\>python -m pip install --upgrade pip

在该环境中安装tensorflow-gpu:

(tensorflow1) C:\> pip install --ignore-installed --upgrade tensorflow-gpu

由于我们使用的是Anaconda,安装tensorflow-gpu时会自动下载并安装正确版本的CUDA和cuDNN。

(注:您也可以使用仅支持CPU的TensorFlow版本,但其运行速度会慢得多。如果要使用CPU版本,只需在上述命令中将“tensorflow-gpu”替换为“tensorflow”即可。)

安装其他必要的软件包:

(tensorflow1) C:\> conda install -c anaconda protobuf
(tensorflow1) C:\> pip install pillow
(tensorflow1) C:\> pip install lxml
(tensorflow1) C:\> pip install Cython
(tensorflow1) C:\> pip install contextlib2
(tensorflow1) C:\> pip install jupyter
(tensorflow1) C:\> pip install matplotlib
(tensorflow1) C:\> pip install pandas
(tensorflow1) C:\> pip install opencv-python

(注:pandas和opencv-python这两个包并非TensorFlow所必需,但在生成TFRecords以及处理图像、视频和网络摄像头流的Python脚本中会用到。)

2e. 配置PYTHONPATH环境变量

必须创建一个指向\models、\models\research和\models\research\slim目录的PYTHONPATH变量。为此,请从任意目录执行以下命令:

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

(注:每次退出“tensorflow1”虚拟环境时,PYTHONPATH变量都会重置,需要重新设置。您可以用“echo %PYTHONPATH%”来检查是否已成功设置。)

2f. 编译Protobuf文件并运行setup.py

接下来,编译TensorFlow用于配置模型和训练参数的Protobuf文件。遗憾的是,TensorFlow对象检测API安装页面上提供的简短protoc编译命令在Windows上无法正常工作。必须逐个调用\object_detection\protos目录下的每个.proto文件。

在Anaconda命令提示符中,切换到\models\research目录:

(tensorflow1) C:\> cd C:\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 .\object_detection\protos\calibration.proto .\object_detection\protos\flexible_grid_anchor_generator.proto

这将为\object_detection\protos文件夹中的每个.proto文件生成对应的name_pb2.py文件。

(注:TensorFlow有时会向\protos文件夹添加新的.proto文件。如果出现ImportError: cannot import name 'something_something_pb2'错误,您可能需要更新protoc命令以包含新增的.proto文件。)

最后,在 C:\tensorflow1\models\research 目录下运行以下命令:

(tensorflow1) C:\tensorflow1\models\research> python setup.py build
(tensorflow1) C:\tensorflow1\models\research> python setup.py install

2g. 测试 TensorFlow 安装以验证其是否正常工作

现在,TensorFlow 对象检测 API 已经设置完毕,可以使用预训练模型进行对象检测,也可以训练一个新的模型。你可以通过启动 Jupyter 中的 object_detection_tutorial.ipynb 脚本来测试并验证安装是否成功。从 \object_detection 目录下,执行以下命令:

(tensorflwo1) C:\tensorflow1\models\research\object_detection> jupyter notebook object_detection_tutorial.ipynb

这将在你的默认网页浏览器中打开该脚本,允许你逐段逐步运行代码。只需点击顶部工具栏中的“运行”按钮即可逐段执行。当该段落旁边的“In [ * ]”文本显示一个数字(例如“In [1]”)时,就表示该段已执行完毕。

(注:脚本的一部分会从 GitHub 下载 ssd_mobilenet_v1 模型,大小约为 74MB。因此,完成这一部分需要一些时间,请耐心等待。)

当你完整地运行完整个脚本后,页面底部应该会出现两张带有标注的图片。如果看到这些图片,则说明一切正常!如果没有出现,底部区域会显示遇到的任何错误信息。有关我在设置过程中遇到的一些常见错误列表,请参阅附录

注意:如果你完整运行了 Jupyter Notebook 并未出现任何错误,但仍然没有显示标注图片,请尝试以下操作:进入 object_detection/utils/visualization_utils.py 文件,将第 29 和 30 行附近包含 matplotlib 的导入语句注释掉,然后再次运行 Jupyter Notebook。

3. 收集并标注图片

现在,TensorFlow 对象检测 API 已经设置完毕并准备就绪,我们需要提供用于训练新检测分类器的图像。

3a. 收集图片

TensorFlow 需要数百张目标物体的图片才能训练出一个优秀的检测分类器。为了训练出鲁棒的分类器,训练图像中除了目标物体外,还应包含随机物体,并且背景和光照条件应多样化。此外,还应有一些目标物体被部分遮挡、与其他物体重叠或只有一半出现在画面中的图像。

对于我的 Pinochle 卡牌检测分类器,我想要检测六种不同的卡牌等级:9、10、J、Q、K 和 A——我并不打算区分花色,只关注等级。我用 iPhone 分别拍摄了每种卡牌的单独照片约 40 张,同时在照片中加入了一些其他非目标物体。之后,我又拍摄了大约 100 张包含多张卡牌的照片。由于我希望能够在卡牌相互重叠的情况下也能检测到它们,因此我在许多照片中特意让卡牌互相重叠。

你可以使用手机拍摄目标物体的照片,或者从 Google 图片搜索下载相关图片。建议至少准备 200 张图片。我用来训练卡牌检测器的图片总数为 311 张。

请确保图片不要太大,每张图片的大小应小于 200KB,分辨率不超过 720x1280。图片越大,训练分类器所需的时间就越长。你可以使用本仓库中的 resizer.py 脚本来缩小图片尺寸。

收集齐所有需要的图片后,将其中 20% 移至 \object_detection\images\test 目录,80% 移至 \object_detection\images\train 目录。确保 \test 和 \train 目录中都包含多样化的图片。

3b. 标注图片

接下来就是有趣的部分了!在收集好所有图片后,现在需要对每张图片中的目标物体进行标注。LabelImg 是一款非常优秀的图像标注工具,其 GitHub 页面提供了清晰明了的安装和使用说明。

LabelImg GitHub 链接

LabelImg 下载链接

下载并安装 LabelImg,将其指向你的 \images\train 目录,然后在每张图片中用矩形框圈出每个目标物体。接着,对 \images\test 目录中的所有图片重复此操作。这个过程可能会花费一些时间!

LabelImg 会保存一个包含每张图片标注数据的 .xml 文件。这些 .xml 文件将用于生成 TFRecords,而 TFRecords 正是 TensorFlow 训练器的输入之一。完成所有图片的标注并保存后,\test 和 \train 目录中将分别对应每张图片生成一个 .xml 文件。

4. 生成训练数据

在完成图片标注后,接下来需要生成作为 TensorFlow 训练模型输入数据的 TFRecords。本教程使用了 Dat Tran 的浣熊检测数据集 中的 xml_to_csv.py 和 generate_tfrecord.py 脚本,并根据我们的目录结构做了一些微调。

首先,利用图片的 .xml 数据创建包含训练和测试图像所有数据的 .csv 文件。在 Anaconda 命令提示符中,从 \object_detection 文件夹下执行以下命令:

(tensorflow1) C:\tensorflow1\models\research\object_detection> python xml_to_csv.py

这将在 \object_detection\images 文件夹中生成 train_labels.csv 和 test_labels.csv 文件。

接下来,用文本编辑器打开 generate_tfrecord.py 文件。将从第 31 行开始的标签映射替换为你自己的标签映射,为每个目标物体分配一个 ID 号。这个编号也将用于步骤 5b 中配置 labelmap.pbtxt 文件。

例如,假设你要训练一个检测篮球、衬衫和鞋子的分类器,那么你需要将 generate_tfrecord.py 中的以下代码:

# TO-DO 替换为标签映射
def class_text_to_int(row_label):
    if row_label == 'nine':
        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 class_text_to_int(row_label): if row_label == 'basketball': return 1 elif row_label == 'shirt': return 2 elif row_label == 'shoe': return 3 else: None

然后,从 \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 文件夹中生成 train.record 和 test.record 文件。这些文件将用于训练新的目标检测分类器。

### 5. 创建标签映射并配置训练
在开始训练之前,最后需要完成的任务是创建标签映射并编辑训练配置文件。

#### 5a. 标签映射
标签映射通过定义类别名称与类别 ID 的对应关系,告诉训练程序每个对象的含义。使用文本编辑器创建一个新文件,并将其保存为 labelmap.pbtxt,路径为 C:\tensorflow1\models\research\object_detection\training 文件夹。(请确保文件类型为 .pbtxt,而不是 .txt!)在文本编辑器中,复制或键入如下格式的标签映射(下面的示例是我的 Pinochle 牌组卡片检测器的标签映射):

item { id: 1 name: 'nine' }

item { id: 2 name: 'ten' }

item { id: 3 name: 'jack' }

item { id: 4 name: 'queen' }

item { id: 5 name: 'king' }

item { id: 6 name: 'ace' }

标签映射中的 ID 号必须与 generate_tfrecord.py 文件中定义的编号一致。对于第 4 步中提到的篮球、衬衫和鞋子检测器示例,labelmap.pbtxt 文件应如下所示:

item { id: 1 name: 'basketball' }

item { id: 2 name: 'shirt' }

item { id: 3 name: 'shoe' }


#### 5b. 配置训练
最后,需要配置目标检测的训练流程。该流程定义了将使用哪种模型以及哪些参数进行训练。这是运行训练之前的最后一步!

导航到 C:\tensorflow1\models\research\object_detection\samples\configs 文件夹,将 faster_rcnn_inception_v2_pets.config 文件复制到 \object_detection\training 目录。然后用文本编辑器打开该文件。需要对 .config 文件进行几处修改,主要包括更改类别数和样本数,以及添加训练数据的文件路径。

对 faster_rcnn_inception_v2_pets.config 文件进行如下修改。注意:路径必须使用单斜杠(不能使用反斜杠),否则 TensorFlow 在尝试训练模型时会报文件路径错误!此外,路径必须用双引号( " )括起来,而不是单引号( ' )。

- 第 9 行。将 num_classes 改为分类器需要检测的不同物体数量。对于上述篮球、衬衫和鞋子检测器,num_classes 应设置为 3。
- 第 106 行。将 fine_tune_checkpoint 修改为:
  - fine_tune_checkpoint : "C:/tensorflow1/models/research/object_detection/faster_rcnn_inception_v2_coco_2018_01_28/model.ckpt"

- 第 123 和 125 行。在 train_input_reader 部分,将 input_path 和 label_map_path 修改为:
  - input_path : "C:/tensorflow1/models/research/object_detection/train.record"
  - label_map_path: "C:/tensorflow1/models/research/object_detection/training/labelmap.pbtxt"

- 第 130 行。将 num_examples 修改为 \images\test 目录中图像的数量。

- 第 135 和 137 行。在 eval_input_reader 部分,将 input_path 和 label_map_path 修改为:
  - input_path : "C:/tensorflow1/models/research/object_detection/test.record"
  - label_map_path: "C:/tensorflow1/models/research/object_detection/training/labelmap.pbtxt"

完成修改后保存文件。至此,训练任务的所有配置已完成,可以开始训练了!

### 6. 运行训练
**更新日期:2018年9月26日:**
*自版本 1.9 起,TensorFlow 已弃用 “train.py” 文件,改用 “model_main.py” 文件。目前我尚未成功使 model_main.py 正常工作(遇到了与 pycocotools 相关的错误)。幸运的是,“train.py” 文件仍然存在于 /object_detection/legacy 文件夹中。只需将 train.py 从 /object_detection/legacy 移至 /object_detection 文件夹,然后继续按照以下步骤操作即可。*

现在开始!从 \object_detection 目录下,执行以下命令以启动训练:

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

如果所有设置都正确,TensorFlow 将初始化训练。初始化可能需要长达 30 秒,之后才会真正开始训练。训练开始时,界面将显示如下:

<p align="center">
  <img src="https://oss.gittoolsai.com/images/EdjeElectronics_TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10_readme_0a3cc4f61c06.jpg">
</p>

训练的每一步都会报告损失值。初始损失较高,随着训练的进行会逐渐降低。在我使用 Faster-RCNN-Inception-V2 模型进行的训练中,损失最初约为 3.0,随后迅速降至 0.8 以下。建议让模型持续训练,直到损失稳定低于 0.05,这通常需要约 40,000 步,大约 2 小时(具体时间取决于 CPU 和 GPU 的性能)。注意:如果使用不同的模型,损失数值也会有所不同。例如,MobileNet-SSD 的初始损失约为 20,应训练至损失稳定低于 2。

可以通过 TensorBoard 查看训练进度。为此,打开一个新的 Anaconda Prompt 窗口,激活 tensorflow1 虚拟环境,切换到 C:\tensorflow1\models\research\object_detection 目录,然后执行以下命令:

(tensorflow1) C:\tensorflow1\models\research\object_detection>tensorboard --logdir=training

这将在本地计算机上创建一个网页,地址为 YourPCName:6006,可通过浏览器访问。TensorBoard 页面提供有关训练进展的信息和图表。其中一个重要图表是损失图,它显示了分类器整体损失随时间的变化情况。

<p align="center">
  <img src="https://oss.gittoolsai.com/images/EdjeElectronics_TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10_readme_adec072ade83.jpg">
</p>

训练过程中会每隔约五分钟自动保存检查点。可以在命令提示符窗口中按 Ctrl+C 终止训练。我通常会在刚保存完检查点后终止训练。您可以随时停止训练并在稍后继续,训练将从最近保存的检查点重新开始。最终用于生成冻结推理图的是步数最高的那个检查点。

### 7. 导出推理图
现在训练已经完成,最后一步是生成冻结的推理图(.pb 文件)。在 \object_detection 文件夹中,执行以下命令,其中“model.ckpt-XXXX”中的“XXXX”应替换为训练文件夹中编号最大的 .ckpt 文件:

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

这将在 \object_detection\inference_graph 文件夹中创建一个 frozen_inference_graph.pb 文件。该 .pb 文件包含了目标检测分类器。

### 8. 使用你新训练的目标检测分类器!
目标检测分类器已经准备就绪!我已经编写了 Python 脚本,可以在图像、视频或网络摄像头流上对其进行测试。

在运行这些 Python  scripts 之前,你需要将脚本中的 NUM_CLASSES 变量修改为你要检测的类别数量。(对于我的皮诺克牌检测器,我需要检测六种牌,因此 NUM_CLASSES = 6。)

要测试你的目标检测器,可以将待检测物体的图片移动到 \object_detection 文件夹中,并将 Object_detection_image.py 中的 IMAGE_NAME 变量修改为与图片文件名一致。你也可以使用包含这些物体的视频(使用 Object_detection_video.py),或者直接连接 USB 网络摄像头并将其对准待检测物体(使用 Object_detection_webcam.py)。

要运行任何脚本,在激活了 “tensorflow1” 虚拟环境的 Anaconda 命令提示符中输入 “idle”,然后按 ENTER 键。这将打开 IDLE,你可以在其中打开任意脚本并运行它们。

如果一切正常,目标检测器会初始化大约 10 秒钟,随后会显示一个窗口,展示它在图像中检测到的所有物体!

<p align="center">
  <img src="https://oss.gittoolsai.com/images/EdjeElectronics_TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10_readme_73f68242d557.jpg">
</p>

如果你遇到错误,请查看附录:其中列出了我在设置目标检测分类器时遇到的一些常见问题及解决方法。你也可以尝试在 Google 上搜索相关错误信息,通常在 Stack Exchange 或 TensorFlow 的 GitHub Issues 中能找到有用的解决方案。

## 附录:常见错误
看起来 TensorFlow 目标检测 API 是在基于 Linux 的操作系统上开发的,文档中的大部分说明也都是针对 Linux 系统的。要在 Windows 上让一个为 Linux 开发的软件库正常工作可能会比较困难。我在尝试在 Windows 10 上使用 tensorflow-gpu 训练目标检测分类器时,遇到了许多小问题。本附录列出了我遇到的一些错误及其解决方法。

#### 1. ModuleNotFoundError: 没有名为 'deployment' 或 'nets' 的模块

当尝试运行 object_detection_tutorial.ipynb 或 train.py 时,如果 PATH 和 PYTHONPATH 环境变量未正确设置,就会出现此错误。请关闭并重新打开 Anaconda 命令提示符窗口以退出虚拟环境,然后再次输入 “activate tensorflow1” 重新进入环境,并按照步骤 2e 中的说明设置环境变量。

你可以使用 “echo %PATH%” 和 “echo %PYTHONPATH%” 来检查环境变量,确保它们已正确配置。

此外,请确保你已在 \models\research 目录下执行了以下命令:

setup.py build setup.py install


#### 2. ImportError: 无法导入名称 'preprocessor_pb2'

#### ImportError: 无法导入名称 'string_int_label_map_pb2'

#### (或其他类似的 pb2 文件错误)

这种情况通常是由于 protobuf 文件(例如 preprocessor.proto)未编译所致。请重新运行步骤 2f 中给出的 protoc 命令。检查 \object_detection\protos 文件夹,确保每个 name.proto 文件都有对应的 name_pb2.py 文件。

#### 3. object_detection/protos/.proto: 没有此类文件或目录

当你尝试运行 TensorFlow 目标检测 API 安装页面上给出的命令:

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

时,可能会出现此错误。遗憾的是,这个命令在 Windows 上无法正常工作!请改用步骤 2f 中给出的完整命令。虽然可能有更好的方法,但我目前还不清楚具体如何操作。

#### 4. TensorSliceReader 构造函数失败:无法获取“文件路径”……文件名、目录名或卷标语法不正确。

当训练配置文件(如 faster_rcnn_inception_v2_pets.config 或其他类似文件)中的文件路径使用正斜杠而非反斜杠时,就会出现此错误。请打开 .config 文件,确保所有文件路径都采用以下格式:

“C:/path/to/model.file”


#### 5. ValueError: 尝试将 't' 转换为张量失败。错误:参数必须是一个密集张量:范围(0, 3) - 得到形状[3],但期望[]。

问题出在 models/research/object_detection/utils/learning_schedules.py 文件中。当前代码如下:

rate_index = tf.reduce_max(tf.where(tf.greater_equal(global_step, boundaries), range(num_boundaries), [0] * num_boundaries))

请将 range() 包裹在 list() 中,修改为:

rate_index = tf.reduce_max(tf.where(tf.greater_equal(global_step, boundaries), list(range(num_boundaries)), [0] * num_boundaries))


[参考:TensorFlow Issue#3705](https://github.com/tensorflow/models/issues/3705#issuecomment-375563179)

#### 6. ImportError: DLL 加载失败:找不到指定的过程。(或其他 DLL 相关错误)

这种错误通常是由于你安装的 CUDA 和 cuDNN 版本与当前使用的 TensorFlow 版本不兼容所致。解决此问题最简单的方法是使用 Anaconda 的 cudatoolkit 包,而不是手动安装 CUDA 和 cuDNN。如果你遇到这些问题,可以尝试创建一个新的 Anaconda 虚拟环境:

conda create -n tensorflow2 pip python=3.5

然后在该环境中使用 CONDA 安装 TensorFlow,而不是 PIP:

conda install tensorflow-gpu

之后可以从步骤 2 重新开始本指南(但可以跳过步骤 2d 中安装 TensorFlow 的部分)。

#### 7. 在步骤 2g 中,Jupyter Notebook 运行完毕且没有报错,但最终没有显示任何图片。

如果你完整地运行了 Jupyter Notebook 并且没有出现任何错误,但仍然没有看到标注后的图片,请尝试以下操作:进入 object_detection/utils/visualization_utils.py 文件,注释掉第 29 和 30 行附近包含 matplotlib 的导入语句,然后再次运行 Jupyter Notebook。(visualization_utils.py 文件的内容可能会有所变化,因此具体的行数可能略有不同。)

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|1周前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|1周前
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

159.6k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

108.3k|★★☆☆☆|1周前
开发框架图像Agent

gemini-cli

gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。

100.8k|★★☆☆☆|1周前
插件Agent图像

markitdown

MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器

93.4k|★★☆☆☆|1周前
插件开发框架