Jetson Xavier NX 下LIO-SAM配置运行

在小车配置LIO-SAM的基础上,在虚拟机端运行 环境配置: ubuntu18.04, ros1(ros-melodic) 必须安装gtsam4.0.2版本 Park数据集下运行(GPS) 需要修改的参数: 将"config/params.yaml"中的"gpsTopic"改为"odometry/gps"将"config/params.yaml"中的"useImuHeadingInitialization"改为true可调整参数: gpsCovThreshold:过滤不良 GPS 读数poseCovThreshold:GPS 因子添加到图形的频率 注释掉run.launch中的运行rviz的部分调整TIMEOUT_SIGINT数值(默认15s,改为60s),否则可能导致地图保存失败 sudo gedit /opt/ros/melodic/lib/python2.7/dist-packages/roslaunch/nodeprocess.py保存地图 将"config/params.yaml"中 savePCD: true savePCDDirectory: “保存路径” - > 保存到小车端 注:先关闭 lio-sam 相关节点再关闭 rvizrviz 在配置rviz.rviz的基础上,再选中"Map(local)”Map(local)中的delay设置时长300,可以查看长时间的点云图 运行: 小车端: roslaunch lio_sam run.launch cd bag的存放位置 rosbag play park.bag 虚拟机端: rviz 并File-open config-rviz.rviz 结果: 查看保存后的点云map: pcl_viewer CornerMap.pcd GlobalMap.pcd SurfMap.pcd trajectory.pcd transformations.pcd 小车实时(无GPS) 待续 小车实时(GPS) 待续 适配kitti数据集链接:https://blog.csdn.net/qq_40528849/article/details/129864881

BaseMapper中提供的方法(17种CRUD)

BaseMapper封装的17种增删改查方法 MybatisPlus框架中mapper层继承了BaseMapper接口,该接口中封装了常用的增删改查方法,共有17种,以下是方法的详情介绍 首先需要明确的括号内的一些对象定义 泛型T:实体类类型参数 Serializable 为任意类型主键 Mybatis-Plus 不推荐使用复合主键约定每一张表都有自己的唯一id 主键@Param注解:指定了参数名称et:实体类对象ew:查询条件wrapper对象 增加 1.插入一条数据 int insert(T entity) T entity = new T(); // 创建实体对象 baseMapper.insert(entity); // 插入数据 删除 2.根据主键id删除数据 int deleteById(Serializable id) Serializable id = 1L; // 要删除的实体的主键ID=xxx baseMapper.deleteById(id); // 删除数据 3.map集合根据条件删除数据 int deleteByMap(@Param(“cm”) Map<String, Object> columnMap) Map<String, Object> columnMap = new HashMap<>();//创建一个map集合存放符合删除条件需要删除的数据 columnMap.put("name", "wonwoo"); // 设置删除条件,比如name字段等于"wonwoo",将name字段等于"wonwoo"的数据放入创建的map集合 baseMapper.deleteByMap(columnMap); // 删除满足条件的数据 4.高级查询根据条件删除数据 int delete(@Param(“ew”) Wrapper wrapper) // 创建Wrapper对象,设置删除条件 LambdaQueryWrapper<T> wrapper = new LambdaQueryWrapper<>(); wrapper.

深度学习论文: YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information及其PyTorch实现

深度学习论文: YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information及其PyTorch实现 YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information PDF: https://arxiv.org/pdf/2402.13616.pdf PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: https://github.com/shanglianlm0525/PyTorch-Networks 1 概述 首先,YOLOv9引入了革命性的可编程梯度信息(Programmable Gradient Information, PGI)技术,这一创新理念致力于解决深层神经网络中信息丢失的难题。传统的目标检测网络在传递深层信息时,经常丢失对最终预测至关重要的细节。然而,YOLOv9借助PGI技术,确保了网络在学习过程中能够维持完整的输入信息,从而获取更加可靠和精确的梯度信息,极大地提升了权重更新的准确性。这一独特的设计显著提高了目标检测的准确率,为实现实时、高精度的目标检测提供了强有力的支持。 不仅如此,YOLOv9还采用了一种全新的网络架构——泛化高效层聚合网络(Generalized Efficient Layer Aggregation Network, GELAN)。GELAN通过精心规划的梯度路径,优化了网络结构,实现了超越当前最先进方法(包括基于深度卷积的方法)的参数利用效率。这种创新设计不仅提升了模型的性能,还确保了模型的高效性。因此,YOLOv9在保持轻量级的同时,达到了前所未有的准确度和速度,为实时目标检测领域树立了新的里程碑。 information bottleneck问题: 2 可编程梯度信息 Programmable Gradient Information(PGI) 为了解决上述问题,YOLOv9提出了一种新的辅助监督框架,称为可编程梯度信息(PGI)。 PGI主要包括三个组成部分,即:1)主分支 2)辅助可逆分支 3)多级辅助信息 2-1 辅助可逆分支 Auxiliary Reversible Branch 辅助可逆分支:这一组件的引入,旨在攻克随着网络深度递增所带来的信息瓶颈挑战。这种瓶颈现象往往会干扰损失函数生成有效梯度的能力,进而限制模型性能的进一步提升。辅助可逆分支的引入,正是为了保持信息流动的完整性和连续性,从而有效克服这一障碍,确保网络在深度增加的同时,仍能够保持强大的表征能力。 辅助可逆分支,通过确保数据到目标的信息流畅传递,减少了损失函数依赖不完整前馈特征产生误导性关联的风险。虽然可逆架构能够保持信息的完整性,但在推理阶段向其中加入主分支会大幅增加计算成本。因此在推理阶段可以去除辅助可逆分支,从而不影响原始网络的推理效率。 2-2 多级辅助信息 Multi-level Auxiliary Information 多级辅助信息:在深度监督学习中,尤其是在具有多个预测分支的复杂结构和轻量级模型中,误差累积是一个不可忽视的问题。为了解决这一难题,我们引入了多级辅助信息。通过这一设计,模型能够更加高效地学习,并在不同层级上减少误差的传播,从而确保整体预测的准确性和稳定性。这一创新不仅增强了模型的鲁棒性,也为深度监督学习提供了新的思路和方法。 在深度监督架构中,尤其是在处理目标检测任务时,为了有效应对不同规模的目标,通常会利用多层次的特征金字塔。为了确保目标信息的完整性,每一级的特征金字塔都需要接收到关于所有目标尺寸的全面信息。为此,我们引入了多级辅助信息框架。该框架通过在辅助监督特征金字塔层与主分支之间构建集成网络,巧妙地将来自不同预测分支的梯度信息进行整合,并将这一综合信息传递给主分支,从而指导参数的更新。通过这种机制,主分支的特征金字塔不再受限于某一特定尺寸目标的信息,而是能够全面考虑各种尺寸的目标信息。这一创新设计不仅解决了深度监督中可能出现的信息断裂问题,还显著提升了模型的泛化能力和检测精度。 3 广义高效层聚合网络 Generalized ELAN(GELAN) GELAN的诞生,源自对两个先进网络设计理念——具备梯度路径规划能力的CSPNet和ELAN——的深度融合。这一创新设计旨在打造一个既轻量又快速且精确的网络架构,全面优化网络性能和效率。

nginx出现 “414 request-uri too large”

nginx出现 “414 request-uri too large” 1.修改传参方式 POST 2.字段能变成后端获取就自己获取,不用前端传 3.修改nginx配置,添加client_header_buffer_size 512k;large_client_header_buffers 4 512k;配置

LeetCode: 数组中的第K个最大元素

问题描述 在未排序的数组中找到第k个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。 解题思路 解决这个问题有多种方法,下面是几种常见的解题策略: 排序后选择: 将数组排序,然后选择第len(array) - k位置上的元素。优先队列(最小堆): 使用一个大小为k的最小堆,遍历数组维护堆的大小为k,堆顶即为第k个最大元素。快速选择(QuickSelect): 快速选择算法是快速排序的变体,用于找到未排序数组中第k个最大的元素。 代码示例 排序后选择 class Solution: def findKthLargest(self, nums, k): nums.sort() return nums[-k] 这种方法的时间复杂度为O(NlogN),空间复杂度为O(1)(如果使用的是原地排序算法)。 优先队列(最小堆) import heapq class Solution: def findKthLargest(self, nums, k): heap = [] for num in nums: heapq.heappush(heap, num) if len(heap) > k: heapq.heappop(heap) return heap[0] 这种方法的时间复杂度为O(NlogK),空间复杂度为O(K)。 快速选择(QuickSelect) class Solution: def findKthLargest(self, nums, k): k = len(nums) - k def quickselect(l, r): pivot, p = nums[r], l for i in range(l, r): if nums[i] <= pivot: nums[p], nums[i] = nums[i], nums[p] p += 1 nums[p], nums[r] = nums[r], nums[p] if p > k: return quickselect(l, p - 1) if p < k: return quickselect(p + 1, r) return nums[p] return quickselect(0, len(nums) - 1) int partition(vector<int>& nums,int left,int right) { int key = nums[left]; while(left < right) { while(left < right and nums[right] >= key ) { right--; } nums[left] = nums[right] while(left < right and nums[left] <= key ) { left++; } nums[right] = nums[left] } nums[left] = key; return left; } int findk(vector<int>& nums) { random_shuffle(nums.

easyexcel字体加粗

public static void main(String[] args) { List<Data> dataList = new ArrayList<>(); dataList.add(new Data("Data 1")); dataList.add(new Data("Data 2")); dataList.add(new Data("Data 3")); // 设置加粗字体 WriteCellStyle boldCellStyle = new WriteCellStyle(); WriteFont boldFont = new WriteFont(); boldFont.setBold(true); boldCellStyle.setWriteFont(boldFont); // 样式策略 HorizontalCellStyleStrategy styleStrategy = new HorizontalCellStyleStrategy(boldCellStyle, boldCellStyle); // 写入 Excel 文件 EasyExcel.write("BoldCellDemo.xlsx", Data.class) .registerWriteHandler(styleStrategy) .sheet("Sheet1") .doWrite(dataList); } public static class Data { @ExcelProperty("Data") private String data; public Data(String data) { this.data = data; } public String getData() { return data; } public void setData(String data) { this.

Centos服务器部署前后端项目

目录 准备工作1. 准备传输软件2. 连接服务器 部署Mysql1.下载Mysql(Linux版本)2. 解压3. 修改配置4. 启动服务另一种方法Docker 部署后端1. 在项目根目录中创建Dockerfile文件写入2. 启动 部署前端1. 在项目根目录中创建Dockerfile文件写入2. 启动使用openresty启动config文件配置代理 准备工作 1. 准备传输软件 下载WinSCP用于传输 WinSCP下载地址 2. 连接服务器 部署Mysql 1.下载Mysql(Linux版本) Mysql8下载地址 下载完成后通过WinSCP传输至服务器 2. 解压 tar -xvf mysql-8.3.0-linux-glibc2.28-x86_64.tar.xz -C /usr/local -x选项表示解压缩-v选项表示在解压缩时显示详细信息-f选项指定要解压缩的文件名-C选项指定解压缩后的目标目录。 3. 修改配置 cd /usr/local/ #修改文件名 mv mysql-8.3.0-linux-glibc2.28-x86_64 mysql ... 4. 启动服务 [root@iZ2zefyktv92zomf8sbocfZ mysql] cd /usr/local/mysql/support-files # 启动 [root@iZ2zefyktv92zomf8sbocfZ support-files] ./mysql.server start 另一种方法Docker #获取 MySQL Docker 镜像: docker pull mysql:8.0 # 创建 MySQL 容器 docker run --name mysql-container -dp 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql # 进入容器内部 docker exec -it mysql-container mysql -u root -p docker run 用于创建指定镜像和启动新的容器实例,

Python爬虫——Urllib库-1

这几天都在为了蓝桥杯做准备,一直在刷算法题,确实刷算法题的过程是及其的枯燥且枯燥的。于是我还是决定给自己找点成就感出来,那么Python的爬虫就这样开始学习了。 注:文章源于观看尚硅谷爬虫视频后笔记 目录 Urllib库 基本使用 一个类型和六个方法 一个类型 六个方法 下载功能 请求对象的定制 url的组成 (1)协议 (2)主机 (3)端口号 (4)路径 (5)参数 (6)锚点 总结 Urllib库 这个库和其他的爬虫库不一样,这个库是Python自带的,所以一般是不需要安装的。 基本使用 urllib的基本使用,我们把百度页面的所有源代码全部拿下。 就是这个页面的全部东西,我们可以使用urllib来拿下它。 代码如下: # 使用urllib来获取百度首页的源码 import urllib.request # 1.定义一个URL,就是要访问的网址 url = "http://www.baidu.com/" # 2.模拟浏览器向服务器发送请求 response = urllib.request.urlopen(url) # 3.获取响应中的页面中的源码 # read返回的是字节形式的二进制数据 # 将二进制的数据转换为字符串 # 解码:二进制 -> 字符串 decode('编码格式字符集') content = response.read().decode('utf-8') # 4.打印一下数据 print(content) 一个类型和六个方法 一个类型 首先我们可以看见服务器返回给我们的response的类型是HTTPResponse 六个方法 [1] read( ):按照一字节一字节的读取,效率较慢 扩展:read( n ):n是多少就返回多少个字节 [2] readline():读取一行 [3] readlines():一行行的读取,直到读取完毕

著名数学家齐民友与门下三人接力,共同翻译出这本颠覆数学教育的微积分教材!...

《可视化微分几何和形式》这本书的原书出版受到众多学生与老师的关注,因为《复分析》的新颖写法,让许多人对这本书备受期待。而齐民友老师的精湛翻译更是让《复分析》吸引了一大批粉丝,翻译版甚至比原书的评分还要高,这在学界也是颇为少见。 于是,《可视化微分几何和形式》的出版也让更多的人期待齐老师的译本。出版社第一时间联系了齐老师,齐老师委托他的学生陈化老师与刘伟安老师共同完成这本书的翻译。然而不幸的是,齐老师未能眼见图书的出版,即于2021年去世。 后陈化老师与刘伟安老师共同完成本书的翻译,于今年出版,以此告慰齐民友老师的在天之灵! 本文摘录两位老师的译者序,一窥书中精彩,与拳拳师生情。 来源 | 《可视化微分几何和形式:一部五幕数学正剧》 作者 | [美]特里斯坦·尼达姆(Tristan Needham) 译者:刘伟安 译者序 刘伟安 2023 年 12 月于克拉玛依 最初,出版社是请齐民友老师(我的博士生导师)翻译本书的.齐老师说需要一个帮手,与陈化老师(具体指导我做博士研究和写博士论文的导师)商量后,他向出版社推荐了我.原定计划是,我翻译全书,齐老师负责处理疑难问题和通读全稿.但不幸的是,齐老师于 2021 年 8 月 8 日突发心脏病辞世.现在,我们以本书中译本的出版告慰齐民友老师的在天之灵! 作者特里斯坦·尼达姆一开始就许诺要为本科生写一本“有几何味”的好书.本书规模宏大,从古希腊人关于平行公理的争论讲到爱因斯坦发现时空的弯曲,从自由落体的数学讲到黑洞的几何、引力波的数学.本书讲法特别,用形象化的描述和 200 多幅插图实现了可视化,并加入了作者自己设计的数学实验,把微分几何教科书里描述得非常抽象的内容(例如平行移动、和乐性等)讲得通俗易懂,看得见、摸得着,所以说,作者兑现了自己的承诺! 特里斯坦·尼达姆教授是做事很认真的人,他对学术负责,也对读者负责.证据有三:本书中包含详尽的“历史注记”,以及作者坚持要将大家熟知的“庞加莱模型”称为“贝尔特拉米 – 庞加莱模型”,此证据一;本书已出版两年,作者还在征求读者意见,并为本书创建了网站 VDGF.space 来公布勘误,此证据二;我们提交译稿后的一年时间中,作者借助翻译工具多次审读译稿,并要求说明,中译本修正了英文原版书中存在的一些错误,此证据三. 作者使用了很多英语成语,多处借用《星际迷航》中的人物和情节做比喻,写得生动有趣、引人入胜.为了便于读者阅读,我们增加了一些译者注.关于英语成语的注释主要参考了 1979 版的 Longman Dictionary of English Idioms 和梁实秋编撰的《最新实用英汉辞典》,还得到了曹凤婷教授(武汉理工大学外国语学院)和邓铿教授(路易斯安那大学拉斐特分校数学系)的帮助.关于数学家和物理学家的注释,主要参阅著名的数学史网站“The MacTutor History of MathematicsArchive”和“百度百科”.在此一并表示感谢. 陈文艺教授仔细地审阅了全书.本书责任编辑杨琳、策划编辑张子尧和特约编辑江志强、黄志斌在编辑的过程中帮我修改了不少错误,按照国家标准统一了人名的翻译,对译者注提出了很好的一些建议.特别是责任编辑杨琳几乎逐句修改了全文,使得译文更通顺、更准确.如果你对中译本的质量感到满意,别忘了这有他们的功劳.我与他们的合作非常愉快,在此表示感谢. 感谢陈化老师百忙之中为本书中译本作序,更要感谢他多年来对我的指导、帮助和支持. 最后,要感谢我的家人.我常与我的妻子蔡新民和女儿刘静萱讨论译稿中的问题,请她们帮我查阅资料.例如,关于《星际迷航》,她们总能以她们的意见帮助和支持我.当然,更重要的是她们,以及我的外孙女刘茹漪给我的爱. 本书翻译中难免有各种问题、缺陷和错误,敬请读者不吝指正. 中文版序 陈化 2022 年 8 月于武汉大学珞珈山 这本书是特里斯坦·尼达姆的第二本可视化的数学著作(简称为《微分几何》),第一本是《复分析》.与第一本书一样,这本书也是针对本科水平的读者写的,但读起来并不简单. 这本书的第一个特点是讲了平行移动、和乐性和形式这些前沿概念,而且用可视化的方法把这些前沿概念讲得通俗易懂. 第二个特点是讲解了微分几何在物理学中的应用,特别是关于广义相对论的讨论,凸显了微分几何的重要性. 第三个特点是详细解答了微分几何发展过程中的一些历史谜团. 第四个特点是把有些内容讲得较为详细.例如,用四章的篇幅来详细介绍全局高斯 – 博内定理的四个证明,以及在第 22 章中介绍平行移动的三种外在构作方法.第五个特点是设计了很多数学实验,而且都是读者很容易自己动手的实验,例如在西瓜、西葫芦、榴梿等瓜果上的实验等. 因此,这本书面世后立即获得了众多好评,例如,迈克尔·贝里爵士就评论说:“这本书有五百页雄辩的篇幅,充满了数学智慧和深厚的历史底蕴.《微分几何》确实是可视的,通过柚子、榴梿、南瓜、土豆和牙签描绘了平行移动、曲率和测地线.我真希望当我还是学生的时候就有尼达姆的这本书.”物理学家伯纳德·舒茨教授也评论道:“《微分几何》是优雅的,有漂亮的排版、巧妙的插图和可爱的工艺.尼达姆巧妙地让几何重新主导了数学,他向我们展示了几何仍然有一些新的东西要告诉我们.” 尼达姆的博士生导师是著名物理学家罗杰·彭罗斯爵士,那是一位奇才,除学术成就之外,还留下了彭罗斯铺垫、彭罗斯三角形和多边形、彭罗斯阶梯等奇思.另外,因其关于黑洞的理论被验证,罗杰·彭罗斯获得了 2020 年诺贝尔物理学奖.学界有人说,应该称彭罗斯为数学家和数学物理学家,因为他是用数学来做物理研究的,而且他是一位“阐述大师”.看来,尼达姆得了彭罗斯的真传,也是一位很会讲物理的数学家,而且讲得生动活泼、引人入胜.

【探索AI】人人都在讲AIGC,什么是AIGC?

AIGC 概述示例展示我们日常用到的一些工具/应用核心技术介绍核心技术的算法解析案例及部分代码实现1. 艺术作品2. 设计项目3. 影视特效4. 广告创意总结 一张图先了解下: 概述 "人工智能生成创造(Artificial Intelligence Generated Content,AIGC)"是指利用人工智能技术生成各种形式的创作内容,包括图像、音频、视频等。AIGC 是人工智能在创意领域的应用,通过机器学习、深度学习等技术,让计算机具备创作和生成内容的能力。 在 AIGC 领域,目前最为广泛应用的技术包括生成对抗网络(GAN)、变分自动编码器(VAE)、神经风格迁移等。这些技术能够模仿艺术家的风格、学习输入数据的特征,从而生成类似但又独特的创作内容。 举例来说,通过使用生成对抗网络(GAN),可以让机器学习并生成逼真的图像、视频或音频。GAN 的原理是由两个神经网络组成,一个生成器用于生成样本,一个判别器用于评估生成的样本与真实样本的区别,二者不断博弈提高生成效果。 另一个例子是神经风格迁移技术,它可以将一幅图像的风格转移到另一幅图像上,生成具有原始图像风格的新图像。这种技术被广泛应用于艺术创作、图像处理等领域。 示例展示 1. 图像生成: 示例:使用StyleGAN算法生成的名人肖像画。描述:展示一幅由StyleGAN生成的逼真的名人肖像画,如奥黛丽·赫本或莱昂纳多·迪卡普里奥。这些图像几乎难以与真实照片区分开来,展示了AIGC在图像生成领域的惊人能力。技术:StyleGAN是一种基于深度学习的生成对抗网络(GAN),通过训练大量的图像数据,能够生成高质量、多样化的图像。 2. 音频生成: 示例:使用Transformer模型生成的语音。描述:播放一段由Transformer模型生成的语音,内容可以是一段新闻报道或诗歌朗诵。这段语音听起来自然流畅,几乎与真实的人类语音无异。技术:Transformer模型是一种基于自注意力机制的深度学习模型,广泛应用于自然语言处理和语音合成等领域。通过训练大量的语音数据,它能够学会生成逼真的语音。 3. 视频生成: 示例:使用MotionGAN生成的人物动作视频。描述:展示一段由MotionGAN生成的人物动作视频,视频中的人物动作流畅自然,与真实视频难以区分。这展示了AIGC在视频生成和编辑方面的巨大潜力。技术:MotionGAN是一种结合了生成对抗网络和运动捕捉技术的深度学习模型。它能够学习人物的动作模式,并生成逼真的动作视频。 我们日常用到的一些工具/应用 以下是上述工具/应用的主要作用和擅长领域的简要概述: ChatGPT: 主要作用:ChatGPT 是一个基于人工智能技术的语言模型,具备对话功能、语言生成功能、文本分类功能、文本摘要功能、机器翻译功能以及语音合成功能。擅长领域:ChatGPT 在自然语言处理方面表现出色,能够进行流畅和自然的对话,并为用户生成各种文本内容。 Midjourney: 主要作用:Midjourney 是一款旅行和出行社交应用,提供路线优化、线路推荐、旅行信息、路程追踪以及社交模式等功能。擅长领域:该应用专注于旅行领域,帮助用户更好地规划、享受和分享旅行体验。 Adobe Firefly: 主要作用:Adobe Firefly 是一款基于人工智能的图像和视频编辑工具,通过语音输入命令快速完成编辑任务。擅长领域:Firefly 在图像和视频编辑方面功能强大,如色彩校正、调整图像大小、添加文本等,以及视频编辑功能如调整音频、添加特效等。 文心一言: 主要作用:文心一言是一个基于人工智能技术的语言模型,具备表达情感、启示思维和传递文化等功能。擅长领域:文心一言在情感表达、思维启示和文化传播方面表现突出,能够提供深入且富有情感的内容。 通义千问: 主要作用:通义千问是阿里云推出的超大规模语言模型,具备多轮对话、文案创作、逻辑推理、多模态理解、多语言支持等功能。擅长领域:通义千问适用于多种场景,如在线客服、智能助手、社交聊天、学习辅助等。 豆包: 主要作用:豆包APP是一款具备自然语言处理和智能推荐功能的AI应用,旨在理解用户需求并提供实用信息。擅长领域:豆包APP擅长多语种、多功能的AIGC服务,如问答、智能创作和聊天,并支持语音播放。 Stable Diffusion: 主要作用:Stable Diffusion 是一种用于图像生成的模型,能够生成高质量的图像。擅长领域:该模型擅长图像生成,尤其在图像修复、图像合成、图像增强和图像生成等任务中表现出色。 请注意,这些工具和模型的具体功能和擅长领域可能会随着技术的不断发展和更新而发生变化。因此,为了获取最准确和最新的信息,建议您直接查阅官方文档或联系相关供应商。 核心技术介绍 AIGC的核心技术介绍 1. 生成对抗网络(GAN) 原理:GAN由两部分组成——生成器(Generator)和判别器(Discriminator)。生成器的任务是生成尽可能接近真实数据的假数据,而判别器的任务是尽可能准确地判断输入的数据是真实的还是由生成器生成的。两者通过相互竞争和不断迭代优化,最终生成器能够产生非常接近真实数据的输出。 应用场景:图像生成、音频生成、视频生成等。例如,StyleGAN在图像生成领域取得了显著的效果,能够生成高质量、多样化的图像。 2. 变分自动编码器(VAE) 原理:VAE是一种生成式模型,它通过学习数据的潜在表示来生成新数据。VAE包含编码器(Encoder)和解码器(Decoder)两部分。编码器将输入数据压缩成一个低维的潜在表示(latent representation),解码器则从这个潜在表示中重构出原始数据。VAE通过最大化数据的变分下界来优化模型,使得生成的数据尽可能接近真实数据。 应用场景:图像生成、文本生成等。VAE在图像生成方面可以产生多样化的输出,同时保持一定的数据质量。 3. 神经风格迁移(Neural Style Transfer)

[伴学笔记]01-操作系统概述 [南京大学2024操作系统]

文章目录 前言jyy:01-操作系统概述 [南京大学2024操作系统]为什么要学操作系统?学习操作系统能得到什么? 什么是操作系统?想要明白什么是操作系统:时间线:1940s1950s-1960s1960-1970s年代. 信息来源: 前言 督促自己,同时分享所得,阅读完本篇大约需要10分钟,希望为朋友的技术精进之路尽到绵薄之力.码字不易,望能给个点赞和收藏,以激励笔者源源不断的创作.在此以表谢意,同时因为笔者实力有限,如果发现错误,请及时指正,以免误导后人,谢谢! jyy:01-操作系统概述 [南京大学2024操作系统] 为什么要学操作系统? ​ 因为我们要重走学科从 无 到有的这个过程,理解这个学科里面种种产生的 基本动机 基本方法 里程碑 走过的弯路。 最终的目的肯定是 想能让我们进行 应用 创新 革命 所有概念的产生 都不是凭空产生,是有所原因的,比如遇到什么什么问题 提出什么什么理论 怎么怎么样克服,把此叫做什么名字 定义下来一个概念 什么都想要一点最后注定四不像,要学会做减法,要学会专注 除了和考研相关的,其他都不去花费时间和精力 操作系统诞生的基本动机 就是更快更好的服务应用 操作系统的发展带动硬件的发展 学习操作系统能得到什么? ​ 可以理解更多的问题比如 为什么可以用 ctr c 结束死循环 更基础的理解什么什么东西是怎么样工作的 ​ 可以手搓更多的东西,比如浏览器 病毒 编译器 杀毒软件 什么是操作系统? 管理软/硬件资源,并且为程序提供服务一个程序(或者换句话说就是 管理软硬件资源,并且为程序提供服务的软件 注 个人理解下 程序就是软件 软件也就是一个程序) 想要明白什么是操作系统: ​ 需要走一遍操作系统发展的历史 ​ 需要理解 什么是软件 什么是硬件 什么是资源 | 管道符 一个东西的输出 是另一个东西的输入 夹在 software hardware中间的是操作系统 时间线: 1940s 1940s的时候还没有操作系统,第一台计算机1946年诞生,那时候是画流程图 打纸带,用不到操作系统,程序直接在硬件上执行,那个时候跑起来程序就很难

【Python笔记-FastAPI】后台任务+WebSocket监控进度

目录 一、代码示例 二、执行说明 (一) 调用任务执行接口 (二) 监控任务进度 实现功能: 注册后台任务(如:邮件发送、文件处理等异步场景,不影响接口返回)监控后台任务执行进度(进度条功能)支持根据任务ID查询对应任务进度 一、代码示例 #!/usr/bin/env python # -*- coding: UTF-8 -*- import random import asyncio from typing import List, Dict from fastapi import FastAPI, BackgroundTasks, WebSocket app = FastAPI() # 用于存储连接的 WebSocket 实例 connected_websockets: Dict[int, List[WebSocket]] = {} @app.websocket("/ws/{task_id}/") async def websocket_endpoint(websocket: WebSocket, task_id: int): """WebSocket路由,用于接收任务进度""" await websocket.accept() connected_websockets.setdefault(task_id, []).append(websocket) try: while True: await websocket.receive_text() except: connected_websockets[task_id].remove(websocket) @app.post("/task/{task_id}/") async def start_task(background_tasks: BackgroundTasks, task_id: int): "

74HC165D/74HC165PW中文资料规格书产品手册PDF档文件图片引脚图价格

74HC165D/74HC165PW中文资料规格书产品手册PDF档文件图片引脚图价格 产品概述: 74HC165是符合JEDEC标准no. 7A的高速硅栅CMOS器件。该类器件与低功耗肖特基TTL (LSTTL)针脚兼容。 74HC165是8位并行负载或串行输入移位寄存器,末级提供互补串行输出(Q7和Q7)。并行负载(PL)输入为低电平时,来自D0至D7输入的并行数据会异步加载到寄存器中。 PL为高电平时,数据在DS输入处串行输入寄存器并随时钟每次正向跃迁向右移一位(Q0 → Q1 → Q2,以此类推)。通过将Q7输出连接到后一级的DS输入,该特性可实现并行到串行转换器扩展。 时钟输入为门控或结构,允许一个输入用作低电平有效时钟使能(CE)输入。CP和CE输入的针脚分配是任意的,为便于布局可以颠倒。CE输入从低电平至高电平的跃迁应当仅在CP为高电平时发生,以便操作可预测。PL从低电平跃迁到高电平前CP或CE应当为高电平,以防激活PL时移位数据。 产品特点: 异步8位并行负载同步串行输入符合JEDEC标准no. 7AESD保护:HBM JESD22-A114E超过2000 VMM JESD22-A115-A超过200 V额定温度范围为-40 °C至+85 °C和-40 °C至+125 °C 产品规格书: 引脚图:

【Python笔记-设计模式】模板方法模式

一、说明 模板方法模式是一种行为设计模式,就是继承和多态的使用,将通用操作在父类中实现,不同操作的细节在子类中具体实现,父类只声明接口。 (一) 解决问题 减少相似逻辑的重复代码,提高代码复用性提高代码逻辑性,使其易于维护 (二) 使用场景 当有一些操作具有相同的步骤,但具体实现步骤不同时当需要控制子类的扩展时 二、结构 抽象类(Abstract­Class)会声明作为算法步骤的方法,以及依次调用它们的实际模板方法。算法步骤可以被声明为抽象类型,也可以提供一些默认实现。具体类(Concrete­Class)可以重写所有步骤,但不能重写模板方法自身。 三、伪代码 #!/usr/bin/env python # -*- coding: UTF-8 -*- __doc__ = """ 模板方法模式 例:使用模板方法定义饮料制作流程,子类实现或重写具体的制作步骤 """ from abc import ABC, abstractmethod class BeverageTemplate(ABC): """抽象类(Abstract Class)""" def prepare_beverage(self): self.boil_water() self.brew() self.pour_in_cup() if self.customer_wants_condiments(): self.add_condiments() def boil_water(self): print("烧水") @abstractmethod def brew(self): pass def pour_in_cup(self): print("将水倒进杯子里") @abstractmethod def add_condiments(self): pass def customer_wants_condiments(self): return True class Coffee(BeverageTemplate): """具体类(Concrete Class)""" def brew(self): print("将咖啡滴过滤网") def add_condiments(self): print("加糖和牛奶") def customer_wants_condiments(self): return False class Tea(BeverageTemplate): "

【Python笔记-设计模式】访问者模式

一、说明 访问者模式是一种行为设计模式,它能在不改变元素类的情况下定义对元素对象的新操作 (一) 解决问题 将算法与对象结构分离,使得算法可以独立于对象结构而变化。主要解决在不改变对象结构的前提下,增加新的操作或功能 (二) 使用场景 对象结构中的元素需要不同方式的操作,并且这些操作需要相互独立,不影响元素类的稳定性和扩展性。对象结构中的元素类经常变化,但是需要为对象结构中的元素添加新的操作。需要对一个对象结构中的元素进行复杂的、多变的操作,而不希望这些操作污染元素类。 二、结构 访问者(Visitor)接口声明了一系列以对象结构的具体元素为参数的访问者方法。如果编程语言支持重载,这些方法的名称可以是相同的,但是其参数一定是不同的。具体访问者(ConcreteVisitor)会为不同的具体元素类实现相同行为的几个不同版本。元素(Element)接口声明了一个方法来“接收”访问者。该方法必须有一个参数被声明为访问者接口类型。具体元素(ConcreteElement)必须实现接收方法。该方法的目的是根据当前元素类将其调用重定向到相应访问者的方法。请注意,即使元素基类实现了该方法,所有子类都必须对其进行重写并调用访问者对象中的合适方法。客户端(Client)通常会作为集合或其他复杂对象(例如一个组合树)的代表。客户端通常不知晓所有的具体元素类,因为它们会通过抽象接口与集合中的对象进行交互。 三、伪代码 #!/usr/bin/env python # -*- coding: UTF-8 -*- __doc__ = """ 访问者模式 例:病人(元素类)有两种类型:急诊病人和住院病人。医生和护士(访问者)对不同类型的病人进行不同的操作。 通过访问者模式,可以实现对病人的管理和处理,而不需要修改病人类的代码。 """ from abc import ABC, abstractmethod class Patient(ABC): """元素基类(病人基类)""" @abstractmethod def accept(self, visitor): pass class EmergencyPatient(Patient): """元素具体类(急诊病人)""" def accept(self, visitor): visitor.visit_emergency_patient(self) class Inpatient(Patient): """元素具体类(住院病人)""" def accept(self, visitor): visitor.visit_inpatient(self) class Visitor(ABC): """访问者基类""" @abstractmethod def visit_emergency_patient(self, patient): pass @abstractmethod def visit_inpatient(self, patient): pass class Doctor(Visitor): """具体访问者,医生类""" def visit_emergency_patient(self, patient): print(f"

FMD 8位MCU入门

目录 前言一、CMIDE的使用二、系统时钟与睡眠2.1 上电复位 (POR)与系统复位2.2 振荡器和系统时钟2.3 SLEEP睡眠模式 (POWER-DOWN)2.4 低电压检测/比较器 (LVD) 三、I/O端口与中断3.1 I/O初始化配置3.2 I/O中断配置 四、USART接口五、定时器六、ADC七、EEPROM 前言 本文以FT61F14x为例,FT61F14x是辉芒微电子(FMD)的微控制器,是一款8位基于EEPROM的RISC MCU。官方提供CMIDE3.0.9可用于编译调试,本文主要讲解其开发环境及部分外设使用,资源见附件。官网链接:https://www.fremontmicro.com/#/home 一、CMIDE的使用 首先需要新建工程,直接编写并编译可能会出现以下链接警告 点击工程->新建工程,设置工程名以及工程路径,然后选择相应的芯片类型,最后点击OK就可以一键生成工程 对生成工程直接点击编译,弹出Options选项配置,可以按照下图修改,点确定便可编译成功。 注意:提示系统占用不可以删除和修改的地方,不要删除,否则会提示链接报警 二、系统时钟与睡眠 2.1 上电复位 (POR)与系统复位 上电过程,即 VDD 从低于 Power-On-Reset 电压(VPOR)上升至高于 VPOR 的过程。当 CPU 重新上电时,VDD 可能没有完全掉电至 0V。初始化配置由CMIDE 界面设置,不能通过指令修改。初始化配置时序如下: 与 POR 不同,系统复位(system reset) 并不会完全复位。系统复位时,CPU 是否启动初始化配置过程则取决于复位触发类型。若启动初始化配置则空闲等待4ms,然后重新加载初始化配置寄存器值,如果使能 PWRT 将额外延时64ms,随后系统正常启动。在系统复位中: 除初始化配置寄存器外,POR 过程中被重置的寄存器在系统复位时也会被同样重置;程序计数器 PC = 0x00, 指令寄存器 = “NOP”, 堆栈指针 = “TOS” (栈顶); 除仿真调试的 OCD(On-Chip Debugger) 模块外,以下 7 种事件可触发系统复位: 欠压复位 (BOR / LVR) – 总会启动初始化配置;非法指令复位;看门狗复位 (WDT,CPU 处于非 SLEEP 状态);EMC 复位– 总会启动初始化配置;软件复位 (执行指令 “RESET”);堆栈溢出复位 (上溢或下溢);外部 I/O 复位 (/MCLRB) – 总会启动初始化配置 ( ≥ VerB 芯片)。 系统复位的大多数设置均由 IDE 界面配置,而不能通过指令修改。系统复位相关寄存器汇总:

Redis主从复制和哨兵模式详解

小伙伴们好,欢迎关注,一起学习,无限进步 以下内容为学习Redis过程中的笔记 文章目录 Redis主从复制概念环境配置一主二从哨兵模式(重点) Redis主从复制 概念 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave 以读为主。 默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。 主从复制的作用主要包括: 1、数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。 2、故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。 3、负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis 服务器的并发量。 4、高可用(集群)基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。 一般来说,要将Redis运用于工程项目中,只使用一台Redis是万万不能的(宕机),原因如下: 1、从结构上,单个Redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大; 2、从容量上,单个Redis服务器内存容量有限,就算一台Redis服务器内存容量为256G,也不能将所有内存用作Redis存储内存,一般来说,单台Redis最大使用内存不应该超过20G。 电商网站上的商品,一般都是一次上传,无数次浏览的,说专业点也就是"多读少写"。 对于这种场景,我们可以使如下这种架构: 主从复制,读写分离! 80% 的情况下都是在进行读操作!减缓服务器的压力!架构中经常使用! 一主二从! 只要在公司中,主从复制就是必须要使用的,因为在真实的项目中不可能单机使用Redis! 环境配置 127.0.0.1:6379> info replication # 查看当前库的信息 # Replication role:master # 角色 master connected_slaves:0 # 没有从机 master_replid:b63c90e6c501143759cb0e7f450bd1eb0c70882a master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 复制3个配置文件,修改对应的信息: 1、端口号 2、pid名字 3、log文件名字 4、dump.rdb名字 修改完后,启动3个redis服务 通过进程信息查看 ps -ef|grep redis 查看除注释外的配置文件 cat redis.conf | grep -v "#" | grep -v "^$" # 查看配置文件并拷贝 cat redis.

网络编程难点之select、poll与epoll详解

前言 为什么需要I/O多路复用技术? 首先,I/O多路复用技术主要被应用在需要高性能的网络服务器程序中。 高性能网络服务器程序需要做的事情就是供多个客户端同时进行连接并处理客户端传送过来的数据请求: 对于这种情况,很多人自然而然想到使用多线程的方式来处理,这当然是正确的想法,但这里我们并不讨论它,只探讨我们为什么需要I/O多路复用技术以及它到底能解决什么问题,因此多线程情况我们不作分析,下面都只探讨单线程情况下的程序情况。 在单线程情况下,多个客户端发起连接请求时,同一时间下服务器程序只能处理一个客户端的数据请求: 假设服务器程序接受了客户端1号的数据请求,那么单线程情况下该服务器程序就只能和客户端1号进行数据传输,此时若有客户端2号、3号发起连接请求,那么它们只能被阻塞(注意,后续客户端请求只是阻塞起来排起了队,并非数据就不要了,而这种技术是通过DMA控制器实现的,在计算机组成原理中有详细介绍这种技术)。 因此单线程服务器程序为了服务到位所有的客户端程序,我们理所当然的在写服务器端程序的数据处理代码时会有如下的逻辑: //数据处理 while(1){ //Fdx是建立通信连接的文件描述符 //FdA~FdE表示已经建立通信连接的文件描述符数组 for(Fdx in (FdA~FdE)){ if(Fdx 有数据){ 读数据; 处理数据; } } } 即循环遍历各个已经建立通信连接的文件描述符,每遍历到一个就进行一次是否有数据的判断,然后进行数据处理。 这种方式简单粗暴,其实效率上也并不低,但是它确实有改进的地方,其缺陷如下: 1、时间复杂度高,很明显第二重循环是每次都要从头遍历的 2、每次都需要判断文件描述符中是否有数据,这个过程涉及到内核,用户态与内核态的频繁切换是其性能低下的原因之一 那么在单线程程序中,我们就可以使用I/O多路复用技术来提高单线程下在面对上述程序所面对的问题时的执行效率,也就是下面要说的select、poll和epoll技术(当然多线程下同样适用,但只要明白了单线程下的情况,多线程的情况也就是照猫画虎)。 select 首先来看一段代码,注意其中注释里的内容: sockfd = socket(AF_INET, SOCK_STREAM, 0); memset(&addr, 0, sizeof (addr)); addr.sin_family = AF_INET; addr.sin_port = htons(2000); addr.sin_addr.s_addr = INADDR_ANY; bind(sockfd,(struct sockaddr*)&addr ,sizeof(addr)); listen (sockfd, 5); for (i=0;i<5;i++) { memset(&client, 0, sizeof (client)); addrlen = sizeof(client); fds[i] = accept(sockfd,(struct sockaddr*)&client, &addrlen); if(fds[i] > max) max = fds[i]; } // 上面是在准备下面代码要使用的已经建立通信连接的套接字文件描述符数组 //---------------------------------------------------------------- // 下面是处理连接请求的代码 while(1){ FD_ZERO(&rset); for (i = 0; i< 5; i++ ) { FD_SET(fds[i],&rset); } //select的第一个参数表示监视对象文件描述符数量 //第二个表示读操作的文件描述符监听集合 //第三个表示写操作的文件描述符监听集合 //第四个表示异常操作的文件描述符监听集合 //第五个表示超时时间 select(max+1, &rset, NULL, NULL, NULL); for(i=0;i<5;i++) { if (FD_ISSET(fds[i], &rset)){ memset(buffer,0,MAXBUF); read(fds[i], buffer, MAXBUF); puts(buffer); } } } 对于select函数最常用的也就是前面两个参数,现在来看下面两个问题: