tag 标签: 源码

相关帖子
相关博文
  • 2024-12-11 09:15
    0 个评论
    MES生产管理系统源码,实时监控生产过程、管理生产数据、优化生产计划
    MES生产制造执行系统源码,可以试用,支持二次开发,商业授权后可商用;公司专业做MES,提供项目分析、指导及技术支持。 MES是“Manufacturing Execution System”的英文缩写,中文翻译为“制造执行系统”“生产实施系统”等。是一种用于实时监控、追踪和控制生产过程的计算机化系统。MES系统可以对生产线上的生产过程、资源和数据进行集成管理,以提高生产效率和质量,降低生产成本。简单地讲,MES是面向车间的生产过程管理与实时信息系统。它主要解决车间生产任务的执行问题。 一、技术架构: 技术框架:springboot2 + vue3 + mysql8 运行环境:IntelliJ IDEA+ jdk1.8 + Mysql8 + tomcat8 + maven + nginx 二、本套MES系统功能介绍: 基础数据【工艺路线,绩效工资配置,产品定义,物料清单,单位管理,不良品项,工序,通知管理,车间设置】 自定义配置【自定义编号规则】 库存管理【出库单,入库单,库存收发明细,库存余额】 生产管理【销售订单,生产计划,装配工单,工单,任务,报工】 系统管理【用户管理,部门管理,消息推送,权限管理,角色管理,菜单设置,数据字典,系统日志,角色管理,版本发布记录,用户管理 报表管理【员工绩效,工资报表,不良品项分部,不良品项汇总,生产报表,产量统计】 定时任务【任务配置,执行记录】 流程管理【审批流程,我的任务】 开发管理【表单设计,表单配置,数据采集,代码生成】 质量管理【常见缺陷,检测项管理,检测模版,来料检验单,过程检验单,出货检验单】 排班管理【班组管理,排班计划,节假日设置,排班日历】 工具管理【工具领用,工具归还,工装夹具类型,工装夹具台账】 设备管理【设备类型设置,设备台账,点检保养项目,点检保养计划,维修单,点检保养工单】 看板管理【车间生产管控看板,工单执行进度看板】 系统截图展示:
  • 热度 4
    2024-5-11 10:25
    272 次阅读|
    0 个评论
    今天想和大家分享的是一套商业开源的 MES制造执行管理系统。对于制造业而言,MES 是一个至关重要的系统,它可以帮助企业提高生产效率、优化资源利用、提高产品质量,从而增强市场竞争力。 ​ 什么是 MES? MES 是指通过计算机技术、自动化技术、管理技术等手段,对生产过程进行信息化、网络化、智能化管理的系统。它通常包括生产调度、生产过程控制、生产过程监控、质量管理、设备管理等模块,旨在提高生产计划的执行率和准确率,降低生产成本,提高生产效率,保证产品质量。 MES 系统的重要性 随着制造业的不断发展和技术的进步,企业对生产过程的管理要求越来越高。传统的人工管理方式已经无法满足复杂的生产需求,而 MES 系统的出现填补了这一空白。它可以实现生产过程的全面监控、实时数据采集和分析、生产计划的优化调整,从而帮助企业提高生产效率、降低成本、提高产品质量。 MES 系统的部署与应用 要部署一个 MES 系统并不困难,但在部署之前需要对企业的生产过程进行充分的了解和分析,确定系统的功能模块和定制需求。在部署完成后,需要对系统进行持续的监控和优化,以确保其稳定运行并发挥最大的效益。 万界星空科技商业开源MES+源码+可拖拽式数据大屏 开源MES系统具有定制化、节省成本、开放性和适应性等优势和特点,可以帮助企业更好地管理生产流程。万界星空MES制造执行系统的Java开源版本,为制造业企业提供了全面的生产管理解决方案。万界星空科技的目标是帮助企业提高生产效率、降低生产成本和提升产品质量。 开发环境: jdk11+tomcat+mysql8+springboot+maven 一、系统概述: 万界星空科技免费试用MES、开源MES、商业开源MES、适合二开的开源MES、市面上最好的开源MES、MES源码、拖拽式数据大屏。 二、技术架构: 技术框架:springboot2 + vue3 + mysql8 运行环境:IntelliJ IDEA+ jdk1.8 + Mysql8 + tomcat8 + maven + nginx 三、系统功能: 1、 车间基础数据建模 :对工作中心、工艺路线、站点维护、资源维护、操作维护。 2、生产物料控制: 对车间物料的成批、单件收发,对车间各种类型物料(毛坯、半成品、成品)资源的管理。 ​ 3、生产计划管理: 订单分析、物料需求分析,生产排程管理,合理安排工单。 ​ 4、生产过程控制: 监控生产过程、自动纠正生产中的错误,并提供决策支持,主要集中在被监视和被控制的机器上,需要连续跟踪生产操作流程。 ​ 5、生产排班管理: ​ 6、产品质量管理 :不合格品管理、维护、生产批次追溯。 7、车间库存管理: 库存接收、结存、出入库历史管理。 8、车间看板管理: 车间物料消耗看板(包括物料名称、库存数、消耗数、结存数、库存上限、安全库存数)。 9、数据分析/报表管理 :包括生产进度报表、车间库存报表、生产记录报表、SFC装配信息追溯报表分析。 10、系统基础管理: 用户信息管理、角色管理、菜单管理。 11、操作日志管理 万界星空科技专注于制造业生产管理平台(低代码平台)的研发和实施,已成功帮助很多企业和工厂解决了内部的管理问题,成功应用于汽车、高科技电子、注塑、电线电缆、造鞋、设备制造、新能源、电梯、家电、家居、纺织、印刷、电气、电机等行业。 访问万界星空科技开源网站或者百度搜索万界星空科技官网联系我们。 ​
  • 热度 2
    2020-12-17 09:11
    4261 次阅读|
    0 个评论
    【不用开发板学习STM32】7段数码管0~9定时显示(文末获取代码及工程文件)
    本实验是通过7个IO口控制一个共阳7段数码管,分别从0~9依次显示。时间间隔200ms刷新一次。系统时钟源是内部8MHz晶振,具体原因上一期已经讲述过了,时钟倍频位40MHz,使用了TIM2定时器,数码管刷新在TIM2中断函数中完成。同时利用systick来计时,控制一个LED灯间歇闪烁。工程师如果对STM32F10x系列怎么使用内部时钟有疑问可以参考这里的代码,都是在实际开发板上测试过,和用Proteus仿真结果是一致的。 TIM2初始化,这里设置是200ms进一次中断,系统时钟是40MHz,并且配置好TIM2的中断,代码如下: void bsp_InitTIM2(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; uint32_t usPeriod; /* 开启TIM2的时钟 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); usPeriod = 2000; //重装载数值 200ms /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = usPeriod; TIM_TimeBaseStructure.TIM_Prescaler = 3999; //设置分频系数 TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //开启TIM2中断 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); /* TIMx enable */ TIM_Cmd(TIM2, ENABLE); { /* 配置定时器中断 */ NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } } 代码及工程下载链接!! https://t.1yb.co/axri
  • 热度 153
    2011-12-31 21:39
    47304 次阅读|
    151 个评论
    KK是一个很有趣的开源飞控(http://www.kkmulticopter.com/),由于其硬件要求低,价格大众化,所以虽然性能有限,还是有着广泛的使用群体。我也有一个KK飞控板,并且我下 载了KK的源码进行研究,比较麻烦的是,KK的源码是用汇编写的,很多人是看不懂的。 我觉得这是一个很好的硬件平台(便宜),适合懂单片机的用户进行电子试验和算法试验,因此我花了几个晚上的时间,用C语言完整从零编写了KK飞控的源代码,并且增强了一些很有价值的功能,使得KK的使用更加方便。 现在,我把全部的源码开放在这里,不懂单片机的模友可以直接下 载使用,懂单片机的模友可以尝试改写代码,加入自己喜欢的功能~ KK_C V1.0源码下载:attachment download KK_C V1.0 使用说明书:attachment download 这个新的KK,朋友建议我命名为GG飞控,我觉得这个基于KK的小玩意,还是不能忘记KK的贡献,于是命名为KK_C飞控,至于GG飞控嘛,已经在设计中~ (编译器:ICCAVR V7.22)
相关资源
  • 所需E币: 5
    时间: 2024-10-11 09:23
    大小: 1.07MB
    上传者: Paul111
    MATLAB数字信号处理85个实用案例精讲.入门到进阶书籍实例源码
  • 所需E币: 0
    时间: 2024-3-6 09:36
    大小: 3.06KB
    上传者: 开心就很好了
    跨平台高手必修课--Flutter动态化解决方案实战之手把手带你自研一套Flutter动态热更新框架。Flutter作为跨平台首选框架,未来可期,但动态化问题一直是行业诟病的问题。所以,各大公司都急需一套成熟且高效的动态化解决方案,因此,动态化方面的人才缺口巨大。在本文中,我将带大家从0到1自主研发一套Flutter动态化框架,并深入掌握跨平台动态化解决方案,助力你在跨平台技术上有质的飞跃。一、首先,我们先来认识Flutter:Flutter是Google开源的构建用户界面(UI)工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动、Web、桌面和嵌入式平台。[5]Flutter开源、免费,拥有宽松的开源协议,适合商业项目。Flutter可以方便的加入现有的工程中。在全世界,Flutter正在被越来越多的开发者和组织使用,并且Flutter是完全免费、开源的。它也是构建未来的GoogleFuchsia应用的主要方式。Flutter组件采用现代响应式框架构建,这是从React中获得的灵感,中心思想是用组件(widget)构建你的UI。组件描述了在给定其当前配置和状态时他们显示的样子。当组件状态改变,组件会重构它的描述(description),Flutter会对比之前的描述,以确定底层渲染树从当前状态转换到下一个状态所需要的最小更改。二、Flutter的特点和优势Flutter具有以下特点和优势:跨平台开发:Flutter允许开发人员使用单个代码库构建应用程序,可在多个平台上运行,包括iOS、Android、Web和桌面操作系统。这简化了跨平台开发的流程,减少了开发成本和工作量。响应式UI:Flutter采用响应式编程模型,允许开发人员根据数据的变化自动更新UI。这意味着UI可以根据应用程序状态的变化实时更新,提供流畅的用户体验。热重载(HotReload):Flutter的热重载功能允许开发人员在应用程序运行时快速查看和调试代码更改。开发人员可以实时看到UI的变化,加快了开发周期,提高了开发效率。自绘引擎:Flutter使用Skia图形引擎进行渲染,这意味着应用程序的每个像素都可以通过Flutter进行绘制。这样可以实现高度自定义的UI设计和动画效果,并提供卓越的性能。丰富的UI组件:Flutter提供了一套丰富而强大的UI组件,可以用于构建漂亮和现代化的用户界面。这些组件具有高度的可定制性,使开发人员能够创建独特的应用程序界面。开发效率:Flutter的热重载、响应式UI和丰富的UI组件使开发人员能够更快速地开发应用程序。单个代码库的使用也简化了代码维护和版本控制的过程。社区支持和生态系统:Flutter拥有庞大的开发者社区和活跃的生态系统。开发人员可以从社区中获取大量的资源、插件和解决方案,加快开发进程,并且可以与其他开发者进行交流和合作。良好的性能:由于Flutter使用自绘引擎和硬件加速,应用程序可以实现卓越的性能。Flutter应用程序通常具有快速的响应时间、流畅的动画效果和较低的内存占用。三、Flutter可以用来做什么?Flutter是一个开源的移动应用程序开发框架,它主要用于移动平台的应用程序开发。Flutter具有许多优势,可以用于开发各种类型的应用程序,包括游戏、社交、生产力和移动应用等。以下是Flutter可以用于开发的一些应用程序类型:游戏:Flutter可以用于开发各种类型的游戏,包括桌面游戏、移动游戏和嵌入式游戏。Flutter提供了高性能的虚拟现实开发工具,可以帮助开发者创建逼真的3D游戏和交互式应用程序。社交应用:Flutter可以用于开发社交应用程序,包括WhatsApp和Facebook等平台。Flutter提供了跨平台的开发工具,可以让开发者使用同一代码库开发多个平台的应用程序。生产力应用:Flutter可以用于开发生产力应用程序,例如任务管理应用程序、金融应用程序和调查应用程序等。Flutter提供了可扩展的开发环境,可以让开发者在不同设备上使用同一代码库进行开发。移动应用:Flutter可以用于开发跨平台的移动应用程序,包括iOS和Android等平台。Flutter提供了丰富的组件和库,可以帮助开发者快速构建原生移动应用程序。桌面应用:Flutter可以用于开发桌面应用程序,包括桌面工具、应用程序和游戏等。Flutter提供了丰富的组件和库,可以帮助开发者快速构建原生桌面应用程序。总的来说,Flutter是一个非常强大的框架,可以用于开发各种类型的应用程序,包括游戏、社交、生产力和移动应用等。开发者可以使用Flutter的高性能、可扩展性和跨平台特性,快速构建具有吸引力和可用性的应用程序。四、Flutter安装安装Flutter的过程通常涉及以下几个步骤:1、下载FlutterSDK。访问Flutter官网,选择并下载最新版本的FlutterSDK2、解压FlutterSDK。将下载的FlutterSDK解压到指定的文件夹,例如,在Windows系统中,通常建议将解压后的文件夹放在`C:\Users\你的用户名\flutter`路径下。3、配置环境变量。在系统环境变量中添加FlutterSDK的路径到`PATH`变量中,例如,在Windows系统中,可以在`系统属性`的`环境变量`部分添加`ANDROID_HOME`和`FLUTTER_STORAGE_BASE_URL`等变量,并相应地设置值。4、安装AndroidStudio或VisualStudioCode。如果计划开发Android应用,需要安装AndroidStudio,并确保安装了AndroidSDKCommand-lineTools;如果计划开发iOS应用,可以选择安装VisualStudioCode并安装Flutter插件。5、配置Flutter和Dart插件。在AndroidStudio或VisualStudioCode中,通过设置菜单找到并安装Flutter和Dart插件。6、运行flutterdoctor。在命令行中,运行`flutterdoctor`来检查并解决可能遇到的问题,如缺少必要的依赖项或环境变量设置不正确完成这些步骤后,就可以在Flutter中创建和运行你的第一个项目了
  • 所需E币: 0
    时间: 2024-3-3 15:06
    大小: 2.43KB
    为什么我们还要学C++因为在贴近底层、追求性能、降低功耗方面,C++几乎没有敌手,小到嵌入式、大到分布式,C++都是解决问题的利器,面向物联网的“嵌入式”开发和面向大型化的“分布式”开发都离不开它5G即来,C++在起势,你不抓住吗?一、选择编译器在C++编程中,我们需要选择一个合适的编译器来将我们编写的源代码转换为可执行的二进制文件。目前常用的C++编译器有GCC、Clang和MicrosoftVisualC++等。这里我们选择GCC作为示例。二、安装GCC编译器GCC编译器是一个开源的跨平台工具链,可以在多种操作系统上使用。下面是在Windows、MacOS和Linux上安装GCC的步骤:Windows操作系统:访问MinGW官方网站下载对应版本的MinGW安装程序(32位或64位),并运行安装程序。在安装向导中选择"Download",然后选择一个镜像站点进行下载。下载完成后,运行安装程序,按照默认选项完成安装。安装完成后,在命令提示符中输入g++--version,如果输出了GCC的版本信息,则说明安装成功。MacOS操作系统:打开终端应用程序。使用Homebrew包管理器安装GCC。在终端中输入brewinstallgcc,然后按照提示完成安装。安装完成后,在终端中输入g++--version,如果输出了GCC的版本信息,则说明安装成功。Linux操作系统:打开终端应用程序。使用相应的包管理器(如apt、yum等)安装GCC。例如,在Ubuntu上可以使用以下命令进行安装:sudoapt-getinstallg++。安装完成后,在终端中输入g++--version,如果输出了GCC的版本信息,则说明安装成功。三、配置编译调试环境打开VisualStudioCode,点击"文件"->"打开文件夹",选择你的项目文件夹。在项目文件夹中创建一个新的C++源代码文件(如main.cpp),并编写一些简单的代码作为示例。#include<iostream> intmain(){  std::cout<<"Hello,World!"<<std::endl;  return0;}在VisualStudioCode中打开终端(点击"视图"->"终端"),输入以下命令来编译和运行代码:对于Windows系统,使用以下命令:g++-omainmain.cppmain.exe四、解压编译安装注:在安装过程中将用户改为root,具有最高权限,否则可能会因权限问题导致安装不成功;在当前用户安装,该程序路径被添加到该用户的环境变量当中,不同用户可能需要手动添加环境变量。但我在root用户下安装,普通用户下也可使用1、将cmake的源码压缩包通过共享文件夹复制到ubuntu某个目录下,进行解压,2、解压后执行./bootstrap3、出现报错,缺少,未安装openssl,复制资料的中的openssl-1.1.1d.tar.gzubunut下安装。(文章末尾将会提供资源下载链接)安装具体步骤:https://blog.csdn.net/weixin_34072159/article/details/860285844、安装成功后,进入cmake文件夹,再次执行./bootstrap5、然后./configure6、最后make7、makeinstall8、测试安装是否成功:cmake--version,若打印出版本信息,则表示成功五、生成DotNetClient通过Nuget安装Grpc、Grpc.Core及Google.Protobuf将Helloworld.cs及HelloworldGrpc.cs文件添加到项目中。编辑Program.cs如下所示:usingSystem;usingGrpc.Core;usingHelloworld;namespaceDotNetClient{  classProgram  {    staticvoidMain(string[]args)    {      Channelchannel=newChannel("127.0.0.1:50051",ChannelCredentials.Insecure);      varclient=newGreeter.GreeterClient(channel);      varreply=client.SayHello(newHelloRequest{Name="tom"});      Console.WriteLine("Greeting:"+reply.Message);      channel.ShutdownAsync().Wait();      Console.WriteLine("Pressanykeytoexit...");      Console.ReadKey();    }  }}
  • 所需E币: 5
    时间: 2024-1-25 15:24
    大小: 591.82KB
    上传者: 丙丁先生
    基于CW32的物联网应用源码.zip
  • 所需E币: 5
    时间: 2024-1-25 15:24
    大小: 4.94MB
    上传者: 丙丁先生
    基于CW32实时时钟DS1302应用源码.zip
  • 所需E币: 5
    时间: 2024-1-25 15:27
    大小: 590.74KB
    上传者: 丙丁先生
    基于CW32的RC522刷卡模块的应用源码.zip
  • 所需E币: 5
    时间: 2024-1-25 15:26
    大小: 5.79MB
    上传者: 丙丁先生
    基于CW32的超声波模块的应用源码.zip
  • 所需E币: 5
    时间: 2024-1-25 15:31
    大小: 579.01KB
    上传者: 丙丁先生
    基于CW32的MAX4466麦克风模块的应用源码.zip
  • 所需E币: 5
    时间: 2024-1-25 15:30
    大小: 1.17MB
    上传者: 丙丁先生
    基于CW32的MPU6050姿态传感器的应用源码.zip
  • 所需E币: 5
    时间: 2024-1-25 15:47
    大小: 639.83KB
    上传者: 丙丁先生
    (终版)基于CW32的智能家居系统源码.zip
  • 所需E币: 5
    时间: 2024-1-25 15:33
    大小: 5.37MB
    上传者: 丙丁先生
    基于CW32的L9110风扇模块的应用源码.zip
  • 所需E币: 5
    时间: 2024-1-25 15:29
    大小: 6MB
    上传者: 丙丁先生
    基于CW32的PID温度控制系统源码.zip
  • 所需E币: 5
    时间: 2024-1-25 15:36
    大小: 8.07MB
    上传者: 丙丁先生
    基于CW32的AS608指纹模块的应用模块资料与源码.zip
  • 所需E币: 5
    时间: 2024-1-25 15:42
    大小: 6.33MB
    上传者: 丙丁先生
    CW32电动工具(手电钻)源码.zip
  • 所需E币: 0
    时间: 2023-11-27 11:13
    大小: 5.15KB
    上传者: 开心就很好了
    自动驾驶是高安全型应用,需要高性能和高可靠的深度学习模型,VisionTransformer是理想的选摔。现在主流的自动驾驶感知算法基本都使用了VisionTransformer相关技术,比如分割、2D/3D检测,以及最近大火的大模型(如SAM),VisionTransformer在自动驾驶领域的落地方面遍地开花。5一方面,在自动驾驶或图像处理相关算法岗位的面试题中,VisionTransformer是必考题,需要对其理论知识有深入理解,并且在项目中真实的使用过相关技术。Transformer出自于Google于2017年发表的论文《Attentionisallyouneed》,最开始是用于机器翻译,并且取得了非常好的效果。但是自提出以来,Transformer不仅仅在NLP领域大放异彩,并且在CV、RS等领域也取得了非常不错的表现。尤其是2020年,绝对称得上是Transformer的元年,比如在CV领域,基于Transformer的模型横扫各大榜单,完爆基于CNN的模型。为什么Transformer模型表现如此优异?它的原理是什么?它成功的关键又包含哪些?本文将简要地回答一下这些问题。我们知道Transformer模型最初是用于机器翻译的,机器翻译应用的输入是某种语言的一个句子,输出是另外一种语言的句子。vari*int=nilfmt.Println("i.size:",unsafe.Sizeof(i))//8vari8*int8=nilfmt.Println("i8.size:",unsafe.Sizeof(i8))//8vars*string=nilfmt.Println("s.size:",unsafe.Sizeof(s))//8varps*struct{}=nilfmt.Println("ps.size:",unsafe.Sizeof(ps))//8varsi[]int=nilvarsi1[]int=nilfmt.Println("si.size:",unsafe.Sizeof(si))//24variiinterface{}=nilfmt.Println("ii.size:",unsafe.Sizeof(ii))//16我们以生成我,爱,机器,学习,翻译成<bos>,i,love,machine,learning,<eos>这个例子做生成过程来解释。训练:把“我/爱/机器/学习”embedding后输入到encoder里去,最后一层的encoder最终输出的outputs[10,512](假设我们采用的embedding长度为512,而且batchsize=1),此outputs乘以新的参数矩阵,可以作为decoder里每一层用到的K和V;将<bos>作为decoder的初始输入,将decoder的最大概率输出词向量A1和‘i’做crossentropy(交叉熵)计算error。将<bos>,“i”作为decoder的输入,将decoder的最大概率输出词A2和‘love’做crossentropy计算error。将<bos>,“i”,“love”作为decoder的输入,将decoder的最大概率输出词A3和’machine’做crossentropy计算error。将<bos>,“i”,"love",“machine”作为decoder的输入,将decoder最大概率输出词A4和‘learning’做crossentropy计算error。将<bos>,“i”,"love",“machine”,“learning”作为decoder的输入,将decoder最大概率输出词A5和终止符做crossentropy计算error。那么并行的时候是怎么做的呢,我们会有一个mask矩阵在这叫seqmask,因为他起到的作用是在decoder编码我们的targetseq的时候对每一个词的生成遮盖它之后的词的信息。funcmain(){s:=[]string{"a","b","c"}fmt.Println("s:origin",s)changes1(s)fmt.Println("s:f1",s)changes2(s)fmt.Println("s:f2",s)changes3(s)fmt.Println("s:f3",s)}funcchanges1(s[]string){vartmp=[]string{"x","y","z"}s=tmp}funcchanges2(s[]string){//item只是一个副本,不能改变s中元素的值fori,item:=ranges{item="d"fmt.Printf("item=%s;s[%d]=%s",item,i,s[i])}}funcchanges3(s[]string){fori:=ranges{s[i]="d"}}首先我们需要为每个输入向量(也就是词向量)创建3个向量,分别叫做Query、Key、Value。那么如何创建呢?我们可以对输入词向量分别乘上3个矩阵来得到Q、K、V向量,这3个矩阵的参数在训练的过程是可以训练的。注意Q、K、V向量的维度是一样的,但是它们的维度可以比输入词向量小一点,比如设置成64,其实这步也不是必要的,这样设置主要是为了与后面的Mulit-head注意力机制保持一致(当使用8头注意力时,单头所处理的词向量维度为512/8=64,此时Q、K、V向量与输入词向量就一致了)。我们假设输入序列为英文的"ThinkingMachines"想要深度理解Attention机制,就需要了解一下它产生的背景、在哪类问题下产生,以及最初是为了解决什么问题而产生。首先回顾一下机器翻译领域的模型演进历史:机器翻译是从RNN开始跨入神经网络机器翻译时代的,几个比较重要的阶段分别是:SimpleRNN,ContextualizeRNN,ContextualizedRNNwithattention,Transformer(2017),下面来一一介绍。「SimpleRNN」:这个encoder-decoder模型结构中,encoder将整个源端序列(不论长度)压缩成一个向量(encoderoutput),源端信息和decoder之间唯一的联系只是:encoderoutput会作为decoder的initialstates的输入。这样带来一个显而易见的问题就是,随着decoder长度的增加,encoderoutput的信息会衰减。funcmain(){varc=make(chanint)fmt.Printf("c.pointer=%p\n",c)//c.pointer=0xc000022180gofunc(){c<-1addChannel(c)close(c)}()foritem:=rangec{//item:1//item:2fmt.Println("item:",item)}}funcaddChannel(donechanint){done<-2fmt.Printf("done.pointer=%p\n",done)//done.pointer=0xc000022180}在测试模型的时候,Test:decoder没有label,采用自回归一个词一个词的输出,要翻译的中文正常从encoder并行输入(和训练的时候一样)得到每个单词的embedding,然后decoder第一次先输入bos再此表中的id,得到翻译的第一个单词,然后自回归,如此循环直到预测达到eos停止标记typevisitstruct{a1 unsafe.Pointera2 unsafe.PointertypType}funcdeepValueEqual(v1,v2Value,visitedmap[visit]bool)bool{if!v1.IsValid()||!v2.IsValid(){returnv1.IsValid()==v2.IsValid()}ifv1.Type()!=v2.Type(){returnfalse}//Wewanttoavoidputtingmoreinthevisitedmapthanweneedto.//Foranypossiblereferencecyclethatmightbeencountered,//hard(v1,v2)needstoreturntrueforatleastoneofthetypesinthecycle,//andit'ssafeandvalidtogetValue'sinternalpointer.hard:=func(v1,v2Value)bool{switchv1.Kind(){casePointer:ifv1.typ.ptrdata==0{//not-in-heappointerscan'tbecyclic.//Atleast,allofourcurrentusesofruntime/internal/sys.NotInHeap//havethatproperty.Theruntimeonesaren'tcyclic(andwedon'tuse//DeepEqualonthemanyway),andthecgo-generatedonesare//allemptystructs.returnfalse}fallthroughcaseMap,Slice,Interface://Nilpointerscannotbecyclic.Avoidputtingtheminthevisitedmap.return!v1.IsNil()&&!v2.IsNil()}returnfalse}ifhard(v1,v2){//ForaPointerorMapvalue,weneedtocheckflagIndir,//whichwedobycallingthepointermethod.//ForSliceorInterface,flagIndirisalwaysset,//andusingv.ptrsuffices.ptrval:=func(vValue)unsafe.Pointer{switchv.Kind(){casePointer,Map:returnv.pointer()default:returnv.ptr}}addr1:=ptrval(v1)addr2:=ptrval(v2)ifuintptr(addr1)>uintptr(addr2){//Canonicalizeordertoreducenumberofentriesinvisited.//Assumesnon-movinggarbagecollector.addr1,addr2=addr2,addr1}//Shortcircuitifreferencesarealreadyseen.typ:=v1.Type()v:=visit{addr1,addr2,typ}ifvisited[v]{returntrue}//Rememberforlater.visited[v]=true}switchv1.Kind(){caseArray:fori:=0;i<v1.Len();i++{if!deepValueEqual(v1.Index(i),v2.Index(i),visited){returnfalse}}returntruecaseSlice:ifv1.IsNil()!=v2.IsNil(){returnfalse}ifv1.Len()!=v2.Len(){returnfalse}ifv1.UnsafePointer()==v2.UnsafePointer(){returntrue}//Specialcasefor[]byte,whichiscommon.ifv1.Type().Elem().Kind()==Uint8{returnbytealg.Equal(v1.Bytes(),v2.Bytes())}fori:=0;i<v1.Len();i++{if!deepValueEqual(v1.Index(i),v2.Index(i),visited){returnfalse}}returntruecaseInterface:ifv1.IsNil()||v2.IsNil(){returnv1.IsNil()==v2.IsNil()}returndeepValueEqual(v1.Elem(),v2.Elem(),visited)casePointer:ifv1.UnsafePointer()==v2.UnsafePointer(){returntrue}returndeepValueEqual(v1.Elem(),v2.Elem(),visited)caseStruct:fori,n:=0,v1.NumField();i<n;i++{if!deepValueEqual(v1.Field(i),v2.Field(i),visited){returnfalse}}returntruecaseMap:ifv1.IsNil()!=v2.IsNil(){returnfalse}ifv1.Len()!=v2.Len(){returnfalse}ifv1.UnsafePointer()==v2.UnsafePointer(){returntrue}for_,k:=rangev1.MapKeys(){val1:=v1.MapIndex(k)val2:=v2.MapIndex(k)if!val1.IsValid()||!val2.IsValid()||!deepValueEqual(val1,val2,visited){returnfalse}}returntruecaseFunc:ifv1.IsNil()&&v2.IsNil(){returntrue}//Can'tdobetterthanthis:returnfalsecaseInt,Int8,Int16,Int32,Int64:returnv1.Int()==v2.Int()caseUint,Uint8,Uint16,Uint32,Uint64,Uintptr:returnv1.Uint()==v2.Uint()caseString:returnv1.String()==v2.String()caseBool:returnv1.Bool()==v2.Bool()caseFloat32,Float64:returnv1.Float()==v2.Float()caseComplex64,Complex128:returnv1.Complex()==v2.Complex()default://NormalequalitysufficesreturnvalueInterface(v1,false)==valueInterface(v2,false)}}这便是encoder的整体计算流程图了,Transformer模型中堆叠了多个这样的encoder,无非就是输出连接输入罢了,常规操作。最后再附上一个Transformer的代码实现,读者有兴趣可以跟着自己复现一下Transformer模型的代码。  packagemain  import(    "log"    "sync"  )  funcinit(){    log.SetFlags(log.Lshortfile)  }  funcmain(){    lock:=sync.Mutex{}    //Go1.18新增,是一种非阻塞模式的取锁操作。当调用TryLock()时,    //该函数仅简单地返回true或者false,代表是否加锁成功    //在某些情况下,如果我们希望在获取锁失败时,并不想停止执行,    //而是可以进入其他的逻辑就可以使用TryLock()    log.Println("TryLock:",lock.TryLock())    //已经通过TryLock()加锁,不能再次加锁    lock.Lock()  }
  • 所需E币: 0
    时间: 2023-11-27 14:02
    大小: 4.52KB
    众所周知,视觉系统对于理解和推理视觉场景的组成特性至关重要。这个领域的挑战在于对象之间的复杂关系、位置、歧义、以及现实环境中的变化等。作为人类,我们可以很轻松地借助各种模态,包括但不仅限于视觉、语言、声音等来理解和感知这个世界。现如今,随着Transformer等关键技术的提出,以往看似独立的各个方向也逐渐紧密地联结到一起,组成了“多模态”的概念。多功能通过引入灵活的提示引擎,包括点、框、涂鸦(scribbles)、掩模、文本和另一幅图像的相关区域,实现多功能性;可组合通过学习联合视觉-语义空间,为视觉和文本提示组合实时查询,实现组合性,如图1所示;可交互通过结合可学习的记忆提示进行交互,实现通过掩模引导的交叉注意力保留对话历史信息;语义感知通过使用文本编码器对文本查询和掩模标签进行编码,实现面向开放词汇分割的语义感知。超大规模视觉通用感知模型由超大规模图像、文本主干网络以及多任务兼容解码网络组成,它基于海量的图像和文本数据构成的大规模数据集进行预训练,用于处理多个不同的图像、图像-文本任务。此外,借助知识迁移技术能够实现业务侧小模型部署。超大规模视觉通用感知模型面临的挑战:(1)网络参数量庞大,通常超十亿参数,训练稳定性、收敛性、过拟合等问题相较于小网络挑战大很多。(2)原始数据集包含数十亿异质低质量图片与海量文本,多步训练以利用异质的多模态多任务数据,流程复杂,存在灾难性遗忘,难以定位精度等问题。(3)实验成本高,通常需要上千块GPU并行训练数周,需要研究者有敏锐的分析能力和扎实的知识基础。(4)工程挑战多,海量数据的吞吐,大型GPU集群上的并行算法,超大参数量模型的内存管理。提示工程大多数视觉数据集由图像和相应文本标签组成,为了利用视觉语言模型处理视觉数据集,一些工作已经利用了基于模版的提示工程,text_descriptions=[f"Thisisaphotoofa{label}"forlabelincifar100.classes]  text_tokens=clip.tokenize(text_descriptions).cuda()除了此类大型视觉语言基础模型外,一些研究工作也致力于开发可以通过视觉输入提示的大型基础模型。例如,最近META推出的SAM能够执行与类别无关的分割,给定图像和视觉提示(如框、点或蒙版),指定要在图像中分割的内容。这样的模型可以轻松适应特定的下游任务,如医学图像分割、视频对象分割、机器人技术和遥感等从模型训练、模型分发、模型商业化,美图体系化地同创作者和开发者共建模型生态:(1)模型训练:提供二次训练能力,并持续不断地为创作者提供服务,包括培训、社区和模型创作大赛。(2)模型分发:创作者和开发者共建的模型可以在美图的产品内进行分发,在分发过程中持续优化模型。(3)模型商业化:行业客户可通过MiracleVision的API和SDK进行商业使用,创作者和开发者通过商业合作获得经济收益。通用视觉-语言学习的基础模型UNITER:结合了生成(例如掩码语言建模和掩码区域建模)和对比(例如图像文本匹配和单词区域对齐)目标的方法,适用于异构的视觉-语言任务。Pixel2Seqv2:将四个核心视觉任务统一为像素到序列的接口,使用编码器-解码器架构进行训练。Vision-Language:使用像BART或T5等预训练的编码器-解码器语言模型来学习不同的计算机视觉任务。模型整体结构上,抛弃了CNN,将BERT原版的Transformer开箱即用地迁移到分类任务上面,在使用大规模训练集的进行训练时,取得了极好的效果。同时,在大规模数据集上预训练好的模型,在迁移到中等数据集或小数据集的分类任务上以后,也能取得比CNN更优的性能。模型整体结构如下图所示,完全使用原始BERT的Transformer结构,主要是对图片转换成类似token的处理,原文引入了一个patch的概念,首先把图像划分为一个个的patch,然后将patch映射成一个embedding,即图中的linearprojection层,将输入转换为类似BERT的输入结构,然后加上positionembedding,这里的position是1D的,最后加上一个learnableclassificationtoken放在序列的前面,classification由MLP完成。这里我们用RAM提取了图像的语义标签,再通过将标签输入到Grounding-DINO中进行开放世界检测,最后再通过将检测作为SAM的提示分割一切。目前视觉基础大模型可以粗略的归为三类:textuallypromptedmodels,e.g.,contrastive,generative,hybrid,andconversational;visuallypromptedmodels,e.g.,SAM,SegGPT;heterogeneousmodalities-basedmodels,e.g.,ImageBind,Valley.CoCa通过将所有标签简单地视为文本,对web-scalealt-text和annotatedimages进行了从头开始端到端的预训练,无缝地统一了表示学习的自然语言监督。因此,CoCa在广泛的下游任务上实现了最先进的性能,零样本传输或最小的任务特定适应,跨越视觉识别(ImageNet,Kinetics-400/600/700,Moments-in-Time)、跨模式检索(MSCOCO、Flickr30K、MSR-VTT)、多模式理解(VQA、SNLI-VE、NLVR2)和图像字幕(MSCOCO、NoCaps)。在ImageNet分类中,CoCa获得了86.3%的zero-shottop-1准确率,frozenencoderandfinetuneclassifier是90.6%,finetuneencoder可以到91.0%。截止目前国内外已经发布了许多包括NLP,CV和多模态在内的大规模模型,但是这些模型在应用落地上还是有待进一步探究的,目前应用落地较好的有华为的盘古,在电网和金融圈都有应用;智源的悟道系列在诗词图文上都有广泛应用,可以帮助学生看图写作,根据文字生成插图等;百度的文心也发布了在金融方面的应用。但截止目前为止大模型在实际中的应用还不是很理想,大模型发展的初衷是使用一个预训练好的大模型代替一堆小作坊似的根据不同任务训练的小模型,通过模型蒸馏知识迁移等技术在小模型上使用少量数据集达到超过原来小模型性能的目标。CV大模型在应用上的一个难点是与实际应用相结合,目前社会中用的较多的视觉相关的深度学习模型主要包括物体检测,人脸识别以及缺陷检测(部分)相比NLP模型在实际中的使用少很多,因此将CV模型与实际生产相结合发现更多的应用场景很关键。另外一个CV大模型应用的难点就是如何快速高效的使用蒸馏和知识迁移技术提升下游任务的性能,这两点难题的解决在CV大模型的实际应用中都刻不容缓。总结起来,将大模型应用于更高分辨率的下游视觉任务具有以下好处:提高感知能力、改善定位精度、提升语义理解、改善细节保留和边缘清晰度、增加鲁棒性和泛化能力,以及推动研究进展。这些好处使得大模型在处理高分辨率图像时能够获得更准确、更细致和更真实的结果。随着深度学习和计算资源的不断发展,我们可以期待更先进的大模型和相关技术的出现,进一步推动计算机视觉在高分辨率图像任务中的应用和突破
  • 所需E币: 0
    时间: 2023-11-13 17:24
    大小: 3.59KB
    TensorRT部署手把手教您,跟我一起来学习。这东西就是NVidia在自家显卡上做了一个深度学习inference加速的框架,只要你把训练好的模型参数和结构告诉他,他就能自动帮你优化(硬件相关),以达到最快速度。这涉及两个问题:应该以什么模型格式把模型喂给TensorRT?如何使用TensorRT优化后的模型?对于第一个问题:现在的深度学习框架非常多,不止常用的pytorch/tensorflow,而即使是同一种框架还可以使用不同的编程语言实现。让TensorRT对每一个框架都直接支持,显然是不可能的。TensorRT只需要知道网络的结构和参数即可,它支持三种转换入口:TF-TRT,要求是TensorFlow模型ONNX模型格式使用TensorRTAPI手动把模型搭起来,然后把参数加载进去第一种不够灵活,第三种比较麻烦,所以最省事方便的就是第二种方法。本文介绍第二种。ONNX就是一个通用的神经网络格式,一个.onnx文件内包含了网络的结构和参数。甭管是用什么深度学习框架写的网络,只要把模型导出成ONNX格式,就跟原本的代码没有关系了。转成ONNX格式还没有被优化,需要再使用TensorRT读取它并优化成TensorRTEngine。优化参数也在这一步指定。对于第二个问题:得到的TensorRTEngine是硬件相关的,之后跑模型只需要运行这个Engine即可。调用TensorRTEngine需要使用TensorRTRuntimeAPI。所以整个逻辑就是:把你的模型导出成ONNX格式。把ONNX格式模型输入给TensorRT,并指定优化参数。使用TensorRT优化得到TensorRTEngine。使用TensorRTEngine进行inference。屏蔽nouveau驱动nouveau是系统自带的一个显示驱动程序,需要先将其禁用,然后再进行下一步操作,否则在安装显卡驱动时,会提示:YouappeartoberunninganXserver…,然后安装失败。分别打开如下两个文件(如果没有就创建一个),并在其中输入如下两句,然后保存。#vim/etc/modprobe.d/nvidia-installer-disable-nouveau.conf#vim/lib/modprobe.d/nvidia-installer-disable-nouveau.conf...blacklistnouveauoptionsnouveaumodeset=0重做initramfs镜像重做镜像之后启动才会屏蔽驱动,否则无效,重做时应先rm已有驱动,否则会提示无法覆盖。这一步需要确保boot文件目录的空间足够,否则会失败。建议大于400MB#cp/boot/initramfs-$(uname-r).img/boot/initramfs-$(uname-r).img.bak#dracut/boot/initramfs-$(uname-r).img$(uname-r)--force#rm/boot/initramfs-$(uname-r).img.bak;这一步可不执行如果想用YOLOv5对图像做目标检测,在将图像输入给模型之前还需要做一定的预处理操作,预处理操作应该与模型训练时所做的操作一致。YOLOv5的输入是RGB格式的3通道图像,图像的每个像素需要除以255来做归一化,并且数据要按照CHW的顺序进行排布。所以YOLOv5的预处理大致可以分为两个步骤:将原始输入图像缩放到模型需要的尺寸,比如640x640。这一步需要注意的是,原始图像是按照等比例进行缩放的,如果缩放后的图像某个维度上比目标值小,那么就需要进行填充。举个例子:假设输入图像尺寸为768x576,模型输入尺寸为640x640,按照等比例缩放的原则缩放后的图像尺寸为640x480,那么在y方向上还需要填充640-480=160(分别在图像的顶部和底部各填充80)。来看一下实现代码:cv::Matinput_image=cv::imread("dog.jpg");cv::Matresize_image;constintmodel_width=640;constintmodel_height=640;constfloatratio=std::min(model_width/(input_image.cols*1.0f),               model_height/(input_image.rows*1.0f));//等比例缩放constintborder_width=input_image.cols*ratio;constintborder_height=input_image.rows*ratio;//计算偏移值constintx_offset=(model_width-border_width)/2;constinty_offset=(model_height-border_height)/2;cv::resize(input_image,resize_image,cv::Size(border_width,border_height));cv::copyMakeBorder(resize_image,resize_image,y_offset,y_offset,x_offset,          x_offset,cv::BORDER_CONSTANT,cv::Scalar(114,114,114));//转换为RGB格式cv::cvtColor(resize_image,resize_image,cv::COLOR_BGR2RGB);格式转化要将tensorflow的pb文件转化为uff格式的文件,首先找到convert_to_uff文件,看自己用的是哪个版本的python,如果是python3,则在/usr/lib/python3.5/dist-packages/uff/bin文件夹下,如果是python2,则在/usr/lib/python2.7/dist-packages/uff/bin文件夹下我们在终端中进入end_to_end_tensorflow_mnist,运行以下指令首先使用Pytorch实现一个和上文一致的模型,即只对输入做一次池化并输出;然后将Pytorch模型转换成ONNX模型;最后将ONNX模型转换成TensorRT模型。这里主要使用了TensorRT的OnnxParser功能,它可以将ONNX模型解析到TensorRT的网络中。最后我们同样可以得到一个TensorRT模型,其功能与上述方式实现的模型功能一致。importtorch importonnx importtensorrtastrt   onnx_model='model.onnx'  classNaiveModel(torch.nn.Module):   def__init__(self):     super().__init__()     self.pool=torch.nn.MaxPool2d(2,2)    defforward(self,x):     returnself.pool(x)  device=torch.device('cuda:0')  #generateONNXmodel torch.onnx.export(NaiveModel(),torch.randn(1,3,224,224),onnx_model,input_names=['input'],output_names=['output'],opset_version=11) onnx_model=onnx.load(onnx_model)  #createbuilderandnetwork logger=trt.Logger(trt.Logger.ERROR) builder=trt.Builder(logger) EXPLICIT_BATCH=1<<(int)(   trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH) network=builder.create_network(EXPLICIT_BATCH)  #parseonnx parser=trt.OnnxParser(network,logger)  ifnotparser.parse(onnx_model.SerializeToString()):   error_msgs=''   forerrorinrange(parser.num_errors):     error_msgs+=f'{parser.get_error(error)}\n'   raiseRuntimeError(f'Failedtoparseonnx,{error_msgs}')  config=builder.create_builder_config() config.max_workspace_size=1<<20 profile=builder.create_optimization_profile()  profile.set_shape('input',[1,3,224,224],[1,3,224,224],[1,3,224,224]) config.add_optimization_profile(profile) #createengine withtorch.cuda.device(device):   engine=builder.build_engine(network,config)  withopen('model.engine',mode='wb')asf:   f.write(bytearray(engine.serialize()))   print("generatingfiledone!") 
  • 所需E币: 2
    时间: 2023-11-10 13:43
    大小: 49.04MB
    上传者: luckyfox
    FreeRTOSv9.0.0操作系统学习,文件目录如下所示:
  • 所需E币: 0
    时间: 2023-11-10 15:44
    大小: 1001KB
    上传者: Argent
    第4讲Uboot源码目录分析
  • 所需E币: 0
    时间: 2023-11-10 15:46
    大小: 1005.5KB
    上传者: Argent
    第10讲Linux内核源码目录分析