“开水白菜”——程序应用中的上等国宴

简介: “开水白菜”——程序应用中的上等国宴

前言

  开水者,场景也;白菜者,算法也。在工业检测界业务视觉的应用场景往往较为单一,没有智慧城市与自动驾驶业务端场景复杂,但缺有独特的业务需求(精度往往要求比智慧城市要高)在本文中我将为大家举一简单工业检测界的业务,为大家展示多种“烹饪”方式。请诸位服飨!

场景介绍分析

  我们可以简化下业务场景:有五种颜色的物体,分别在传送带上被运输,我们需要做到的事情是将通过传送带上的物体的颜色检测出来,并对被检测颜色的物体数量+1操作。

  由于是真实的场景,那么必然是会存在一些让人意想不到的情况出现,比如传送带是整体是绿色的,但是这条 传送带是首位焊接一起的,在焊接部分是呈现黑绿色,传送带比较光滑,会发生镜面反射现象。对于被检测的物品会存在部分被检测物品的出厂log会在摄像头正下方,被检测物品有塑料膜包裹,由于塑料膜表面比较光滑,所以被检测物体也会出现镜面反射。

算法烹饪

  对上述业务场景明显可以得到是一个很【分类】任务我们按照深度学习的范畴来划分可以划分为【有导师监督】与【无导师监督】。也可以不采用深度学习的方式完成业务场景下的任务。下面我将为大家带来这两个方向的“烹饪”技法。

无导师监督

  在无导师监督学习中最经典的算法莫过于聚类算法了(k-means算法),使用k-means进行二分类对业务场景的应用流程如下:

image.png

理想中的检测结果可如下:

  1. 【底色,底色】:传送带上无物体,统计结果不变;
  2. 【底色,非底色】:传送带上有物体,且物体颜色为检测颜色,被检测颜色物体个数+1;
  3. 【非底色,非底色】:传送带上有物体,且物体颜色为检测色,被检测颜色物体个数+1;

根据上述流程我们可以发现,我们需要处理的问题有:

  1. 物体颜色不可与传送带颜色RGB范围值过于接近;
  2. 物体之间的颜色RGB范围值不可过于接近;
  3. 传送带自身的颜色RGB范围不应有太大的变换;
  4. 物体本身印刷的log颜色会干扰检测结果,应避免;

有导师监督

  有导师监督的深度学习算法这个里面涵盖的类别就较多了,在这里我们继续细分为【图像分类】和【目标检测OR分割】

图像分类

  分析业务场景如果我们采用图像分类实现传送带上物体的检测,由于物体会持续性出现在画面中,所以需要划定ROI区域进行识别,在构建数据集的时候,考虑到后期可能会存在物体颜色于传送带颜色接近,故而需要对传送带上没有物体的时候进行采样,并对传送带上存在物体的时候进行采样。流程如下:

image.png

理想中的检测结果可如下:

  1. 当ROI区域没有目标的时候,返回的最大置信度的结果为空,被检测物体个数不变;
  2. 当ROI区域存在物体目标的时候,返回的最大置信度的结果为实际检测到的物体颜色,被检测物体个数+1;

  根据上述流程我们可以发现,我们需要着重处理的问题为:数据清洗阶段无法很好把控物体进入ROI区域的临界线会导致存在物体与不存在物体的边界模糊不清

目标检测(分割)

  由于在图像分类任务中我们无法很好的把握物体进入ROI区域的边界,导致检测结果会出现一些不友好的地方,我们可以考虑使用目标检测类,这里我们仅以yolo为例子进行分析流程:

image.png

理想中的检测结果可如下:

  1. 当没有物体在传送带上的时候,没有检测框,统计物体数据不变;
  2. 当传送带上存在物品时但物品坐标与ROI坐标形成的区域没有交集时,只显示当前检测物品颜色,不进行物品数量+1;
  3. 当传送带上存在物品且物品坐标与ROI坐标形成的区域存在交集时,对检测的物品颜色显示并对该颜色的物品个数+1;

  采样目标检测虽然可以很好的实现对传送带上的物品进行检测并统计,此时具备一定的泛化能力,但这种方法也不是十分友好,例如下“不友好的地方”:

  1. 数据标注耗费时间精力;
  2. 训练网络需要耗费精力;
  3. 更改需求后,例如新增物体时,数据需要采集并训练;

非深度学习

  对于完成某一目标的识别检测,不妨我们可以跳出机器学习的圈子,我们难道忘记了做当前做车牌识别课程设计时采用的模板匹配算法么?在OPENCV中集成了模板匹配算法,大家可以自行Google一下稍加调试便可实现一个简单的目标匹配算法。这里我简单概述一下目标匹配算法的流程:

image.png

理想中的检测结果可如下:

  1. 当画面中没有物体时不显示被检测信息;被检测物体数据不变;
  2. 当出现物体且进入指定较大的ROI区域内时,对检测的物品颜色显示并对该颜色的物品个数+1;

  在使用非深度学习时,我们通过流程图可以明显得到流程足够精简,我们不用花费很多精力便将任务初步解决了,虽然使用模板匹配也是不十分优秀的解决方案,也是存在一些让人诟病的地方。例如:

  1. 无法很好的适应被检测物体的大小变换
  2. 当被检测物体被log遮挡过多的时候,检测结果会出现异常

  当然上述让人诟病的地方也不是不可被解决,例如我们可以摄像头上当安装一激光感应模块,当摄像头正下方出现物体的时候,传递相应的电平信号进行分析是否有物体通过,模板匹配法充当物体颜色检测模块使用,会让我们更方便处理业务,这样我们在收集数据样本时不必像深度学习那般繁琐,对于添加新颜色物体的时候,模板匹配库也是较为轻易的实现。

结束语

  一个小小的工业端的物体颜色检测并统计问题,在本文中我提出了两大类解决办法,一类是深度学习,另一类是非深度学习。同时也为大家带来了相应的解决流程,分析了各自的优劣,希望大家可以在处理日常的业务的时候,能够发散思维,不要局限于某一类方法中,不迷信于深度学习方法,多尝试一些其它方法,有时候会有意想不到的结果。

  尤其对于新入行的人来说,面对新的业务时逐步剖析这个问题面临的问题,去思考如何解决这个问题,有哪几种方式解决,比对各种方法的优劣,方便后期项目中的选择,为自己的“烹饪”技巧添砖加瓦。

白菜易,开水白菜难!


相关文章
|
小程序 前端开发 程序员
【小程序】网络数据请求
【小程序】网络数据请求
213 0
【小程序】网络数据请求
|
移动开发 小程序 开发者
初步了解小程序
初步了解小程序
162 0
初步了解小程序
|
算法
循序渐进写程序
【来信】   老师,我现在是初学编程,感觉自己的编程能力比较弱,如果做一道算法题,有时候需要两三个小时,做出来之后还没有答案上给的算法好,应该是练习比较少,我是应该多看别人写好的算法,然后多敲代码好呢,还是尽量自己写,写不出来再看答案好呢(感觉自己写好浪费时间) 【回复】   我们的学习,要讲究循序渐进。你出现这种情况,应该是做的题目中,包含了太多对你而言是“新知识”的
989 0
|
C++ 小程序
C++ 实用的小程序
1. 打开test_ids.txt 将里面的东西添加"1_",然后另存为test_ids_repaired.txt   1 #include 2 #include 3 #include 4 #include 5 #include 6 using name...
951 0
文本查询程序
我们实现一个简单的文本查询程序。我们的程序允许用户在一个给定文件中查询单词,查询结果是单词在文件中出现的次数及所在行的列表。如果一个单词在一行中出现多次,此行只列出一次。 #include #include #include #include #include #include #...
945 0
|
存储 小程序 .NET
一个小程序引发的思考
既然是一个小程序引发的思考,那么我们就先看看这个小程序,看看他有何神奇之处: namespace ConsoleApplication1 { class Program { static void Main(string[] args) ...
837 0
|
C++ 存储
C++电话本程序
/* C++电话本程序 */ /* 1.可实现txt文件的读取和保存。 */ /* 2.可实现联系人的增添、删除和修改。 */ /* 3.可实现通过联系人查询号码。 */ /* 4.可实现通过号码查询联系人。 */ /* 5.可实现全部联系人的显示。 */ /* 运行环境vs2010||codebl
996 0
程序30和程序31
【程序30】题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。 $marr = array(1,3,5,7,9,11,13,15); function setPosArr($num,$arr){ for($i=count($arr);$i>0;$i--...
641 0
程序24和程序25
【程序24】 题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。 $num = rand(1,99999); strlen($num); $arr_num = str_split($num); array_reverse($arr_num);strlen() 返回给定的字符串的长度。
561 0