2024.1.16
Rocket家族算法是用于时间序列分类的强baseline(性能比较参考【小笔记】时序数据分类算法最新小结),Rocket/MiniRocket/MultiRocket官方都有开源实现,相比较而言,用tsai来实现有三个好处:1是快速跑通模型;2是更简洁优雅;3是掌握一个框架能举一反三。
1.tsai简介 项目:https://github.com/timeseriesAI/tsai
简介:
用于处理时间序列的工具库,包含TCN、Rockert等众多时间序列处理算法
安装:
pip install tsai
2.Rocket:最优雅的实现 这个例子是基于UCR的Beef数据集,运行时,会自动下载数据集到项目的data路径下
from tsai.all import * from sklearn.linear_model import RidgeClassifierCV from dsets_build import get_my_dsets device = 'cuda' if torch.cuda.is_available() else 'cpu' print(device) # 加载UCR数据集 X, y, splits = get_UCR_data('Beef', return_split=False, on_disk=True, verbose=True) tfms = [None, [Categorize()]] batch_tfms = [TSStandardize(by_sample=True)] dsets = TSDatasets(X, y, tfms=tfms, splits=splits) # 标准示例 dls = TSDataLoaders.from_dsets(dsets.train, dsets.valid, bs=768, drop_last=False, shuffle_train=False, device=device, batch_tfms=[TSStandardize(by_sample=True)]) model = create_model(ROCKET, dls=dls) # model = model.
背景 最近需要实现一个PDF文档预览的功能,按理说,如果只是简单的预览,使用<embed>、<object>等就可以实现。
但是,我们的需求要实现搜索!而且,文档还都超大,均300页以上。那<embed>、<object>就难以实现了!所以使用pdf.js库。
摘要 上一篇文章 前端 使用pdf.js加载PDF文件 中讲的是使用canvas绘图的方式,将PDF文件渲染在页面中。但其实PDF.js也提供了通过viewer.html来加载预览PDF文件,而且使用非常方便。
viewer.html很好用,但是我查遍了很多文档,真的都好难看懂是怎么使用的啊!那下面,我们把使用viewer.html的方法直接贴出来。
使用Viewer.html的好处 与我上一篇文章中提到的canvas绘图相比,性能肯定是比较好的;自带了搜索、页面跳转、高亮等等工具栏,不需要手动实现了,这是莫大的便利。 viewer.html使用 第一步:pdf.js文档和文件包下载 pdf.js文档: https://github.com/mozilla/pdf.js?tab=readme-ov-file,这个是pdf.js的readme.md地址,所有的使用指导在这里都可以找到。文件包下载:你可以在上面的这个页面中找到。当然也可以在这个地址中:https://mozilla.github.io/pdf.js/getting_started/#download,选择stable下载。下载页面截图如下:
第二步:下载到pdf.js按照包后,怎么使用呢?放在哪里 有两种方式:
1. 第一种方式:放在你当前项目的路径下,像下面这样: 说明:
pdfjs-4.0.379-dist是下载的pdf文件的夹,里面的viewer.html文件,就是它的入口文件。 2. 第二种方式:将它部署成为一个静态服务(这是本示例中我所使用的方式) 这样做的好处是:
对于当前项目,项目体量减小;部署一个静态服务,多个项目可调用。便利性更好 题外话:将pdfjs部署在亚马逊 创建一个部署静态服务的存储桶,上传下载下来的文件包,如下所示:
这样一来,存放在该静态服务内的pdf文件都可以访问了。假设部署的服务地址是:http://xxx-pdf-viewer.s3-website-xx-xxx-xx.amazonaws.com/pdfjs-4.0.379-dist/web/viewer.html?file=docs/xxx.pdf
在这个路径中,docs文件夹位于web文件夹内,专门用来存放pdf文件。
第三步:使用viewer.html 通过iframe嵌入来使用viewer.html,使用方法很简单:
html:
<iframe :src="url" frameborder="0" width="100%" height="100%"></iframe> JavaScript:计算url
const url = computed(() => { // 部署pdfjs的服务地址 const aws_server = 'http://xxx-pdf-viewer.s3-website-xx-xxx-xx.amazonaws.com/pdfjs-4.0.379-dist/web/viewer.html' // pdf文件名称 const pdf_name = 'x-trail-0601-20220911.pdf' return `${aws_server}?file=${encodeURIComponent(`docs/${pdf_name}`)}` }) 这样,就可以访问到docs文件夹下的所有pdf啦。简单吧!
前言 在网上找了很多文章,都只是单独说了用后端加解密及前端加解密,很少把两个结合起来一起说的文章,本文分享两者结合起来的用法和踩坑。
准备工作 前端项目引入第三方包
npm install --save sm-crypto 后端项目引入工具类
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.16</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15to18</artifactId> <version>1.69</version> </dependency> 生成密钥 使用工具类生成两套公私钥: 服务端公私钥、客户端公私钥
前端拿服务端公钥+客户端私钥
后端拿客户端公钥+服务端私钥
本文仅做演示,如何安全存储密钥请自行研究。
import cn.hutool.core.util.HexUtil; import cn.hutool.crypto.BCUtil; import cn.hutool.crypto.SmUtil; import cn.hutool.crypto.asymmetric.SM2; import org.bouncycastle.crypto.engines.SM2Engine; import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey; //创建sm2 对象 SM2 sm = SmUtil.sm2(); // sm2的加解密时有两种方式即 C1C2C3、 C1C3C2, sm.setMode(SM2Engine.Mode.C1C3C2); // 生成私钥 String privateKey = HexUtil.encodeHexStr(sm.getPrivateKey().getEncoded()); log.info("私钥: {}", privateKey); // 生成公钥 String publicKey = HexUtil.encodeHexStr(sm.getPublicKey().getEncoded()); log.info("公钥: {}", publicKey); // 生成私钥 D,以D值做为js端的解密私钥 String privateKeyD = HexUtil.
说明:
安装与卸载中,用户全部切换成为 root,一旦安装,普通用户就能使用。 一、卸载内置环境 1、卸载不要的环境 [root@VM-8-5-centos ~]$ ps ajx | grep mariadb # 先检查是否有mariadb存在 13134 14844 14843 13134 pts/0 14843 S+ 1005 0:00 grep --color=auto mariadb 19010 19187 19010 19010 ? -1 Sl 27 16:55 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log- error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid -- socket=/var/lib/mysql/mysql.sock [root@VM-8-5-centos ~]$ systemctl stop mariadb.service # 停止mariadb服务 ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units === Authentication is required to manage system services or units. Authenticating as: root Password: ==== AUTHENTICATION COMPLETE === [root@VM-8-5-centos ~]$ ps axj | grep mariadb # 停止完成 13134 14976 14975 13134 pts/0 14975 S+ 1005 0:00 grep --color=auto mariadb mariadb 其实就是 mysql,只不过是 mysql 的另一种拉出来的开源分支,也可以正常使用,如果不想卸载也是可以的。
文章目录 🎉数据库的事务四大特性(ACID)以及隔离性一、事务的四大特性✨1、原子性(Atomicity)🎊2、一致性(Consistency)🎊3、隔离性(Isolation)🎊4、持久性(Durability)🎊 二、详解事务的隔离性✨1、脏读🔮2、不可重复读🔮3、虚读(幻读)🔮4、隔离级别🔮1️⃣ Read uncommitted (读未提交):最低级别,任何情况都无法保证。2️⃣ Read committed (读已提交):可避免脏读的发生。3️⃣ Repeatable read (可重复读):可避免脏读、不可重复读的发生。*MySQL默认隔离级别 4️⃣ Serializable (串行化):可避免脏读、不可重复读、幻读的发生。 三、怎样算是一个事务🪄1、从第一次执行SQL语句开始到执行commit或者rollback结束。中间不管执行多少SQL语句都是同一个事务内。2、事务的开始与结束3、数据库如何实现事务的 四、常用操作🌈-----记住:设置数据库的隔离级别一定要是在开启事务之前!1、查看提交状态命令2、关闭自动提交3、查看隔离级别4、修改隔离级别5、开启事务-----只要执行一条SQL语句就是开启事务,不一定非要使用start transaction;6、结束事务 五、数据库事务怎么做✨1、如何进行事务🏆1️⃣ 建立引擎支持InnoDB,InnoDB支持数据库事务操作2️⃣ 设置autocommit为false3️⃣ 修改隔离级别4️⃣ 开启事务5️⃣ 执行SQL语句6️⃣ commit或者rollback(回滚) 2、对Read Uncommitted级别进行操作1️⃣ 脏读:两次数据 3、对Read Committed级别进行操作2️⃣ 不可重复读-----此时避免了脏读,但是还存在不可重复读的问题,看此标题下第二张图 4、repeatable read隔离级别3️⃣ 解决了脏读、不可重复读 六、锁🔒1、代码层次的乐观锁、删除锁 2、数据库层次的悲观锁: 🎉数据库的事务四大特性(ACID)以及隔离性 一、事务的四大特性✨ 1、原子性(Atomicity)🎊 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。因此事务的操作如果成功就必须完全应用到数据库,如果操作失败不能对数据库有任何影响。
例子:考虑银行转账操作,从一个账户扣除一定金额并存入另一个账户。如果扣除成功但存入失败,需要回滚,保持操作的原子性。
2、一致性(Consistency)🎊 一致性要求事务执行前后数据库的状态保持一致。事务执行过程中可能涉及多个操作,这些操作的结果必须满足数据库的约束和规则。
例子:在购物网站上进行支付操作,支付前后库存、账户余额等信息必须保持一致,否则支付过程可能导致数据不一致。
🪄例如:那转账来说,假设用户A和用户B两者的钱加起来是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱加起来应该还得是5000,这就是事务的一致性。
3、隔离性(Isolation)🎊 隔离性是指当多个用户并发访问数据库时,比如操作同一张表时,数据库为每个用户开启的事务,不能被其他事务的操作干扰,多个并发事务要互相隔离。
即要达到一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后开始,这样每个事务都感觉不到有其他的事务在并发执行。
关于事务的隔离性又提供了多种隔离级别,如读已提交、读未提交、可重复读、串行化,稍后会讲到。
4、持久性(Durability)🎊 持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变是永久的,即便是在数据库系统中遇到故障的情况下也不会丢失提交事务的操作。
例如我们在使用JSDC操作数据库时,在提交事务后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务已经正确提交,即使数据库出现了问题,也必须要将我们的事务完全执行完成,否则会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。
例子:用户在博客平台上发表文章,一旦用户点击发布并事务提交,该文章的修改应该是永久性的,即使系统在发布过程中发生了故障。
二、详解事务的隔离性✨ 以上介绍完事务的四大特性(简称ACID),现在重点来说明一下事务的隔离性,当多个线程都开启事务的操作数据库中的数据,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性,在介绍数据库提供的各种隔离级别之前,我们先看看如果不考虑事务的隔离性,会发生哪些问题:
1、脏读🔮 脏读是指在一个事务处理过程里读取了另一个未提交事务中的数据。
当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。例如:用户A向用户B转账100元,对应SQL命令如下
update account set money=money+100 where name=’B’; (此时A通知B) update account set money=money - 100 where name=’A’; 当只执行第一条SQL时,A通知B查看账户,B发现确实钱已到账(此时即发生了脏读),而之后无论第二条SQL是否执行,只要该事务不提交,则所有操作都将回滚,那么当B以后再次查看账户时就会发现钱其实并没有转。
查看PDF
目 录
1. Sentry介绍 1.1. 编写目的 1.2. 名词定义 2. Sentry监控原理概述 2.1. 常见的性能优化指标及获取方式 2.2. 常见的前端异常及其捕获方式 3. Sentry 整体架构 4. Sentry安装部署 4.1. 前提条件 4.2. 安装 5. Sentry环境配置 5.1. 初始化配置 5.2. 应用服务配置 6. Sentry项目创建配置 6.1. 前端接入和使用 6.2. 域名解析配置示例 7. 常见问题解决 Sentry介绍 Sentry 是一套开源的实时的异常收集、追踪、监控系统。这套解决方案由对应各种语言的 SDK 和一套庞大的数据后台服务组成,通过 Sentry SDK 的配置,还可以上报错误关联的版本信息、发布环境。同时 Sentry SDK 会自动捕捉异常发生前的相关操作,便于后续异常追踪。异常数据上报到数据服务之后,会通过过滤、关键信息提取、归纳展示在数据后台的 Web 界面中。
编写目的 此文档主要为帮助运维人员了解Sentry系统的原理、架构、配置、运行和维护,以确保软件系统的稳定性和可靠性,为自动化运维相关工作实施提供依据。
名词定义 本文相关名词定义如下:
名称
说明
FP
first paint, 表示页面开始首次绘制的时间点,值越小约好。在 FP 时间点之前,用户看到的是导航之前的页面。
FCP
first contentful paint, lighthouse 面板的六大指标之一,表示首次绘制任何文本、图像、非空白 canvas 或者 SVG 的时间点,值越小约好。
一、Oracle ID自增长功能介绍 Oracle数据库默认不支持像 SQLServer、MySQL中的自增长(auto increment)功能,即自动为每一行记录的自增长字段生成下一个值。
二、Oracle ID自增长方法 第一种,通过序列(sequence)以及触发器(trigger)实现主键自增长。 序列是Oracle数据库中用来生成唯一数值的对象,可以类比于MySQL中的自增长。使用序列递增生成的数字当作主键时,防止并发访问时产生重复的主键值。
触发器可以在INSERT、UPDATE和DELETE操作执行之前或之后自动运行PL/SQL代码。对于使用序列生成自增长主键的情况,可以通过在插入语句之前定义一个触发器,在INSERT语句执行时触发自动生成下一个序列值。
这种方式适用于直接使用JDBC连接数据库。这种方式将主键自增长的任务完全交给数据库,我们无需在代码层面上进行任何控制。
第二种,通过序列(sequence)以及Hibernate(JavaWeb框架)配置实现自增长。 这种方式适用于通过Hibernate连接数据库的方式。这种方式在数据库上创建序列,通过配置在POJO类上的注释,让Hibernate去调用数据库的序列实现自增长。
这两种方式都是通过Oracle的序列实现自增长,但第一种通过数据库的触发器在插入的时候自动插入主键。而后者则由Hibernate自动完成获取主键,插入主键这一操作。
三、Navicat创建--序列和触发器 序列和触发器的位置在【其他】选项里面。
3.1、创建表:保存时命名 T_STU 示例字段只需要一个id,一个name即可
3.2、序列-创建序列:保存时命名 Seq001 3.3、触发器-创建触发器:保存时命名 Trigger001 常规选项卡中:触发器类型选【TABLE】,表模式选【ROOT】,表明选择【T_STU】
高级选项卡中选填:引用旧【OLD】,引用新的【NEW】
定义选项卡中:需要将序列Seq001的序号查出来并放入T_STU表的id中。
BEGIN select "Seq001".nextval into :NEW."id" from dual; END; 3.4、最后看一下预览SQL 其中"Untitled"是未保存的默认触发器名。
3.5、最后一步插入数据观察递增情况 四、SQL语句创建--序列和触发器 -- 创建表 CREATE TABLE "T_STU" ( "id" NUMBER NOT NULL PRIMARY KEY, "name" VARCHAR2(255) ); -- 创建序列 CREATE SEQUENCE "Seq01" MINVALUE 1 INCREMENT BY 1 NoMaxValue START WITH 1; -- 创建触发器 create TRIGGER "
高级归档文件密码恢复软件 闯入受密码保护的 ZIP、7Zip 和 RAR 存档!彻底的低级优化有助于更快地完成工作。保证在一小时内恢复某些类型的归档文件。
恢复加密保护的 ZIP、7Zip 和 RAR 存档的密码已知明文攻击,并保证一小时恢复某些类型的归档文件全面优化,提供一流性能支持最新 ZIP、7Zip 和 RAR 格式的 AES 加密 支持:ZIP/PKZip/WinZip、7Zip、RAR/WinRAR、ARJ/WinARJ、ACE/WinACE (1.x)、AES 加密、自解压存档、字典和暴力攻击。
解锁受密码保护的档案 Advanced Archive Password Recovery 可解锁使用所有版本的流行存档器创建的加密 ZIP、7Zip 和 RAR 存档或恢复其保护密码。自动或在协助下恢复使用 PKZip 和 WinZip、7Zip、RAR 和 WinRAR 创建的普通和自解压存档的密码。通过利用某些类型保护的实施缺陷,可以在一小时内保证解锁使用 WinZip 8.0 及更早版本创建的存档。
Advanced Archive Password Recovery 在各种类型的存档之间具有终极兼容性,了解某些类型保护的弱点,并在解锁所有类型的存档方面提供一流的性能。
通用兼容性 Advanced Archive Password Recovery 支持广泛的压缩和加密算法、所有版本的流行归档工具和多种存档格式,几乎是真正通用的恢复工具,无人能及。
兼容性列表 Advanced Archive Password Recovery 可解锁使用各种方法压缩的存档文件,从传统的Shrinking、Reducing、Imploding、Tokenizing 到现代 Iflating和最近的 WavPack、BZip2 和 PPMd。
ARCHPR 标准版
ARCHPR专业版
支持ZIP和WinZip存档(经典加密)
✓
✓
支持 RAR 和 7Zip 存档
1需求背景 应用侧的同学需要对数据进行导出和导入,于是跑来找 DBA 咨询问题:MySQL 如何导入大批量的数据?
应用侧目前的方式: mysqldump 工具
select outfile 语句
图形化管理工具(MySQL Workbench、Navicat 、DBeaver)
DBA 听了觉得挺好的呀!
DBA 想了,我的数据库我做主。通知应用侧,目前先使用之前熟悉的方式进行,测试之后给建议。
Tips:为了防止导入时出现大事务,造成主从延迟。
2方案准备 待测方案:mysqldump、mydumper、select outfile 语句、Util.dumpTables 、Util.exportTable。
环境配置信息 配置项说明MySQL 版本5.7.39磁盘随机读写100 MiB/sec测试表名test.t_order_info行数1000W字段数6 建表语句 CREATE TABLE `t_order_info` ( `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键ID', `order_no` varchar(64) NOT NULL DEFAULT '0000' COMMENT '订单编号', `order_status` varchar(2) NOT NULL DEFAULT '01' COMMENT '订单状态: 00-异常、01-待处理、02-进行中、03-已完成', `flag` tinyint(4) NOT NULL DEFAULT '1' COMMENT '删除标识: 1-正常、0-逻辑删除', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `modify_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`ID`), UNIQUE KEY `IDX_ORDER_NO` (`order_no`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='订单表' 导出文件 包含数据结构和数据的 备份文件 (mysqldump、mydumper、Util.
JetBrains: Essential tools for software developers and teams ##pycharm官网下载地址
此处选择相对于的版本
已经在下载了
Download Python | Python.org ##python解释器官网下载地址
默认的是最新的版本
想选择旧版本可以往下找到
此处选择版本
全部勾选后点击安装
下载Pycharm后要求重启,重启后选择相对于的激活方式(一般是激活码激活,也可以求助于某宝)
下面是python的安装教程
最后选择解释器路径即可
然后创建一个项目
写一个name
试一下没有问题
如果发现没有自己想要的第三方库,可以进入控制台pip install 库名 进行安装
Python 3.12.1网盘资源
链接:https://pan.baidu.com/s/1rYnXUjNDvOrZRLli3qYC7g 提取码:f62t --来自百度网盘超级会员V3的分享
Pycharm网盘资源
链接:https://pan.baidu.com/s/10K3JWaccYaHAC4uLMnkClA 提取码:6c5k --来自百度网盘超级会员V3的分享
## 如有错误之处还请不吝赐教,感谢观看
一、前言 回顾AI绘画的历史,GAN(Generative Adversarial Nets)是比较出众的一个。GAN的出现让AI绘画成为可能,当时GAN给AI绘画提供了一种新的思路,现在回顾当时的绘画可以算是相当粗糙。
gan-results.jpg
初代GAN出现后,出现了大量GAN的变种,比如StyleGAN、CycleGAN、DCGAN等。而StyleGAN已经可以生成非常逼真的图像了,下面是StyleGAN的一些结果。
stylegan-results.jpg
GAN提出已经过去十年,AI绘画也得到了颠覆性的进步。Diffusion Model(DM)逐渐取代了GAN在AI绘画领域的地位。在此基础上,AI绘画领域还融合了其它深度学习方法,比如Controlnet、LoRA等。如今,AI绘画达到了以假乱真的地步,同时给与用户极高的可控性,对资源的要求也逐步降低,每个人都可以在自己的电脑上运行AI绘画模型。
今天我们的主角是Stable Diffusion,它是如今最流行的开源DM。基于Stable Diffusion,开源社区涌现了繁多的开源项目和模型。比如Stable Diffusion Webui、Comfyui、Fooocus等集成应用;分享模型的Civitai网站;HuggingFace提供的Diffusers模块。
今天我们将介绍Stable Diffusion的整体架构,分解每个部件,最后借助Diffusers模块实现AI绘画。
二、网络结构 Stable Diffusion由多个子网络组成,包括文本编码器、UNet和VAE三大部分。组合在一起可以看做一个接收文本输入,输出图像的模型。下面我们将从整体出发,而后拆分每个部件。
2.1 整体架构 Stable Diffusion的架构如图所示:
stable-diffusion-structure.jpg
整体上看是一个接收文本输入,并输出图像的模型。Stable Diffusion处理的过程如下:
输入文本,使用CLIP模型对文本进行编码,获得文本Embedding
从潜空间生成噪声Latent
将文本Embedding和Latent输入UNet模型,预测Latent中的噪声
将去除Latent中的噪声,去除噪声后的结果重新赋值为Latent
重复步骤3、4
将Latent传入VAE解码器,得到最终图片
模型的核心是一个UNet噪声预测网络。不同于GAN直接从噪声中生成图片,Stable Diffusion会进行多次预测噪声并降噪,最终生成图片。
2.2 文本编码器 Stable Diffusion是一种带条件的图像生成模型,可以根据输入的文本生成与文本相符的图片。我们可以直接使用训练良好的Bert模型作为文本编码器,但是这样生成的文本向量和图像的关系不太密切,为了图像生成能更遵循文本条件,Stable Diffusion使用了CLIP模型。
CLIP模型的提出是为了更好的解决视觉任务,CLIP可以在zero-shot的情况下在ImageNet上与ResNet50有同等的表现。
下面是OpenAI提供的CLIP工作图:
clip-training-steps.jpg
从结构上来看,CLIP模型由两个Encoder构成,分别是用来编码文本的TextEncoder和用来编码图片的ImageEncoder。CLIP的训练数据是一堆“图片-文本”对形式,其工作模式如下:
训练TextEncoder和ImageEncoder,最大化ItTt(图片向量与响应的文本向量相似度)
利用分类标签生成句子,“a photo of a {object}”
输入图片获得It,找到最相似的句子向量Tk,改句子对应的标签就是图片标签 在完成训练后就可以得到比较出色的文本编码器,而后两步则是为图像分类做准备。
2.3 VAE模型 VAE模型在Diffusion Model里面并非必要的,VAE在Stable Diffusion中作为一种有效利用资源的方法,减少了图片生成的资源需求。下图是VAE的结构,其中c是一个可选的条件。
vae-structure.png
VAE由Encoder和Decoder两个部分组成,首先需要输入x,经过Encoder编码后,得到(μ,σ),分别表示均值和方差,这两个变量可以确定一个分布,然后在当前分布中采样出样本z。z通常是一个比x维度更低的向量。
采样出来的z输入Decoder,我们希望Decoder的输出与输入的x越接近越好。这样我们就达到了图像压缩的效果。
在训练Stable Diffusion时,我们会把图片输入VAE的Encoder,然后再拿来训练UNet,这样我们就可以在更低的维度空间训练图像生成模型,这样就可以减少资源的消耗。
2.4 UNet模型 UNet模型结构与VAE非常相似,也是Encoder-Decoder架构。在Stable Diffusion中,UNet作为一个噪声预测网络,在绘画过程中需要多次推理。我们先不考虑VAE的介入,来看看UNet在Stable Diffusion中的作用。
实际上UNet在Stable Diffusion中充当噪声预测的功能。UNet接收一张带有噪声的图片,输出图片中的噪声,根据带噪声的图片和噪声我们可以得到加噪前的图片。这个降噪的过程通常会重复数十遍。
知道UNet的作用后,我们就需要创建数据集了。我们只需要图片即可,拿到图片对该图片进行n次加噪,直到原图变成完全噪声。而加噪前的图片可以作为输入,加噪后的数据可以作为输出。如图所示:
作者推荐 视频算法专题
本文涉及知识点 动态规划汇总
状态压缩 广度优先搜索
LeetCode1494. 并行课程 II 给你一个整数 n 表示某所大学里课程的数目,编号为 1 到 n ,数组 relations 中, relations[i] = [xi, yi] 表示一个先修课的关系,也就是课程 xi 必须在课程 yi 之前上。同时你还有一个整数 k 。
在一个学期中,你 最多 可以同时上 k 门课,前提是这些课的先修课在之前的学期里已经上过了。
请你返回上完所有课最少需要多少个学期。题目保证一定存在一种上完所有课的方式。
示例 1:
输入:n = 4, relations = [[2,1],[3,1],[1,4]], k = 2
输出:3
解释:上图展示了题目输入的图。在第一个学期中,我们可以上课程 2 和课程 3 。然后第二个学期上课程 1 ,第三个学期上课程 4 。
示例 2:
输入:n = 5, relations = [[2,1],[3,1],[4,1],[1,5]], k = 2
输出:4
解释:上图展示了题目输入的图。一个最优方案是:第一学期上课程 2 和 3,第二学期上课程 4 ,第三学期上课程 1 ,第四学期上课程 5 。
问题描述:
Android Studio新建项目出现Gradle Sync issues报错:
Could not install Gradle distribution from 'https://services.gradle.org/distributions/gradle-7.3.3-bin.zip'.
主要原因:请求下载的文件gradle-7.3.3-bin.zip服务器在国外,访问受限,下载速度太慢导致安装失败!
解决方案:
①直接复制文件URL链接到浏览器,请求下载(下载速度比较慢)
文件链接:https://services.gradle.org/distributions/gradle-7.3.3-bin.zip
②解压缩一下,我们可以把它复制到Gradle默认安装位置
默认安装位置:C:\Users\ASUS\.gradle\wrapper\dists (ASUS是我的用户名)
③在Android Studio中配置Gragle位置
3.1 获取下载的Gradle文件路径:
C:\Users\ASUS\.gradle\wrapper\dists\gradle-7.3.3-bin\gradle-7.3.3
3.2 Android Studio依次找到 "文件"--"设置"--"构建、执行、部署"--"构建工具"--"Gradle"
File——>Settings——>Gradle——> Build,Execution,Deployment —>Gradle
3.3 使用来自此位置的Gradle:指定位置 (下载的Gradle文件路径)
④将项目与Gradle文件同步 (一般时间比较长>1小时)
"文件"--"Sync Project with Gradle Files"
选择AI工具:选择一个适合的AI工具,这取决于你的需求和偏好。一些流行的AI工具包括百度大脑(Baidu Brain)、微软的Azure认知服务、IBM的Watson等。数据收集:收集需要加入知识库的数据。这可以包括文本、图像、音频和视频等多种形式的数据。确保你有权使用这些数据,并且它们的质量和准确性能够满足你的需求。数据预处理:对收集到的数据进行清洗、去重和标注等操作,以便更好地训练模型。数据预处理是建立知识库的重要步骤,它能够提高模型的准确性和效率。模型训练:使用AI工具中的算法和模型进行训练,以从数据中提取有用的信息。这可以通过自动标注、分类、聚类等方法实现。知识提取:从训练后的模型中提取知识,并将其整理成结构化或非结构化的形式。结构化的知识可以通过图表、表格等形式表示,而非结构化的知识则可以以文本、图像等形式存储。知识库构建:将提取的知识以一定的方式组织起来,形成一个知识库。你可以根据自己的需求选择不同的知识表示方法,如知识图谱、本体等。确保知识库具有良好的可扩展性和可维护性,以便随着时间和需求的变化进行更新和调整。知识库应用:使用知识库进行各种应用,如智能问答、推荐系统、决策支持等。你可以根据自己的需求选择合适的应用场景,并开发相应的应用程序或接口。持续优化:在使用过程中不断优化和更新知识库,以提高其准确性和效率。这可以通过重新训练模型、更新数据、添加新知识和删除旧知识等方法实现。 总之,使用AI工具建立自己的知识库需要一定的技术基础和经验,但通过掌握基本的步骤和方法,你可以逐步构建出一个高质量的知识库,并发挥其在各个领域的应用价值。
基于RD、CS和ωk算法的合成孔径雷达成像算法实现 前言SAR基本概念雷达获取数据的几何关系低斜视角下的回波信号模型 RADARSAT-1主要参数数据预处理数据读取与再封装数据补零 成像算法坐标轴的产生RD算法距离压缩距离徙动矫正方位压缩 CS算法第一次相位相乘 变标后的信号第二次相位相乘第三次相位相乘 ωk算法参考函数相乘Stolt插值 成像后处理图像平移与翻转图像增强亮度钳制直方图均衡 仿真实现代码下载成像结果RD算法成像结果CS算法成像结果ωk成像结果 后语附录代码RD算法成像CS算法成像ωk算法成像 前言 合成孔径雷达(Synthetic Aperture Rader, SAR)感觉就是一个小众的领域,尽管笔者的主要研究方向不是这个,但是选修了这门课,在查找资料的过程中发现论文很多,但开源代码非常少,为了方便后来者的学习,将课本中著名的三种成像算法——距离多普勒算法(Range-Doppler, RD)、CS算法(Chirp Scaling, CS)和ωk算法通过MATLAB进行了复现,对课本附录雷达回波数据进行了成像与对比。当然,由于笔者学识有限,不知道代码的具体细节是否有问题,文章与代码有任何问题都可以在评论区或私信交流。
本文代码已开源,所使用的雷达回波数据和算法概念来源于课本《合成孔径雷达成像算法与实现》1及其附录光盘。
SAR基本概念 雷达获取数据的几何关系 雷达位置波束在地面覆盖区的简单几何模型及相关概念如下图所示。
低斜视角下的回波信号模型 基于上述简单几何模型,由于书本附录的雷达回波数据由RADARSAT产生,这是一款小斜视角和中等孔径长度的传感器,因此基带接收信号可近似为:
s 0 ( τ , η ) ≈ A 0 ω r ( τ − 2 R ( η ) c ) ω a ( η − η c ) e x p { − j 4 π R 0 λ } ∗ e x p { − j π K a η 2 } e x p { j π K r [ τ − 2 R ( η ) c ] 2 } s_0(\tau, \eta)\approx A_0 \,\omega_r(\tau-\frac{2R(\eta)}{c}) \, \omega_a(\eta-\eta_c) \, \mathrm {exp}\{-j\frac{4\pi R_0}{\lambda}\}\\ \, \\ \ast \, \mathrm{exp}\{-j\pi K_a \eta^2\}\, \mathrm{exp}\{j\pi K_r[\tau - \frac{2R(\eta)}{c}]^2\} s0(τ,η)≈A0ωr(τ−c2R(η))ωa(η−ηc)exp{−jλ4πR0}∗exp{−jπKaη2}exp{jπKr[τ−c2R(η)]2}
什么是LCA? LCA(Least Common Ancestors),即最近公共祖先,是指在有根树中,找出某两个结点x和y最近的公共祖先。
三种算法 用三种算法可以求解LCA问题,分别为朴素算法、倍增算法和Tarjan算法。
朴素算法 倍增算法和Tarjan算法都在建立在朴素算法的思想下,因此,了解朴素算法的思想有助于更好的理解进阶算法。
朴素算法前置知识:邻接表,dfs。
假设我们要寻找某两个节点x和y的LCA,那么我们肯定是让深度更深的那个结点跳到另一个结点深度处,然后再让这两个结点一起向上跳,直到首次相遇。
光说可以有些抽象,举个例子,就以下面这张图中的树为例。
图中结点4先跳到结点3的位置,然后两个结点一起向上跳,随后跳到结点1处相遇,所以结点2和结点4的LCA为结点1。
也就是说,我们只要记录下每个结点的深度信息和祖先信息,就能通过逐个向上跳跃直至相遇来确定两个结点的LCA。
这便是LCA朴素算法的核心支撑所在,但是由于朴素算法每次跳跃一层,因此他的时间复杂度很差,尤其是当树退化为链的时候,那么如果我们让他跳跃多层,是不是可以更好更快的解决问题呢?答案是一定的,而接下来的倍增算法就是这个思想。
倍增算法 倍增算法前置知识:邻接表,DP&倍增,dfs。
倍增算法我们将会定义一个数组fa[i][j]表示结点i向上跳2j层所到的结点,从而实现了倍增跳跃,而且,通过有限的组合跳跃,我们到达任意结点处。例如向上5层,我们可以先向上跳跃22层之后,再向上跳跃2^0次方。同时,我们可以证明又fa[x][i] = fa[fa[x][i-1]][i-1],实质就是2^(i-1) + 2^(i-1) = 2^i.
同时,倍增LCA算法中还用到了贪心的思想,假如现在有两个结点x,y,假设x深度更大,则我们要尽可能地让x在不超过y的深度的前提下,尽可能地接近y,也就是跨的步子尽可能大!这样操作过后,结点x与结点y的深度就一定相同了。
相同之后,如果已经重合,直接return,如果没有,那么现在两个结点处于一个平行的位置。接下来我们让两个结点同时向上跳,也是能跳多大就跳多大,但是肯定是有限制的,就像上一步一样,这个限制就是只有在跳完之后他们结点不重合时才跳。这个地方有点绕,不要急,我们结合代码看一下。
点击查看代码 int lca(int u, int v) { if(depth[u] < depth[v]) swap(u, v); for(int i = MAXLOG - 1; i >= 0; i--) { if(depth[u] - (1 << i) >= depth[v]) { u = parent[u][i]; } } if(u == v) return u; // 注意看这里,这一步是平行之后的操作 for(int i = MAXLOG - 1; i >= 0; i--) { if(parent[u][i] !
基础概念 Web API是指用于Web服务器或Web浏览器的应用程序编程接口(API)。作为一个Web开发概念,它可以与Web应用程序的客户端(包括正在使用的任何Web框架)相关。服务器端Web API由一个或多个公开暴露的端点组成,该端点指向已定义的请求响应消息系统,通常通过基于HTTP的Web服务器以JSON或XML表示。
Web API可以粗略的分为客户端Web API和服务器端Web API两种,其中客户端API是用于扩展Web浏览器或其他HTTP客户端中的功能,而服务器端API是基于HTTP的Web服务器公开的指向已定义的请求-响应消息系统的接口,本文主要介绍的就是基于服务器端Web API漏洞挖掘手法。
什么是API漏洞 API漏洞是指API安全性中可能被恶意行为者利用的潜在弱点或漏洞。这些漏洞可能存在于API的任何部分,从设计阶段到部署阶段。它们可能会导致严重的后果,例如数据泄露、未授权访问,甚至系统崩溃。
根据OWASP统计,2023年十大API安全漏洞如下:
漏洞名称对象级授权被破坏(Broken Object Level Authorization)破损的用户身份验证(Broken User Authentication)破碎对象属性级授权(Broken Object Property Level Authorization)资源消耗不受限制(Unrestricted Resource Consumption)功能级别授权被破坏(Broken Function Level Authorization)不受限制地访问敏感业务流程(Unrestricted Access to Sensitive Business Flows)服务器端请求伪造(Server Side Request Forgery)安全配置错误(Security Misconfiguration)库存管理不当(Improper Inventory Management)API的不安全组合(Unsafe Composition of APIs) API漏洞介绍 对象级授权被破坏 对象级授权被破坏(BOLA),当API根据用户角色提供对数据的访问权限,但无法验证用户是否有权访问这些数据时,就会产生漏洞。通过此漏洞,攻击者可以绕过授权访问敏感数据甚至执行未经授权的操作。
示例
BOLA漏洞如何发现呢,一般情况下我们可以从网站的某些查询功能入手。例如在某个网站的个人中心中,用户想查看自己的个人资料,那么就会向服务器API发送一个查询资料的请求。
POST example.com/api/v2/customer/profile HTTP/1.1 Host: example.com User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0 Accept: */* Accept-Language: en-US,en;q=0.5 Content-Type: application/json Cookie:BearereyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJlZEBleGFtcGxlLmNvbSIsImlhdCI6MTY1ODQ2MDMzMCwiZXhwIjoxNjU4NTQ2NzMwfQ.m0ha0L89xuLpLlLlybcaD2SfKp23BZfe_Hjjs- PprCN2sDvxpmWAcemN5yOq-nhx78Iu8EzLIJbqqc1d-q10UA Connection: keep-alive {"
1. 添加 maven 仓库 1. 1. settings配置 1. 1.1. settings.gradle repositories { maven {url 'https://maven.aliyun.com/repository/public/'} mavenCentral() } 1. 1.2. settings.gradle.kts repositories { maven { setUrl("https://maven.aliyun.com/repository/public/") } mavenCentral() } 1. 2. gradle配置 1. 2.1. build.gradle implementation 'com.github.bumptech.glide:glide:4.12.0' 1. 2.2. build.gradle.kts implementation(libs.glide) 版本号在gradle文件夹下 libs.versions.toml文件中添加
1. 2.2.1. build.gradle.kts libs.versions.toml文件用来抽离依赖来加载,文件由 4 个主要部分组成:
(1)[versions]部分用于声明可以被依赖项引用的版本
(2)[libraries]部分用于声明坐标的别名
(3)[bundles]部分用于声明依赖包
(4)[plugins]部分用于声明插件
注意:不要使用驼峰命名方式,单词使用 - 分割:
[versions] groovy = "3.0.5" checkstyle = "8.37" [libraries] groovy-core = { module = "org.codehaus.groovy:groovy", version.
大家好,我是木川
没有 AI 的时候,我们阅读完代码,然后根据自己的理解,手动通过 XMind 绘制思维导图,或者通过 draw.io 绘制流程图,至少需要 60 分钟 有了 AI,其实可以直接将代码转换为比较准确的代码可视化图形,省掉自己阅读代码的时间,AI 直接解读代码,可能只需要 5分钟
这里面存在三个问题:
1、怎么通过 AI 解读代码
2、怎么通过流程图呈现解读后的代码?
3、怎么生成流程图
我将依次介绍这三部分
一、AI 解读代码 AI 解读代码实际上是利用了 AI 的总结能力,也就是生成代码注释,目前有很多代码辅助相关的大模型都实现了这个功能
比如 Baidu Comate 的底层模型:文心一言 4.0、清华开发的 CodeGeex 大模型、GitHub Copilot 的底层模型:CodeX
可能有的人会问,为什么不通过 GPT 直接生成注释呢?
GPT 是一个通用大模型,可以做很多事情,写文章、写代码、写小说等;如果只写代码,不如专有代码大模型,更加专一,只专注在代码领域,解读代码更准确,生成的代码注释更精准
这里介绍一个使用 Comate 解读代码的例子:
比如下面这段代码有 200 行,核心就是订单打包,比如 10 个订单聚类后生成 8 个包裹
聚类的细节太多,想着用 AI 提取并绘制流程图,更加直观,首先使用 AI 编程工具 Baidu Comate,解读这段代码
安装插件 Comate 后,在函数代码上方,找到代码解释菜单
点击代码注释,将会打开百度 AI 助手聊天框,显示代码解释
二、代码可视化方式 不论是给领导汇报,还是写周报,如果你能将的文字或者代码可视化,给人的感觉就立马不一样了,所以学会可视化非常重要
代码可视化一般需要创建 UML 图,这样的工具有很多,从使用文本描述来生成 UML 图的角度,我选择的是 PlantUML
目录
前言
设计思路
一、课题背景与意义
二、算法理论原理
2.1 深度学习
2.2 YOLOv5算法
三、检测的实现
3.1 数据集
3.2 实验环境搭建
3.3 实验及结果分析
最后
前言 📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导:
最新最全计算机专业毕设选题精选推荐汇总
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯基于实时车流的智能交通灯系统
设计思路 一、课题背景与意义 智能交通系统在现代城市中起着至关重要的作用,能够提高交通效率、减少交通拥堵和事故发生率。而交通灯作为交通系统的核心组成部分,对交通流量的控制和调度起着重要作用。传统的定时交通灯无法适应实时交通流量的变化,导致车辆等待时间长、交通效率低下。基于实时车流的智能交通灯系统通过结合深度学习和计算机视觉技术,能够实时感知交通流量并根据实际情况进行智能调度,提高交通效率,减少交通拥堵和碰撞事故的发生。
二、算法理论原理 2.1 深度学习 深度强化学习实质是将深度学习与强化学习两者相结合。深度学习基于神经网络,因此具有较好的感知能力,但是在决策能力方面有欠缺,而强化学习具有较好的决策能力。DQN是一种深度强化学习算法,结合了深度学习和Q-learning的思想,用于解决连续状态和动作空间较大的强化学习问题。DQN的核心思想是使用神经网络来近似Q值函数,以替代传统Q-learning中的Q表格。
DQN算法的基本思路和实现步骤:
定义深度神经网络模型:首先,定义一个深度神经网络(如卷积神经网络)作为Q值函数的近似器。该网络将状态作为输入,输出每个动作的Q值估计。初始化经验回放缓冲区:创建一个经验回放缓冲区,用于存储智能体与环境的交互经验。每个经验包括当前状态、执行的动作、奖励、下一个状态以及一个表示是否为终止状态的标志。采样并执行动作:根据当前状态和Q值函数选择一个动作。可以使用epsilon-greedy策略,以一定的概率选择最优动作,以一定的概率探索其他动作。执行选择的动作,并观察环境返回的下一个状态和奖励。存储经验:将当前状态、执行的动作、奖励、下一个状态和终止状态标志存储到经验回放缓冲区中。从经验回放缓冲区中随机采样:从经验回放缓冲区中随机采样一批经验,用于训练神经网络。计算目标Q值:根据DQN的目标函数,使用当前的Q值网络和目标Q值网络计算目标Q值。更新Q值网络:使用梯度下降法更新Q值网络的参数,使得预测的Q值与目标Q值尽可能接近。更新目标Q值网络:定期更新目标Q值网络,将当前Q值网络的参数复制到目标Q值网络中。重复步骤3至步骤8:不断地与环境交互、存储经验、训练神经网络,直到达到预定的停止条件(如达到最大训练步数或达到收敛条件)。 2.2 YOLOv5算法 车辆控制算法利用车辆内部传感器采集车辆的位置和行驶速度等信息,并通过人机交互界面提供给驾驶员。同时,车辆也将信息整理上传给雾层,并接收来自雾层的信息。通过与雾层的信息交互,车辆可以获得全面的交通信息,帮助驾驶员安全高效地驾驶车辆。基于收集到的数据,车辆可以进行简单的决策,例如根据道路状况判断是否能够在有效绿灯时间内通过路口。驾驶员接收到这些信息后,可以有意识地调整车辆的速度,避免抢红灯等危险行为,降低交通事故的可能性。如果系统判断车辆能够在有效绿灯时间内通过路口,驾驶员可以加速或保持现有速度,确保车辆顺利通过路口,提高道路的车辆吞吐量。
利用DQN算法可以对路口各相位的绿灯时长进行进一步优化。由于其他相位的道路可能仍有车辆排队等待,因此在计算绿灯时长时需要考虑一定范围内仍在移动的车辆。数据收集完成后,系统可以获取相应的交通状态。本研究将路口各道路靠近停止线的255m道路的车辆分布作为状态。每隔7.5m划分一小格,根据实时车流量信息,对应的道路车辆位置矩阵进行标记,有车则记为1,无车则记为0。如果车头和车尾分别在相邻的两个格中,认为车头所在的格记为1,车尾所在格记为0。从停止线开始向后,如果有一格为0,则从该0格开始向后找到第一个为1的格,即为该车道中第一辆没有排队的车辆。
在DQN算法中,将状态作为输入,根据策略决定选择Q值最大的动作执行,或者随机选择行为执行。每次只能选择一个动作,可以增加绿灯时间、减少绿灯时间或保持绿灯时间。在奖励方面,考虑到某个相位拥有通行权的同时意味着其他相位对应的车道处于红灯阶段,需要车辆停车等待。在获得进一步精确的绿灯时间分配后,需要判断绿灯时长是否合理并进行微调。长时间保持某个相位的绿灯可能导致其他相位的车辆等待时间过长,从而导致车辆平均等待时间增加,造成道路拥堵。
相关代码示例:
class DQNAgent: def __init__(self, state_size, action_size): self.state_size = state_size self.action_size = action_size self.memory = deque(maxlen=2000) self.gamma = 0.95 # discount rate self.epsilon = 1.0 # exploration rate self.epsilon_decay = 0.995 self.