当前位置: 首页 > news >正文

Stable Diffusion Fooocus批量绘图脚本

当当当挡~,流动传热数值计算之余发布点AIGC相关文章,希望大家能喜欢~

1 Stable Diffusion各种UI分析对比

提示:此部分主要是对SD各种界面的简要介绍和对比,只关注Fooocus批量绘图的读者可直接跳到第二部分。

Stable Diffusion WebUIForgeUIComfyUIFooocusUI 都是基于 Stable Diffusion(稳定扩散技术)的开源图像生成UI。它们各有特色,满足了不同用户在生成 AI 图像时的需求。

  • WebUI:类 Web 应用的用户界面,适合普通用户,是目前最受欢迎和使用最广泛的SD UI。生态非常丰富,有大量插件和脚本支持,但插件与WebUI版本间的冲突有时令人头秃。WebUI入门相对相对简单,但生成高质量图片的操作流程较为复杂,需要用户在插件、Lora、controlnet方面花费较多心思。
  • ComfyUI:类Blender 的节点编辑器,用户可通过节点自定义工作流,适合工作流程超复杂的专业用户。与WebUI相比,ComfyUI对计算资源的要求低得多,是低显存用户的福音。ComfyUI支持节点工作流导入,这极大避免了繁复的工作流搭建过程。用户熟悉ComfyUI的基本功能后,直接去社区寻求搭建好的典型工作流后直接开抄,实现高质量出图。另外,可图、混元、Flux等新秀大模型发布后,ComfyUI通常是率先响应。因此,对于喜欢尝鲜的用户,ComfyUI将是首选。
  • ForgeUI:保留了WebUI的类Web 应用操作逻辑的同时,还具有不输于ComfyUI计算效率的特点。用户若会使用WebUI,Forge自然也就会了。Forge插件生态较差,WebUI的很多插件都不支持,但好在支持adetailer,提示词自动补全,openpose editor,wd14 tagger,StyleSelectorXL等常用插件,基本不影响使用。另外,Flux大模型,图片转视频的Deforum等插件对Forge来说也是手拿把掐,这些对WebUI用户还比较遥远。
  • FooocusUI:只接受预训练模型,专注于高质量图像的快速生成和性能优化,是一个简单高效的UI,适合追求快速高质量生图的用户(在快速出美图方面,估计也就Midjourney能碰一碰)。Fooocus具备WebUI的部分外表,但DNA里却是ComfyUI的节点工作流基因,而行为上又与Midjourney比较亲近。Fooocus的不足之处在于对插件的支持缺少到了将近匮乏的地步,对图片细节的把控能力也不够。但无论怎么讲,Fooocus仍不失为一款非常优秀的UI。最后推荐一个超棒的Fooocus分支作品——SimpleSDXL2(点此下载,需上网技巧),该分支与ComfyUI一样支持了SD3, Flux, 可图,混元等新晋大模型,若用户选择国产大模型,那么该UI还支持全中文提示词,特别适合中国人体质。

2 FooocusUI生厂力工具——批量绘图脚本

Fooocus擅长快速生成高质量图片,故其在AIGC领域有重要用武之地。依据用户输入的系列关键词批量生成符合要求的图片是SD生产效率的重要指标。截止目前(2024.9.17),WebUI/Forge以及ComfyUI已通过脚本或插件等方式具备了相关能力,但Fooocus的作者似乎并不打算在这方面所有突破。在Fooocus高质高效出图且官方批量绘图模块遥遥无期的背景下,我开始尝试在国内外论坛寻找相关问题的解决方案,没想到还真找到了两种(不然我都打算自己造轮子了,难顶)。

2.1 Chrome/Edge油猴脚本

声明:该脚本非原创,本人仅针对博主AidecLi发布的代码进行了一些可能有益的修改(传送门:Fooocus批次執行任務功能(使用tampermonkey實現),此链接在PC端似乎有渲染问题,在手机端能正常查看,但需上网技巧),该博主也在某视频网站发布了脚本教程,大家可观看学习(传送门:Fooocus批次執行任務功能,需上网技巧)。

该方案已被证实可行,并且至少可支持Fooocus2.4.3-2.5.5版本(最新的Fooocus2.5.5版本可在https://github.com/lllyasviel/Fooocus.git下载安装),如果FooocusUI不发生重大改变,那么该脚本应该也会自动适配后续版本(SimpleSDXL2作者对FooocusUI进行了魔改,本脚本暂不支持)。

2.1.1 Javascript脚本

请务必注意:代码开头两个“// ==UserScript==”间的代码(预设代码)不完全是注释,绝不能删除,有些部分会在代码中生效!!!

预设中的最重要代码为"// @match        http://192.0.0.1:7865/*",该预设限制脚本只能在 IP 为192.0.0.1(即本地地址),端口为7865以及其后所有路径的网页上运行。大家要使用的话必须将这段代码修改为与用户IP和端口匹配的地址(就是打开Fooocus后浏览器网址栏显示的地址),否则脚本不会生效!!!

特别地,"// @match        http://192.0.0.1:7865/*"中的“*”表示通配符,如果用户使用秋叶启动或自定义主题,浏览器网址栏除了IP和端口外还有如“?__theme=dark”这种主题信息。若不使用通配符,一旦用户更换了主题,则必须重新更新脚本中的网址信息,否则脚本将失效。

别的部分则没什么好说的,大家配合注释应该能明白。

// ==UserScript==
// @name         Fooocus批量绘图
// @namespace    https://blog.aidec.tw/ || https://blog.csdn.net/liuqihang11?type=blog
// @version      2024-09-17
// @description  输入以句号结尾的多行提示词实现Fooocus批量绘图,提示词格式:一行为一组,末尾用英文句号隔开。
// @author       AidecLi Create || Syphomn Modify
// @match        http://192.0.0.1:7865/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=0.1
// @grant        none
// ==/UserScript==
(function() {'use strict';let isProcessing = false;let stopRequested = false;let promptInputTextarea, processedTextarea, startButton, stopButton, clearButton, progressBar, statusDiv;// 添加UI元素function addUI() {const targetElement = document.querySelector('#component-3');if (!targetElement) {console.error('目标元素 #component-3 未找到');return;}const container = document.createElement('div');container.style.marginTop = '20px';container.style.display = 'flex';container.style.flexDirection = 'column';container.style.gap = '10px';// 待处理文本框promptInputTextarea = document.createElement('textarea');promptInputTextarea.id = 'promptList';promptInputTextarea.rows = 5;promptInputTextarea.style.width = '100%';promptInputTextarea.style.color = 'red'; // 设置文字为红色promptInputTextarea.placeholder = 'Unprocessed Prompts';// 已处理文本框processedTextarea = document.createElement('textarea');processedTextarea.id = 'processedList';processedTextarea.rows = 5;processedTextarea.style.width = '100%';processedTextarea.style.color = 'green'; // 设置文字为绿色processedTextarea.placeholder = 'Processed Prompts';processedTextarea.readOnly = true;// 开始批次处理按钮startButton = document.createElement('button');startButton.textContent = 'Start Batch-Drawing';startButton.onclick = processPrompts;startButton.style.padding = '5px 10px';startButton.style.cursor = 'pointer';startButton.className = 'lg secondary type_row svelte-cmf5ev';// 停止批次处理按钮stopButton = document.createElement('button');stopButton.textContent = 'Stop Batch-Drawing';stopButton.onclick = stopProcessing;stopButton.style.padding = '5px 10px';stopButton.style.cursor = 'pointer';stopButton.className = 'lg secondary type_row svelte-cmf5ev';// 清除已处理文本框按钮clearButton = document.createElement('button');clearButton.textContent = 'Clear Processed-Text';clearButton.onclick = clearProcessed;clearButton.style.padding = '5px 10px';clearButton.style.cursor = 'pointer';clearButton.className = 'lg secondary type_row svelte-cmf5ev';clearButton.disabled = true; // 初始化为不可用状态// 进度条progressBar = document.createElement('progress');progressBar.id = 'progressBar';progressBar.value = 0;progressBar.max = 100;progressBar.style.width = '100%';// 状态显示statusDiv = document.createElement('div');statusDiv.id = 'statusDiv';statusDiv.textContent = 'Enter Multiple Lines of Prompts Separated by a Period';statusDiv.style.fontWeight = 'bold';// 将UI元素添加到容器中container.appendChild(statusDiv);container.appendChild(promptInputTextarea);container.appendChild(processedTextarea);container.appendChild(startButton);container.appendChild(stopButton);container.appendChild(clearButton);container.appendChild(progressBar);targetElement.appendChild(container);}// 处理批次提示词async function processPrompts() {if (isProcessing) return;isProcessing = true;stopRequested = false;disableUI();// 重新读取未处理文本框中的内容const promptList = promptInputTextarea.value.split('\n').filter(p => p.trim() !== '');const totalPrompts = promptList.length;const positivePromptTextarea = document.querySelector('#positive_prompt textarea');const generateButton = document.querySelector('#generate_button');let i = 0;for (const prompt of promptList) {if (stopRequested) break;statusDiv.textContent = `正在处理第 ${i + 1} 组,共 ${totalPrompts} 组提示词: ${prompt}`;positivePromptTextarea.value = prompt;positivePromptTextarea.dispatchEvent(new Event('input', { bubbles: true }));console.log('开始绘制' + prompt);await new Promise(resolve => setTimeout(resolve, 500));generateButton.click();await new Promise(resolve => setTimeout(resolve, 500));await waitForGeneration(generateButton);if (stopRequested) break;console.log('结束绘制' + prompt);// 将已处理的移到已处理区processedTextarea.value += prompt + '\n';// 从待处理区移除已处理的提示词promptInputTextarea.value = promptList.slice(i + 1).join('\n');// 更新进度条progressBar.value = ((i + 1) / totalPrompts) * 100;// 等待2秒再继续下一个提示词statusDiv.textContent = `第 ${i + 1} 组已处理完毕,即将进入下一组。`;await new Promise(resolve => setTimeout(resolve, 1000));i++;}if (stopRequested) {statusDiv.textContent = '批量绘图已停止';} else {statusDiv.textContent = '所有提示词均处理完毕';clearButton.disabled = false; // 处理完毕后启用清除按钮}isProcessing = false;enableUI();}// 停止处理function stopProcessing() {stopRequested = true;isProcessing = false;enableUI();// 也停止本轮正在运作的生图const stopButton = document.querySelector('#stop_button');stopButton.click();// 启用清除按钮clearButton.disabled = false;}// 清除已处理文本框的内容function clearProcessed() {processedTextarea.value = '';clearButton.disabled = true; // 清除后禁用清除按钮}// 禁用UI元素function disableUI() {promptInputTextarea.disabled = true;startButton.disabled = true;startButton.textContent = 'Processing...';}// 启用UI元素function enableUI() {promptInputTextarea.disabled = false;startButton.disabled = false;startButton.textContent = 'Start Batch-Drawing';}// 等待生成过程function waitForGeneration(button) {return new Promise(resolve => {const observer = new MutationObserver(() => {if (!button.disabled && !button.hidden) {// 等待按钮setTimeout(() => {observer.disconnect();resolve();}, 500);}});observer.observe(button, { attributes: true, attributeFilter: ['disabled', 'hidden'] });if (stopRequested) resolve();// 如果按钮可用且没有hidden,则继续if (!button.disabled && !button.hidden) {observer.disconnect();resolve();}});}// 将自定义UI添加到页面上function initScript() {const maxAttempts = 10;let attempts = 0;function tryAddUI() {if (document.querySelector('#component-3')) {addUI();} else if (attempts < maxAttempts) {attempts++;setTimeout(tryAddUI, 1000); // 等待1秒重新尝试} else {console.error('在 ' + maxAttempts + ' 次尝试后未能找到 #component-3');}}tryAddUI();}// 页面完成加载UI到页面if (document.readyState === 'loading') {window.addEventListener('DOMContentLoaded', initScript);} else {initScript();}
})();

2.1.2 What's New

​相比于博主AidecLi的版本,本文提供代码在以下方面做了一些工作:

  • 修改了提示词文本框中的文字显示颜色以解决在Fooocus深色背景下文字显示不清的问题;
  • 添加了已绘提示词清除按钮以使用户能一键清除已使用提示词;
  • 修改了停止按钮的作用,修改前,停止绘图按钮的作用是中断绘图,并且已处理文本框中的文字被清空,未处理文本框中的文字将被初始化,修改后,停止绘图按钮的作用是中断绘图,但对文本框的内容不做任何处理,用户可在停止绘图后重新输入提示词文本并开始绘图,也可在断点处继续绘图。

2.1.3 使用方法

  • 安装油猴插件,Edge用户可在Edge插件商店安装,Chrome用户可在Chrome插件商店(需要上网技巧)。
  • 在插件管理处打开开发人员模式, Edge用户的插件管理在这里edge://extensions/,Chrome用户的插件管理在这里chrome://extensions/。

Edge:

Chrome:

  •  在油猴中添加新脚本,将2.1.1节的代码复制到代码框中;
  • // @match        http://192.0.0.1:7865/*行的网址修改为自己Fooocus的实际网址;

  • 正常启动Fooocus(2.5.5版本)后界面应该是这样 :
  • 用户的提示词应该遵循以下格式
1girl.
2girls.
3girls.
  •  设置fooocus出图参数后,将批量提示词(也可手动输入)复制粘贴到“Unprocessed Prompts”文本框,点击“Start Batch-Drawing”开始批量绘图,第一个文本框显示了未处理提示词,第二个文本框显示了已处理提示词;
  • 点击“Stop Batch-Drawing”按钮以中断绘图,之后用户可在该断点处继续绘图,也可修改提示词后重新开始绘图;
  • “Clear Processed-Text”的作用是在用户停止绘图或所有提示词绘图完毕后清空已处理文本框的文字内容。

OK了各位,Hope you all enjoy it!

2.2 接管Fooocus接口

这是SD各种UI实现批量绘图的通法,也是第三方软件调用SD绘图的常用做法。该方法需要对SD源代码有基本了解,至少需要掌握SD大模型、lora、高清放大等接口的调用格式(我一开始本来打算采用这种方法,但苦于无法找到详细的Fooocus接口说明文档,就一直没搞成),好在CSDN上的桥呗博主已发布了相关代码供大家学习使用(传送门:fooocus读取批量prompts进行批量生成图像方法)。

该方法是非UI界面绘图,有一定使用门槛,且有效性我没有验证,大家可以自行实践。

3 写在最后

本文提供了一个用于Fooocus批量绘图的简易脚本,能够基本满足用户需要,希望能帮到大家。

文章已提供源代码,代码1.0版本由博主AidecLi无偿提供,本文对其功能进行了增改,更新到了2.0版本。

AIGC领域的发展需要大家共同努力,欢迎各位对我提供的脚本二次开发,修复Bug,完善功能。

严正声明:

  • 脚本源代码为免费提供,严禁任何人(除博主AidecLi及其授权人员外)直接利用源代码本身盈利(但这不包括本脚本的二次开发产品及其衍生品),否则将严肃追责!
  • 若本文尤其是本声明侵犯了博主AidecLi您的任何权益,请联系我商讨善后事宜。

最后再来几张AIGC美图:

(masterpiece, top quality, best quality, official art, beautiful and aesthetic:1.2),(1girl),extreme detailed,(fractal art:1.3),colorful,highest detailed,
Negative prompt: (worst quality, low quality:2),monochrome,zombie,overexposure,watermark,text,bad anatomy,bad hand,extra hands,extra fingers,too many fingers,fused fingers,bad arm,distorted arm,extra arms,fused arms,extra legs,missing leg,disembodied leg,extra nipples,detached arm,liquid hand,inverted hand,disembodied limb,small breasts,loli,oversized head,extra body,completely nude,extra navel,EasyNegative,(hair between eyes),sketch,duplicate,ugly,huge eyes,text,logo,worst face,(bad and mutated hands:1.3),(blurry:2),horror,geometry,bad_prompt,(bad hands),(missing fingers),multiple limbs,bad anatomy,(interlocked fingers:1.2),Ugly Fingers,(extra digit and hands and fingers and legs and arms:1.4),((2girl)),(deformed fingers:1.2),(long fingers:1.2),(bad-artist-anime),bad-artist,bad hand,extra legs,(ng_deepnegative_v1_75t),
Steps: 30, Sampler: DPM++ 2M Karras, CFG scale: 6, Seed: 1015468391, Size: 512x768, Model hash: e3edb8a26f, Model: GhostMix鬼混_V2.0, Denoising strength: 0.5, Clip skip: 2, Hires upscale: 2, Hires upscaler: R-ESRGAN 4x+ Anime6B, Version: f0.0.17v1.8.0rc-latest-277-g0af28699

modern,masterpiece,best quality,8k,intricate details,hyperdetailed,hyper quality,anime,CG,1girl,modern,
Negative prompt: NSFW,watermark,third-party watermark,character watermark,sharp,(worst quality, low quality:1.4),cropped,poorly drawn,low resolution,logo,text,blurry,bad anatomy,lowres,monochrome,grayscale,(signature:1.4),bad proportions,username,poorly drawn face,malformed hands,skin blemishes,skin spots,bad body,acnes,missing fingers,long body,missing limb,fused fingers,too many fingers,long neck,floating limbs,extra legs,disconnected limbs,bad feet,mutated,cross-eyed,extra arms,ugly,mutated hands,disfigured,poorly drawn hands,(deformed iris, deformed pupils:1.3),(deformed, distorted, disfigured:1.3),out of frame,extra limb,cloned face,amputation,blurry,jpeg artifacts,
Steps: 20, Sampler: DPM++ 2M Karras, CFG scale: 7, Seed: 3081904287, Size: 768x512, Model hash: d6301c47f5, Model: 小说推文大模型-通用, VAE hash: 735e4c3a44, VAE: vae-ft-mse-840000-ema-pruned.safetensors, Denoising strength: 0.7, Hires upscale: 2, Hires upscaler: R-ESRGAN 4x+ Anime6B, Version: f0.0.17v1.8.0rc-latest-277-g0af28699

相关文章:

Stable Diffusion Fooocus批量绘图脚本

当当当挡~&#xff0c;流动传热数值计算之余发布点AIGC相关文章&#xff0c;希望大家能喜欢~ 1 Stable Diffusion各种UI分析对比 提示&#xff1a;此部分主要是对SD各种界面的简要介绍和对比&#xff0c;只关注Fooocus批量绘图的读者可直接跳到第二部分。 Stable Diffusion …...

Web 安全基础教程:从零基础入门到精通

一、Web 安全概述 &#xff08;一&#xff09;Web 安全的定义与重要性 1.定义 Web 安全是指保护 Web 应用程序免受各种网络威胁&#xff0c;确保 Web 服务的保密性、完整性和可用性。在当今数字化时代&#xff0c;Web 应用广泛存在于各个领域&#xff0c;从电子商务到社交媒…...

ubuntu 20.04 ‘Wired Unmanaged‘ 网络无法配置解决方法

问题描述 系统&#xff1a;ubuntu20.04连上网线后右上角没有有线网络连接的图标&#xff0c;在网络配置界面也只有VPN和无线网络的配置;实际上此时电脑已经连接网络&#xff0c;通过DHCP获得IP地址可以正常访问网络。 解决办法 ubuntu有有两套网络管理软件&#xff1a;serve…...

前端实战:使用JS和Canvas实现运算图形验证码(uniapp、微信小程序同样可用)

图形验证码是网站安全防护的重要组成部分&#xff0c;能有效防止自动化脚本进行恶意操作&#xff0c;如何实现一个简单的运算图形验证码&#xff1f;本文封装了一个简单的js类&#xff0c;可以用于生成简单但安全的图形验证码。它支持自定义验证码样式&#xff0c;包括字体大小…...

SQL Server 语句日期格式查找方法

1. SQL Server中&#xff0c;处理日期格式和查找特定日期格式方法示例 在SQL Server中&#xff0c;处理日期格式和查找特定日期格式的记录是一个常见的需求。SQL Server提供了多种函数和格式选项来处理和比较日期。以下是一个详细的示例&#xff0c;展示了如何根据特定日期格式…...

【Python报错已解决】python setup.py bdist_wheel did not run successfully.

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...

查询结果是1条记录,但执行更新却是2条记录原因查找

1、问题 在 sqlserver2008 数据库 select * from userinfo WHERE username SP4267ED2409011; 查询结果是1条记录&#xff0c;但执行更新 UPDATE userinfo SET qt qt 2.0 WHERE username SP4267ED2409011; 结果是这样的 Affected rows: 1 Affected rows: 1 返回了2个&#x…...

校园网站的管理与建设心得体会

随着时代发展的需要&#xff0c;学校网站建设如雨后春笋般的涌现出来。在这股大潮的带动下我校校园网网站建设也逐步开展深入。通过数年的发展&#xff0c;我校的校园网建设取得了长足发展&#xff0c;架构了数字化交流平台&#xff0c;整理了专题学习网站资源&#xff0c;开设…...

智慧农业——InsectMamba利用状态空间模型对害虫进行分类

介绍 论文地址&#xff1a;https://arxiv.org/abs/2404.03611 害虫分类是农业中的一个重要问题。准确识别有害害虫可减少对作物的损害&#xff0c;确保粮食安全和环境的可持续发展。然而&#xff0c;害虫及其自然环境的高度拟态性和物种多样性使得视觉特征的提取极具挑战性。…...

基于机器学习的癌症数据分析与预测系统实现,有三种算法,bootstrap前端+flask

研究背景 癌症作为全球范围内最主要的死亡原因之一&#xff0c;已成为当代医学研究和公共健康的重大挑战。据世界卫生组织&#xff08;WHO&#xff09;的统计&#xff0c;癌症每年导致全球数百万人的死亡。随着人口老龄化、环境污染和生活方式的改变&#xff0c;癌症的发病率逐…...

docker|Oracle数据库|docker快速部署Oracle11g和数据库的持久化(可用于生产环境)

一、 容器数据持久化的概念 docker做为容器化的领先技术&#xff0c;现在广泛应用于各个平台中&#xff0c;但不知道什么时候有一个说法是docker并不适用容器化数据库&#xff0c;说容器化的数据库性能不稳定&#xff0c;其实&#xff0c;这个说法主要是因为对docker的数据持…...

uni-app 聊天界面滚动到消息底部

目录 问题 组件 页面 使用的API 总结 问题 当你发一个消息&#xff0c;但是消息却需要你自己向下滑你才能看见&#xff0c;否则一直呗输入框挡住。 组件 scroll-view组件&#xff1a;一般使用scroll-view组件的都采取使用其scroll-into-view或者scroll-to属性。 scroll-…...

学习风格的类型

学习风格是指个体在学习过程中偏好的方式和方法。不同的学习风格反映了人们在接收、处理和记忆信息方面的不同偏好。了解自己的学习风格可以帮助提高学习效率和效果。以下是几种常见的学习风格类型&#xff1a; 1. 视觉型&#xff08;Visual Learner&#xff09; 特点&#x…...

GCP容器镜像仓库使用

GCP容器镜像仓库产品为&#xff1a;Artifact Registry。 1&#xff09;用户账号认证 GCP需要前置在控制台登陆对应环境账号。然后执行以下命令操作&#xff1a; $ gcloud auth login 2&#xff09;登陆镜像仓库 $ gcloud auth configure-docker us-west1-docker.pkg.dev …...

【C++ Primer Plus习题】16.10

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> #include <string> #include <…...

Django框架全面指南

Django是一个高级的Python Web框架,它鼓励快速开发和清晰、实用的设计。本指南将全面介绍Django的核心概念和使用方法。 1. Django简介 Django遵循"batteries included"哲学,提供了Web开发所需的几乎所有功能。它的主要特点包括: ORM(对象关系映射)URL路由模板…...

git 更新LingDongGui问题解决

今天重新更新灵动gui的代码&#xff0c;以便使用最新的arm-2d&#xff0c;本来以为是比较简单的一件事情&#xff08;因为以前已经更新过一次&#xff09;&#xff0c;却搞了大半天&#xff0c;折腾不易啊&#xff0c;简单记录下来&#xff0c;有同样遇到问题的同学参考&#x…...

Thymeleaf模版引擎

Thymeleaf是面向Web和独立环境的现代服务器端Java模版引擎&#xff0c;能够处理HTML、XML、JavaScript、CSS甚至纯文本。Thymeleaf旨在提供一个优雅的、高度可维护的创建模版的方式。为了实现这一目标&#xff0c;Thymeleaf建立在自然模版的概念上&#xff0c;将其逻辑注入到模…...

jpa适配mysql切换达梦可能的坑

1、liquibase脚本 &#xff08;1&#xff09;达梦数据库不支持&#xff0c;修改字段varchar改成blob <changeSet author"ly" id"v3.0_4_202307111505_101"><renameColumn tableName"PC_SS_ZRQD" oldColumnName"BHNR" newCo…...

922. 按奇偶排序数组 II 双指针 力扣

922. 按奇偶排序数组 II 已解答 简单 相关标签 相关企业 给定一个非负整数数组 nums&#xff0c; nums 中一半整数是 奇数 &#xff0c;一半整数是 偶数 。 对数组进行排序&#xff0c;以便当 nums[i] 为奇数时&#xff0c;i 也是 奇数 &#xff1b;当 nums[i] 为偶数时…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...