深度学习-不仅是手机上的封条或我们如何诊断机车手推车


就在几天前,Aurorai将试运行移交给了Ermak机车的缺陷识别和电车监控系统。 这项任务并不简单,而且非常有趣,第一步是评估制动衬块的状况和支架的宽度。 我们设法以高达30 km / h的机车速度以1 mm的精度解决了这个问题! 我想指出的是,由于具体情况,可以使用“ TTA(测试时间增强)” -这是kaggle风格竞争黑客的生动示例,它不适合基于se_resnext50 编码器的产品和语义细分,这在掩码预测中提供了惊人的准确结果。

任务说明

有必要创建一种硬件软件复合体,以检测制动衬块的缺陷以及将数据输出到换挡工头。

任务的先决条件

事实证明,PTOL(机车的技术检查要点)中有大量的垫板(约80%)发生了变化,每台机车每72小时就会发生一次这种情况。 PTOL中的大部分检查工作是由机车手推车外部的主人进行的目视检查。



解决问题的计划:

  1. 设备选型
  2. 资料收集
  3. 模型训练
  4. 使用REST API进行服务器开发
  5. Android平板电脑客户端开发
  6. 设计和组装用于放置摄像机和照明灯的机架
  7. 试运行

设备选型

也许最困难的任务之一,就是即使不是最困难的任务,也是在有限的预算和时间内选择摄像机,镜头和灯光:MVP必须在一个半月内完成。 几天后,Google使我成为了机器视觉硬件的专家。 选择是在Basler相机和与相机同步的6k流明脉冲背光中进行的。 支持Basler(70帧/秒,分辨率高达1920x1024)的python API辐条,极大地促进了所有系统组件的集成,唯一的缺点是相机价格约为100tr。

由于缺乏对必要的焦距和视角的理解,使相机镜头的选择变得很复杂,我不得不冒险,但是我掏出了镜头计算器,却碰巧了运气。

背光:通过实验确定LED发光所需的时间,其类型和透镜参数。 我尝试对LED进行3种不同的镜头修改,其角度分别为30、45、60,最终选择了角度为45的磨砂镜头。





组装并测试相机的脉冲控制信号



对于服务器硬件,我采用了Intel Core i7-7740X Kaby Lake,46gb RAM,1 TB SSD和3x1080Ti-这足以在不超过2分钟的时间内预测出两个三节式机车。

来自视频卡的三明治的农场总体降温10度。



资料收集

创建数据集是一首单独的歌,没有人可以委托此活动,因此我被送往我们广阔家园深处一个遥远的鲜为人知的小镇。 我在手机上拍了约400个垫子(!!!) 。 展望未来,我要说的是,勇敢的仓库员工显然受到来自莫斯科的审计员的惊吓,将机车上的所有护垫都换成了全新的护垫,并给它们涂上了一层新鲜的油漆,这看上去真是有趣而且令人恐惧。 我期待着最坏的情况,尽管我仍然在莫斯科仓库中拍摄了约400张完全不同的街区照片。

只是相信一个奇迹,大量增加,提出启发式方法来删除错误的段,其中有很多,因为我没有考虑过反例。

等待中:



现实情况:





在这里必须说,没有一个严重磨损的砖块的例子。

模型训练

该存储库中带有se_resnext50编码器和带scse块的解码器的模型表现得最好,但由于要加快预测过程,因此必须删除scse(pytorch的实现) ,因为 必须在一分钟内预测到。 为了进行模型训练,使用了Pytorch 1.0.1框架,其中包括大量来自白化的增强和自写的水平翻转增强,以在显示时更改类。

def train_transform(p=1): return Compose([ OneOf([ CLAHE(clip_limit=2), IAASharpen(), IAAEmboss(), RandomBrightnessContrast(brightness_limit=0.8, contrast_limit=0.8), HueSaturationValue(hue_shift_limit=50, sat_shift_limit=50, val_shift_limit=50), RGBShift(r_shift_limit=50, g_shift_limit=50, b_shift_limit=50), JpegCompression(quality_lower=30), RandomGamma(), GaussNoise() ], p=0.3), OneOf([ Blur(), MotionBlur(), MedianBlur(), ], p=0.3), ShiftScaleRotate(shift_limit=0.2, scale_limit=0.4, rotate_limit=5, p=0.5), Normalize(p=1) ], p=p) 

作为损失函数,我选择了TheLovász-Softmaxloss ,其行为几乎与bce + jaccard相同,但比BCE更好,后者在标记中过于合适。 选择算法来确定一对齿轮和轮对的序列号也是一个挑战, 公制学习有很多选择,但是我需要快速显示结果,然后才想到在第1类和第2类中标记这些块,其中1是向右的方向,而2是在左边 网络不仅开始预测遮罩,还开始预测方向。 使用简单的试探法,可以可靠地确定块和轮对的序列号,然后对预测取平均,实际上,即使在320x320的分辨率下,使用TTA在运动过程中物体略有移动以及不同的照明角度也可以很好地实现蒙版精度。

另外,任务是确定块的楔形缺陷,从霍夫变换Huff Transformation )到用不同类的点/线标记块的角/边界,有很多想法。 最后,选择权胜过了工人的工作方式:您需要从窄边向后退5厘米并测量宽度(如果它在正常范围内),然后跳过该块。

培训管道是从MICCAI 2017机器人仪器细分中获得的 。 培训过程包括三个阶段:使用冻结编码器进行培训,对整个网络进行培训以及使用CosineAnnealingLR进行培训。 前两个阶段使用ReduceLROnPlateau

在Android上编程REST服务器和客户端

对于REST服务器,我选择了flask-2分钟之内不要启动就更容易了。 我决定自己动手制作一个数据库,以简单的文件夹结构和当前状态文件的形式存储。 Android Studio上平板电脑的应用程序,最新版本的好处对开发人员来说只是天堂。

设计和组装用于放置摄像机和照明灯的机架

我回想起了我为电动汽车制造充电站的年代,这种经历非常方便-我们决定使用3D打印机上打印的铝制结构机架来制造它。





进行测试!


结果超出了所有预期。 对于计算机视觉专家而言,该任务似乎非常简单明了。 但是,由于两件事,我有些怀疑:首先,训练集很小,并且没有边界案例,例如很薄的积木。 其次,测试是在非常不同的拍摄和照明条件下进行的。





验证中的Jaccard达到0.96,在视觉上将焊盘进行了非常清晰的分割,对几张照片进行了平均,并且在估计焊盘的宽度时具有非常好的准确性。 在测试期间,事实证明您可以使用其他机车的手推车,但要使用更快的相机:





总而言之,我想说的是,该技术已经很好地展示了自己,并且在消除人为因素,减少机车的停机时间和进行预测方面具有巨大的潜力。

致谢

感谢ods.ai社区,如果没有您的帮助,我将无法在这么短的时间内完成所有这些工作! 非常感谢DL,希望我能接受DL n01z3的宝贵建议和非凡的敬业精神! 非常感谢意识形态策划者Vasily Manko(Aurorai公司首席执行官),最佳设计师Tatyana Brusova。

故事的下一集见!

Aurorai,llc

Source: https://habr.com/ru/post/zh-CN443016/


All Articles