Stable Diffusion Fooocus批量绘图脚本

news2024/11/15 10:41:45

当当当挡~,流动传热数值计算之余发布点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

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

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

相关文章

进程间的通信4 共享内存

共享内存 1.共享内存简介 共享内存是将分配的物理空间直接映射到进程的用户虚拟地址空间中&#xff0c;减少数据在内核空间缓存共享内存是一种效率较高的进程间通讯的方式在 Linux 系统中通过 ipcs -m 查看所有的共享内存 共享内存模型图 2.共享内存的创建 1.函数头文件 #…

【6DRepNet360全范围头部姿态估计onnxruntime推理】

6DRepNet360全范围头部姿态估计 标题摘要关键词主要贡献方法概述实验结论模型转换和onnxruntime推理模型和代码下载可视化结果代码 这篇论文的核心内容是关于一种用于全范围旋转头部姿态估计的新方法。以下是关键点的总结&#xff1a; 标题 Towards Robust and Unconstrained…

输电线路数据集

输电线路数据集&#xff08;绝缘子自爆&#xff0c;破损&#xff0c;闪络&#xff0c;鸟巢&#xff0c;防震锤脱落五种缺陷&#xff09; 包括 1.绝缘子自爆 2.绝缘子破损绝、闪络 3.鸟巢 4.防震锤脱落 数据增强后的数量 对应数量&#xff1a;1828&#xff0c;1467&#xff0c;4…

【Godot4.3】剪贴板相关以及粘贴截图

概述 Godot4.3中更新了一些关于剪贴板的方法&#xff0c;获取图片赫然在列&#xff0c;这意味着可以在自己的应用中创建诸如粘贴截图的功能。 这些方法被包含在DisplaySever单例中&#xff0c;有兴趣的戈友可以自己去翻一下文档。或许可以实现Godot版本的屏幕截图工具。 相关…

Java | Leetcode Java题解之第414题第三大的数

题目&#xff1a; 题解&#xff1a; class Solution {public int thirdMax(int[] nums) {Integer a null, b null, c null;for (int num : nums) {if (a null || num > a) {c b;b a;a num;} else if (a > num && (b null || num > b)) {c b;b num;…

Maven笔记(二):进阶使用

Maven笔记&#xff08;二&#xff09;-进阶使用 一、Maven分模块开发 分模块开发对项目的扩展性强&#xff0c;同时方便其他项目引入相同的功能。 将原始模块按照功能拆分成若干个子模块&#xff0c;方便模块间的相互调用&#xff0c;接口共享(类似Jar包一样之间引用、复用)…

【LLM学习之路】9月16日 第六天

【LLM学习之路】9月16日 第六天 损失函数 L1Loss 可以取平均也可以求和 参数解析 input &#xff08;N&#xff0c;*&#xff09; N是batchsize&#xff0c;星号代表可以是任意维度 不是输入的参数&#xff0c;只是描述数据 target 形状要同上 MSELoss平方差 CrossEntr…

物理学基础精解【7】

文章目录 平面方程直角坐标及基本运算 参考文献 平面方程 直角坐标及基本运算 向量的四则运算 下面由文心一言自动生成 向量的四则运算主要包括加法、减法、数乘&#xff08;标量乘法&#xff09;和数量积&#xff08;点积或内积&#xff09;&#xff0c;但通常不直接称为“除…

python sql中带引号字符串(单双引号)转义处理

描述&#xff1a; 最近在爬取数据保存到数据库时&#xff0c;遇到有引号的字符串插入MySQL报错&#xff1a;1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 转义字符串…

线程(三) 线程的互斥

文章目录 线程线程的同步和互斥线程同步线程互斥为什么要使用线程互斥什么是线程同步示例--线程操作共享资源引发问题 线程互斥--互斥锁示例--使用互斥锁来保证取款操作 互斥锁的属性示例--创建不同的属性的互斥锁后进行加锁操作 线程互斥--读写锁示例--对读写锁进行使用以观察…

鸿蒙【项目打包】- .hap 和 .app;(测试如何安装发的hap包)(应用上架流程)

#打包成.hap需要用到真机 原因是&#xff1a;只有用上了真机才能在项目中配置 自动签名 #步骤: ##第一步:选择真机->选择项目结构->点Sigining Configs(签名配置) ##第二步:勾选Automatically generate signature(自动签名)->点击ok ##第三步:点击构建->点击 …

伊犁云计算22-1 rhel8 dhcp 配置

1 局域网搭建 2 yum 配置 这个参考前面 不说 3 dnf 安装dhcp 好我们废话不说开始安装。理论看书去 进入 dhcp.conf 配置 重启dhcpd 不能报错&#xff01;&#xff01;&#xff01;&#xff01; 我们在客户机上做测试 全局的dhcp关闭 很明显我们的客户机获取到192.16…

Why Is Prompt Tuning for Vision-Language Models Robust to Noisy Labels?

文章汇总 本文的作者针对了提示学习的结构设计进行了分析&#xff0c;发现了一些规律&#xff1a; 1)固定的类名令牌为模型的优化提供了强正则化&#xff0c;减少了由噪声样本引起的梯度。 2)从多样化和通用的web数据中学习到的强大的预训练图像文本嵌入为图像分类提供了强大…

李宏毅机器学习2023-HW11-Domain Adaptation

文章目录 TaskLinkBaselineSimple BaselineMedium BaselineStrong BaselineBoss Baseline Task Domain Adaptation 通过训练真实图片得到分类模型&#xff0c;并将其应用到涂鸦图片上进行分类&#xff0c;来获得更高的精准度。 Link kaggle colab Baseline Simple Baseli…

JVM(HotSpot):JVM简单介绍

文章目录 一、什么是JVM二、优点三、比较四、学习路线 一、什么是JVM 定义&#xff1a;java程序的运行环境 首先&#xff0c;我们要知道&#xff0c;JVM是一套规范&#xff0c;运行java程序的一套规范。 那么&#xff0c;我们学习过java的人都知道&#xff0c;接口规范的实现类…

软考高级:数据库关系模式推理规则 AI 解读

你提出的是关系模式中的一些经典推理规则&#xff0c;这些规则在数据库理论、函数依赖和范式相关的讨论中经常出现。我们可以通过以下方式深入理解这些规则&#xff0c;并且对其中的推理逻辑进行分解。 生活化例子 想象你在管理一家快递公司&#xff0c;货物需要从仓库&#…

24年研赛-华为杯数模竞赛D题论文首发+代码分享

本届研赛助攻题目 C D F三题论文均已经全部完成。后更新计划 如图所示。 免费给大家分享 三个问题的论文部分代码 2024年华为杯-研赛分享资料&#xff08;论文部分代码&#xff09;&#xff08;已更新部分代码&#xff09;&#xff1a; 链接&#xff1a;https://pan.baidu.com…

数据结构哈希(hash)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 数据结构哈希(hash) 收录于专栏 [C进阶学习] 本专栏旨在分享学习C的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. 哈希的概念 2.…

Linux:进程(四)

目录 一、进程优先级 二、Linux调度与切换 1.背景 2.进程切换 一、进程优先级 背景&#xff1a;在计算机中&#xff0c;软硬件资源是有限的&#xff0c;而进程想要访问某一种资源&#xff0c;就得通过排队来保证访问资源的过程是有条不紊的。 Linux下对优先级的定义。执行命…

MAE 模型

masked autoencoders (MAE) 论文地址&#xff1a;https://arxiv.org/abs/2111.06377 代码地址&#xff1a;https://github.com/facebookresearch/mae 模型结构图: 思想&#xff1a;自监督学习&#xff08;Self-Supervised Learning&#xff09;&#xff0c;遮住大部分&…