​【AI简报20210924期】设计边缘人工智能SoC需要注意些什么?

RTThread物联网操作系统 2021-09-24 14:01

嵌入式 AI

1. 边缘AI时代已来,设计边缘人工智能SoC需要注意些什么?

原文链接:

https://mp.weixin.qq.com/s/wkEEW45HIXAFMlE8tku0Uw

不知不觉中,AI已经无感地进入了我们的日常生活当中,且大家已经开始习以为常。无论是用手机记录下生活美好的瞬间,还是享受智能门锁给人们带来的方便,或是在超市使用无人值守的称重台给商品称重,抑或是工作中使用的远程视频会议系统,背后都有AI技术的一份功劳。

AI技术的三大核心是算力、算法和大数据。随着半导体技术的进步和处理器相关企业的努力,芯片的性能越来越高,算力问题基本得到了解决;随着深度学习技术的不断进化,算法也在不断向前演进;再加上存储技术的进步,能够被记录的数据越来越多,也越来越快。

看起来AI发展的核心问题已经都被解决了,但其实还有个容易被忽略的问题,正逐渐变得关键起来,那就是接口问题。

接口在AI发展中的重要性越来越大

海量的数据存储在存储器中,高算力的处理器需要把数据从存储器中提取出来后才能调用算法来进行处理,处理完之后,还需要存储到存储器当中。

那么,如何将数据从存储器当中提取到处理器缓存呢?答案是接口。对AI芯片来说,选择一个合适的接口,将会决定AI芯片支持AI应用和系统的容易程度和效率。特别是对一些边缘AI系统来说。因为边缘AI对于处理速度的要求并不是那么高,反而是对方便性要求更高。

比如我们经常可以见到的智能网络摄像头,它里面的视觉处理SoC需要与高清广角摄像头传感器和麦克风阵列相连接。视觉处理SoC经过训练后,可以检测人的面部和躯干,因此,摄像头能够通过自动平移、倾斜和变焦等方式,始终对焦会议室内的参与者,根据检测到的演讲者所在位置,将麦克风阵列对准该方向,以拾取演讲者的声音。该应用场景中的摄像头可以通过USB 3.x连接大量的视频会议主机。

其实智能摄像头所采用的就是边缘人工智能SoC芯片,该SoC芯片除了可以用于智能摄像头,也可以用于实时汽车辅助驾驶应用,不过如果用于汽车的话,视觉处理SoC就需要使用PCIe接口与一个强大的主机连接在一起。

那么有没有可能让边缘人工智能SoC芯片同时拥有PCIe接口的高速性能,及USB接口的便捷性呢?有人就设计出来了这样的产品,并且芯片的面积并没有因此而增加。

边缘人工智能SoC芯片设计案例

很明显,同时具备PCIe和USB4接口的边缘人工智能SoC可简化边缘AI系统集成,支持多种应用场景,可帮助迅速拓展新的目标市场。图1显示了一个典型的边缘人工智能系统和SoC芯片的总体框图。

图1:边缘人工智能系统集成了PCIe和USB4接口,提高了应用的灵活性(来源:新思科技)

与市面上大多数人工智能SoC芯片一样,图1显示了通用的一种架构,但由于PCIe和USB4接口的集成,可支持更多的应用场景。该边缘人工智能SoC芯片的接口设计,可以在传统PCIe模式、带有隧道PCIe的USB4模式、传统USB 3.x流媒体或传输模式,以及USB 2.0传输模式下运行。

如何实现多接口边缘人工智能SoC芯片

想要设计出灵活的边缘人工智能SoC芯片接口,关键在于使用了新思科技的DesignWare USB4 PHY IP。该IP支持USB4(包括隧道PCIe)和传统USB。对于边缘人工智能SoC,DesignWare USB4 PHY IP可以通过升级的方式,获得额外支持传统PCIe的功能。边缘人工智能加速器支持的操作模式如图2所示。

图2:边缘人工智能加速器所需的操作模式(数据来源:新思科技)

据新思科技透露,DesignWare USB4 IP的最高传输速度为40 Gbps,是USB 3.2的最高数据传输率的两倍,并可向下兼容USB 3.x和USB v2.0系统。DesignWare USB4 IP支持多个高速接口协议,包括USB4、DisplayPort 1.4a TX、PCIe和Thunderbolt 3,通过一根USB Type-C数据线即可实现高效的数据传输、高清视频传输,还可以提供电源。

据悉,DesignWare USB4 PHY IP已在先进的5nm FinFET工艺中实现了测试芯片的流片。而且该IP不仅适用于7/6/5/4nm等先进工艺节点,也适用于12nm等低成本工艺节点进行芯片开发。

结语

边缘人工智能的应用场景更加细分,为了适应不同的应用场景,边缘人工智能SoC既需要支持高速高性能的接口标准,也需要支持更加便捷性的接口标准,而USB是设备最为普遍采用的一种接口,支持USB接口可以让设备的部署更加简单和便捷。

借助DesignWare IP,设计人员可以创建出支持PCIe和USB4协议的边缘人工智能加速系统,与单独的PCIe或单独的传统USB设计相比,在边缘人工智能加速器设备中,采用DesignWare USB4 PHY接口IP可提供更高的灵活性,并增加边缘人工智能加速器的功能和接口选项。因此,客户可以更加快速地拓宽目标市场,并加快新型边缘人工智能应用的上市速度。

2. 浪潮发布新版AIStation推理服务平台,可高效调度多元AI芯片

原文链接:

https://baijiahao.baidu.com/s?id=1711732548587544494&wfr=spider&for=pc

9月17日,在苏州举行的第四届全球人工智能产品应用博览会(AIExpo2021)上,浪潮发布了新版AIStation人工智能推理服务平台,为快速发展的人工智能应用提供强大的服务管理支撑,并可统一高效调度多款国际国内领先的AI芯片的算力,帮助企业和智算中心充分发挥多元算力作用,加速AI应用场景落地。此次发布是为了应对日趋丰富的人工智能应用对多元化AI芯片算力的需求,以及智能计算中心日益复杂的异构计算资源管理调度挑战。

浪潮AIStation是业界领先的人工智能开发服务平台,可支持超过数千节点AI服务器的超大规模人工智能集群调度管理基于容器化技术简化算力调度过程,帮助用户摆脱在大规模AI计算集群中进行算力选择、算力适配等繁杂工作,提高调度效率实现资源敏捷调配,使得资源利用率得以大幅提升强大的平台调度机制可以应对需求突发场景在几分钟内自动完成服务扩容支持多源模型统一部署,模型部署时间从数天缩短到几分钟,从而实现业务快速上线AIStation可支持百万级高并发的大规模AI推理服务场景,服务响应平均延迟低于1ms。

3. 百度自主研发的7nm昆仑AI芯片实现量产

原文链接:

https://new.qq.com/rain/a/20210922A0BUBA00

据悉昆仑2芯片基于百度公司自研的第二代XPU架构,采用7nm制程,相比一代性能提升2至3倍,将在自动驾驶、智能交通、智能助手等多领域,打造百度应用。

百度自研AI芯片"昆仑"来了业内算力最高|昆仑|百度|芯片_新浪科技_新浪网

特别需要为百度点赞的是,昆仑AI芯片拥有自主研发的XPU架构及多项自主设计,能与多款国产通用处理器及麒麟等多款国产操作系统适配,希望国内能够以这款自主研制的处理器为基础,推动中国芯片产业快速发展,早日扭转中国缺芯状况。

AI新闻

4. 工信部标准化研究院与商汤共建AI算力及芯片评测联合实验室

原文链接:

https://baijiahao.baidu.com/s?id=1711577724860862703&wfr=spider&for=pc

近日,智算联盟首次全员大会在上海成功举办。会上,中国电子技术标准化研究院CESI(工业和信息化部电子第四研究院)与商汤科技共同宣布成立“CESI-SenseTime人工智能算力及芯片评测联合实验室”,旨在推进国内外人工智能芯片测试标准统一化进程,推动人工智能芯片的技术创新与产业应用。

全新成立的“CESI-SenseTime人工智能算力及芯片评测联合实验室”将融合双方优势,开展人工智能算力和芯片标准制定、人工智能芯片测评工具开发,提供人工智能计算中心、芯片测试验证服务和人才培训等支持。

此外,由商汤科技在上海临港建立的人工智能算力基础设施——商汤智算中心(AIDC)也将在近期完成幕墙工作。

该AIDC将于2022年初投入使用,届时不仅可为人工智能芯片测试标准统一化工作提供充足的算力支持,更将助力产业链上下游的数字化转型升级,成为带动经济社会高质量发展的“底座”和“基石”,加快经济结构优化升级。

5. 获小米、闻泰重磅押注,黑芝麻智能再获两轮融资,估值已超百亿

原文链接:

https://baijiahao.baidu.com/s?id=1711568153858376042&wfr=spider&for=pc

中国自动驾驶领域诞生了一只超级独角兽,估值已超百亿人民币。9月22日,自动驾驶芯片企业黑芝麻智能宣布,目前已经完成了数亿美金的战略轮及C轮两轮融资,估值近20亿美金。

其中,小米长江产业基金,富赛汽车等国内产业龙头企业参与了战略轮投资;C轮由小米长江产业基金领投,闻泰战投、武岳峰资本、天际资本、元禾璞华、联想创投、临芯资本、中国汽车芯片产业创新战略联盟等跟投。

此次融资,黑芝麻智能将在人才、研发、市场拓展和商业化等多方面发力,持续吸引行业顶尖人才、引领技术创新、推动产品的大规模量产落地,驱动企业进入发展的快车道。凭借着扎实的技术实力,黑芝麻智能赢得了资本市场的青睐,已正式步入了超级独角兽行列。这不仅是国产芯片企业的高歌猛进,也是中国汽车产业向智能化推进的又一风向标。

6. 吃串串,数签签,这个 AI 神器一秒搞定

原文链接:

https://mp.weixin.qq.com/s/S1BoJc5VH3owyk0UJGMhpQ

Make AI everywhere 不只是工程师的一句口号,如今,AI不光已经在金融、医疗、工业等行业取得了令人惊叹的表现,它还深入到了日常生活的方方面面。

国庆去哪旅游还没定下来,打开电脑,出行网站就会根据你的个人历史数据智能推荐出你可能喜欢的相关景点,如果有疑问要找客服,智能语音服务就能答疑解惑,出门有手机导航为你规划最佳行进路线,想找美食,打开相关应用就会为你自动筛选相关饭店,现在,甚至撸个串能用上AI了。


但吃串串容易,数签签难。每当我们撸完串,扫码结账前,总要等待服务员一个个数签结算,他们每天都要进行这样的重复性工作。

好在,为了解决数签难题,现在有一款AI数签神器上线了。服务员只需对着签子底部拍张照片,就能实现一秒“数签”,让服务员简洁优雅地从这种繁琐的日常工作中解脱。


这款叫做《百度AI数签神器》的小程序由百度研发。据了解,上线这个数签小程序,前期只需要进行小批量的数据标注,通过把标注好的图片上传平台进行模型训练,最快半小时,专属的数签模型就轻松生成了。随后结合百度APP,就开发出「百度AI数签神器」小程序。


这次“AI数签神器”,就是在百度飞桨EasyDL一站式开发平台完成模型训练的。EasyDL是百度飞桨推出的零门槛AI开发平台,开发者不需要有算法基础,就能在平台上完成数据上传、标注和训练,可视化操作几步就可以完成一个AI模型。感兴趣的读者可以进入原文链接,看看如何实现自己专属的AI。

7. 初创公司Paige的AI诊断技术正在彻底改变癌症诊断

原文链接:

https://mp.weixin.qq.com/s/mGqOagbciXP7lhzfGaYMdQ

20世纪90年代初,当Leo Grady申请大学时,他并没有考虑过研究人工智能。这位IEEE会员对人类互动、语言学和心理学感兴趣,由此,他在最初选择了不同寻常的人类学和物理学双专业。但是,他想了解人类大脑是如何工作的,这促使他从物理学专业转向了电气工程专业,最终在佛蒙特大学(University of Vermont)研究信号处理。

Grady说:“所有这些最终引领着我找到了人工智能这个方向。人工智能是心理学、工程学、计算机科学和一点哲学的混合体。它真的激发了我的想象力。”

Grady现在是这家坐落于纽约市的Paige公司的首席执行官。2018年,该公司从Memorial Sloan Kettering Cancer Center剥离。Paige使用机器学习帮助病理学家从组织样本的图像中做出更快、更准确的癌症诊断。这家初创公司专注于检测前列腺癌和乳腺癌,并计划扩展到其他疾病。

Paige希望帮助医生更早地发现癌症,提出有效的治疗计划,并防止由于假阳性而进行不必要的手术。5月,该公司宣布与Quest Diagnostics合作开发软件产品,以发现以前可能不知道的癌症标记物,并帮助病理学家和肿瘤学家更好地诊断前列腺癌、乳腺癌和其他类型的癌症。

“我们的技术确实具有变革性,”Grady说,“这将有助于病理学家提高效率,做出更高质量的决定,并更快地将结果反馈给患者。这也有助于最终降低医疗系统的成本。”今年1月,这家初创公司在C轮融资中筹集了1亿美元。Paige的前列腺癌诊断技术是第一款为病理学或肿瘤学设计的人工智能产品,获得了美国食品和药物管理局(FDA)突破性设备认证。Paige现在正在寻求将其技术用于诊断以外的领域。Grady说,通过培训AI了解特定类型肿瘤与特定药物疗效之间的相关性,该公司希望能够预测患者的治疗方案。

希望AI不断的发展可以给医疗行业传递更多解决问题的创新思路,从而开发出越来越多的智能设备,服务人类的医疗。

8. 超越Facebook、谷歌、微软,百度发布全球首个百亿参数对话预训练生成模型PLATO-XL

原文链接:

https://www.jiqizhixin.com/articles/2021-09-23-10

百度发布PLATO-XL,全球首个百亿参数中英文对话预训练生成模型

很难相信,以上是 AI 与人交流的真实对话记录。近日,百度发布新一代对话生成模型 PLATO-XL,一举超过 Facebook Blender、谷歌 Meena 和微软 DialoGPT,成为全球首个百亿参数中英文对话预训练生成模型,再次刷新了开放域对话效果,打开了对话模型的想象空间。

尽管大规模参数的模型在自然语言处理领域如雨后春笋出现,并且在多个自然语言理解和生成任务上取得了很多成果,但多轮开放域对话的主动性和常识性问题一直无法很好解决。百度 NLP 于 2019 年 10 月预发布了通用领域的对话生成预训练模型 PLATO,在 ACL 2020 正式展示。2020 年升级为超大规模模型 PLATO-2,参数规模扩大到 16 亿,涵盖中英文版本,可就开放域话题深度畅聊。如今,百度 全新发布 PLATO-XL,参数规模首次突破百亿达到 110 亿,是当前最大规模的中英文对话预训练生成模型。

聊点技术

9. ONNX 浅析:如何加速深度学习算法工程化?

原文链接:

https://mp.weixin.qq.com/s/GDiYK6ISPxLJll35Q-qYdA

AlphaGo击败围棋世界冠军李世石以来,关于人工智能和深度学习的研究呈现井喷之势。

各种新的算法和网络模型层出不穷,令人眼花缭乱。与之相随的,深度学习的训练和推理框架也在不断的推陈出新,比较著名的有:微软的CNTK、Google的TensorFlow、Facebook的PyTorch、Apple的CoreML、Intel 的OpenVINO、英伟达的cuDNN和TensorRT、腾讯的TNN和NCNN、阿里的MNN等等。

这些框架都有相似之处,他们的输入是一个或者一组多维数据,数据经过多层运算单元之后输出运算结果。训练框架支持BackPropogation等训练方法,可以自动调整模型参数,用于算法设计。推理框架则是单纯只能用于模型推理运算,不能调整模型本身,用于算法部署落地。

这些框架中,Google的TensorFlow的这个名字尤其具有美感。多维数据是为张量(Tensor),数据在多层运算单元中的运算和传递是为流(FLow),看到这个词就仿佛看到了一个数据和运算的图(Computation Graph),真可谓妙手偶得之佳作。这些框架都需要构建算子,并且将这些算子按照一定的次序连接起来,可以称之为网络模型。

01. Why ONNX?

每个深度学习框架都有自己独有的格式来解释和存储网络模型,并且这些框架的侧重点不同,有些用于训练学习,有些用于部署推理。在深度学习算法开发中,在不同的阶段会选择不同的框架,所以模型描述格式的不同,在客观上造成了深度学习算法开发和落地的困难。

笔者之前曾开发深度神经网络算法,当时选择的训练框架是Caffe,需要落地部署到Linux、iOS、Android等多个平台。Linux选择的是Nvidia的cuDNN;iOS选择的是CoreML;Android选择的是NNAPI,Caffe的模型描述格式是caffemodel。

它使用自定义的Protobuf (https://github.com/BVLC/caffe/tree/master/src/caffe/proto),但是显然,无论是cuDNN、CoreML、NNAPI都无法直接使用caffemodel,CoreML的模型描述使用另一种定义 (https://apple.github.io/coremltools/mlmodel/index.html),cuDNN和NNAPI都是low-level的推理引擎,需要使用者将这个模型组装起来。

对于CoreML来说,我们需要把caffemodel转为coremlmodel格式,对于 cuDNN和NNAPI,我们需要解析caffemodel,然后自己组装出完整的网络模型。这个过程繁琐而且容易出错,当时有强烈的冲动,希望定义一个统一的模型描述格式,所有的训练框架训练所得的网络模型,都是用这个格式来描述,在设备上部署推理时,相应的推理引擎支持解析这个统一的描述格式,直接完成部署落地,岂不美哉。

当然此事并不容易,要定义个统一的模型描述格式,不仅仅需要对机器学习技术有深入的理解,而且将之推广成为事实上的行业标准,更需要有很大的行业影响力,并不是如笔者这样的无名小卒可以为之。所幸已经有社区在做这个事情了,这就是Open Neural Network Exchange(ONNX)。

用ONNX自己的话来说,ONNX是一个对计算网络(Computation Graph)的一个通用描述(Intermediate Representation)。它希望被设计成为开放的网络描述格式,减少开发者在各个训练和推理框架间切换的代价,可以让开发者专注于算法和优化。虽然ONNX还处于比较早期的阶段,不过已经有约来越多的人开始关注到它,未来会有机会得到更广泛的应用。

02. 计算模型描述

ONNX有两个分类:基础的ONNX主要用于描述神经网络、ONNX-ML是对基础ONNX的扩展,增加了神经网络之外的其他机器学习算法的支持。本文不会涉及ONNX-ML,接下来的文字以一个简单的ONNX模型为例,介绍一下 ONNX是如何来描述一个计算网络的。该模型可以在ONNX的Github上下载(https://github.com/onnx/models/blob/master/vision/classification/mobilenet/model/mobilenetv2-7.onnx).

ONNX的模型描述采用了Google的Protocol Buffer语言。最外层的结构是ModelProto,它的定义如下:

 1message ModelProto {
2  int64 ir_version = 1;
3  repeated OperatorSetIdProto opset_import = 8;
4  string producer_name = 2;
5  string producer_version = 3;
6  string domain = 4;
7  int64 model_version = 5;
8  string doc_string = 6;
9  GraphProto graph = 7;
10  repeated StringStringEntryProto metadata_props = 14;
11  repeated TrainingInfoProto training_info = 20;
12  repeated FunctionProto functions = 25;
13}

比较重要的字段有:

lr_version : 当前的ONNX模型文件的版本,目前发布的最新版本为IR_VERSION_2019_3_18 = 6. 发布于2019年,版本7还在制定中。

opset_import: 当前的模型文件所依赖的算子domain和版本。

graph: 这个模型执行的运算图,这个是最重要的字段。

GraphProto的定义如下:

 1message GraphProto {
2  repeated NodeProto node = 1;
3  string name = 2;   // namespace Graph
4  repeated TensorProto initializer = 5;
5  repeated SparseTensorProto sparse_initializer = 15;
6  string doc_string = 10;
7  repeated ValueInfoProto input = 11;
8  repeated ValueInfoProto output = 12;
9  repeated ValueInfoProto value_info = 13;
10  repeated TensorAnnotation quantization_annotation = 14;
11}

比较重要的字段有:

initializer : 模型的每一网络层的参数, 模型训练完成之后参数就被固定下来。

input : 模型的输入格式。

output : 模型的输出格式。

nodes : 定义了模型的所有运算模块, 依照推理的次序排布。

NodeProto的定义如下:

1message NodeProto {
2  repeated string input = 1;    // namespace Value
3  repeated string output = 2;   // namespace Value
4  string name = 3;     // namespace Node
5  string op_type = 4;  // namespace Operator
6  string domain = 7;   // namespace Domain
7  repeated AttributeProto attribute = 5;
8  string doc_string = 6;
9}

比较重要的字段有:

input : 输入参数的名字。

output : 输出参数的名字,这里需要留意的是,每一个网络层之间的连接使用输入和输出的名字来确立的。

op_type : 算子的类型。

attributes : 算子的属性, 其解析取决于算子的类型。

ONNX中最复杂的部分就是关于各种算子的描述,这也可以理解,构成神经网络的主体就是这些算子。attributes 就是算子的一组带名字的属性。

本文中,我们介绍一个在mobilenetv2-7.onnx使用最多的算子: conv。

卷积神经网络在语音,图像,视频等处理上获得了巨大成功. ONNX关于卷积网络层的属性定义主要有:

dilations: 扩展卷积,默认为1,即普通卷积。其数学定义如下:

group: 分组卷积, 其定义见文献14. 默认为1, 即不分组。

kernel_shape: 定义了卷积核的大小。

pads: 定义了上下左右填充的像素数。

strides: 定义了卷积运算的步长。

03. ONNX的支持情况

各家的训练和推理框架还在继续发展,ONNX想成为行业标准显然还为时尚早,但是目前尚没有看到其他更好的通用模型描述格式,我们简单归纳一下现在的ONNX的支持情况(不完整):

10. 目标检测中的Anchor

原文链接:

https://zhuanlan.zhihu.com/p/55824651

目标检测之anchor

anchor字面意思是锚,指固定船的东东,anchor在计算机视觉中有锚点或锚框,目标检测中常出现的anchor box是锚框,表示固定的参考框。

目标检测是"在哪里有什么"的任务,在这个任务中,目标的类别不确定、数量不确定、位置不确定、尺度不确定,传统非深度学习方法如VJ和DPM,和早期深度学习方法如OverFeat,都要金字塔多尺度+遍历滑窗的方式,逐尺度逐位置判断"这个尺度的这个位置处有没有认识的目标",非常笨重耗时。

近期顶尖(SOTA)的目标检测方法几乎都用了anchor技术。首先预设一组不同尺度不同位置的固定参考框,覆盖几乎所有位置和尺度,每个参考框负责检测与其交并比大于阈值 (训练预设值,常用0.5或0.7) 的目标,anchor技术将问题转换为"这个固定参考框中有没有认识的目标,目标框偏离参考框多远",不再需要多尺度遍历滑窗,真正实现了又好又快,如在Faster R-CNN和SSD两大主流目标检测框架及扩展算法中anchor都是重要部分。

当然也有不用anchor的检测算法:2016 ECCV的YOLO是全局回归,但很快在YOLOv2就替换为anchor方法;2018 ECCV的CornerNet是角点预测,但论文用了非常庞大的hourglass-104速度比较慢,关键点与anchor技术没有明确的公平对比,孰优孰劣尚不清楚。

接下来以2015年NIPS的Faster R-CNN和2016年ECCV的SSD两个代表性框架分析anchor技术,并延伸到最新的FPN/Mask R-CNN/RetinaNt框架中,学习anchor的设计方法,探讨一些问题。

Faster R-CNN中的Anchor

Faster R-CNN这里仅分析与anchor有关的VGG16+RPN部分(后面简称RPN):主干输出stride16的feature map,RPN是一个conv3x3+两个并列的conv1x1,一边预测anchor中是否包含目标,一边预测目标框偏离固定anchor多远。

设置:RPN用stride 16的单feature map进行预测,anchor为三尺度{128, 256, 512}三比例{1:1, 1:2, 2:1},feature map上每个位置设置9个参考anchor,这些大约能覆盖边长70~768的目标。下图是Faster R-CNN论文中个anchor形状训练后学习到的平均proposal大小。

感受野:典型1000x600输入图像,经过conv5-3 + RPN,用于预测的feature map层分辨率是63x38,计算这一层的感受野:

1r = 1 + 2 + 2x3 )x2 + 2x3 )x2 + 2x3 )x2 + 2x2 )x2 + 2x2 = 228 < 512

分析:Faster R-CNN最早提出了anchor概念,首先,backbone+RPN实质上是一个FCN,上一篇分析过FCN本质上是密集滑窗,所以就没必要显式密集滑窗了;其次,anchor的设置是多尺度的,这样就没必要显式图像金字塔;最后,RPN与检测网络共享backbone部分的计算量,能大幅提升速度;注意,输入图像大小相比后面的SSD(512x512)更大,相当于小目标放大去检测,性能会有提升,但这是牺牲速度换来的。

Anchor设置方面有三个问题(从今天的算法水平往回看,事后诸葛角度):

  1. 最小的anchor是128x128尺度,而COCO小目标很多,且小目标很小,远小于这个尺度,为了能检测这些小目标,Faster R-CNN不得不放大输入图像(~1000x600),导致计算速度成倍增加,而同时被放大的大目标可能超过最大anchor尺度,又不得不加入多尺度测试保证从大到小anchor全覆盖,进一步影响速度;

  2. 最大的anchor是512x512尺度,而预测层的感受野仅228,上一篇讨论过,一般来说感受野一定要大于anchor大小,而且越大越好,这里感受野明显不足以支撑最大尺度的anchor,导致大尺度目标检测性能不够好;

  3. 三尺度按照检测目标的大小,我们简称为大、中、小锚框,那么三个尺度的anchor分别有63x38x3=7182个,共计7182x3=21546个anchor。通常anchor需要覆盖训练集的所有目标,即每个groundtruth box都能匹配到一个anchor,因此理想情况下目标越小anchor应该越多越密集,才能覆盖所有的候选区域,目标越大anchor应该越少越稀疏,否则互相高度重叠造成冗余计算量,反观RPN这里的单一feature map三尺度三比例设置,导致检测小目标的anchor太少太疏,而检测大目标的anchor太多太密。论文提到Faster R-CNN训练中忽略了所有跨边界的anchor否则训练无法收敛,尺度越大跨边界越多,所以训练中忽略掉的很多都是大锚框。

SSD中的Anchor

SSD是VGG16+conv3x3进行检测,输出目标分类和边框回归结果,从6个stride递增的feature map进行预测,网络结构从conv7之前是标准的VGG16结构,之后每一组conv1x1 + conv3x3s2输出一个stride的feature map。

设置:feature map从stride8开始共6层,每层4或6个形状的anchor,anchor共6个尺度(0.2~0.9)x300,6个形状是{1, 2, 3, 1/2, 1/3}比例框,外加较大的{1}比例框,依然按照大、中、小锚框进行划分,典型300x300输入图像:

  • 小锚框:从{conv4_3} feature map检测单一小尺度{60}目标,4个anchor形状,共38x38x4=5776个anchor;

  • 中锚框:从{conv7, conv8_2, conv9_2} feature map检测三个中尺度{102, 144, 186}目标,6形状anchor,共19x19x6 + 10x10x6 + 5x5x6=2916个anchor;

  • 大锚框:从{conv10_2, conv11_2}检测两个大尺度{228, 270}目标,4形状anchor,共3x3x4 + 1x1x4=40个anchor;


感受野:计算conv4-3+conv3x3 ~ conv11_2+conv3x3的感受野

1r1 = 1 + 2 + 2x3 )x2 + 2x3 )x2 + 2x2 )x2 + 2x2 = 108 > 60
2r2 = 1 + 2 + 2 + 2x3 )x2 + 2x3 )x2 + 2x3 )x2 + 2x2 )x2 + 2x2 = 260 > 102
3r3 = 1 + 2 )x2+1 + 2 + 2x3 )x2 + 2x3 )x2 + 2x3 )x2 + 2x2 )x2 + 2x2 = 324 > 144
4r3 = 1 + 2 )x2+1 )x2+1 + 2 + 2x3 )x2 + 2x3 )x2 + 2x3 )x2 + 2x2 )x2 + 2x2 = 452 > 186
5...

可以看到各层的感受野都是大于anchor大小的。

分析:6个feature map共计5776 + 2916 + 40=8732个anchor,总数量比RPN少了很多,而且小尺度锚框多且密,大尺度锚框少且疏,更合理;anchor的尺度范围从60到284,输入图像不用故意放大去检测小目标,计算速度更快;大尺度分布合理,不忽略跨边界anchor训练结果更好。

Anchor设置方面有三个问题(继续马后炮角度):

1.论文中提到的anchor设置没有对齐感受野,通常几个像素的中心位置偏移,对大目标来说IOU变化不会很大,但对小目标IOU变化剧烈,尤其感受野不够大的时候,anchor很可能偏移出感受野区域,影响性能。


2. 还是论文中提到的,anchor尺度和比例都是人工给定的,尺度和比例必须要覆盖相应任务的可能出现的所有目标,如PASCAL VOC评价每图目标数较少、目标较大,所以SSD中最小60x60的anchor或许够用,但MS COCO中目标密集且小、数量多,对anchor的密度和最小尺度都有严格要求,60x60的最小框完全不够看,只能放大输入图像。

一种方法是针对特定数据集设计anchor,如YOLOv2中的聚类,和近期有论文CNN训练anchor的设置,这些方法或许更适合某一数据集,但也可能影响模型的泛化能力,换一个库是否依然够用。另一种方法就是多尺度测试,尺度不够,缩放来凑,常用multi-test,和SNIP等等方法,都牺牲了速度,实用性打折。

3. 深度悖论(杜撰):SSD检测小目标是从conv4-3拉出来的,共经过11个conv3x3,检测中目标是从{conv7, conv8_2, conv9_2}拉出来的,分别经过{15, 16, 17}个conv3x3,检测大目标经过的卷积层就更多了,一般经过的conv3x3越多,深度越深,感受野越大,特征越强 (这一说法有否正确?)。

一般来说,目标越小,像素数量少,清晰度低,细节丢失严重,检测难度越大,反之目标越大,检测难度越小。RPN框架检测各尺度的特征深度相同,但SSD框架目标越小越难的,特征深度反而越浅,特征越弱。

4. 继续来看最小anchor不够小的问题:我们能否将stride4的feature map拉出来,设置更小anchor检测比60更小的目标呢?实际操作当然可行,我们将conv3_3的feature map上加一个检测头,假设anchor设置为{30},计算这一层感受野,看看能支持多小目标:

1r0 = 1 + 2 + 2x3 )x2 + 2x2 )x2 + 2x2 =  48 > 30

直观来看conv3_3可以支持这一anchor,但小目标更需要大感受野来提供上下文信息,如果感受野太小误检率会非常高。

FPN中的Anchor

设置:FPN + ResNet标配后,Faster R-CNN和SSD分别进化为Faster R-CNN+FPN/Mask R-CNN(简写FPN)和RetinaNet,Pn表示对应feature map的stride是 ![公式] ,尺度都是 {32, 64, 128, 256, 512}:不同点是:

  • FPN从 {P2, P3, P4, P5, P6} 拉出5个feature map进行检测,每个位置预测三比例,不同尺度不同形状的anchor共15个

  • RetinaNet从 {P3, P4, P5, P6, P7} 拉出5个feature map进行检测,每个位置预测三尺度三比例,每个尺度预测9个形状anchor

感受野:首先忽略FPN的top-down pathway,考虑RPN中的conv3x3卷积层,直接计算ResNet-50各个feature map的感受野,{P2, P3, P4, P5}分别对应{conv2_3, conv3_4, conv4_6, conv5_3}:

1P2 = 1 +2 +2x3 )x2+1 )x2+5 = 43
2P3 = 1 +2 +2x3 )x2+1 +2x3 )x2+1 )x2+5 = 107
3P4 = 1 +2 +2x5 )x2+1 +2x3 )x2+1 +2x3 )x2+1 )x2+5 = 299
4P5 = 1 +2 +2x2 )x2+1 +2x5 )x2+1 +2x3 )x2+1 +2x3 )x2+1 )x2+5 = 491

随着block增加,感受野也对应越多,如果考虑检测需要上下文,stride32的感受野足够大,但stride4的感受野不够大。FPN中的bottom-up pathway将深度层特征上采样后与当前层相加,相加时感受野取最大,即相加后感受野等于深度层的感受野,FPN仅用微小计算量,实现了浅层feature map的感受野大幅提升,高效解决了“深度悖论”,目前是目标检测的标配。

分析:同样尺度为32的anchor,FPN用P2进行检测,而RetinaNet用P3进行检测,这是因为FPN的前景阈值是0.7需要anchor更密集,RetinaNet前景阈值是0.5 anchor相对稀疏,FPN技术继承了前面SSD的所有优点,还以极低计算量克服了浅层感受野不足的问题。

Anchor设置方面的问题(这么完美还有问题? 后面全是瞎说):

  1. 小框的问题:MS COCO上数据库上小目标的AP(S)远低于大目标的AP(L),如下表,从anchor角度来看可能是两方面的问题:

  • 来自高层的feature map上采样用了最简单的最近邻插值,太过于粗糙,而且高层特征训练用于检测大目标,可能已经丢失了小目标相关的语义

  • 低层自己的feature map感受野本来比较小,缺乏上下文信息


实验:某直筒型检测网络,用stride4的feature map层设置16x16的anchor检测小目标,为了提高小目标的检测性能,采用两种不同方法增加感受野

  • stride4加深度(加2个conv3x3卷积层)

  • 加入FPN技术,用P2层进行检测

实现发现第一种方法对小目标检测的提升更大,但第一种方法由于分辨率较大引入了很多额外计算量,模型大小和训练所需内测都大幅上升,相反第二种方法额外计算量非常少,在速度方面优势非常大。

  1. 大框的问题:用大stride层的feature map检测大目标,步进等于stride,anchor数量少且疏,造成边框回归的难度增加,而且感官上更容易看到大目标的检测偏差。

为了提高高层feature map的分辨率,近期很多论文都在stride16之后用空洞卷积代替下采样block,在提高感受野的同时保持空间分辨率不下降,以获得更密集的大目标anchor,提升大目标的检测性能。空洞卷积的理论计算量与标准卷积相同但更难优化,如果采用空洞卷积则通道数不用翻倍,否则速度无法接受。

Anchor设计总结

总结以上几篇论文,设计目标检测算法时,anchor设置应该考虑一下几个方面 (以RetinaNet为例):

  1. anchor的密度:由检测所用feature map的stride决定,这个值与前景阈值密切相关,如同样检测{32}尺度,FPN阈值0.7用P2,RetinaNet前景阈值0.5用P3。

  2. anchor的范围:RetinaNet中是anchor范围是32~512,这里应根据任务检测目标的范围确定,按需调整anchor范围,或目标变化范围太大如MS COCO,这时候应采用多尺度测试,当然,实际应用中需考虑多尺度测试的复杂度问题。

  3. anchor的形状数量:RetinaNet每个位置预测三尺度三比例共9个形状的anchor,这样可以增加anchor的密度,但stride决定这些形状都是同样的滑窗步进,需考虑步进会不会太大,如RetinaNet框架前景阈值是0.5时,一般anchor大小是stride的4倍左右。

  4. 检测层Pn的数量:RetinaNet中是P3~P7共5个检测层,如需检测更小的目标,可以考虑加入P2检测层。

  5. 检测层Pn的感受野:前面计算了RetinaNet中是ResNet+FPN的感受野在检测中、大目标时都是够用的,检测小目标时略显疲乏,kaiming最新论文《Rethinking ImageNet Pre-training》既然告诉我们预训练模型没那么重要时,那检测任务就可以着重考虑按照感受野的需求设计ConvNet。

总之,要做到anchor以足够密度实现全覆盖。



你可以添加微信17775982065为好友,注明:公司+姓名,拉进RT-Thread官方微信交流群!



👇 点击阅读原文进入官网

RTThread物联网操作系统 帮助您了解RT-Thread相关的资讯.
评论 (0)
热门推荐
X
广告
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦