不是Nvidia买不起,只是国产更有性价比!使用全国产CPU和GPU项目开发记录-训练篇...

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达0b66105f5e9b88517e1827f8031e420b.jpeg

作者丨Dcity

编辑丨极市平台

极市导读

 

本文介绍真实的客流统计算法从Nvidia环境往国产海光CPU+DCU进行迁移的训练过程,并验证了目标检测、行人重识别和多标签分类三个不同类型的任务,最后结果显示采用历史的训练代码,不做任何修改,就能完成整个训练! >>加入小白学视觉技术交流社区,走在深度学习计算机视觉的最前沿

2023年是作为AI领域从业者悲喜交加的一年,一方面是超级大模型带来的狂欢狂热,一方面是算力困境带来的无奈无助。甚至一度连消费级的Nvidia卡都要被禁,我们还能不能愉快地玩转人工智能深度学习了,说好的科研无国界呢!当然了,作为一名算法工程师,我们的使命就是解决技术和研发难题,自然不会坐以待毙。前面有了遥遥领先开路8949ecf7887889814021b4d76305d102.png,于是我也在思考是否可以用国产替代呢,不是很痛的那种?

放眼望去,国产的AI软硬件近年也是风生水起、奋力追赶,到底哪家强,上手了才知道。本文本着工程师实事求是的精神,通过实际落地应用项目的迁移来记录国产方案替代的过程。这里介绍的是国产海光CPU+DCU的方案(不管是CPU还是AI加速器芯片都是国产的)。按照一般AI项目开发的流程,本文内容上分为训练篇和部署篇,方便的大家阅读理解。

项目任务介绍

在零售门店、大型商超和公共设施等场景下大都在出入口安装有监控摄像头,利用这些监控摄像头采用AI的技术方法进行客流信息统计是一类常见的需求。本文涉及的实战项目就是针对上述应用场景,算法应用具体包含的需求点是:

1)能够根据视频流实时统计门口的进入客流数量和出去客流数量(即同时记录出入两个方向的客流量);

2)能够实现客流去重,即频繁进出门口的客流需要在统计上去除重复;

3)能够实现特殊人员的筛选,比如门店工作人员、外卖人员、清洁人员等;

4)限制条件为不允许使用人脸信息和基于人脸的算法。(小伙伴们可以根据实际需求自己设计技术方案)

实现的一种技术方案大致如下:

对于俯视安装的摄像头拍摄到的画面,进行ROI设计,将画面分为门内区域(例如图中白色多边形)和门外区域(例如图中白色多边形以外),同时有一条虚拟的门线(例如图中的红线)。结合ROI区域和门线,可以判断客流运动在门店的进出的方向。采用目标检测器检测行人及头肩,并利用通用多目标跟踪器(比如ByteTrack(https://github.com/ifzhang/ByteTrack))进行连续跟踪,然后根据跟踪轨迹及方向来对进出门口的人数进行统计。为进行人员过滤和去重,结合行人重识别方法和人员属性信息,进行判断。大致逻辑是人员从店门区域走到店内区域就是进店候选,通过过滤来判断是不是真的进店,通过去重判断是不是首次进店:

  • step1: 人员进入店门区域,此时会维护一个长度为time_limit_before的入店前队列,队列中存放人员的位置box信息,再从入店前队列中取一张人员截图,该人员截图需满足没有与其他人员有重叠,或者整个过程中重叠的区域最小;

  • step2: 当人员的box与店内区域有交集时,此时触发入店,保存此时刻的人员截图作为第二张截图;这时又会维护一个长度为time_limit_after的入店后队列;

  • step3: 当time_limit_after这个队列长度达到time_limit_after时,选取此时的人员截图为第三张截图;

  • step4: 使用获取到的三张图片,进行人员过滤与去重,首先如果人员的三张截图中有一张背面朝向的,或者三张里面没有正面朝向的,直接认为不是真正的入店客流并过滤掉;如果未被过滤掉,将三张截图的特征与当前人员库中的特征作比较,相似度高于阈值则去重,低于阈值则认为是真实客流,比对完成后将三张截图的特征入库。

5a64f365282479e26239ca67071cb927.png

从AI模型方面看,主要涉及到三个不同类型的模型:目标检测、行人重识别、多标签图像分类。对于CV方向的小伙伴们来说,这几类模型的技术不会陌生,能够实现的算法和模型结构也有很多的选择。因为是已有项目的迁移,我们没有采用最新的一些的模型技术方法,而是尽可能复用之前的训练工程代码。

先前目标检测模型是用pytorch框架、YOLOv5网络,在Intel CPU + Nvidia GPU上训练得到;行人重识别模型使用pytorch框架、fast-reid网络,在Intel CPU + Nvidia GPU上训练得到;多标签图像分类模型是用paddlepaddle框架、PaddleClas的PULC网络,在Intel CPU + Nvidia GPU上训练得到。现在我们准备将项目的开发迁移到国产AI硬件,选择采用海光的CPU和DCU,其CPU是属于x86架构,DCU是属于GPGPU,更多详细信息可自行查询。

模型训练流程

环境搭建

从事深度学习开发的小伙伴们最痛苦的事情之一应该是环境搭建,即便是有文档,甚至源码,最基本的运行起来都绝非易事。海光DCU开发的相关文档和资源可以在他们的社区光合开发者社区(https://developer.hpccube.com/)找到,下载拉取都很方便(不用受网络之苦)。

首先,我们有一台物理机,其CPU配置为EPYC 8-core Processor, DCU配置为DCU Z100L,预装国产操作系统NFSChina Server release 4.0。根据操作系统先选择安装驱动(https://cancon.hpccube.com:65024/6/main),我们选择的是dtk-22.10.1驱动。然后,就是在宿主机上安装容器环境docker(解决环境问题的利器)。接着是在官方镜像仓库(https://sourcefind.cn/#/service-list)选择所需要的docker镜像,直接docker pull即可。

我们选择了pytorch 1.10.0-ubuntu20.04-dtk-22.10-py37-latest 和paddlepaddle 2.3.2-ubuntu20.04-dtk-22.10-py37-latest两个,分别是pytorch框架和paddlepaddle框架,对应于我们项目上模型训练的历史环境。

至此,环境搭建基本完毕,剩下就是训练工程代码所需要的一些python包,直接pip install(采用pip国内源安装,快速且无任何问题)。这可能是我们在从Nvidia迁移到众多国内外AI硬件,开始第一关———环境搭建过程中最简单最愉快的一次。

模型训练

为了方便进行比较公平的对比,模型训练的工程代码完全复用项目上使用过的历史代码,训练数据和测试数据保持完全相同,并且保持所有超参一致,不修改任何一行代码。

作为对比的Nvidia环境机器配置是GeForce RTX 1080 Ti(实在是没有卡呀!)和Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz,均是单卡真实训练。

1.目标检测模型训练

目标检测模型采用的是YOLOv5网络,具体使用的是轻量级的YOLOv5s,网络层没有进行大的修改,采用自定义的场景数据集,检测类别包括行人(person)和人头(head),训练轮次100+20,SGD优化器。训练速度上两种机器配置DCU和GPU基本一致,都在平均每秒4次迭代左右(4 it/s)。

训练结束后的精度对比如下图所示。可以看出在测试集上的表现,两者相差大约2个百分点,尚可接受。这是在两种硬件环境下由完全相同的训练代码和设置条件下得出的。

e2ae2b9f777e31943b54185f6bb5e0c6.png

从部分推理结果图显示来看,DCU和GPU训练出来的模型在推理时表现几乎一样,连预测的置信度都没有差异(如下图所示)。

eb5bd89a421fc25312806cf8684ebc3c.png

2.行人重识别模型训练

行人重识别模型采用的是fast-reid网络,具体使用的轻量级的R34网络,特征向量512维,输入图像分辨率256x128,训练轮次120.训练速度上,GPU机器平均每次迭代0.65s(0.65s/it),DCU机器平均每次迭代1.34s(1.34s/it)。因为采用的是完全相同的训练设置,这里的速度差异应该是由于训练数据加载导致(两个机器的CPU核数不同,论单核的性能DCU机器的CPU应该比GPU机器采用的Intel CPU差一些,毕竟从主频上就差距较大,前者是2.9GHz,后者4.2GHz)。

训练结束后的精度对比如下图所示, 可以看出在测试集上的表现,两者相差不到2个百分点,都还是不错的效果了。

6b47cfbc6a6b7ad95d7f5a8ed0e2c11b.png

从部分识别结果图来看还是符合预期的,能正确进行识别和区分。

563c1d4c2a1ded025a5bdcea2862d2ca.png

3.多标签图像分类模型训练

多标签图像分类模型是采用paddlepaddle框架、PaddleClas实现。多标签分类模型的目的是对方便对人员属性进行区分,包含了性别(男女)、年龄段(儿童、青年、中年、老年、未知)、身份属性(普通客人、快递人员、穿制服工作人员、清洁工人等)、身体朝向(正面、背面、其他)。

具体实现是基于PaddleClas中的person_attribute,轻量级的PPLCNet网络进行改造。网络输入分辨率256x192,标签数量14,训练轮次100。训练速度上,DCU机器和GPU机器差异巨大,其中DCU训练的吞吐量约1410images/sec,GPU训练的吞吐量约194images/sec,尚不清楚差异的来源,因为两种环境的训练工程代码完全一致,没有任何的修改(对paddlepaddle比较熟悉的小伙伴可以去深究一下)。

训练结束后的精度对比如下图所示,可以看出在测试集上两者的差异在1个百分点之内,没有大的差别。

df36b3dd9eba8f7edd4fec1ad41cb80e.png

从一些识别结果样例图看,效果还是不错(不少场景下,截取到的行人图像质量较差)

2a609c4600ce6825ce032df6c8cc359e.png

总结

本文重点阐述了真实的客流统计算法从Nvidia环境往国产海光CPU+DCU进行迁移的训练过程,验证了pytorch和paddlepaddle两种主流的深度学习框架,以及目标检测、行人重识别和多标签分类三种类型的深度学习任务,详细对比了Nvidia GPU和Hygon DCU两种硬件环境下的训练结果。从使用体验上总体还是超出预期的,最难能可贵的是采用历史的训练代码,不做任何修改,就能完成整个训练,并且精度对比差异不大,这才是真的无痛平滑迁移!当然,此处进行的实验有限,不能说明太多问题,但是相信国产的AI软硬件在小伙伴们的共同努力下会越来越好,毕竟谁能一直忍受卡脖子呢!

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。


下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。


下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。


交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值