在2020年8月,通用磨坊公司开始在商店销售“Just Magical Marshmallows”袋装棉花糖,几乎立刻在各地售罄。父亲几乎无法在eBay以外的任何地方找到它们,除非以极高的价格购买。那时,他有了一个想法:“使用机器人手臂从一盒幸运符麦片中分离出棉花糖。”唯一的问题是他不知道如何去做,而因为学校的事情太忙而无法帮助这个项目。最近,决定接手这个项目,使用Roboflow来完成它。
将向展示两种不同的训练数据集的方法:使用RoboflowTrain或使用TensorFlow Object Detection API。在这两种情况下,都将使用Roboflow平台来构建和标记数据集。使用Roboflow Train,可以轻松地通过一个API端点快速启动模型并进行推理。Roboflow Train是一个一键式AutoML解决方案,这意味着不需要为训练带来自己的模型;这对来说可能不重要。如果控制训练过程的细节并不重要,那么Roboflow Train是最佳选择。
TensorFlow Object Detection API方法,如前所述,允许选择正在使用的模型,并将模型导出为一个冻结的图;这很重要,如果想要一个更亲力亲为的模型训练过程。
许多人不知道,这些棉花糖每个都有描述它们形状的名字:独角兽、三叶草、气球、心形、马蹄铁、彩虹、星星和月亮。将构建一个数据集,其中包含所有这些棉花糖的标签,并且还包括未标记的麦片本身的图像。为了能够使用机器人手臂挑选棉花糖,采取了用平面图片训练数据集的方法,而不是在装有麦片层的碗中。
使用RoboflowAnnotate大约需要半小时来标记包含每种不同类型的棉花糖的数据集。这使得能够生成一个包含增强的数据集版本,以增加相当小的初始数据集的大小。
如果决定不需要对训练过程进行细粒度的控制,那么使用Roboflow Train只需要几个简单的步骤就可以训练、测试和运行模型的推理。
使用Roboflow的一键式自动ML训练,训练结果和部署选项可以测试模型。成功识别训练后的棉花糖。现在可以使用Roboflow托管的多种选项部署模型。他们有大量的代码样本,用于使用他们的托管API。还可以通过Web应用程序对单个图像进行推理。
要按照教程进行操作,需要一个Google账户和Google Cloud Storage存储桶。这个教程将帮助创建一个Google Cloud Storage存储桶。可以按照这个Google Colab笔记本来训练自己的幸运符检测模型(或者使用)。
需要配置一个远程Google Cloud Storage(GCS)存储桶,因为将使用Google的TPUs(张量处理单元)来训练模型,比使用GPU快约15倍。由于数据通过TPUs的移动速度非常快,Google要求所有必要的数据存储在他们的数据中心内,以防止不必要的瓶颈。
下载并安装TensorFlowObject Detection API。TensorFlow Object Detection API是由TensorFlow研究团队创建的一个了不起的API,它使得“构建、训练和部署目标检测模型”变得容易得多,并且是建立在TensorFlow之上的。
下载预训练模型。TensorFlow的Object Detection API GitHub页面有一个“模型动物园”,他们有各种常见的模型架构类型,这些模型是在流行的COCO数据集上训练的。
使用此代码,选择EfficientDet D4 - 一个由Google制作的相对较新的快速准确模型 - 作为模型类型,并从模型动物园下载预训练模型的推理图和管道配置文件。
如果想使用不同的模型,只需使用在模型动物园中找到的链接更新model和model_config变量。
从Roboflow下载注释的数据集作为TFRecord。TFRecord是保存结构化数据的格式,在这种情况下,是一个带有图像注释的数据集,用于TensorFlow训练。
按照以下步骤操作时,使用下图作为参考,将数据集导出为TFRecord。然后将代码最后一行中的链接替换为托管的数据集URL。
现在已经下载并安装了所有需要的文件,需要将所有文件移动到正确的位置,指定训练变量,并将文件上传到Google Cloud Storage。
设置文件位置的培训管道。当上传管道文件时,保存为model.config,对象检测API需要知道从哪里获取数据,因此预先声明将在Google Cloud Storage存储桶中上传每个文件的位置。
设置培训变量。在训练网络时,可以选择指定一些培训变量,无论模型类型如何。在这种情况下,想要指定num_steps和batch_size。训练期间的步骤数量代表了程序为给定批次调整模型权重的次数。批次的大小是模型完成一步时给出的图像数量。
除了上述设置的培训变量外,还需要告诉模型数据集有多少个类别,这是通过函数get_num_classes动态设置的,以便此代码可以轻松地重用于不同的数据集,或者如果想只对某些棉花糖类型进行分类。
批次大小不仅仅是一个任意数字,因为它取决于所使用的处理器类型;TPUs可以处理比GPU更大的批次大小,因此如果在GPU上运行此代码,需要将批次大小降低到大约8。
使用特定文件位置和培训变量配置管道配置文件。现在已经将所有重要信息保存为本地变量,现在可以将这些变量写入model.config文件,以便可以将数据上传到Google存储桶。
这只是上传数据集文件夹,其中包含所有的图片和注释保存为TFRecord;模型文件夹,其中包含从TensorFlow的GitHub存储库下载的模型;以及刚刚完成写入的模型管道配置文件。
这个过程仍然需要大约4-5个小时,即使使用TPU。它将定期写入检查点,但建议让它全部运行,因为之前将步骤数量限制为10,000。
将模型检查点保存为冻结图。现在已经训练了模型,需要将最终的检查点转换为冻结图,以便实际上可以使用模型进行预测。
将模型保存到GCS。现在已经将冻结图复制到Google Cloud Storage,即使关闭了当前的Google Colab笔记本,也将能够访问它。稍后,将从Google Cloud Storage下载冻结图文件到一个新的笔记本中进行推理。
此外,这些文件也可以从Google Cloud Storage的网站下载,如果想在计算机上或在像OAK-D Lite这样的边缘处理器上本地运行推理。
由于运行整个培训脚本需要时间,创建了另一个Colab笔记本来运行推理,如果想使用冻结图进行与仅叠加图像上的边界框不同的事情。可以使用这个Colab笔记本进行测试部分。这个笔记本中的大部分代码都已解释,因为它与前一个笔记本中的代码相同,或根据TensorFlow的演示笔记本进行了修改,并附有内联代码解释。
要尝试在自己的训练模型上使用,只需要将第一个代码单元中的project_name变量替换为自己的项目的项目名称,并将第5个代码块中的bucket变量替换为自己的项目名称。同样,确保model变量与训练数据集的模型相同。一旦进入“在根目录上运行上传图像的检测”步骤,上传保存在本地的.jpg照片到根目录,以便代码运行推理。