1.导言:目标检测任务描述
随着计算机技术的发展和计算机视觉原理的广泛应用,利用计算机图像处理技术对目标进行实时跟踪研究越来越热门,对目标进行动态实时跟踪定位在智能化交通系统、智能监控系统、军事目标检测及医学导航手术中手术器械定位等方面具有广泛的应用价值。目标检测任务相较于分类任务更为精细。分类任务通过图片整体内容对图片进行分类,而目标检测任务需要分离图片的背景和前景,找出图像或视频中人们感兴趣的物体,并同时检测出它们的位置和大小,它不仅要解决分类问题,还要解决定位问题,属于一个 Multi-Task 的问题。
2.传统目标检测方法
传统的目标检测算法主要有以下几个步骤:
1.首先通过滑动窗口的模式来扫描图片每一块区域,如下图:
图1 传统方法滑动窗口方式遍历图片
2.对每个小窗口进行特征提取,常见的特征提取方法有 SIFT 和 HOG。
3.最后使用分类器进行分类。
传统方法存在两个主要的问题:
- 第一个是滑动窗口大小的问题。由于图片的大小和目标的大小都不确定,这使得需要设置多尺度的窗口大小。这样一来,时间成本就上升了,同时还会带来大量的冗余窗口。
- 第二个是特征问题,手工设计的特征并不能充分提取图片中的丰富信息。
3.基于深度学习的目标检测方法
由于深度学习和 GPU 计算能力的迅速发展,深度学习方法广泛应用于目标检测领域。目前主流的目标检测模型通常分为两类:One-stage 和 Two-stage。Two-stage 方法代表模型为 RCNN 系列模型,该类方法具有较高的定位和目标识别精度。One-stage 方法代表模型为 yolo 系列模型,该类方法具有较高的推理速度。
3.1 Two-stage
Two-stage 模型先提取物体区域,再对区域进行分类识别,其代表为 R-CNN 及其改进网络。
3.1.1 R-CNN
论文🔗arxiv.org/pdf/1311.25… R-CNN[1] 在候选区域上自下而上使用CNN用于定位和分割物体,因为把 region proposal 和 CNNs 结合起来,所以该方法被称为 R-CNN:Regions with CNN features。R-CNN 的检测系统如图2所示。
图2 R-CNN
R-CNN 检测系统主要有三个模块构成:第一个是产生类别无关的 region proposal,这些推荐定义了一个候选检测区域的集合。第二个是大型的卷积网络,用于从每个区域抽取特定大小的特征向量。第三个是判断类别的线性 SVM。
3.1.2 Fast R-CNN
论文🔗www.cv-foundation.org/openaccess/… 由于 R-CNN 需要多阶段的 pipeline 训练,训练费时间费空间,物体检测慢,因此 R-CNN 的作者在 RCNN 的基础上做出了改进,提出了 Fast R-CNN[2]。Fast R-CNN 的网络框架如图3 所示。
图3 Fast R-CNN
Fast R-CNN 网络中有两个输入,分别为图像和对应的 region proposal。其中 region proposal 由 selective search 方法得到。对于每个类别,都训练一个回归器,且只有非背景的 region proposal 才会进行回归。图中的 ROI pooling 的作用是对于不同大小的 region proposal,得到固定大小的特征图。由于全连接层的输入尺寸需要相同,因此不同大小的 region proposal 需要进行缩放。 在检测调优方面,Fast R-CNN 提出一个更加高效的训练方法,可以在训练过程中发挥特征共享的优势。首先采样 N 张图像,然后从每张图片采样 R/N个RoI。来自同一张图片的 RoI 在前向和后向传播中共享计算和内存。这样就可以减少 mini-batch 的计算量。
3.1.3 Faster R-CNN
论文🔗arxiv.org/pdf/1506.01… Faster R-CNN[3] 将特征提取、proposal 提取、bounding box regression(rect refine),classification 都整合在了一个网络中,在速度方面提升明显。其具体网络框架如图4所示。
图4 Faster R-CNN
Faster R-CNN 的 Conv layers 中对所有的卷积都做了 padding 处理,使得原图变为 (W+2)x(H+2),再做 3X3 的卷积输出为 WxH 的特征图,这使得 Conv 层不会对图片大小进行改变,使得特征图和原图可以对应起来。
Faster R-CNN 通过 RPN 网络生成检测框,极大提升了检测速度。RPN 网络输出两部分内容,一部分为 anchors 的分类,一部分为对于 anchors 的 bounding box regression 偏移量。
3.1.4 Mask R-CNN
论文🔗arxiv.org/pdf/1703.06… Mask R-CNN[4] 在 Faster R-CNN 上添加了一个分支,从而实现实例分割(略)。具体如图5所示。
图5 Mask R-CNN 模型框架
3.1.5 Cascade R-CNN
论文🔗arxiv.org/pdf/1712.00… Cascade R-CNN[5] 针对 IOU 的阈值问题进行了改进。用较低的 IOU 来训练会使得检测器因为过拟合而产生较大的噪声,用叫高 IOU 训练模型会使的模型的性能不佳。Cascade R-CNN 采用多级结构,每一部分检测器的 IOU 不断提升,使检测器逐段进行训练。上一阶段训练好的结果来帮助下一阶段来训练,逐步改进的超参数的重采样保证了所有检测器具有相等大小的正样本集,减少了过拟合问题。Cascade R-CNN 的框架如图6(d)所示
图6 Cascade R-CNN 与其他框架比较
3.2 One-stage
One-stage 模型直接输出物体类别的概率和边界框 (Bounding Box) 的坐标,其速度优势明显。接下来以 YOLO 系列为例子,详细介绍 One-stage 模型的发展。
3.2.1 YOLOv1
图7 YOLOv1 网络模型
YOLOv1[6] 的网络模型如图7所示。YOLOv1 的输入为整张图片,这和传统手工特征相比能给分类器提供更多的图片信息。YOLOv1 将图像划分成 S × S 个网格,如果检测目标的中心落在网格之中,那么网格将负责对检测目标进行预测。每个网格预测 B 个边界框和置信度。置信度不仅反映了所预测的边界框里包含目标的概率,也反应了这个边界框预测的概率。每个边界框需要预测5个值 (x,y,w,h,confidence),每个网格还需要预测 C 个类别,因此网络输出的 tensor 维度为 S x S x (5xB+C)。得到每个边界框的 confidence 以后,设置阈值,对高于阈值的边界框进行 NMS 处理,得到最后的结果。 YOLOv1 的优势在于速度快并且泛化性强。其缺点有以下几点:
- 1.每个网格最多只能预测两个类别,这对于一个网格包含多个类别的物体时会产生漏检。
- 2.YOLOv1 的损失函数采用均方误差,由坐标误差、IOU 误差和分类误差组成。对于小物体和大物体同时存在时,小物体的 IOU 误差对于网络优化会产生较大影响。
3.2.2 YOLOv2
论文🔗 arxiv.org/abs/1612.08… YOLOv2[7] 较 YOLOv1 模型除了预测的更准确,速度更快,其能识别的对象也扩展到 9000 多种,因此 YOLOv2 也被称之为 YOLO9000。 YOLOv2 在网络上进行了如下图的改进:
图8 YOLOv2 在 YOLOv1 基础上的模型改进
在准确性提升方面,YOLOv2 做了以下工作:
- Batch Normalization:YOLOv2 在所有卷积层中添加BN并且摒弃了 dropout,这使得整个网络提升超过 2% 的 map。BN 不仅有助于解决过拟合问题,还在一定程度上起到了正则化效果。
- High resolution classifier:YOLOv2 采用 448 x 488 的高分辨率样本对分类网络进行 10 个 epoch 的微调,让网络适应高分辨率的输入,之后再用 448 x 488 的样本在检测网络上进行微调。高分辨率的图像分类器使得网络提升了大约 4% 的 map。
- Convolutional With Anchor Boxes:YOLOv2 参考了 Faster R-CNN 的方法采用了 Anchor,即预设一组边框来覆盖全图。YOLOv1 每张图片输出 98 个预测框,而 YOLOv2 采用 Anchor 最终输出 1000 多个预测框。添加 Anchor 使得精确度略微下降,但是 Recall 达到了 88%。
- Dimension Clusters:在 Anchor 的设计上,YOLOv2 在训练集上对标注的边框进行 k-means 聚类。通过实现分析得出,聚类后选择的 Anchor,可以提升 Avg IOU。
- Direct location prediction:考虑到训练早期预测边框极不稳定,YOLOv2 将预测边框限定在特定的 gird 之中。在做了限制后,位置预测参数化使得其更易学习,模型也变得更加稳定。
- Fine-Grained Features:由于图像中存在大小不一的目标,在一系列的特征提取操作后,特征图容易忽视小目标的特征。为此,YOLOv2 提出了passthrough 层,具体操作就是将最后一次 pooling 之前的特征图拆成4份。举个例子,原来 26 x 26 x 512 的特征图被拆分成 4 x 13 x 13 x 512 的特征图。这样可以保留特征图中的一些细节。
- Multi-ScaleTraining:YOLOv2 希望不同尺寸的图片都能有不错的效果,因此其在训练中加入了不同尺度的图片进行训练。YOLOv2 每隔几次迭代更改一次网络,其网络每 10 个批次随机选择一个新的图像维度大小。由于模型按 32 倍进行下采样,因此输入的图片大小为 {320,352,...,608}。
在速度提升方面,YOLOv2 提出了一个新的网络。YOLOv1 在 Googlenet 框架的基础上进行改进,其速度快于 VGG-16,但是在准确率方面不如 VGG-16。为此 YOLOv2 从头设计了网络 Darknet-19,如图9所示。Darknet-19 仅需要 55.8 亿次操作来处理图像,但在 ImageNet 上达到了 72.9% 的 top-1 精度和 91.2% 的 top-5 精度。
图9 Darknet-19
在识别对象扩展方面,YOLOv2 提出了一种在分类数据集和检测数据集上联合训练的机制。在训练期间,YOLOv2 对于目标检测的图像使用完整的损失函数进行反向传播,对于分类的图像只计算分类的损失函数。但统一训练时数据集存在一定的问题,检测数据集通常是比较普通一般的标签如“狗”、“猫”等,但是分类数据集会更广泛和深入,比如 ImageNet 数据集有一百多个狗的品种。为此,YOLOv2 提出了 Hierarchical classification,如下图所示:
图10 Hierarchical classification
具体步骤为:遍历 ImageNet 的类别,在 WordNet 中寻找该类别指向根节点的路径。如果只有一条,那么直接添加到树形结构,如果有多条,那么选取最短的一条加入。
3.2.3 YOLOv3
论文🔗 pjreddie.com/media/files… YOLOv3[8] 吸取其他方法的优点并且训练了比其他网络更好的分类器网络。 对于 Bounding Box 预测,YOLOv3 延续 YOLOv2 的做法,通过维度聚类得到 anchor boxes 来预测 bounding boxes。在类预测方面,作者使用了多标签的分类法,损失函数采用了 BCE(binary cross-entropy)。之所以不使用 softmax 损失函数是因为数据集上有很多重叠的标签,比如女人和人。除此以外,YOLOv3 还在三个不同的尺度上预测物体框,使用类似特征金字塔的网络在这些尺度上提取特征。对于第一种尺度,在基础特征提取器上添加了几个卷积层,再来预测 bounding box。第二种尺度是取前两层的特征图进行上采样 x2,再和最后一个 16x16 的特征图相加,然后通过多层卷积输出信息。第三种尺度与第二种类似,把特征图大小变成了 32 x 32。 YOLOv3 在特征提取上通过一个新网络来实现。新网络杂糅了 Darknet-19 和 resent,具体如图11所示:
图11 Darknet-53
在测试中,新网络和当时的 SOTA 分类器在效果上相差无几,但在速度上明显快于其他分类器。 YOLOv3 在 IOU=0.5 上的 map 效果相当强悍,但是随着 IOU 的阈值增加而效果明显下降,这说明 YOLOv3 在检测框完美贴合物体上还有一定困难。除此以外,YOLOv3 对于小物体的效果优于过去,但在中尺寸和大尺寸的效果不尽人意。YOLOv3 在速度的提升上可以说是效果拔群,这也是 YOLOv3 在许多工业上有应用的重要原因。
3.2.4 YOLOv4
论文🔗 arxiv.org/pdf/2004.10… YOLOv4[9] 是一个高效强大的模型,它可以在 MS COCO 数据集上达到 43.5% 的 AP(65.7% 的 AP50)。YOLOv4 使得每个人都可以使用 1080Ti 或 2080Ti 的 GPU 来训练一个超快速和精确的目标检测。
图12 YOLOv4 和其他方法的比较
YOLOv4 结合了当时很多提升性能的方法,并进行了测试。具体结合了以下功能:加权残差连接 (WRC),跨阶段部分连接 (CSP),跨小批量标准化 (CmBN),自对抗训练 (SAT),Mish 激活,马赛克数据增强,DropBlock 正则化和 CIoU 损失函数。最终和其他方法的比较如图12所示。
3.2.5 YOLOv5
代码🔗github.com/ultralytics… YOLOv5l 模型如图13所示:
图13 YOLOv5l 模型
截止到目前,YOLOv5 一共发布了 YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l 和 YOLOv5x。在最新版中,将 Focus 框架改为 6 x 6 的 Conv2d,替换 SPP 为 SPPF,使得网络速度提升一倍以上。
- 在数据增强方面:YOLOv5 采用了 Mosaic、Copy paste、Random affine (Rotation, Scale, Translation and Shear)、MixUp、Albumentations、Augment HSV(Hue, Saturation, Value) 和 Random horizontal flip。
- 和 YOLOv4 比较,YOLOv5 在数据增强方面添加了更多的操作。因为 YOLOv5 支持实例分割,因此其添加了 Copy paste 的数据增强方法。
- 在训练策略方面:YOLOv5 采用了多尺度训练,输入的图片会随机扩大或缩小(范围在0.5~1.5)。最终的图片大小取值始终为 32 的倍数。当用户训练自定义数据时,YOLOv5 会根据训练集通过聚类的方式自动计算 Anchors 来匹配每个数据集。在模型训练时,会采用 Warmup 来预热学习率,让模型先趋于稳定,有助于减缓模型在初始阶段对 mini-batch 的提前过拟合现象。之后通过 Cosine LR scheduler 来动态调节学习率。训练的时候采用了 EMA(Exponential Moving Average),具体操作是在训练时复制一份模型,不断更新模型复制,直至最后,模型会在最优点处都懂,EMA 取最后模型复制的平均,增加模型的鲁棒性。混合精度训练和 Evolve hyper-parameters 也被加入了 YOLOv5。
- 在其他方面:关于损失函数,YOLOv5 的损失函数主要由三部分构成,Classes loss(BCE loss),Objectness loss(BCE loss) 和 Location loss(CIoU loss)。为了平衡不同尺度的损失,对于大中小的 loss 分配的权重分别为 0.4、1 和 4。针对于 Grid 敏感度问题,YOLOv5 对预测目标宽高做了限制,以免出现梯度爆炸和训练不稳定等问题,如图14所示。
图14 对预测目标宽高做限制前后
3.2.6 YOLOv6
论文🔗arxiv.org/pdf/2209.02… YOLOv6[10] 重新设计了一系列不同规模的模型,为不同工业场景量身定做。同时,YOLOv6 还添加了自蒸馏策略,为了更好地部署模型。具体模型如图15所示:
图15 YOLOv6 框架
- 在网络设计方面,YOLOv6 融合 RepVGG 做了改造。YOLOv6 在主干网络进行了重新设计,对于小型网络将 RepBlock 作主干网络以获取更多的特征表达能力。
- 而对于大型网络,修改了 CSP 块,添加 RepBlock 思想,构建 CSPStackRep 块。在 Neck 部分,YOLOv6 采用 PAN 的拓扑结构,实现 Rep-PAN。在 Head 方面进一步简化,构建高效解耦头。
- 对于标签分配,YOLOv6 引入了更高效的标签分配策略 TAL(Task Alignment Learning) 的动态匹配策略,解决了目标检测任务中常见的分类回归不均衡难题,提高检测精度。
- 对于损失函数,YOLOv6 选择 VariFocal 损失作为分类损失,SIoU/GIoU 损失作为回归损失。
YOLOv6 为了适配工业界,引入了自蒸馏和并且训练了更多的 epoch。此外,软标签和硬标签的信息比例通过余弦衰减动态下降帮助学生在训练过程中的不同阶段选择性地获取知识。在面对评估时不添加额外的灰边而导致性能受损的问题,也提出了一些补救措施。
3.2.7 YOLOv7
论文🔗arxiv.org/pdf/2207.02… YOLOv7[11] 的主要工作有以下几点:
- 设计了几种 bag-of-freebies 方法,能够不增加推理成本的情况下提高检测精度。
- 解决了重新参数化模块替换原始模块和动态标签分配给不同输出层的问题。
- 提出了实时目标检测器的“扩展”和“复合缩放”方法,可以有效地利用参数和计算。
YOLOv7 基于 ELAN 提出了 E-ELAN 的扩展方法,具体如图16(d) 所示。E-ELAN 使用 expand、shuffle、merge cardinality 来实现在不破坏原有梯度路径的情况下不断增强网络学习能力。在架构方面,E-ELAN 只改变了计算块的架构,而过渡层的架构完全没有改变。 其策略是使用组卷积来扩展计算块的通道和基数,并对计算层的所有计算块应用相同的组参数和通道乘数。 然后,每个计算块计算出的特征图会根据设置的组参数 g 被打乱成 g 个组,然后将它们连接在一起。 此时,每组特征图的通道数将与原始架构中的通道数相同。 最后,添加 g 组特征图来执行合并基数。 除了保持原有的 ELAN 设计架构,E-ELAN 还可以引导不同组的计算块学习更多样化的特征。
图16 扩展的高效层聚合网络
模型缩放是为了生成不同尺度的模型来满足不同的实际需求。YOLOv7 基于级联的模型提出相应的复合模型缩放方法。当缩放一个计算块的深度因子时,同时计算该块的输出通道的变化。之后,对过渡层进行等量变化的宽度因子缩放,最终结果如图17(c)所示。
图17 基于级联的模型的模型缩放
在训练方面,YOLOv7 也提出了一些技巧。RepConv 中的恒等连接破坏了 ResNet 中的残差和 DenseNet 中的连接,为不同的特征图提供了更多的梯度多样性。基于上述原因,作者使用没有恒等连接的 RepConv(RepConvN) 来设计计划中的重参数化卷积的体系结构。此外,YOLOv7 还在深度训练中的标签匹配进行了讨论。过去,在深度网络的训练中,标签分配通常直接指GT,并根据给定的规则生成硬标签。然而,近年来,如果以目标检测为例,研究者经常利用网络预测输出的质量和分布,然后结合 GT 考虑,使用一些计算和优化方法来生成可靠的软标签。无论 auxiliary Head 或 lead Head 的情况如何,都需要对目标目标进行深度监督培训。“如何将软标签分配给 auxiliary head 和 lead head?”成为了一个新问题。目前最常用的方法的结果如图18(c)所示,即将 auxiliary head 和 lead head 分开,然后使用它们自己的预测结果和 GT 来执行标签分配。YOLOv7 提出的方法是一种新的标签分配方法,通过 lead head 预测来引导 auxiliary head 和 lead head。换句话说,使用 lead head 预测作为指导,生成从粗到细的层次标签,分别用于 auxiliary head 和 lead head 的学习。所提出的2种深度监督标签分配策略分别如图18(d)和(e)所示。
图18 Coarse for auxiliary and fine for lead head label assigner
4.技术现状与未来趋势
4.1 难点与挑战:
所有的目标检测类任务中,所面临的问题大致有以下几大类:
- 数据与标注成本:训练需要大量的人工标注数据,但人工操作的成本高且不一定100%可靠。
- 难分样例问题:生产环境中模型表现会往往不及测试集中的表现,一个常见的优化方向是如何挖掘更多的难分样例来提升模型。
- 小目标检测问题:小目标一直是目标检测中老生常谈的问题,通常表现为对噪声数据过拟合,或者检测不到,模型表现不佳。
- 复杂多变的背景:背景对目标的遮挡,模糊,黑暗,过曝,拥挤,形变,视角变换,高相似对象这些情况都对目标检测带来挑战。
4.2 模型提升方向:
为了改善目标检测的精度,近年来出现的一些主要改进方法如下:
- 更丰富的数据增强技术,如 mosaic,mixup,cutmix 等;
- 更强大的 backbone 特征提取网络,如 darknet,repnet,resnext 等;
- 更有效的 neck 特征融合策略,如 FPN,SPP,PAN 等;
- 改进 DET 基本组件:卷积,归一化,激活,池化,正则化,损失,IOU 和 NMS 算法等;
- 增强特征提取能力:注意力机制,上下文信息,多尺度特征融合等;
- 提升训练方法:warm-up,余弦退火,遗传算法,标签平滑,SAT 等;
- 更合理的标签分配策略:ATSS,OTA,PAA,TOOD 等; ...
4.3 技术发现趋势:
在未来的一些研究工作中,目标检测领域可能主要呈现以下几大发展趋势:
- 轻量化:在移动设备上快速流畅的运行,加快部署推理速度,这在物联网,边缘计算,增强现实等方向都具有重要的意义。
- 领域自适应:模型训练过程本质都是假设数据在独立同分布的前提下进行似然估计的过程,但现实中这种假设并非一定成立。
- 非监督:包括无监督,自监督,半监督,弱监督等学习范式在目标检测上的研究。
- 少样本:使得模型能够像婴儿一样可以快速认识新实例,为了解决在训练样本少的情况下对新标签快速学习的问题。
- AutoML:基于深度学习的检测算法被设计得越来越复杂,未来一个发展方向是将目标检测与 AutoML 技术结合,使其目标检测脱离于经验依赖,实现机器的自动设计和学习。 ...
5.参考文献
[1] Girshick R , Donahue J , Darrell T , et al. Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation[J]. IEEE Computer Society, 2013.
[2] Girshick R . Fast R-CNN[C]// International Conference on Computer Vision. IEEE Computer Society, 2015.
[3] Ren S , He K , Girshick R , et al. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2017, 39(6):1137-1149.
[4] He K , Gkioxari G , Dollar P , et al. Mask R-CNN[C]// International Conference on Computer Vision. IEEE Computer Society, 2017.
[5] Z. Cai and N. Vasconcelos, "Cascade R-CNN: Delving Into High Quality Object Detection," 2018 IEEE/CVF Conference on Computer Vision and Pattern Recognition, 2018, pp. 6154-6162, doi: 10.1109/CVPR.2018.00644.
[6] Redmon J , Divvala S , Girshick R , et al. You Only Look Once: Unified, Real-Time Object Detection[C]// Computer Vision & Pattern Recognition. IEEE, 2016.
[7] Redmon J , Farhadi A . YOLO9000: Better, Faster, Stronger[C]// IEEE Conference on Computer Vision & Pattern Recognition. IEEE, 2017:6517-6525.
[8] Redmon J , Farhadi A . YOLOv3: An Incremental Improvement[J]. arXiv e-prints, 2018.
[9] Bochkovskiy A , Wang C Y , Liao H . YOLOv4: Optimal Speed and Accuracy of Object Detection[J]. 2020.
[10] Li, C., YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications
[11] Wang C Y , Bochkovskiy A , Liao H . YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors[J]. arXiv e-prints, 2022.
推荐阅读
招贤纳士
政采云技术团队(Zero),一个富有激情、创造力和执行力的团队,Base 在风景如画的杭州。团队现有 500 多名研发小伙伴,既有来自阿里、华为、网易的“老”兵,也有来自浙大、中科大、杭电等校的新人。团队在日常业务开发之外,还分别在云原生、区块链、人工智能、低代码平台、中间件、大数据、物料体系、工程平台、性能体验、可视化等领域进行技术探索和实践,推动并落地了一系列的内部技术产品,持续探索技术的新边界。此外,团队还纷纷投身社区建设,目前已经是 google flutter、scikit-learn、Apache Dubbo、Apache Rocketmq、Apache Pulsar、CNCF Dapr、Apache DolphinScheduler、alibaba Seata 等众多优秀开源社区的贡献者。如果你想改变一直被事折腾,希望开始折腾事;如果你想改变一直被告诫需要多些想法,却无从破局;如果你想改变你有能力去做成那个结果,却不需要你;如果你想改变你想做成的事需要一个团队去支撑,但没你带人的位置;如果你想改变本来悟性不错,但总是有那一层窗户纸的模糊……如果你相信相信的力量,相信平凡人能成就非凡事,相信能遇到更好的自己。如果你希望参与到随着业务腾飞的过程,亲手推动一个有着深入的业务理解、完善的技术体系、技术创造价值、影响力外溢的技术团队的成长过程,我觉得我们该聊聊。任何时间,等着你写点什么,发给 zcy-tc@cai-inc.com
微信公众号
文章同步发布,政采云技术团队公众号,欢迎关注