深度学习算法在工业视觉落地的思考

0.废话

距离上次的栈板识别的思考已经过去3个月,中间根据客户的需求和自己的思考,对软件又重新做了调整。但是整体上还是不满意。

0.1 老生常谈的工业视觉落地架构

对于软件架构,我实在没有太多的参考。没办法,公司根本不关心软件是什么玩意。对于一个销售型公司,在2023年了,还认为软件是硬件的附赠品。所以对于软件,公司的态度就是很随意。所以根本也不会有软件框架可以参考,或者类似的需求。但是我们可以看看雷卡慢的。不说具体的细节,因为我也没用过。之前我提出要公司弄一套给我们参考,但是显然不现实,
在这里插入图片描述
视觉工程最重要的就是相机拍照,视觉算法,通讯。
其实这个软件就是一个图形化的工程工具,他把视觉工程通过拖拉ui的方式搭建成一整个流程图。但是内置的算法,我理解的就是一深度学习推理端的部署。因为他把训练的模块又弄了一个软件
在这里插入图片描述
模型训练工具
在这里插入图片描述
这个我最感兴趣的是他的标定工具。当然这种类似的软件其实是每一个视觉厂家必须有的东西。当然我们除外。

0.2 一穷二白的公司需要的技术

我们公司可以说以上3种软件全部没有,那么作为视觉工程师。我们接到任务后,需要哪方面的技术呢。

  1. 软件前端UI,我就用pyqt
  2. tcp/ip , socket,要会多线程,非阻塞,心跳机制,连包分包问题的解决
  3. 相机的SDK,通读SDK的文档,做到了解相机的每个函数的作用。而不是只去看demo
  4. 标定,熟悉相机的内参外参,熟悉旋转矩阵,欧拉角,四元素法。熟悉相机的9点标定。熟悉机器人的3个坐标系的关系
  5. 机器视觉算法。不限于2D,3D 熟悉对应的算法库。opencv pcl open3d cloudcompare
  6. 深度学习视觉算法。不限于2D 3D 分类,检测,实例分割,熟悉pytorch
  7. 打包工具。log日志。ubuntu脚本。

1。接着栈板识别再思考

之前我们说过,就不再赘述。现在出现的新问题,需要解决

1。1 相机图像的适应性

之前使用了各种方式去增强图像数据的对比度。使得我们要检测的1500-3000范围内的栈板有很好的对比度。结论就是还是对数变换。

1。2模型的适应性

经过了几个客户的测试,我最终还是换成了yolov5。但是瞎折腾也有瞎折腾的好处不是么。yolov5的适应性显然强过yolov7。
推理后端我还是改成了onnx。相比pytorch的真的是体积小速度快。当然win下还是openvino快一点。但是我现在不仅要考虑win linux 还要考虑 树莓派。真的是一个简单的软件弄得特别复杂。具体的测试结果看其他文章。

1。3软件太大

这里我不得不吐槽一下open3d ,我使用pyinstaller打包竟然一个open3d就占了900m 打包的软件加上权重,足足1。5g 客户直接骂娘。而我只用了它其中的一个拟合平面的函数。所以果断去找源码,照着改了一份。这里参考我的其他文章。

1。4 相机的SDK

我是真的服了老外的SDK,真的不当人。当然也怪我,水平不够,看Demo完全没用。前前后后我又把相机的SDK 看了2遍。算是懂了一大半,但是他还是很多漏洞。。。。

2。重点,获取3D点云坐标系

之前我一直通过拟合直线获取平面的法向量。
但是这种方式有个问题,那就是另外一个方向是不知道的。所以如果我的相机的安装方式不规整,那么我们就需要3个坐标轴的旋转角度。

2。1 拟合直线

我的想法是通过找的矩形框去拟合对应的平面

2。2 特征向量

其实这个是让我最着迷的,研究了2天,最后发现瞎折腾。我偶然间发现cloudcomepare 中有个拟合平面的工具竟然拟合的平面是带有旋转矩阵的。这个发现让我欣喜若狂。这样问题不久解决了么。我去看看了他妈的源码。竟然是计算点云的协方差矩阵,然后算矩阵的特征值和特征向量。其中特征值最小的的特征向量就是z轴,特征值最大的特征向量是x轴。z,x叉乘就是y轴。简直不要太牛逼。然后我发现误差贼大。

2。3组合

那就把之前的拟合平面的算法加上去,筛选出正确的点云数据。
然后通过求解协方差矩阵的特征向量获取坐标轴。

def getboxfrompoints(points, inliers):# 计算点云的协方差矩阵cov_matrix = np.cov(points[inliers], rowvar=False)eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)# 创建特征向量z_indx = np.argmin(eigenvalues)z = eigenvectors[:, z_indx]x_indx = np.argmax(eigenvalues)x = eigenvectors[:, x_indx]y = np.cross(z, x)# 创建 Open3D 点云对象point_cloud = o3d.geometry.PointCloud()point_cloud.points = o3d.utility.Vector3dVector(points[inliers])# 创建坐标轴coordinate_frame = o3d.geometry.TriangleMesh.create_coordinate_frame(size=100.0, origin=np.array([0, 0, 0]))# 计算旋转角度theta_x = np.arctan2(y[2], z[2])theta_y = np.arctan2(-x[2], np.sqrt(x[0]**2 + x[1]**2))theta_z = np.arctan2(x[1], x[0])# 获取旋转矩阵rotation_matrix = np.eye(3)# rotation_matrix = np.dot(rotation_matrix, np.array([x,y,z]))rotation_matrix = np.dot(rotation_matrix, o3d.geometry.get_rotation_matrix_from_xyz([theta_x, theta_y, theta_z]))# 旋转坐标轴coordinate_frame.rotate(rotation_matrix)# 缩放坐标轴coordinate_frame.scale(1.0, center=np.mean(points[inliers], axis=0))# 平移坐标系coordinate_frame.translate(np.mean(points[inliers], axis=0))# 将点云和坐标轴合并到一个列表中geometries = [point_cloud, coordinate_frame]# 显示点云和坐标轴o3d.visualization.draw_geometries(geometries)# return matrix_to_euler(np.array([x,y,z]))return np.degrees(np.array([theta_x,theta_y,theta_z]))

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

使用华为eNSP组网试验⑵-通过端口地址进行静态路由

有了网络模拟器可以对很多网络应用场景进行模拟,既方便学习又有利于实际的网络实施。 之前因为没有用过,用过了才知道eNSP的好处。但是与思科模拟器不同,连接是自动连接,不能确定端口,比如使用指定的光纤端口或者RJ45的…

CSS详细基础(六)边框样式

本期是CSS基础的最后一篇~ 目录 一.border属性 二.边框属性复合写法 三.CSS修改表格标签 四.内边距属性 五.外边距属性 六.其他杂例 1.盒子元素水平居中 2.清除网页内外元素边距 3.外边距的合并与塌陷 4.padding不会撑大盒子的情况 七.综合案例——新浪导航栏仿真 …

QT按钮介绍

目录 按钮基类 QAbstractButton QPushButton QToolButton QRadioButton QCheckBox 按钮基类 QAbstractButton 这是按钮的基类,它是继承QWidget类 它可对当前的图标,标题等进行设置。 它有自己的一些信号与槽函数: /* 当按钮被激活时(即…

Chrome(谷歌浏览器)如何关闭搜索栏历史记录

目录 问题描述解决方法插件解决(亲测有效)自带设置解决步骤首先打开 地址 输入:chrome://flags关闭浏览器,重新打开Chrome 发现 已经正常 问题描述 Chrome是大家熟知的浏览器,但是搜索栏的历史记录如何自己一条条的删…

asp.net core mvc 文件上传,下载,预览

//文件上传用到了IformFile接口 1.1文件上传视图 <form action"/stu/upload" method"post" enctype"multipart/form-data"><input type"file" name"img" /><input type"submit" value"上传&…

国庆day1

发送数据 #include<myhead.h>//消息结构体 typedef struct {long msgtype; //消息类型char data[1024]; //消息正文 }Msg_ds;#define SIZE sizeof(Msg_ds)-sizeof(long) //正文大小 int main(int argc, const char *argv[]) {//1、创建key值key_t ke…

Microsoft Office无法重装报错30015-44(3) 0-2031(17004)

1.问题描述 由于迁移文件夹导致Microsoft office软件无法使用&#xff0c;于是准备卸载重装&#xff0c;但是点击OfficeSetup.exe出现报错30015-44(3) 关闭后出现以下报错0-2031(17004) 2. 尝试的解决方式 重启后仍然无法解决问题 2.1 参考官网解决办法 手动从控制面板&…

Spring源码分析(四) Aop全流程

一、Spring AOP基础概念 1、基础概念 连接点(Join point)&#xff1a;能够被拦截的地方&#xff0c;Spring AOP 是基于动态代理的&#xff0c;所以是方法拦截的&#xff0c;每个成员方法都可以称之为连接点&#xff1b;切点(Poincut)&#xff1a;每个方法都可以称之为连接点&…

Sentinel学习——CAP理论,微服务中的雪崩问题,和Hystix的解决方案 Sentinel的相关概念 + 下载运行

前言 Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 本篇博客介绍CAP理论&#xff0c;微…

【C++】单例模式

文章目录 一. 介绍二. 饿汉模式三. 懒汉模式四. 饿汉模式和懒汉模式对比 一. 介绍 单例模式是属于设计模式的一种&#xff0c;那什么是设计模式呢&#xff1f; 设计模式&#xff08;Design Pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总…

产品经理如何科学的进行需求调研?

导语&#xff1a;作为产品经理&#xff0c;需求调研是开展工作的重要环节之一。科学、有效地进行需求调研不仅可以帮助产品经理更好地了解用户需求&#xff0c;还能指导产品设计和功能开发&#xff0c;提升产品的竞争力。本文将介绍几种科学的方法和技巧&#xff0c;帮助产品经…

嵌入式MCU都有什么高级用法?

嵌入式MCU都有什么高级用法&#xff1f; 您举的几个例子&#xff0c;确实是MCU外设的一些高端玩法。只是不知道您是否想过&#xff0c;既然这些机制是被 人设计出来的&#xff0c;那它就是种标准用法。从微控制器的发展历程来看&#xff0c;许多硬件机制都是有了实际 需求后才…

nodejs+vue 网上招聘系统elementui

第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;技术背景 5 3.2.2经济可行性 6 3.2.3操作可行性&#xff1a; 6 3.3 项目设计目标与原则 6 3.4系统流程分析 7 3.4.1操作流程 7 3.4.2添加信息流程 8 3.4.3删除信息流程 9 第4章 系统设计 11 …

进阶指针(三)--- qsort函数(快速排序)的使用和(用冒泡排序)模拟实现

✨博客主页&#xff1a;小钱编程成长记 &#x1f388;博客专栏&#xff1a;进阶C语言 &#x1f388;推荐相关博文&#xff1a;进阶C语言&#xff08;一&#xff09;、进阶C语言&#xff08;二&#xff09; 进阶指针&#xff08;三&#xff09; 8.回调函数&#xff08;下&#x…

ThreeJS-3D教学四-光源

three模拟的真实3D环境&#xff0c;一个非常炫酷的功能便是对光源的操控&#xff0c;之前教学一中已经简单的描述了多种光源&#xff0c;这次咱们就详细的讲下一些最常见的光源&#xff1a; AmbientLight 该灯光在全局范围内平等地照亮场景中的所有对象。 该灯光不能用于投射阴…

Windows系统利用cpolar内网穿透搭建Zblog博客网站并实现公网访问内网!

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

ElementUI之首页导航+左侧菜单->mockjs,总线

mockjs总线 1.mockjs 什么是Mock.js 前后端分离开发开发过程当中&#xff0c;经常会遇到以下几个尴尬的场景&#xff1a; - 老大&#xff0c;接口文档还没输出&#xff0c;我的好多活干不下去啊&#xff01; - 后端小哥&#xff0c;接口写好了没&#xff0c;我要测试啊&#x…

【前端】ECMAScript6从入门到进阶

【前端】ECMAScript6从入门到进阶 1.ES6简介及环境搭建 1.1.ECMAScript 6简介 &#xff08;1&#xff09;ECMAScript 6是什么 ECMAScript 6.0&#xff08;以下简称 ES6&#xff09;是 JavaScript 语言的下一代标准&#xff0c;已经在2015年6月正式发布了。它的目标&#xff…

【sgTileImage】自定义组件:瓦片图拖拽局部加载、实现以鼠标为中心缩放

特性&#xff1a; 支持缩放瓦片图&#xff0c;定义瓦片图初始缩放比例&#xff0c;以鼠标所在位置为中心缩放支持局部拖拽加载 sgTileImage源码 <template><div :class"$options.name"><div class"sg-ctrl"><label>缩放百分比&l…

ElasticSearch映射与模板介绍

一、前言 前面有相关系列文章介绍了ES的基本概念和各种版本SDK的使用&#xff0c;ES现在已升级到8.5版本&#xff0c;有些概念和SDK用法都有很大变化&#xff0c;后续ES相关的文章会以8.3版本为基准介绍一些实际中应用需要掌握的概念以及一些比较实际的例子。 二、映射 ES环…