提交 783c40ce 编写于 作者: M MaoXianxin

本周AI热点回顾:傅里叶变换取代Transformer,GPU上快7倍、TPU上快2倍;DeepMind新模型自动生成CAD草图

上级 bd0a10d6
# 用OpenCV实现条形码识别
# 本周AI热点回顾:傅里叶变换取代Transformer,GPU上快7倍、TPU上快2倍;DeepMind新模型自动生成CAD草图
**每天会对文章进行更新,每次更新一篇,采用阅后即焚模式,且看且珍惜,喜欢的话帮我点个star哈**
最近,我们为OpenCV贡献了一维条形码识别模块,代码收录在:[https://github.com/opencv/opencv_contrib/tree/master/modules/barcode](https://github.com/opencv/opencv_contrib/tree/master/modules/barcode)
## 傅里叶变换取代Transformer自注意力层,谷歌这项研究GPU上快7倍、TPU上快2倍
我们收集的数据集(数据集地址:[https://github.com/SUSTech-OpenCV/BarcodeTestDataset](https://github.com/SUSTech-OpenCV/BarcodeTestDataset),共250张条码图片)上进行了测试,我们的识别算法正确率达到了**96%**,速度为**20ms**每张图像。作为对比,我们也测试了ZXing在该数据集上的表现,其正确率为**64.4%**,速度为**90ms**每张图像
来自谷歌的研究团队表明,将傅里叶变换取代 transformer 自监督子层,可以在 GLUE 基准测试中实现 92% 的准确率,在 GPU 上的训练时间快 7 倍,在 TPU 上的训练时间快 2 倍
注:测试速度不包含初始化以及读图时间。同时,我们的算法是C++实现,ZXing是Java实现。另外,对于用图片数据集进行的测试,ZXing99%的时间是在做彩色图到灰度图的转换
Transformer 自 2017 年推出以来,其架构就开始在 NLP 领域占据主导地位。Transformer 应用的唯一限制之一,即 Transformer 关键组件的巨大计算开销–一种自注意力机制,这种机制可以根据序列长度以二次复杂度进行扩展
本文将对此模块的原理和使用方式进行介绍
基于此,来自谷歌的研究者建议用简单的线性变换替代自注意力子层,该线性变换「混合」输入 token,以较小的准确率成本损失显著的提高了 transformer 编码器速度。更令人惊讶的是,研究者发现采用标准的、非参数化的傅里叶变换替代自注意力子层,可以在 GLUE 基准测试中实现 92% 的 BERT 准确率,在 GPU 上的训练时间快 7 倍,在 TPU 上的训练时间快 2 倍
## 条形码介绍
![](imgs/1.png)
条形码是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符,如下图所示:
论文链接:[https://arxiv.org/pdf/2105.03824.pdf](https://arxiv.org/pdf/2105.03824.pdf)
![](imgs/1.png)
该研究的主要贡献包括:
## 基于方向一致性的条码定位算法
- 通过用标准的非参数化傅里叶变换代替注意力子层,FNet 在 GLUE 基准测试中实现 92% 的 BERT 准确率,在 GPU 上的训练时间快 7 倍,在 TPU 上的训练时间快 2 倍。
- 仅包含两个自注意子层的 FNet 混合模型在 GLUE 基准上可达到 97%的 BERT 准确率,但在 GPU 上的训练速度快近 6 倍,而在 TPU 上则是 2 倍。
- FNet 在「Long Range Arena」基准评估中,与所有的高效 transformer 具有竞争力,同时在所有序列长度上拥有更少的内存占用。
根据条形码方向趋于一致的特点,我们可以将图像分块,通过计算每个块内**梯度方向的一致性**,来滤除那些**低一致性**的块。下图是筛选过后剩下的块:
Transformer 自注意力机制使得输入可以用高阶单元表示,从而可以灵活地捕获自然语言中各种语法和语义关系。长期以来,研究人员一直认为,与 Transformer 相关的高复杂性和内存占用量是不可避免的提高性能的折衷方案。但是在本论文中,Google 团队用 FNet 挑战了这一思想,FNet 是一种新颖的模型,在速度、内存占用量和准确率之间取得了很好的平衡。
![](imgs/2.png)
由于包含条码区域的块**一定连续存在**的特性,我们可以通过对这些图像块再进行一个改进的**腐蚀**操作过滤掉部分背景图像块。下图是滤除部分背景图像块后剩余的块:
## 借助Transformer,DeepMind新模型自动生成CAD草图,网友:建筑设计要起飞了
深度学习的灵活性恰好适合于复杂的 CAD 设计,DeepMind 的研究者基于 CAD 草图与自然语言建模的相似性,提出了自动生成 CAD 草图的机器学习模型。
在制造业中,CAD 的应用十分广泛。凭借着精准、灵活、快速的特性,CAD 已经取代了纸笔画图,并且不再只是应用于汽车制造、航空航天等领域,哪怕小到一个咖啡杯,生活中几乎每个物件都由 CAD 画图建模。
CAD 模型中最难制作的部件之一就是高度结构化的 2D 草图,即每一个 3D 构造的核心。尽管时代不同了,但 CAD 工程师仍然需要多年的培训和经验,并且像纸笔画图设计的前辈们一样关注所有的设计细节。下一步,CAD 技术将融合机器学习技术来自动化可预测的设计任务,使工程师可以专注于更大层面的任务,以更少的精力来打造更好的设计。
在最近的一项研究中,DeepMind 提出了一种机器学习模型,能够自动生成此类草图,且结合了通用语言建模技术以及现成的数据序列化协议,具有足够的灵活性来适应各领域的复杂性,并且对于无条件合成和图像到草图的转换都表现良好。
![](imgs/3.png)
得到这些块之后,我们再根据每个图像块内的**平均梯度方向进行连通**。因为如果是相邻的图像块都属于同一个条码的话,那么他们的平均梯度方向也一定相同。
论文链接:[https://arxiv.org/pdf/2105.02769.pdf](https://arxiv.org/pdf/2105.02769.pdf)
得到连通区域之后我们再根据条码图像的特性进行筛选,比如连通区域内的梯度大于阈值的点的比例,组成连通区域的图像块数量等。
具体而言,研究者开展了以下工作:
最后,用**最小外接矩形**去拟合每个连通区域,并计算外界矩形的方向是否和连通区域内的平均梯度方向一致,过滤掉差距较大的连通区域。将平均梯度方向作为矩形的方向,并将矩形作为最终的定位框。
- 使用 PB(Protocol Buffer)设计了一种描述结构化对象的方法,并展示了其在自然 CAD 草图领域的灵活性;
- 从最近的语言建模消除冗余数据中吸取灵感,提出了几种捕捉序列化 PB 对象分布的技术;
- 使用超过 470 万精心预处理的参数化 CAD 草图作为数据集,并使用此数据集来验证提出的生成模型。事实上,无论是在训练数据量还是模型能力方面,实际的实验规模都比这更多。
![](imgs/4.png)
CAD 草图展示效果图如下:
## 条形码解码
![](imgs/4.gif)
目前我们支持了三种类型的条码解码,它们分别是EAN13、 EAN8 和UPC-A。(下图为EAN13 条码示例)
对于 DeepMind 的这项研究,网友的评价非常高。用户 @Theodore Galanos 表示:「非常棒的解决方案。我曾使用 SketchGraphs 作为多模态模型的候选方案,但序列的格式和长度太不容易处理了。等不及在建筑设计中也使用这种方法了。」
![](imgs/5.png)
## 为了医疗AI,他们做出了一个“违背祖师爷”的决定
条码的识别主要流程如下图
搞深度学习的人,应该感谢“祖师爷”Geoffrey Hinton在2012年的尝试。因为Hinton团队使用了GPU进行AI运算加速,让神经网络AlexNet的实现成为可能,开启了深度学习大爆发的时代。Hinton彻底带火了GPU,带火了以计算机视觉为主的医疗AI。连Hinton本人也对AI辅助医疗技术将会迅速成熟充满了信心。但是,Hinton可能万万没想到,现在搞医疗AI的人,尤其是落地部署和使用医疗AI的人,却做出了一个违背“祖师爷”的决定
![](imgs/6.png)
用CPU来做医学影像领域的辅助诊断推理。
那么,问题来了,在GPU原本擅长的领域,CPU的能力真的可以胜任吗?
其中:
事实证明,只要软硬件配合得当,CPU一样可以实现出色的AI应用效果,尤其是进行准确、快速的AI推理。性能优化到位的话,在这方面的表现就可与GPU相媲美。 当然,CPU也仅仅是AI计算硬件中的一种,而非唯一的选择。可它越来越受到医疗AI领域的青睐,必然有更为深刻的原因:那便是惠民。
1. 优化的超分辨率策略指的是对较小的条码进行**超分辨率放大**,不同大小条码做不同处理。
虽然已经有了很多实例,目前仍然有许多人对CPU做AI抱有疑虑。而这些疑虑,主要集中在计算速度和生态系统这两点上:但英特尔,早已为CPU在AI行业的应用,做好了软硬件两手准备。一方面,针对AI应用的算力和数据加速,英特尔早从数年前就开始布局,从硬件架构上对AI推进了三方面的优化:
2. 解码算法的核心是基于条码编码方式的**向量距离计算**。因为条码的编码格式为固定的数个"条空",所以可以在约定好"条空"间隔之后。将固定的条空读取为一个向量,接下来与约定好的编码格式相匹配,取匹配程度最高的编码为结果。
- 在2017年发布的第一代至强可扩展处理器上,导入支持AVX-512高级矢量扩展技术,让CPU单位时间内能处理更多浮点运算任务,用以加速高精度的AI应用;
- 在2019年发布的第二代至强可扩展处理器上,基于AVX-512技术扩展出了英特尔深度学习加速(DL Boost)技术,支持INT8加速,主攻推理加速;
- 2020年发布的面向四路和八路服务器的第三代至强可扩展处理器时,为这项技术增添了BF16加速能力,从而兼顾推理和训练的加速;
- 在2019年推出傲腾持久内存,兼具接近DRAM内存的高性能,以及DRAM内存所不具备的容量、价格和数据非易失优势,让基于CPU的AI系统可以将更大体量的数据缓存在距离CPU更近的地方,加速训练和推理。
3. 在解码步骤中,解码的单位为一条线,由于噪点,条空的粘连等原因,单独条码的解码结果存在较大的不确定性,因此我们加入了对**多条线的扫码**,通过对均匀分布的扫描与解码,能够将二值化过程中的一些不完美之处加以抹除
如今看来,用CPU做AI,确实没啥可担心的——甚至在医疗AI行业,这还是个更好的选择
**具体实现为**:首先在检测线上寻找起始符,寻找到起始符之后,对前半部分进行读取与解码,接着寻找中间分割符,接着对后半部分进行读取与解码,最后寻找终结符,并对整个条码进行首位生成与校验(此处以EAN13格式举例,不同格式不尽相同)。最后,每条线都会存在一个解码结果,所以对其进行投票,只将最高且总比例在有效结果50%以上的结果返回。这一部分我们基于ZXing的算法实现做了一些改进(投票等)。
大概,就连当年积极将GPU引入医疗AI行业的Hinton,也没预料到会是这幅景象:如今的CPU,正在医疗AI领域大放异彩。
4. **更换二值化和解码器**指的是在为解码成功遍历使用每种解码器和二值化尝试解码。
## 双方互GAN,不如来试试群体博弈?更快更强更自由 | ICLR 2021
## 使用方式
AI诞生之初,很长一段时间都停留在个体智能阶段,即面向“识别出图像中的内容”、“听懂一段语音”、“预测蛋白质的3D结构”这类目标单一的任务。但随着技术发展,AI开始逐渐与其他智能群体产生交互,走向更加复杂的应用场景。比如在2019年,DeepMind训练的游戏类AI就在星际争霸中超越了99.8%的活跃玩家,达到了最高的 Grandmaster段位。
C++
这是一种以博弈论为机器学习模型的思路。沿着这种思路,DeepMind的几位研究者提出了一种名为EigenGame的理论,重新定义了PCA(主成分分析,Principal Component Analysis)方法。
```
#include "opencv2/barcode.hpp"
#include "opencv2/imgproc.hpp"
### “Eigen”与“Game”
using namespace cv;
“Eigen”意为特征。也是论文题目中所提到的PCA方法的核心概念。
![](imgs/5.png)
PCA是ML领域里用于数据降维的经典方法。目的是在尽可能不丢失原数据信息的前提下,将高维数据映射(压缩)到低维空间,得到剔除了原有特征冗余信息的新特征。
![](imgs/6.png)
Ptr<barcode::BarcodeDetector> bardet = makePtr<barcode::BarcodeDetector>("sr.prototxt", "sr.caffemodel"); //如果不使用超分辨率则可以不指定模型路径
Mat input = imread("your file path");
Mat corners; //返回的检测框的四个角点坐标,如果检测到N个条码,那么维度应该是[N][4][2]
std::vector<std::string> decoded_info; //返回的解码结果,如果解码失败,则为空string
std::vector<barcode::BarcodeType> decoded_format; //返回的条码类型,如果解码失败,则为BarcodeType::NONE
bool ok = bardet->detectAndDecode(input, decoded_info, decoded_format, corners);
```
在目标数据集的数据属性过多,数据量过大的时候,模型训练和计算的性能可能受到很大影响。这时,就需要用到PCA进行数据降维。而“Game”则意为博弈论*(Game Theory)*,是一种研究理性决策者之间的冲突与合作的数学模型。纳什均衡(Nash equilibrium)作为博弈论的一个重要概念,指每个参与人在获取信息不完全的情况下,做出了针对其他参与人策略的最优反应,比如经典的囚徒困境。
Python
### 当博弈论遇上机器学习
```
import cv2
其实,博弈论的思想一直存在于很多机器学习的探索过程中,不管是经典的 SVM,还是大火的 GAN,这些模型的背后都有博弈论的影子。
bardet = cv2.barcode_BarcodeDetector()
img = cv2.imread("your file path")
ok, decoded_info, decoded_type, corners = bardet.detectAndDecode(img)
```
最初提出“博弈机器学习”这一概念的刘铁岩博士曾这样说过:
更多使用方式请参考文档:[https://docs.opencv.org/master/dc/df7/classcv_1_1barcode_1_1BarcodeDetector.html](https://docs.opencv.org/master/dc/df7/classcv_1_1barcode_1_1BarcodeDetector.html)
什么才是人工智能?想要解决这个问题,首先需要为「智能」提出一个定义。如果说过去对于个体智能的研究为计算机赋予了智商(IQ)的话,那么社会智能则对应着人工智能的情商(EQ)。
## 参考文献
博弈论的引入让AI在过去只与环境交互的基础上,又学会了如何与其他智能体打交道。而当EigenGame这种与多智能群体交互的算法出现时,其意义就不仅是更多更快的数据运算。按照既非随机,也非理性和对立的人类的行为规律去训练建模,那么AI就有了更多解决问题的新角度,也能在广告竞价、社交媒体、众包管理、交通疏导等多个领域中得到更广泛的应用。
王祥敏,汪国有. 一种基于方向一致性的条码定位算法[EB/OL]. 北京:中国科技论文在线 [2015-04-22]. [http://www.paper.edu.cn/releasepaper/content/201504-338](http://www.paper.edu.cn/releasepaper/content/201504-338)
或许,博弈论会是连接机器学习走向人和社会的一个桥梁。
![](1.png)
imgs/1.png

30.6 KB | W: | H:

imgs/1.png

177.5 KB | W: | H:

imgs/1.png
imgs/1.png
imgs/1.png
imgs/1.png
  • 2-up
  • Swipe
  • Onion skin
imgs/2.png

102.1 KB | W: | H:

imgs/2.png

137.7 KB | W: | H:

imgs/2.png
imgs/2.png
imgs/2.png
imgs/2.png
  • 2-up
  • Swipe
  • Onion skin
imgs/3.png

90.1 KB | W: | H:

imgs/3.png

93.7 KB | W: | H:

imgs/3.png
imgs/3.png
imgs/3.png
imgs/3.png
  • 2-up
  • Swipe
  • Onion skin
imgs/5.png

35.3 KB | W: | H:

imgs/5.png

50.2 KB | W: | H:

imgs/5.png
imgs/5.png
imgs/5.png
imgs/5.png
  • 2-up
  • Swipe
  • Onion skin
imgs/6.png

47.1 KB | W: | H:

imgs/6.png

167.1 KB | W: | H:

imgs/6.png
imgs/6.png
imgs/6.png
imgs/6.png
  • 2-up
  • Swipe
  • Onion skin
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册