颜色传感器原型:从对象检测颜色名称
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 3 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
应用和在线服务
|
关于这个项目
这是全文的简化版,为简单起见,便于本项目的复制。也可以在我的博客上查看此项目以了解更多实现细节。
本文分为右侧菜单中列出的部分。如果您想跳到技术细节,请查看右侧的目录,或在 GitHub 存储库中下载代码。在继续阅读之前,请查看项目视频以了解该项目的真正含义:)
项目概况
类似于人眼的色觉,并且基于光,RGB 模型包含超过 1600 万种颜色 , 排列在 3D 空间 ,其中分量 R(红色)、G(绿色)和 B(蓝色)的整数值,范围从 0 到 255,构成了该空间的坐标。从该模型中,使用与光相关的电子元件和机器学习机制执行颜色检测和识别;它本质上是 RGB LED 和 CdS 单元(光传感器,或 LDR)的组合,两者都与环境光隔离 .这些组件分别发射和感应从特定颜色的物体反射的每种光(红色、绿色和蓝色)的强度。
多层感知器
多层感知器 (MLP) 是人工神经网络的前馈架构,具有输入(非神经)层、隐藏层和输出层。该网络通过反向传播算法进行训练,执行监督学习(通过示例学习)。
对于这个颜色传感器,上图所示的神经网络接收 3 个输入(RGB 值) , 有一个隐藏层,有 6 个神经元 和一个具有 10 个神经元的输出层 - 回想一下:对于二值化输出,输出层必须具有相同数量的类(在本例中为颜色)。对于本教程,网络已经过训练并且能够识别颜色:)。有关训练步骤和用于训练的示例数据集的更多详细信息,请查看我博客中的完整帖子。
颜色识别
可以使用我们训练有素的 MLP 网络执行此任务。它允许对空间可分离模式进行分类和识别 - 在这种情况下非常有用。在其训练步骤中,网络将区域映射到下图所示的 RGB 颜色空间中,以便每个被超平面隔离的区域代表一种颜色 .因此,每个新的 RGB 颜色模式(表示为 3D 点)都属于特定区域,被归类为各自的颜色。
图>为了使用 MLP 进行泛化以很好地识别 RGB 模式,必须将训练集(具有上述 3D 空间所需输出的颜色示例)呈现给网络以进行训练步骤。此项目中使用的训练集可在项目的 GitHub 上获得 存储库。如果您热衷于神经网络,请继续阅读本节并查看我开发的这个 Playground,这样您就可以使用数据集自己训练网络并在代码中使用它:)。否则,跳到实现细节 .
泛化会发生在训练集所包含的领域,所以注意最小值和最大值 空间的每个组成部分!不要用这个域之外的模式输入网络,否则输出不会正常工作。
数据集(所有示例)包含 75 个颜色模式实例,范围从 0 到 1。最初的范围从 0 到 255,这些实例通过简单地将每个值除以 255 来重新缩放,例如 0 <=x1、x2、x3 <=1从数据集中可以看出,需要指出的是,输出层只有一个神经元必须输出1,而其余神经元必须输出0。由于经过训练的网络输出浮点值,后处理如下:
其中 yi 是第 i 个神经元的输出,max(y) 是最大的输出值。实际上,输出最大的神经元输出1,其余神经元输出0。就这么简单。
电子电路
由物体产生的所有检测过程都发生在电子电路中,包括在 Atmega328 中运行的计算活动,它连接在 Arduino 板上。从下面的示意图检查接线。
图>代码遵循上述使用公共阳极的方案 RGB LED。也就是说,检查您的 RGB LED 是否也是共阳极,否则只需反转代码中的逻辑 .
另一个重要的细节是我在 RGB LED 上只使用了一个电阻。由于一次点亮一种颜色,我将电阻器放在共阳极中,电阻器的平均电阻应该 使用阴极 - 这是懒惰的,我知道,我很抱歉!当我去购买项目部件时,他们并没有我需要的一切 - 但是使用正确的电阻器和阴极非常重要,以便使收集的 RGB 值与计算机中的 RGB 值保持一致。我的做法还不错,因为图案没有扭曲;它们与我们在计算机屏幕上看到的颜色(以及人眼捕捉到的颜色)不同。
从原理图中可以看出RGB LED 和CdS Cell 之间的邻接关系。那是因为它们必须与环境光隔离(旧的黑色胶片管是完美的选择),因此可以执行校准(在编程中解释)和识别。 查看项目视频,了解此类组件与环境光隔离。
色彩理论
电子电路执行的颜色感知基于颜色理论概念。由于(尚)不涉及镜头,只应考虑具有不透明(和哑光)材料的物体 ,避免处理LED的镜面反射。另一方面,漫反射是用光进行颜色检测的关键。入射光在不规则表面反射,不会产生破坏 CdS 细胞功能的发光效果。
回到实际的颜色理论,当(某种颜色的)光到达一个物体时,它会根据该物体颜色的特性进行反射。例如,到达黄色物体的红光将根据该黄色的成分中存在多少红色而被反射 - 请记住,我们正在谈论光! - 所以预计会有很多红光被反射,当我们想到黄色(基本上是红色和绿色)的 RGB 组合时,这是有道理的。然而,当蓝光到达黄色物体时,由于颜色成分中蓝色的含量较低,预计不会有强烈反射。
考虑加色系统,其中白色和黑色分别代表每种颜色的存在和不存在(更多细节这里 ),可以测量(使用 CdS 单元)来自 RGB LED 的每种光线的最大和最小反射,这些反射将到达有色物体。也就是说,可以对电路中涉及的电子元件进行校准。这是获得检测保真度以及确保稳定检测模式(避免异常值)的另一个关键 - 这是一个金技巧 :校准后,尽量(努力!)不要移动或触摸电子元件(特别是当它们放置在面包板中时),也不要移动或触摸您正在使用的部件(您必须使用)以将组件与环境光隔离。
US_plugins_acrobat_en_motion_education_colorTheory.pdf
编程
对于校准和识别,一旦有色物体暴露于 RGB LED 和 CdS 单元,颜色传感器就会执行三个迭代。在第一次迭代中,红光击中物体,程序等待 CdS 细胞稳定其传感;然后读取模拟输入并存储红光的反射。该程序对绿色和蓝色再重复两次。颜色理论中显示的图很好地直观地解释了这个迭代过程。
关于校准,上述迭代过程执行两次:一次用于黑色,一次用于白色。正如颜色理论中所解释的,这是为了检测最大值和最小值 - 最初从 接近零 到 接近 1024 ,根据阅读分辨率 - 红色、绿色和蓝色光的反射,获得真实范围以正确重新缩放到区间 [0, 255](用于信息目的)和 [0, 1](馈送神经网络的实际输入) ).
等待时间 建立光传感器的读数可以变化 根据每个电子元件,因此最好给出良好的延迟以确保稳定的感应。在我的例子中,我给出了 500 毫秒的延迟,但值得一开始使用更大的值,然后减小它直到出现不稳定行为的边缘。
在检测中,收集到的 RGB 值(范围从 0 到 1)提供给 MLP,执行实际的颜色识别。对于在 Arduino 中运行的 MLP,我使用的是 Neurona - 我编写的一个库,用于在 arduino 中轻松使用 ANN,可以使用库管理器从 Arduino IDE 安装。也检查这篇文章 了解更多详情。
如前所述,网络已经经过训练,可以在项目代码中进行检测。它使用我开发的 Playground 进行训练,将调整后的权重嵌入代码中,以便 Neurona 库使网络准备好运行。
测试
为了提供信息,我们从数据集中提取了一些颜色来进行一些识别测试:
图外的数字用于识别,图内的数字表示错误分类,指的是哪些颜色被分类。这些颜色是用喷墨打印机在亚硫酸盐纸上打印的——请查看本文开头视频中的小纸方块——所以对象 由不透明材料组成,适合颜色检测。
代码
颜色传感器原型
发送到 arduino 的代码位于 colorSensor 文件夹中。确保您的电子电路是根据提供的原理图构建的,并且 Neurona 库已正确安装(您可以从 Arduino 库管理器安装)。https://github.com/moretticb/ColorSensor/示意图
根据 LCD 显示屏上的说明使用按钮制造工艺