paint-brush
我们如何自动验证汽车照片by@indrivetech
6,792
6,792

我们如何自动验证汽车照片

inDrive.Tech9m2023/07/05
Read on Terminal Reader
Read this story w/o Javascript

inDrive 要求用户每月为他们的汽车拍一张照片。我们的管理员手动检查前后照片。当前方法的问题在于,增加主持人的数量比扩大基础设施的规模更困难。我们希望向用户提供线索,说明为什么所提供的照片“不符合要求”

People Mentioned

Mention Thumbnail
featured image - 我们如何自动验证汽车照片
inDrive.Tech HackerNoon profile picture

在本文中,我将告诉您我们如何自动化用户车辆验证过程。我将与您分享我们使用的组件以及我们如何组织流程。


在inDrive,我们使用大量的视觉内容。我们存在于具有不同思维方式的广泛不同地区,使用大量不同的文件:护照、证书和车辆文件。


除此之外,还有司机本身和他们的车辆需要处理。


当谈到旅行舒适度和提高用户的服务质量时,安全和消除意外情况是绝对重要的。例如,当停下来的车不是您预订的车时。


您将了解 inDrive 目前如何处理定期车辆验证。完成后,我们的主持人会手动检查之前和之后的照片。当然,验证的过程还涉及到其他的事情,这里我们只关注这方面。


当前方法的问题在于,增加主持人的数量比扩大基础设施的规模更困难。尤其是在处理用户的个人数据时。

关于手头的任务

让我们把问题说得很简单,就好像对一个孩子来说:我们有两张汽车的照片——它们都是同一辆车吗?显然,任何人都可以解决这个问题,但是一旦我们添加比较标准,事情就会变得更加复杂。


例如,确保这不是手机屏幕截图或车牌号完全匹配。



在全球范围内,这个问题可以通过多种方式解决: 使用端到端模型和这些模型集。


E2E模型意味着涉及一个大型模型(很可能是神经网络),它可以根据一对图像回答我们的问题,例如“照片中是否是同一辆车?”,“车牌号是否匹配”升还是不升?”等。


此类模型的问题在于,它们需要大量数据来学习,并且缺乏对答案为何如此的理解。


例如,如果我们训练一个模型根据一对照片回答“是”/“否”,则不再可能找出答案的原因。


因此,用户将无法理解我们想要从他们那里得到什么,我们将不得不引入主持人。


这种端到端的方法不适合我们。我们希望向用户提供线索,说明为什么所提供的照片“不符合要求”:“最好在光线充足的位置拍摄照片”,“看起来我们看不到整辆车”图片”或“车牌号与提供的信息不符。”

模型质量和基础

对我们来说非常重要的是,当存在不同的车辆时,模型不会回答“是”。我们将此指标命名为“FPR”(误报率),并用它来显示“是”响应与所有负面示例(车辆不匹配)的百分比。


现在,我们引入另一个指标 - TPR - 来衡量“是”答案与所有肯定答案的比率。


基本上,这两个指标已经足以描述我们优化模型时的任务:最小化 FPR 并确保 TPR 不会下降太多。


我们采用了模型集方法。因此,我们可以将所有想法添加到最终解决方案的骨架中(该骨架将称为“基线”)。让我们探索一下它是什么样子并将其分解为几个部分。



事实上,它由多个模型组成,这些模型在输入端独立处理两个图像,并在输出端给出车辆的车牌号及其矢量。结果,根据比较的细节,对正在审查的两张照片做出验证决定。


这是我们用来添加多个其他模型,将它们放置在模型的不同节点中的算法的骨架。例如,在评估照片的质量时,其清晰度、光线和饱和度水平。


有时,我们需要检测提交不真实照片的尝试。为此,我们添加了一个预处理器来检查照片是否存在欺骗攻击。


使用这种方法时,拥有清晰的产品迭代周期并生成良好的测试数据集至关重要。我们添加了一个新模型来评估这两个因素,“它是否解决了分配的问题?”以及“它对之前解决方案的指标有多少修改?”


现在我们来谈谈该解决方案的基本构建块。

您只需要检测和分割

让我们继续看一下术语。下面,我将解释“边界框”和“分割掩模”等术语的含义。


边界框是用于包围特定感兴趣对象的矩形形状。例如,如果我们想识别猫的脸,我们可以通过用红色勾勒出它的轮廓来定义一个边界框。它由图像内左下点和右上点的坐标定义。


分割是指为输入图像中的每个单独像素分配类标签的任务。在我们讨论的背景下,我们通过将猫从背景中分割出来来隔离它。



在我们的模型中,我们对车辆的背景不感兴趣,因为这没有为塑造我们的目标解决方案提供相关信息。但这并不意味着我们不知道如何通过使用背景来改进我们的模型。


为了解决将车辆与背景分离的挑战,我们将采用 YOLO 系列(You Only Look Once)模型并训练它来分割汽车图像。这里的问题是,我们有大量来自用户的照片,图片中包含不止一辆汽车。


为了解决这个问题,我们可以采用以下方法:


  • 计算边界框的质心与照片中心之间的距离。


  • 确定边界框的大小。


  • 根据距中心的距离按升序对边界框进行排序,并根据框的大小按降序对边界框进行排序。


  • 选择排序列表中的第一个对象。因此,我们获得最接近图片中心且最大的边界框。


太好了,我们已经得到了第一个输入。



下一步是查找车辆的车牌号。在几乎所有国家/地区,车牌都位于前面。车辆牌照位于不寻常位置的罕见情况不在本文讨论范围之内。


建立车牌号的最常见方法是检测边界框并对生成的补丁应用 OCR。


但正如我们的实验所示,如果车辆的车牌号与地平线不平行,OCR 的效率就会低得多(并且在某些型号中需要更长的时间)。


这与我们的数据尤其相关,我们要求司机以一定角度拍照。



我们决定的解决方案是对数字进行分段,然后平滑获得的轮廓线。在我们的例子中,分割任务的处理方式与车辆的分割方式类似,结果如下:



接下来,我们使用蒙版绘制轮廓线并应用 ConvexHull 对其进行平滑处理。这个简单的算法可以平滑(拉直)轮廓线的凹度,使其更直。这可以描述为轮廓多边形中的角度数量较少。


在理想的情况下,此操作将为我们提供一个由四个点定义的矩形。



一旦我们对齐了边界,我们就用透视法重复同样的练习,这样注册号就平滑、清晰、清晰可见。当以几乎看不到车牌的角度拍摄汽车时,这种方法特别有用。


什么是透视校正?我记得在代数课上旋转矩阵是如何工作的。如果你在笛卡尔坐标系中取一个正方形,并将每个坐标乘以 30 度的旋转矩阵,那么你的正方形在新坐标系中将旋转 30 度。



在这里,我们正在处理类似的任务 - 让我们获取轮廓线并将所有点移动到新的坐标系。问题是找到一个合适的变换矩阵。


所有这些算法都已经很完善,因此我们唯一要做的就是确保它们针对手头的任务正确配置。



结果非常棒。这使 TPR 提高了近 15 个百分点。接下来,我们应用一些轻量级、高质量的OCR软件,例如PARSeq架构。

汽车编码器

截至目前,这是处理车辆照片的最新神经网络技术。嵌入是各种机器学习领域广泛采用的技术,包括搜索、推荐和数据压缩。


在我们的任务中,使用嵌入来评估车辆之间的相似性。


让我们看一个例子,我先从右侧拍摄汽车照片,然后从左侧拍摄。现在,我可以计算这些图片的嵌入(向量),如果这些向量在空间中很接近,则表明它是同一辆车。


但是嵌入提供了另一个可以在产品中使用的有用属性:如果您的嵌入模型运行良好,您可以搜索嵌入样本中最接近的模型。例如,查找系统中非唯一的车辆。


当使用 inDrive 数据训练嵌入模型时,我们采取了细致的预防措施。我们努力从照片中删除任何个人数据,并确保数据集标准化,包含来自我们开展业务的所有国家/地区和不同质量水平的图像。


这种方法旨在防止对那些可能无法使用昂贵的智能手机来拍摄高质量照片的个人的歧视。


因此,获得了按车辆品牌和制造商分组的数据集。经过几次实验后,我们意识到我们暂时不能比较车辆的颜色。


在为我们的模型选择架构时,我们寻求一个能够在性能和计算效率之间取得平衡的主干。避免使用过大的主干至关重要,因为它可能会显着减慢基线运行时间。


经过仔细考虑,我们选择 effectivenet_b2 作为我们的主干架构,并辅以用于机器学习目的的附加角裕度损失。


我们模型的目标是学习向量表示,其中相同品牌和型号的车辆(例如所有奥迪 A4)在向量空间中紧密定位在一起。


相比之下,奥迪 A5 的定位将距离奥迪 A4 稍远,但与丰田凯美瑞等车型相比仍然更近。


现在,让我们深入研究一些车辆比较的例子:



在顶部,我们有两辆相同的汽车,而在底部,我们有两辆不同的汽车。让我们重新审视一下相似度得分:顶部对的得分为 0.989,而底部对的得分为 0.697。通过设置阈值 0.98,我们可以将车辆分类为相同。


然而,值得注意的是,我们的模型尚未完美运行。我们对有关因素存在偏见:




该模型产生的结果为 0.751,而理想情况下我们希望不同车辆的值接近于零。


这里的主要问题源于在主要关注车辆型号和品牌的数据集上训练我们的模型。因此,该模型能够熟练区分不同车辆,但在评估车辆类别内的差异时却很困难。


我们遇到的第二个问题是车辆可能会以不同的角度显示,由于数据集有限,这会对我们的嵌入质量产生负面影响。


第一步,在客户端,我们添加遮罩并提示驾驶员如何拍摄他们的汽车照片。第二步是检测车辆的不同部分,以将其定位在空间中并估计其旋转。



这里可以开发很多启发式方法来选择正确的旋转角度。最重要的是,这些模型以后可以重复使用来评估车辆的状况。但这是另一个故事了。


伊利亚·卡夫塔诺夫发布。