无规则采集器列表算法( 用Python写出来的分类程序分类,请请到这里围观)
优采云 发布时间: 2022-03-30 11:27无规则采集器列表算法(
用Python写出来的分类程序分类,请请到这里围观)
唐旭编译自Jacques Mattheij的博客
量子生产 | 公众号QbitAI
本文的作者 Jacques Mattheij 从小就是乐高迷。在接触乐高的过程中,他发现了这样一个现象:不同类型的乐高售价不同。例如,精装乐高的价格约为每公斤40欧元,散装乐高只需10欧元;而一些限量和稀有的版本和乐高套装可以以每公斤 100 欧元的价格出售。
出于这个原因,有些人甚至大量购买新的乐高积木和精装,然后将它们重新分类以获得更高的价值。
然而,手动分类所有这些奇怪的乐高似乎不是一个好主意。所以有一天,Mattheij 突发奇想,决定尝试用一台机器来做这件事。他做了这个实验,在各种拍卖会上抢购了整个车库的乐高积木网站(在回来的路上丢了一辆卡车)。
这是 Mattheij 在他的个人 网站 上发表的第二篇文章,关于他尝试在软件中对这堆乐高积木进行分类的方法;首先,他介绍了硬件方面的准备和困难。
让我们跳过买几辆乐高汽车,安装*敏*感*词*,传送带等,看看他是如何编写这个分类程序的。如果您对硬件部分更感兴趣,请访问:
以下是从 Mattheij 的第二篇文章中编译的:
概述
所有软件都是用 Python 编写的。我自己不是 Python 专家,但幸运的是,我不需要花费一生的时间就能弄清楚。Anaconda 是一个非常有用的 Python 分发工具。最初,为 Python 设置虚拟环境是解决各种依赖项和版本问题的噩梦。对我来说,Anaconda 帮助很大。
有一个主要部分是关于乐高分类软件的。例如,通过*敏*感*词*实现的图像采集 系统:
扫描仪/“图像缝纫机”
采集器完成工作后,图像会被发送到“图像缝纫机”(将两个图像拼接在一起),后者的主要任务是两件事:一是确定传送带的多少一块乐高已经移动(见视频中的波浪线),第二个是更新一个新扫描的内存图像。将两块乐高分开的“缝纫机”将它剪下来,然后附上下一个扫进去的乐高图像。
以上都是用OpenCV写的。
扫描仪和“图像缝纫机”完成工作后,结果如下所示:
分类
这是这件事真正有趣的部分。我已经做过很多次了,现在我厌倦了。
OpenCV 原语
我选择的第一种方法是使用 OpenCV 原语,特别是其中的轮廓匹配和圆检测。只要乐高积木的种类不多,这种方法也能保证比较好的识别准确率。结合一些简单的元数据(如一块乐高积木的长度、宽度和高度),它可以分辨出所有基本乐高积木之间的区别,但仅此而已。
贝叶斯
换句话说,让我们试试贝叶斯。贝叶斯分类器很容易理解:你设计了一堆特征,基于这些特征构建一个检测器,然后创建一个测试集来确保你的检测器按照他们告诉你的那样工作,然后你就完成了,你尽你所能来提高系统识别这些特征的能力。你将尽可能大的一组测试图像扔到系统中并运行它来优先考虑你设置的特征,然后确定每个特征的权重——如果一个特征出现,它将被检测为“正确”,如果该特征没有出现,则该特征被检测为“假”。
我使用这种方法构建了一个基于以下特征的分类器:
可能还有其他功能......我已经研究了一段时间。制作“螺柱检测器”可能看起来微不足道,但并不是那么简单。您需要记住,螺柱可以在任何方向,有可能被识别为螺柱但不是螺柱的小部件,块可能倒置放置,或者它们可能背对相机。几乎每一个功能都会出现类似的问题,最终你必须花费大量的精力去调整,才能让系统达到你满意的状态。但是,一旦您完成了上述所有操作,您将拥有一个分类器,可以准确地检测出许多不同类型的构建块。
即便如此,该系统还远非完美:它太慢了。每次向其中添加新类别的块时,您都必须做更多的工作来确定块属于哪个类别。计算机花费大量时间采集元素,形成一个不断扩展的积木形状库,从中得出最佳匹配。该系统的准确性令人印象深刻,但最终我放弃了,因为它太慢了(它跟不上传送器的速度)。
淘汰
剔除系统使用与之前方法相同的分类标准。按效率递减规则排序,可以快速剔除不规则物体,剩余部分得到高效处理。软件第一次可以跟上全速运行的机器。
但是这种方法也有几个问题:一旦删除了一个构建块,它就永远不会回来——但删除可能是错误的。事实是,这种“二进制”的方式确实限制了系统的准确性,你需要一个非常大的数据集来运行这个系统,这会大大降低整体性能。
该系统通常会在最后剔除所有内容 - 因此它是无用的。因此,校正精度的成本很可能会抵消其速度优势。
树分类
这是流感的想法。我只是简单地按照《猜动物》游戏中的台词做了一棵小树。每次我向它添加新东西时,树都会找出功能的不同部分并在上面放一个叉子。输入新块。与剔除方法相比,这种方法有两个非常重要的优点:一是一个块可以用树上的多个点来表示,有助于提高准确率;第二个是这个系统与以前的方法相比的速度。快如闪电。
但是这种方法也有明显的缺点:一开始你需要手动创建所有这些特征,而且即使你能找到足够清晰的特征,也只是用基本的OpenCV写一个特征检测器,这个过程太繁琐了……很快,它会变得更糟,特别是因为 Python 是那些相当慢的语言之一,如果你的问题不能用 NumPy 或 OpenCV 库调用来表达,它会在速度上吃掉很大的损失。
机器学习
我终于写了这个!经过将近六个月的上述所有混乱折磨,我已经受够了。我意识到编写一个涵盖所有类型乐高积木的有效分类器是不可能的。当然,这让我沮丧了一段时间。
我决定咬紧牙关。我将目光投向了机器学习,并以一种更严肃的方式进行了研究:接下来的几周我研究论文并学习有关神经网络的各种有趣的东西。
我在 1980 年代曾短暂接触过神经网络,现在我看到该领域从那时起发生了很大变化。
经过大量研究,我最终决定选择 Google Brain 团队开发的 TensorFlow。但是真正学会使用它也需要一个过程,而且我一开始就卡住了一段时间,不知道该做什么最好。
大约两个月前,一位名叫 greenpizza13 的 Hacker News 用户向我推荐了 Keras,这样我就可以直接使用 TensorFlow,而不必大费周章(Anaconda 可以帮上大忙),这也直接把我引向了 Jeremy Howard 和 Rachel Thomas 的真棒机器学习入门课程(课程链接:)。
结果,在几个小时内(是的,你没看错),我得到的结果超过了我过去几个月练习的所有解决方案;几天之内,我就让分类系统实现了真正的实时工作,而不是智能地简单地分组。再说一句:大约 2000 行特征检测代码和另外 2000 行测试和粘合代码可以用不到 200 行的 Keras 代码代替,无论是在训练还是推理方面。
与其他手动编码特征的方法相比,机器学习在速度和易于编码方面的优势非常简单。虽然不如树状机制快,但准确率比它不知道的要高得多;同时,您不必为那些奇怪的积木编写代码,系统可以自动完成。
下一个麻烦是我必须拿出一个足够大的训练数据集,以确保系统可以执行超过 1000 个分类。起初,这似乎是一项不可能完成的任务,我不知道如何获得足够的图像并在可接受的时间内手动注释它,即使在最好的情况下,以获得足够大的图像我需要 6 个月使系统启动并在理想状态下运行。
最后我想通了:没关系。大多数时候我可以让机器自己注释图像,我所要做的就是修复它的错误。随着系统运行,错误也越来越少。这种方法非常迅速地扩展了训练图像集。第一天,我手动标记了 500 个区块;第二天,机器将数量增加到了 2000 个,当然,其中大约有一半是错误标记的——这 2500 个块成为了接下来三天的训练。基础数据,最后机器标注了4000多块乐高,90%正确!我只需要修复 400 个错误的。在两周结束时,我已经有了一个收录 20,000 张图像的数据集,这些图像都被正确注释了。
这还不够,有些类别非常不具代表性,所以我需要增加这些类别中的图像数量,我应该将这部分拉出来单独在机器上处理 - 不需要更多更正,它们将被标记相同。
自从上周发布我的第一篇文章以来,我得到了很多帮助,我要特别感谢两个人。一个是Jeremy Howard,他帮我填补了知识上的空白,没有他的帮助,我将无法开始;第二个是 Keras 的作者 Francois Chollet,他为我提供了他的自定义版本的 Xception 模型,大大加快了训练过程。
训练现在处于速度瓶颈,即使我的 Nvidia GPU 足够快,我仍然认为它很慢。生成一个新网络需要几天的时间,而且在一台有 4 个 GPU 的机器上,这真的不是很快……我是一个非常没有耐心的人,但我让它解决了。
在某个时候这些软件和数据会开源,但在那之前,我还有很长的路要走。
当软件真的有能力整理这堆松散的乐高积木时,这一天就会到来。当我用完这堆乐高积木后,我会便宜地处理掉它们。
最后,这是我最初想法的概念图,全部在 LEGO 中:
招聘
量子比特正在招聘编辑记者、运营、产品等岗位,工作地点在北京中关村。相关详情请在公众号对话界面回复:“招聘”。
还有一件事…
今天的AI世界还有什么值得关注的?在QbitAI公众号对话界面回复“今日”,看看我们采集到的全网AI行业和研究动态。补充~