基于华为atlas的皮带跑偏、空载、堆煤、启停探索

生乎吾前,其闻道也固先乎吾,吾从而师之;生乎吾后,其闻道也亦先乎吾,吾从而师之。吾师道也,夫庸知其年之先后生于吾乎?是故无贵无贱,无长无少,道之所存,师之所存也。

写在前面:

写这篇的时候,想起当年第一次接触atlas还是在京东的一次aicon的会议上,其实那时觉得这东西挺新的,还有自己的IDE,其实自己也没用过。后来的工作中在面试中,也见过1-2个用过atlas的面试者。直到几年前归梓,阴差阳错,华为atlas满足信创的需求,才于23年12月正式研究学习atlas。几个月过去了,整体感觉昇腾生态闭塞、最新的git很难支持、华为各种软件包下载也很坑。问题是很多的,至于其他国产显卡,像曙光、海光、摩尔线程、寒武纪等自己也没机会接触,不得不说华为在信创这条路的部署是强于其他厂商的,于是我便这条路走下去了。

回归主题:

在真正做这件事情的时候,其实也预研了几天,也了解了别的公司的大体思路,比如精英、壹合等。其实我这里想做一个不一样的,有别于别人的,视觉有冲击力的,真正的all in one模型。

整体模型我没有选择基于检测的思路,而是选择基于分割的思路,因为分割可以帮我获取更多的检测不具备的信息,这里后续可以看到。皮带跑偏、空载、堆煤基于unet实现,皮带启停基于unet+光流跟踪实现。

整体感觉模型这块不算复杂,唯一的麻烦的地方就是皮带、煤、煤块这几个的分割是属于多标签分割问题,就是说一个像素可以属于其中的一个也可以是属于其中的几个。这块需要在损失函数处下一些功夫修改代码,当然也有其他曲径通幽的方法。这个修改不能算复杂,复杂的是这个修改同时还得兼容atlas的模型转化,这块就需要真正下功夫了。

另外一个复杂的地方就是皮带中轴线的方法,探索这个中轴线大概耗费了1个月的时间把,中间尝试了很多方法,比如label_centerlines、PCA、旋转角度法、曲线拟合等,效果都不太满意。这里需要考虑皮带多种形状的自适应性,还得考虑效果、考虑速度。最终根据自己的思想实现了一个中轴线确定的方法,客观的说该方法不是完美的,但是已经可以解决90%以上的场景,具体后面我会有图片展示。

数据制作:

这里我一共标注了1056张图片,数据的标签包括,左托锟、右托锟、皮带、煤、煤堆、背景一共6个类别,标注工具选择labelme。

模型训练:

原型代码链接:https://github.com/milesial/Pytorch-UNet.git

训练过程采用累进训练的方式,我是一个一个目标递进训练的,这样可以获取更好的精度,具体的先训练出背景、皮带、左右托锟的模型,再在此基础上迭代煤的模型,最后迭代煤块的模型。整体感受随着类别数量的增加,训练过程会逐渐变得困难,尤其到最后一个目标得时候,如果采用一起训练得方法,精度会比我这种累进训练得方法至少低5个点。

最开始得时候我训练得模型,输入分辨率是572*572的,经过测试速度很慢,后来修改为384*384的,同时注意原始代码中的上采用部分要做适当的修改。这样才能保证上下采样都是2的整数倍。这里我直接简单粗暴的去掉了Up模块中的pad部分。

Atlas模型转化:

atc --model=./unet.onnx --framework=5 --output=unet --soc_version=Ascend310P3  --input_shape="input.1:1,3,384,384" --output_type="/outc/conv/Conv:0:FP32" --out_nodes="/outc/conv/Conv:0"

其中fusion_result.json内容,

[{"graph_fusion": {"ConstToAttrPass": {"effect_times": "4","match_times": "4"},"Conv2DbpInputDilationFusionPass": {"effect_times": "0","match_times": "4"},"ConvConcatFusionPass": {"effect_times": "0","match_times": "4"},"ConvFormatRefreshFusionPass": {"effect_times": "0","match_times": "19"},"ConvToFullyConnectionFusionPass": {"effect_times": "0","match_times": "19"},"ConvWeightCompressFusionPass": {"effect_times": "0","match_times": "19"},"CubeTransFixpipeFusionPass": {"effect_times": "0","match_times": "1"},"DeconvWeightTransFusionPass": {"effect_times": "0","match_times": "4"},"FIXPIPEAPREQUANTFUSIONPASS": {"effect_times": "0","match_times": "23"},"FIXPIPEFUSIONPASS": {"effect_times": "0","match_times": "23"},"RefreshInt64ToInt32FusionPass": {"effect_times": "1","match_times": "1"},"RemoveCastFusionPass": {"effect_times": "0","match_times": "48"},"SameInputConv2dPass": {"effect_times": "0","match_times": "10"},"SplitConvConcatFusionPass": {"effect_times": "0","match_times": "4"},"StrideHoistingPass": {"effect_times": "0","match_times": "18"},"TransdataCastFusionPass": {"effect_times": "0","match_times": "25"},"ZConcatDFusionPass": {"effect_times": "0","match_times": "4"}},"session_and_graph_id": "0_0","ub_fusion": {"TbeConvCommonRules0FusionPass": {"effect_times": "18","match_times": "18","repository_hit_times": "0"}}
}]

ge_check_op.json内容,

{"graph_id": 0,"op": [{"error_type": "infer_shape_error","input0": {"data_type": "DT_FLOAT","layout": "ND","shape": [1,128,80,80]},"input1": {"data_type": "DT_FLOAT","layout": "ND","shape": [1,128,81,81]},"name": "/up1/Concat_1","output0": {"data_type": "DT_FLOAT","layout": "ND","shape": [1,128,80,80]},"reason": "InferShapeFailed!","type": "ConcatD"}],"session_id": 0
}

图片效果:

皮带跑偏:

下面的几个图分别表示有左右托锟的效果图、无托锟的效果图、只有单侧托锟的效果图、一侧托锟只有1个的效果图。

                         原始视频帧图片                                              皮带分割效果图                               皮带直线方程图

皮带启停:

视频效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/401040.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[C#]实现GRPC通讯的服务端和客户端实例

最近要做两个软件之间消息的通讯,学习了一下GRPC框架的通讯。根据官方资料做了一个实例。 官方资料请参考:Create a .NET Core gRPC client and server in ASP.NET Core | Microsoft Learn 开发平台:Visual Studio 2022 开发前提条件&#x…

图像识别,图片线条检测

import cv2 import numpy as np # 读取图片 img cv2.imread(1.png)# 灰度化 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 边缘检测 edges cv2.Canny(gray, 100, 200) 当某个像素点的梯度强度低于 threshold1 时,该像素点被认为是非边缘;当梯度强度…

达梦数据库版本介绍

达梦数据库根据不同用户的不同需求,提供了三种版本的数据库:DM Standard Edition 标准版、DM Enterprise Edition 企业版、DM Security Edition 安全版。那么这三种版本有什么区别,我们该如何选择合适的版本?下面先介绍三种版本各…

language model

1、language model(LM):估计token序列的可能性 2、对于HMM,固定需要P(Y)才符合公式;对于LAS,加上P(Y)能够使效果更好 P(Y|X)需要成对的数据,而P(Y)不需要成对,所以可以得到很多数据 …

【区块链+金融服务】港融区域股权服务平台 | FISCO BCOS应用案例

中国证监会在 2020 年启动了区块链建设试点工作,提出建设基于区块链的场外市场登记系统和交易报告库,利 用区块链去中心化、不易篡改、安全稳定等技术特点,构建区域性股权市场数字化信任机制,为区域性股权市场 提供基础支撑设施。…

Linux11

Linux运行级别 graphical.target图形化模式 runlevel查看运行级别 init 6自动重启 centos7单用户模式修改密码 Windows安全模式可用来删除木马,更为方便 单用户模式修改密码 选择第一个 按e键进入编辑模式,并完成以下修改(注意&#xff0…

Java爬虫中的数据清洗:去除无效信息的技巧

在互联网信息爆炸的时代,数据的获取变得异常容易,但随之而来的是数据质量的问题。对于Java爬虫开发者来说,如何从海量的网页数据中清洗出有价值的信息,是一个既基础又关键的步骤。本文将介绍Java爬虫中数据清洗的重要性&#xff0…

【C++】深入探索类和对象:初始化列表及其static成员与友元

C语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇 本章将分享C中类和对象最后章节“深入探索类和对象:初始化列表及其static成员与友元”,希望通过这几篇关于类和对象文…

Linux信号的概念信号的产生

前言 我们前面已经对进程已做了介绍!知道进程具有独立性,但在运行起来后可能会"放飞自我",即不受控制的执行,这就会导致系统崩溃等问题,非常不利于管理。因此OS需要一种机制来协调和控制进程的运行&#xf…

PHP多城市多门店多端平台健身系统小程序源码

🏋️‍♀️🌍 打造健身新纪元!多城市多门店多端平台健身系统全解析 🏃‍♂️ 🌐 开篇:跨越界限,健身无界 🌍 在快节奏的现代生活中,健身已成为越来越多人追求健康与美好…

家纺四件套入驻亚马逊VC的四大优势——WAYLI威利跨境助力商家

亚马逊VC平台为供应商提供了一个庞大的客户基础。亚马逊作为全球最大的在线零售商之一,拥有数以亿计的活跃用户,这为家纺四件套品牌商家带来了前所未有的市场机遇,也深刻影响着消费者的购物体验。 以下是四大核心优势: 1.流量与曝…

AWS域名注册服务:为您的在线业务打下坚实基础

在如今的数字时代,域名是每个在线业务的基础。一个好的域名不仅可以提升品牌形象,还能为用户提供便捷的访问体验。亚马逊网络服务(AWS)提供了强大的域名注册服务,帮助企业轻松获取和管理域名。我们九河云将深入探讨AWS…

电影票购买管理系统-计算机毕设Java|springboot实战项目

🍊作者:计算机毕设残哥 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目、 源…

米联客-FPGA程序设计Verilog语法入门篇连载-24 FPGA知识_认识FPGA中的状态机

软件版本:无 操作系统:WIN10 64bit 硬件平台:适用所有系列FPGA 板卡获取平台:https://milianke.tmall.com/ 登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑! 1概述 让FPGA电路,有序…

初识C++ · 智能指针

目录 前言: 1 智能指针的发展历史 2 unique_ptr和shared_ptr的基本使用 3 shared_ptr的模拟实现 4 有关定制删除器 前言: 智能指针的引入,我们得先从异常开始说起,异常面临的一个窘境是new了多个对象,抛异常了会…

厂家揭秘:劳保鞋里的防砸黑科技,这些材料你了解多少?

在工业生产的前沿阵地,安全生产始终是企业发展的基石,也是每一位劳动者的头等大事。在繁忙的生产线上,一双看似普通的劳保鞋,实则蕴含着保护我们双脚免受意外伤害的重要科技——防砸材料。今天,百华小编就来和大家盘点…

GitLab-CI/CD指南

由于公司没有运维,写go服务时各个环境编译部署还是略显麻烦,由于代码管理使用的是 gitlab,所以决定使用 gitlab 自带的 CI/CD 来做自动编译和部署,这样每次提交代码以后就可以自动部署到服务器上了。 gitlab 本身只有 CI/CD 的接…

STM32第十二节(中级篇):串口通信(第一节)——功能框图讲解

前言 我们在51单片机中就已经学习过了串口通信的相关知识点,那么我们现在在32单片机上进一步学习通信的原理。我们主要讲解串口功能框图以及串口初始化结构体以及固件库讲解。 STM32第十二节(中级篇):串口通信(第一节…

Python绘图入门:使用Matplotlib绘制柱状图

Python绘图入门:使用Matplotlib绘制柱状图 柱状图是一种常见的数据可视化方式,能够直观地展示不同类别之间的数据差异。在Python中,Matplotlib是一个非常强大且灵活的绘图库,它不仅能绘制简单的图表,还能创建复杂的多…

远程命令行控制SSH

第一次接触SSH是ROS小车作为服务端,通过ubuntu电脑客户端访问。因为机器人接键盘和屏幕操作起来不方便,所以使用SSH进行连接,方便对小车的操作。 1.服务端安装 打开终端查看ssh是否安装 sudo service ssh status 如果未安装 sudo apt upd…