Node-RED是一个用于可视化编程的平台,它允许用户创建工作流,这些工作流被称为“flows”,它们能够将工具、代码和APIs集成在一起。通常需要编写代码才能完成的应用和工作流,现在可以通过Node-RED以更少的努力和时间,以可视化的方式完成。
在本文中,将探讨Node-RED是什么,它为什么有用,以及如何与Roboflow一起使用,以创建模块化、可扩展且直观的计算机视觉工作流。通过本指南的结束,将拥有一个工作的Node-RED流程,该流程能够在图像中定位车牌,裁剪车牌,将车牌传递给字符识别模型,并将字符转换为文本。
Node-RED允许以模块化的方式轻松地将计算机视觉任务,如目标检测和分类,集成到各种工作流程中。例如,将使用车牌检测和识别,灵感来自于。即使在创建了用于检测车牌的模型之后,如果想在现实世界中实现它,需要从相机获取输出,将其发送到车牌检测模型,处理输出,分离图像中的每个车牌,对图像中的每个车牌运行字符识别(OCR),然后处理输出以获取车牌。
Node-RED允许使用直观的块和线连接器以可视化的方式开发此过程。更改就像交换块或更改配置一样简单。如果用代码编写,它看起来会像这样:
// 一个快速的代码示例,展示等效任务的样子。
// 如果在Node-RED中这样做,它看起来会像这样:
让尝试一下。对于这个示例项目,将使用来自Roboflow Universe的。
如何使用Node-RED与Roboflow
步骤1:安装Node-RED。Node-RED的最新安装信息将在和上,但这里是基础知识。确保已安装Node.js和NPM。然后运行:
npm install -g node-red
步骤2:开始使用。现在已经安装了Node-RED,让开始设置。将介绍Node-RED的基础知识,然后如何使用roboflow-red。
Node-RED通过链接在一起的块,称为“nodes”,帮助构建“flows”。几乎所有的节点至少有一个输入和一个输出。有例外,比如用于启动流程的节点。可以以多种方式触发流程开始。可以是手动按钮(inject节点),网络事件,文件更改(watch节点),或其他流程中的事件(例如错误,完成等)。
一旦启动了流程,可以通过从输出端(右侧)拖动线条到另一个节点的输入(左侧)来连接其他节点。Node-RED流程在消息系统上工作。所有节点将提供消息,并沿着流程移动,被携带,修改或替换。
调试是任何编程语言中的重要概念,这也适用于Node-RED。可以在任何有帮助的地方添加调试消息,它将显示在侧面的调试菜单中。
Node-RED有几个预安装的原生节点,但Node-RED的实用性在于可以添加到其中的扩展,如roboflow-red。可以通过进入管理调色板菜单来安装扩展。然后在安装标签中,可以搜索包并点击安装。
现在已经了解了基础知识,让开始使用roboflow-red。
可以使用roboflow-red将计算机视觉集成到流程中。它在Node-RED提供的现有节点集上添加了几个节点。
主要的是推理节点,它在Roboflow模型上运行推理。它的工作原理类似于托管推理API,并且与所有模型类型兼容,并将返回一个预测数组,可以使用内置的split节点(如果想的话)来使用。
还有一个上传节点,允许将图像上传回项目以实现主动学习。将在本文后面更深入地讨论这个问题。
可以像安装任何其他Node-RED扩展一样安装roboflow-red,方法是进入右上角的菜单,点击管理调色板,在安装标签中搜索roboflow-red,然后点击安装。
构建工作流
让开始构建流程!正如之前提到的,将使用车牌检测和识别作为示例。假设想要跟踪哪些汽车停在特定位置。
在Node-RED中要做的第一件事是找到一个合适的启动机制。将为示例使用手动“inject”节点,然后使用“read file”节点读取测试图像。
如果使用image-tools模块中的viewer节点,可以看到当前的图像是这样的。可以通过搜索node-red-contrib-image-tools来安装它。viewer节点是可选的调试步骤,但稍后将需要该包。
然后将使用Roboflow从图像中检测车牌。roboflow-red推理节点附加到先前创建的read file节点。
要使用该节点,需要导入API密钥和模型ID。还可以在此处添加最小置信度和最大重叠配置。
一旦有了检测结果,可以裁剪原始图像以获取车牌图像。与托管推理API不同,它为检测的中心产生坐标,roboflow-red为边缘(x1,x2,y1,y2)和中心产生坐标(center_x和center_y)在msg.payload中,以使与其他节点的集成更容易。
目前,模型的结果在一个单独的数组中。需要将它们分割成单独的消息,以便可以分别处理每个预测。为此,将使用原生的split节点。
现在,每个预测都在自己的消息中沿着流程移动,可以裁剪图像,以便可以在其中检测字符。将使用image-tools的image节点。
要配置该节点,需要确保函数设置设置为裁剪,输出设置为base64,以便稍后可以将其发送到OCR服务。还需要确保x,y,宽度和高度设置为先前消息中的正确变量。
在这里,可以添加另一个viewer节点来检查工作流的进展:最后,可以进行最后一步,运行OCR或光学字符识别,以获取车牌上的数字和字母。将使用OCR.space API来完成这一步骤。这是此过程中需要使用function节点编写少量代码的部分。
const {ocrSpace} = OCRSpace
const response = await ocrSpace(msg.image, { scale: true, OCREngine: 2, detectOrientation: true})
if(response.IsErroredOnProcessing) throw Error(response)
msg.payload = response.ParsedResults[0].ParsedText.replace(/[^a-zA-Z0-9]/g, '')
return msg
将function节点连接到其余部分,并添加一个debug节点以查看输出是什么。就是这样!从车牌图像到文本仅用了六个节点。
来自最终debug节点的调试消息显示在侧面的调试菜单中。
主动学习
更进一步,还可以在Node-RED中实现主动学习。主动学习是使用现实生活示例作为训练数据来进一步改进和迭代模型。
可以在任何想要上传图像的地方添加roboflow-red的upload节点。有几种实施主动学习的选项。
一个选项是将其添加到现有的图像预测工作流中,过滤图像,如那些具有新位置,新时间或低置信度的图像,并上传这些图像:
另一个选项是使用用户输入,如node-red-dashboard的按钮:
然后可以回到Roboflow并根据现实世界示例创建数据集的新版本。
鼓励使用roboflow-node将计算机视觉集成到工作流程中,并查看GitHub仓库示例文件夹中的完整“flow”JSON模板!
这个相对简单的用例可以扩展到查找车牌,让知道不熟悉的汽车等。使用Roboflow与Node-RED的最佳部分是,即使在这个相当小众的示例中,它也可以被拿走并轻松修改以适应任何用例。