Skip to content

Instantly share code, notes, and snippets.

@hewumars
Last active March 28, 2024 10:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hewumars/5429ed18bb8613cdc780dfc6abb0ca31 to your computer and use it in GitHub Desktop.
Save hewumars/5429ed18bb8613cdc780dfc6abb0ca31 to your computer and use it in GitHub Desktop.
1. 自我介绍及杂项 2. 新基建公司名单 3. 面试总结
  1. 根据AI产品需求完成技术方案设计及算法设计和核心模块开发
  2. 计算机视觉算法的技术方向、技术难点攻关、性能优化等
  3. AI算法在嵌入式(异构平台)和服务器平台部署的研究和实现
  4. 技术上把关交付算法的性能和功能

我优势:

  1. 独立完成算法技术方案设计、嵌入式和服务器平台部署
  2. 模型压缩、量化
  3. 目标检测、语义分割、识别、跟踪、ReID

面试提问:

  1. 公司对这个职位的期望是什么?
  2. 团队成员有多少人,都是什么背景,属于销售部门还是研发部门?
  3. 核心工作内容有哪些
  4. 这个职位的成长晋升路径是怎么样的
  5. 如果有幸入职,应该朝什么方向提高自己
  6. 你大概什么时候会给我回复?
  7. 这个职位的职责到范围是什么,我会怎么被考核?

自我介绍
1.我是谁,主要介绍自己的姓名、年龄、籍贯等基本信息,教育背景,和应聘职位相关的特长,这一步主要目的是给面试官留下比较好的第一印象;

2.我做过什么,主要介绍自己的工作经历,哪个时间段在XX公司,从事XX岗位,主要负责XX,主要目的是让面试官认为你很有经验;

3.我做成过什么,主要介绍自己的工作成绩,有哪些突出的业绩贡献,注意最好用可以量化的数字来说明,主要目的是展示自己的能力和水平;

4.我想做什么,主要介绍自己来面试的目的,说明自己的职业规划、未来的工作蓝图、对行业的看法与理解,主要目的是表达出来自己对应聘职位的兴趣,表示自己很有兴趣加入!

我叫贺武,17年初参加工作,一直在现在的公司从事深度学习算法研究和工程化开发工作,先后获得公司最佳新人,最佳员工,19年任算法部智能硬件组组长,负责AI硬件算法验证和适配工作。前两年主要是各类算法研究的相关工作,包括目标检测,识别,模型优化压缩,语义分割,图像检索等,参与公司算法产品从传统方法向深度学习方法升级的整个过程,并负责利用tensorrt更新算法量化推理模块,整体性能提升1.5倍,单推理3倍以上;从去年开始负责公司算法在AI硬件方面的开发,研究过比特大陆和华为的NPU硬件,基于华为Atlas300加速卡的视频结构化算法实现日处理4千万张卡口图片,36路实时视频分析,并且对接部署到华为和海康算法仓平台。经过3年多的工作积累,我对深度学习算法层面软硬件系统开发有比较清晰的认识,能够独立完成从产品需求到技术方案设计和算法设计,并在GPU和NPU等平台完成核心模块的开发部署。最后我虽然没有从事过解决方案架构师这个职位,但是我有很强学习能力去快速学习产品和应用层面的技术架构和行业解决方案,努力成为行业方面的技术专家,希望面试官能给机会,谢谢。

**简化版:**我叫贺武,工学硕士,17年初参加工作,一直在现在的公司从事深度学习算法研究和工程化开发工作,先后获得公司最佳新人,最佳员工。前两年主要是各类算法研究和GPU平台算法部署的相关工作。从去年开始任算法部智能硬件组组长,负责公司算法在AI硬件方面的验证和适配工作。经过3年多的工作积累,我对深度学习算法层面软硬件系统开发有比较清晰的认识,能够独立完成从产品需求到技术方案设计和算法设计,并在GPU和NPU等平台完成核心模块的开发部署。最后我虽然没有从事过解决方案架构师这个职位,但是我有很强学习能力去快速学习产品和应用层面的技术架构和行业解决方案,努力成为行业方面的技术专家,希望面试官能给机会,谢谢。

英文自我介绍 My name is He wu, I was born in HuBei. I gained a master's degree of Control Engineering from Wuhan Institute of Technology.I started to work in 2017. I am engaged in deep learning algorithm research and deployment in my current company. I have made great progress and won many praise and prizes during my three year work ,such as the company's best newcomer and best employee.In the first two years, I have done various algorithm research and the deployment of algorithm based on GPU platform.since last year, I have been the leader of the Intelligent Hardware Group of the Algorithm Department , and in charge of the verification and adaptation of the company's algorithms in AI hardware. With 3 years working experience , I have grasped software and hardware system development at the level of deep learning algorithms. I can independently complete tasks from product requirements to technical solution design and algorithm design, and the development and deployment of core modules on platforms such as GPU and NPU.Finish, although I have not engaged in the position of solution architect, but I have the ability to quickly learn product and application-level technical architecture and industry solutions, and strive to become a technical expert in the industry. I hope that the interviewer will give me the opportunity, That's the end of my self-introduction.

销售和售前的配合:
项目成功,销售的客户关系只是一部分,销售负责搭建公司技术与客户沟通的桥梁,售前需要针对客户的业务,站在管理咨询的角度采用各种方法去了解客户业务、分析用户需求,并提供一份有亮点解决方案,并在后续沟通测试中控制客户对产品的预期。

售前工作重要性: 售前这份工作很重要,售前是公司技术传播的布道师,售前是销售攻城略地的军师,售前甚至还能影响公司产品的研发方向,在项目中售前与销售一起制定项目打单策略,对外传播公司价值,对内售前通过市场研究影响公司战略选择,也可参与产品开发以提供价值。

解答了为什么离职问题,我觉得这个岗位更具挑战性,综合性能力要求特别高的岗位,不仅仅像现在算法工程师只接触算法层面的纯技术开发,而是在解决方案层面,对外作为公司技术解决方案的传播者,发掘用户需求,通过对市场的需求的研究,对内配合研发团队参与产品开发。**能力要求:**逻辑思维能力,写作能力,口才,快速学习能力。

对接NVIDIA中国区,特别是位于深圳的核心客户,与销售团队配合,理解用户关键应用场景,发掘用户需求;与内部团队及用户开发团队协调,管理推进各合作项目的开发进度;与用户工程师合作完成基于深度学习的各类应用和产品,在GPU平台的研发和部署。

售前能力:售前首先必须懂技术,比如计算机网络知识、数据库、服务器、操作系统等知识,这些基础知识一般靠自学。

其次需要深入掌握公司的产品和一些业界的主流技术,公司产品要熟悉产品原理,最好是实际操作一些产品,能对产品理解更深刻,主流技术主要是云计算、大数据、虚拟化这些东西,现在IT行业这几种技术非常火,不懂这些技术跟客户都没法聊。

然后需要了解公司的各种方案,各种行业性的解决方案,售前需要根据不同用户的需求和问题修改这些方案,制作成针对某一个客户的具体方案。

技巧类的主要是逻辑思维、销售技巧、演讲能力、营销能力等,售前其实更应该定义成产品和解决方案销售,不仅仅是一个销售支持类的角色,所以售前的技巧也很重要。

**职业规划:**首先希望尽快熟悉部门安排的任务并出色的完成。在一年内成为对GPU软硬件架构及行业应用有更深入的了解,成为行业技术专家,为销售和研发团队提供解决方案层面的技术支撑,更好的服务各类合作项目;更长远希望对行业分析,规划、拓展行业客户和产品;

**技术如何描述:**论文采用什么技术解决什么问题的方式来描述

nvidia面试总结

昨晚静静的复盘了下面试,想了想没回答好的问题,主要还是目前技术多是看和用,很少交流,面试经验太少。 销售面确实自身经验原因面的不好,怎么去跟不愿意配合的客户去沟通交流,最终打动客户去使用我们的产品。其实也能回答一些,角度没找对,因人而异,多观察,投其所好。我只回答了从客户不喜欢麻烦的使用角度,回答了下让客户知道新产品的优势以及极低的迁移成本。 技术面太亏了,好多问题回来想想,我做过工作,被问的时候脑袋短路哦。模型蒸馏我前期也做过,验证过流程,虽然后来主要是同事练的模型。我居然想不起来怎么回答,只说模型主要是同事练的。tvm实现卷积,这个问题完全就是弄过了的,还写过blog,都没想起来,居然回答没特别熟悉……。也是很少跟人去讲技术,讲比做难,表述不好,一个问题没回答好,整体就紧张了。 完全浪费了张总推荐的这么好的机会,希望还有机会哦。我现在工作是从零开始的,也得到认可,头两年最佳新人最佳员工。实话说nvidia这份工作从综合能力上来说,我有一定欠缺,前期可能有点压力山大,遇强则强,也能做好。主要是能敲开个小门,进到这个圈子,后面职业发展就更加开阔。

海信电子科技

HR面试

  1. 自我介绍

    我叫贺武,武汉工程大学硕士毕业,17年校招工作,在现在的公司从事深度学习算法和工程化开发工作,17、18年先后获得公司最佳新人,最佳员工,19年任算法部智能硬件组组长。前两年主要是各类算法研究和GPU平台部署的相关工作,包括GPU-TensorRT int8开发部署、目标检测、通道剪枝、语义分割、行人ReID等。19年开始负责公司算法在AI硬件方面的验证和适配工作,主要是基于华为Atlas300的结构化算法产品,也做少量模型训练工作如图像检索和目标检测的一些模块开发。经过4年的工作积累,我对深度学习算法层面软硬件系统开发全流程有比较清晰的认识,能够独立根据产品需求,完成技术方案和算法模型训练,并在GPU和NPU等平台完成核心模块的开发部署。最后我虽然没有从事过解决方案架构师这个职位,但是我有很强学习能力去快速学习产品和应用层面的技术架构和行业解决方案,努力成为行业方面的技术专家,希望面试官能给机会,谢谢。

  2. 为什么离职

    我虽然在现在公司工作还算顺利,就是平台太小很多事情推进困难,技术属于部门中上水平,没有参考系了,提升变慢,个人发展还是有些受限,希望进入大公司,有更大平台上更好发挥自己的能力,有更多机会和更好的发展。

  3. 评价目前公司的工作环境,组织架构,及同事工作年限

    公司算法部同事大部分是校招进公司,都是硕士学历,整体氛围比较轻松,相处和谐,沟通顺畅,工作年限最高7年,我在部门4年属于中等工作年限。组织架构:算法部属于研发中心下面,研发中心还有一个平台部,两个部门合起来30几人;另外还有一个应用软件中心,下设三个部门,质量管理部,交付开发部,交付与服务部,合起来60多人;其他还有非研发部门,营销、运营、财务、行政、采购这些。

  4. 2-3点评价目前公司直属领导
    1. 公平,每个人做好自己工作内容就行,不会因为私交而偏袒谁,根据完成工作多少优劣来绩效。
    2. 技术大佬,做算法很多年了,编程和算法一般很快能找到关键问题
    3. 平时话不多,典型程序员性格
    4. 上下级平等,沟通顺畅
  5. 新公司对你来说哪些因素最重要

1.最主要工作氛围好,看对眼,2.希望进大公司因为有更大平台,3.团队大佬多,4.然后学习晋升机会多

  1. 关于写blog
  2. 坚持最长时间的兴趣,简单谈谈

跑步坚持时间最长,虽然中间有时候会中断,但是基本上每年都会有半年按计划跑步,参加过几次马拉松。

  1. 有没有什么问题问HR?

1.岗位团队情况 2.刚才面试的技术问题中,您觉得哪些是不对的?我面试有些紧张,可能考虑不周。 3. 如果能入职,需要提升什么。4. 面试结果什么时间出

  1. 最佳新人员工为什么颁给你,作出了什么贡献?

首先我在公司算法产品从传统方法向深度学习方法升级过程中,做出了很多贡献,实现了很多算法模块。其次,我对Windows和Linux系统以及在GPU\NPU硬件上从无到有的开发核心模块,部署落地。

  1. 目前公司绩效,能力评定,专利级别
  2. 对海信企业的了解

技术面

  1. 简历中项目描述
  2. 图像检索流程,检索性能

    1.特征提取,包括主干,特征聚合,度量学习。2.pca白化降维,AutoEncoder。3.检索,包括量化倒排索引,milvus相似度比对引擎。4.扩展查询或者叫reranking

  3. 剪枝量化提升性能多少

    1.剪枝:权重减少75%(4倍),性能提高50%,显存减少30%。2.量化:性能提高3倍多,显存减少50%

  4. 修改优化模型主要改哪些部分

    1.backbone 2.attention 3.loss监督 4.压缩 5.数据增强

  5. 为了提升性能,三个模型会不会合并模型

    一般属性识别会考虑利用多任务学习的方法,共享主干,每个分支识别几类属性。

  6. 两个模型如何同时执行

    一般推理都是异步接口,两个模型通常使用两个线程去并行执行。

  7. 怎么实现异步推理系统

    回调和消息队列两种方式。通常需要维护一个全局的数据流队列,输入数据到队列,推理引擎消费数据,然后将处理的数据送入下一级推理引擎的输入队列,来实现异步推理系统。

  8. 算法用在什么软硬件系统上

    GPU\NPU Linux服务器平台

  9. 技术开源更新很快,对技术要有甄别能力,否则很累
  10. 关于数据采集、标注
  11. 写了哪四篇专利,怎么写的?
  1. 《一种视频处理方法及控制平台》主要是关于GPU解码部署和模型多级压缩
  2. 《车辆违法识别方法及相关产品》交通场景图像分割,根据规则进行交通判罚
  3. 《 图像识别方法及相关装置》自注意力蒸馏,由深层的featuremap监督浅层featuremap,多尺度融合,共享检测ROI特征直接进行属性识别。
  4. 《图像局部特征检索及方法》利用关键点描述符来比对ROI框区域的特征

深信服面试

技术面:

  1. 交付过什么算法产品?

    1.基于Atlas300的通用目标结构化产品,并且部署到华为和海康的算法仓平台;2.通用目标检测模块,检测行人、车辆、自行车、三轮车、打伞和拉杆箱;3.通用目标结构化算法的GPU TensorRT int8推理模块;4.图片预审,通过路口交通场景分割,对车辆进行违法判定;5.检测模型剪枝;6.图像局部特征检索,这些产品或者模块除了检测以外,其他都是我从无到有开发。

  2. 最熟悉的技术(一定要往自己熟悉的地方引)

    最熟悉TRT和Atlas300加速的部署,其次图像检索ReID,再次检测,再次通道剪枝,再就是语义分割

  3. 检测yolov3,以及Yolo系列演进
  4. 车辆行人ReID

    数据,最开始用到Market1501、Duke、CUHK03这些数据,后来大部分都是从各个项目现场拿回来的数据,没有跨摄像头,27w类,1200w张图片。车辆直接以车牌号码为类别,收集26w类,800多万张数据。

  5. Atlas300部署
  6. pytorch转caffemodel有没有遇到什么问题
  7. x86平台用什么部署?

    我们没有CPU版本的算法,但是我知道openvino,ncnn,tnn,mnn,tvm,bolt,dabnn这些都能在cpu上较好部署,部署步骤通常都是模型解析转换序列化、加载、推理、获取结果,以及自定层这些。

  8. focal loss作用及alpha和gamma参数分别控制什么?以及与OHEM区别?

    fl(pt)=-alpha(1-pt)^gamma*log(pt) 两个作用:平衡正负样本,降低易分样本(易分样本通常为负样本)的权重。因为loss是一个较小的量级,如果存在大量易分样本相加后会淹没正样本的loss。alpha=0.25 平衡正负样本1:3权重,尽管αlpha平衡了正面/负面例子的重要性,但它并未区分简单/困难例子。 所以gamma使用来区分简单和困难样本,gamma越大,简单样本的loss就越低,推荐gamma=2。ohem计算复杂度大,影响训练速度。

每日优鲜

  1. 过拟合如何优化模型

    1.保存大量中间模型测试精度选择最优 2.数据增强/添加数据 3.Dropout 4.权重正则化 5.通道剪枝

  2. 跟踪算法了解
  3. int8量化的时候有没有遇到什么问题
  4. 技术广和技术深,没有深入某方向算法如何优化模型

    我觉得术业有专攻,我更多专注于算法预研和落地,对广度的需求更大。做好前期算法技术方案及初期模型训练及落地工作,更多精细优化工作可以由其他同事继续深入。

  5. BN层原理作用,以及scale层作用

    BN层分为白化操作和线性变换两部分。白化操作可以使输入的特征分布具有相同的均值0与方差1,固定了每一层的输入分布,从而加速网络的收敛。然而,白化操作虽然从一定程度上避免了梯度饱和,但也限制了网络中数据的表达能力,浅层学到的参数信息会被白化操作屏蔽掉,因此,BN层在白化操作后又增加了一个线性变换操作,让数据尽可能地恢复本身的表达能力。网络被设计的越深越难收敛,因为浅层参数的微小变化进过层层放大,改变了每一层的输入分布,造成深层网络需要不断调整以适应这些分布变化,最终导致模型难以收敛。

牧原集团面试

HR面

  1. 工作责任和担当简单描述,以及对996/007的看法?目前工作强度。

    目前公司是965,通常工作日7-8点下班,周末较少加班。对于996/007觉得有紧急任务可以加班保质保量完成,任务正常推进时,我会花时间去看书学习,提高工作效率,而不是一直低效率的996。

  2. 个人优势技能以及推动力
  3. 在新公司也遇到现在的瓶颈你会怎么处理?

    选择一家公司也是看中公司业务的发展前景,在一个新兴的应用场景里面,我会把这份工作当成事业去做,所以天花板会更高。即使将来遇到瓶颈或者有更好的发展,我相信我对公司的贡献也是相当可观的。

  4. 实现财务自由最想做的三件事,按重要性排序

    1.环游世界放松下来冷静规划后面的生活 2.陪伴家人,让家人得到更好的生活 3.做自己想做的事情或者技术,服务社会 3.

技术面

  1. 检测拥挤和遮挡问题如何优化

    1.改进NMS(soft-NMS和IoU-Net);2.增加语义信息(分割信息,梯度,边缘信息等);3.划分多个part处理;4.互斥损失;5.增加数据

  2. 网络量化误差过大如何解决

    首先8-bit 量化本身不是一个非常激进的压缩策略,不会有严重的精度损失,在fine-tuning之后,由于量化可以带来一定防止over-fitting的作用,所以最终效果反而是有提升的。如果仍然有损失可以试着换1.拥有更多冗余参数的模型例如mobilenet换resnet,2.加ReLU6限制,3.BN稀疏训练4.混合精度训练

  3. 构造函数出错如何处理

    标记错误状态、使用一个额外的initialize函数来初始化、直接抛出异常

  4. 按深度学习任务层次划分,你接触过哪些算法

  5. 消息队列实现异步系统

  6. 传统算法和深度学习算法各自未来的发展

    自建、咨询服务、AI服务化。1. 深度学习是数据驱动的,而传统机器学习则不需要(大数据DL、小数据ML);2. 机器学习是深度学习基石,区别在于特征提取是人工还是学习而得。

  7. 移植工作中什么最重要

    对硬件平台的软硬件架构要熟悉,其次算法流程熟悉,最后C++要牛逼

中集物联

立体车库,辅助停车,智慧养猪,e站快递柜,充电桩及周边 行业了解,工作意愿,我觉得企业最重要的是分工协作,我之前工作经验主要集中在底层算法应用研发上面,对产品及解决方案可能并不了解,但是这并不是大问题,我到这个职位肯定能通过自我学习自我驱动,很快实现自己在公司都价值。

你为什么来我们公司? 看好公司业务场景的未来前景。

你能为我们做什么? 我视觉算法软硬件层能力全面,跟根据公司产品需求和规划,设计好的技术方案,使产品更加智能化,更加稳定,增加公司产品的市场竞争力。能快速上手,减少公司人才培训成本。

你是怎么样的人? 我是自我驱动力强,有进去心的人,我当初专科毕业工作,觉得学历对我未来发展非常重要就下定决心考研,吃了不少苦,考上研究生。 其次我学习能力强,我进入一家公司或者一个团体时可能不是最优秀的,但是经过我的学习和努力,通常都能在团队中拔尖,就比如我在现在公司最佳新人和最佳员工。

你与其他竞聘者有何区别?

你还有问题问我吗?

如何开展工作?先做什么后做什么,如何处理横向纵向的关系。如何协调各部门工作。 首先加强学习业务场景相关技术额算法,完成领导安排的任务,尽快融入团队。在一年内成为对GPU软硬件架构及行业应用有更深入的了解,成为行业专业技术人员,为团队提供算法解决方案层面的技术支撑,更好的服务各类合作项目;更长远希望对行业分析,规划、拓展行业客户和产品;

对我们公司都印象? 人和蔼好相处,业务场景有前景

格言,个人性格? 致良知,知行合一。致良知就是遵循天理去做事,从道德和思想的内在认知上去想把工作做好,想为公司创造价值。知是行的认识,行是知的实践,知是行之始,行是知之成。拥有正确动机,关键看你在为谁谋福利。

华为Atlas300项目经验总结

  1. 流程:
    1. 首先进行模型验证,使用omg离线模型转换工具将模型转换成昇腾310芯片可以高效执行的离线模型,分为4个步骤:解析、量化、编译和序列化。其中编译阶段进行算子调度优化、权重数据重排和压缩、内存优化等。统计离线模型与原始模型精度差异,以及哪些层是不支持的,需要作为自定义层
    2. 由于昇腾310芯片有独立的硬件编解码器,所以需要测试图片视频编解码功能,并统计引入的误差。
    3. 分析通用目标结构化基线工程,对算法重新划分功能模块,解耦模型之间的依赖,设计计算引擎流程图,使得模型最大程度并行执行,达到最大性能
    4. 共享参数和结果通信结构体,引擎独立时并行输出结果,引擎间依赖时同步相关引擎
    5. 编写底层接口用于加载模型、执行推理、获取结果、销毁上下文,便于屏蔽硬件相关代码,使得各引擎可以像使用caffe那样调用硬件算力。

    难点:DVPP编解码、异步接口、细节逻辑

  2. 硬件架构(主要说亮点和GPU的区别)
    1. SOC主要由计算单元、存储单元、控制单元组成
    2. 存储转换单元:硬件高效实现数据格式转换,提高cache命中率。如补零、Img2Col、转置、解压缩、矩阵分块等
    3. 矩阵计算单元:一次完成16x16的两个矩阵运算即4096MAC,Int8完成16×32的连个矩阵运算
    4. 四条流水线:标量计算单元、向量计算单元、矩阵计算单元、存储转换单元
    5. 多进单出数据通路:数据可以从片外HBM、L2缓冲区、输入缓冲区、输出缓冲区多条数据通路进入AIcore计算单元,只能从输出缓冲区流出,统一地控制和协调所有核内数据的输出。
    6. 加速卡和嵌入式盒子两种形态:1.pcie流程编排器功能由流程编排代理子进程、流程编排守护子进程和流程编排服务子进程实现。2.soc的流程编排服务子子进程完成所有功能

    所有设计都是为了保证数据尽可能快到到计算单元。

  3. 软件架构
    1. 4层架构(核心在L2、L1):L3应用使能层、L2执行框架层(框架调用能力和离线模型生成能力,包括流程编排器、框架管理器(离线模型生成器、AI模型管家、离线模型执行器))、L1芯片使能层(加速库给离线模型计算提供加速功能,包括DVPP模块、张量加速引擎、运行管理器、驱动以及任务调度器)、L0计算资源层
    2. 软件流:原始模型通过框架管理器和张量加速引擎生成离线模型;数据通过数字视觉预处理DVPP模块转换成芯片能够处理的格式,由框架管理器加载离线模型并执行,并由运行管理器、任务调度器逐级细化,生成硬件任务,上述整个过程都由流程编排器统筹,最后下发昇腾AI处理器
  4. 关键API:
    1. 数据传输:
      一、为计算引擎流程图的某个Engine设置接收消息的回调函数。我们设置在host侧引擎用于接收推理结果:一、1.定义一个DataRecvInterface类的子类,初始化一个子类对象;2.调用Graph::SetDataRecvFunctor接口将子类的对象设置成回调函数;3.调用Enging::SendData将对应的结构体数据发送到对应的输出端口;4.自动回调子类的RecvData返回推理结果。
      二、用户从外部向Matrix发送void类型的数据到指定端口。
    2. Graph创建销毁:
      一、从文件中创建图:1. 创建hiai::Graph::CreateGraph(graph_path_,graph_list_); 2. 从graph_list_中获取Graph句柄指针;3.销毁hiai::Graph::DestroyGraph(graph_list_.front()->GetGraphId());
      二、动态创建图:1. new GraphConfigList()类;2. GraphConfig* graph_config = graph_config_list->add_graphs();添加图;3. EngineConfig* engine = graph_config->add_engines();添加引擎,之后即按照protobuf的接口方式添加对应的Host和Device引擎设置值。
    3. **Engine实现:**1. 业务引擎子类都是通过继承Engine类,在Init函数中获取Graph中对引擎的键-值内容,初始化配置和加载模型;2. 调用HIAI_DEFINE_PROCESS设置输入输出端口数量,初始化队列,声明Run和Process函数;3.HIAI_IMPL_ENGINE_PROCESS注册对象到全局引擎map里面,实现Process函数。
    4. **DVPP VDEC视频解码:1.对于一个视频码流,调用一次CreateVdecApi接口创建实例后,必须使用同一个实例调用VdecCtl接口进行视频解码,最后再调用一次DestroyVdecApi接口释放实例。调用CreateDvppApi创建句柄用于格式转换;2.编写回调函数FrameReturn(FRAME frame, void hiaiData),frame为解码后结构体,hiaiData为用户指针。将原始hfbc帧格式转成nv21供后续cropresize。3.VdecCtl(vdec_handle_,DVPP_CTL_VDEC_PROC,&dvppapi_ctl_msg,0)执行解码操作;4.DvppCtl(dvpp_handle_,DVPP_CTL_VPC_PROC,& dvppapi_ctl_msg)转换帧格式
    5. **DVPP JPEGD图片解码:**1.调用CreateDvppApi创建dvpp句柄;2.使用JpegdIn和JpegdOut结构体,拷贝裸流并填充JpegdIn,通过DVPPGetOutParameter获取JpegdOut参数,包括内存大小;3.使用HIAI_DVPP_DMalloc申请输出内存空间;将上述结构体和大小赋值给dvppapi_ctrl_msg;5.调用DvppCtl(dvpp_handle_,DVPP_CTL_JPEGD_PROC,&dvpp_ctl_msg);6.发送解码数据到下级引擎,输出内存由shared_ptr自动释放。

目标检测相关

  1. 单步和两步检测及基本概念

    **单步:**没有独立地提取候选区域。分3个步骤:主干网络(backbone)-->衔接部分(neck)-->ROI连接头(Head) **两步:**独立地提取候选区域。分5个步骤:主干网络(backbone)-->衔接部分(neck)-->密集连接头(DenseHead)-->ROI提取器(ROIPooling)-->ROI连接头(Head)\

    1. 主干网络(Backbone):其作用是从图像中抽取特征,将图像从像素空间转换到高维的特征空间,例如 VGG 和 ResNet 等都是常用的主干网络;
    2. 衔接部分(Neck):连接主干网络和头部的结构。它对主干网络生成的原初始特征图执行一些优化或重新配置,例如特征金字塔网络(FPN)就是一种典型的 Neck。
    3. 密集连接头(DenseHead):用于在特征图所映射的密集位置上进行操作,包括 AnchorHead 和 AnchorFreeHead,代表性操作有 RPN、Retina、FCOS 等。
    4. RoI 抽取器:从一个或多个特征映射中提取 RoIPooling 特征。
    5. RoI 连接头(BBoxHead / MaskHead):将 RoI 特征作为输入并计算出对应任务的结果,包括 bbox 的位置、分类或者分割的预测结果。
      NMS(非极大值抑制):通过计算Bbox间的IOU来删除同个目标的重复检测框。
      RPN网络:首先通过一系列卷积得到公共特征图,假设他的大小是N x H x W,然后我们进入RPN阶段,首先经过一个3 x 3的卷积,得到一个256 x H x W的特征图,也可以看作 H x W个256维特征向量,然后经过两个1 x 1的卷积(重组通道特征),分别得到一个2k x H x W的特征图,和一个4k x H x W的特征图,k=9,也就是 H x W x 9个结果,每个结果包含2个分数和4个坐标,再结合预先定义的Anchors,经过后处理,就得到候选框;
      Anchor理解:FasterRCNN中经过一系列的卷积池化得到51x39x256 feature map, 在这个参数基础上,通过3x3滑窗,stride=1,padding=2,滑动得到51x39个3x3窗口,假定3x3窗口是通过spp池化得到,池化的区域的面积以及比例,就是一个个的anchor,对每个3x3窗口求出对应于原图池化区域的中心,得到9个原图不同面积和长宽比例,这就是anchor,(而对于yolo这个中心点规定为每个网格的中心点,每个网格对应3个anchor); \
  2. YOLOv2/v3

    主干网络darknet-53,使用残差结构防止梯度消失,经过五次下采样,采用3个不同尺度的特征图concat连接提取融合特征,加强了对小目标的检测;二元交叉熵损失支持多标签检测;kmean聚类9个anchorbox;头部直接在锚框预测偏移量和置信度;添加BN层以加快收敛速度,防止过拟合; V4、V5新技术:数据增强、自动学习锚框、backbone、Neck、activation、Loss、自对抗训练

    YOLOv1:backbone没有什么创新,使用网格,基于网格进行回归Loss的设计。因为限定了bbox的区域所以能在无锚框情况下回归成功。 YOLOv2:BN层(2%),3x3替换7x7卷积去掉Dropout,增加直通层融合深浅层特征(1%),每个网格增加至5个候选框并引入锚框(7%),多尺度和多阶段训练提高鲁棒性,缺点:单层特征图预测粒度不够,依旧没有解决小目标问题; YOLOv3:引入残差加深网络,不同尺度特征融合,多层特征图预测,softmax改为logistic多标签 小目标问题如何解决?正负样本不均衡,数据增强,浅层特征

  3. CenterNet

    通过检测关键点来获取bbox,对每个像素(即目标bbox的中心点)进行分类,并回归起坐标偏移和宽高。高斯label用于分类标签;采用3个loss函数,分别为focal loss分类、L1loss改进用于关键点回归和宽高回归。接着,MaxPooling代替NMS,共中心智能输出一个目标。6类检测:输出3个分支,包括6个heatmap通道,2个offset通道和2个wh通道。6次upsample,编解码特征融合的语义分割网络,更能凸显检测关键点的目标检测方法。 语义融合:在通道方向进行的聚合/融合,能够提高模型推断“是什么”的能力(what) 空间融合:在分辨率和尺度方向的融合,能够提高模型推断“在哪里”的能力(where)

通道剪枝

《Pruning Convolutional Neural Networks for Resource Efficient Inference》源码地址:https://github.com/jacobgil/pytorch-pruning

原理: 使用泰勒展开进行修剪标准的衡量。实际上就是使得修剪后和修剪前的网络损失尽可能变化最小。最后即激活值和梯度值相乘作为衡量标准,如果通道的梯度值很小,即使当前激活值比较大,对后续损失函数的影响也不大,在排序中重要性也相对会降低。

步骤:

  1. 根据要裁剪的比例,确定迭代次数;
  2. 注册钩子,每次迭代做一次模型训练,获取梯度值和激活值,相乘累加并归一化,计算排序;
  3. 根据排序确定需要裁剪的layer索引和channel索引

图片预审之交通场景语义分割

使用Deeplabv3+像素级语义分割,当时也预研过MaskRCNN实例分割,但是速度太慢了。分割mask标签进行8*8像素框扩张,deeplab主干网络选用resnet101, 不使用池化层,conv-stride2进行下采样,ASPP去掉(解决编码过程中信号被不断下采样导致细节信息丢失的问题,但是dilate conv没法量化),使用了Encoder和Decoder结构用于融合不同层级特征,恢复清晰边缘,原始deeplabv3作为encoder,取conv2_3处输出的低级特征与encoder conv1x1输出处的上采样4x特征进行concat。 tensorrt上量化20ms。二分块合并像素分割结果,区分类别,并RANSAC(RANdom SAmple Consensus),随机采样一致性进行直线拟合,定位车辆所在车道,进行交通违法规则判定。

行人ReID及以图搜图

我们改进Resnet分类网络来提取特征,然后比较检索图像和目标图像的特征相似度,然后判断是否属于同一个行人。对分类网络的进行改造,添加细粒度识别的优化-空间通道注意力模块提取局部特征(首先feature分组,每组feature在空间上与GAP后的feature做点积,然后归一化,再进行sigmoid,最后与分组的每个feature进行scale)和加入6个度量学习的损失函数,我们用主干resnet50,从不同尺度输出3个分支,9个loss(relu分出3对pooling,每对一个avg pooling(平均特征)和一个max pooling(最大特征)进行三元组损失的度量学习 ,然后pooling对进行元素加经过两个全连接层(reshape+bn+relu+fc+bn+relu+fc)进入交叉熵loss分类,最后提取倒数第二的3个fc连接concat得到256*3特征。3个cross entropy loss,6个triplet loss。推理时,输出3个交叉熵分支,concat连接,Rank-1可以到95%,mAP 88%,re-rank可以到96%和94%。

模型部署TensorRT

使用tensorrt推理库,封装实现caffe、tf、onnx三种模型的解析量化推理,包括精度校验、插件层、推理类等,升级算法底层核心计算模块,整体性能提高1.5倍,单推理性能3倍以上。 解析器,构建器,创建网络,创建引擎,运行时反序列化和执行; 导入->校验->生成->部署;

graph TB
iLogger --> iBuilder
iBuilder--createNetwork()-->iNetworkDefinition
iParser--parse()-->iNetworkDefinition
iBuilder--buildCudaEngine()-->iCudaEngine
iCudaEngine--serialize()-->EngineFile
iCudaEngine--createExecutionContext()-->iExecutionContext

iLogger-->iRuntime
iRuntime--deserializeCudaEngine()-->iCudaEngine

模型部署TVM

TVM将计算和调度分离相对TRT而言更加灵活。TVM调度原语有分裂、平铺、融合、重排序等。优化策略:分块、数据排布(将按列访问的数据重拍成行)、循环排布(按行访问)、向量化、线程并行、控制读写cache。

代码管理

公司代码用svn来进行代码管理,我一般只是从代码库拉取代码,自己一般是用git+clion来进行代码版本控制,master分支用来发布版本,然后checkout -b develop分支,平时开发某个功能模块一般再checkout分支,开发完后commit,拉取服务器上的develop分支再merge新功能,再删掉branch -d功能模块的分支。一般用clion来比较前后版本的代码差异,或者不同分支之前代码差异。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment