AIGC

【AIGC】ComfyUI常用概念备忘—-节点、数据、模型类型

一. 常见节点类型与作用

节点按照功能大致可以分为以下几类:

1. 加载模型节点

  • Checkpoints Loader:加载 .ckpt.safetensors 模型,输出模型检查点(Model Checkpoint)。

  • VAE Loader:加载对应的 VAE 文件。

  • CLIP Loader:加载用于文本编码的 CLIP 模型。

2. 文本提示节点

  • CLIP Text Encode:将用户输入的 Prompt 编码为语义向量(Text Condition),可作为生成条件。

  • CLIP Text Encode (Negative):负向提示词,用于去除不希望生成的元素。

3. 采样节点

  • KSampler:图像采样器,接收模型、提示、初始噪声等,生成最终图像。

  • KSampler (Advanced):带更多可控参数的采样版本。

4. 噪声和图像节点

  • Empty Latent Image:创建空白的潜空间图像张量(latent),用于起始输入。

  • Noise:生成随机噪声。

  • Latent to Image:将生成的 latent 图像解码为可见图像。

  • Image to Latent:将实际图像转换为 latent 表示。

5. 图像处理节点

  • Resize Image:改变图像分辨率。

  • Crop Image:裁剪图像。

  • Load Image / Save Image:读取/保存图像文件。

6. 控制模块

  • ControlNet Loader:加载 ControlNet 模型。

  • Apply ControlNet:在图像生成中应用 ControlNet 条件。

  • T2I Adapter:另一种控制模块,用于风格/姿态控制。

二. 节点之间的数据类型传递

不同节点之间的连接线,传递的是特定类型的数据:

数据类型 说明 常见来源 常见去向
Model Checkpoint 主模型结构及权重 Checkpoints Loader KSampler
CLIP Text Condition 文本提示的向量表示 CLIP Text Encode KSampler
Latent Image 潜空间图像(未解码) Empty Latent Image / KSampler Latent to Image
Image 普通 RGB 图像 Load Image / Latent to Image Resize / Save Image
Noise 随机噪声 Noise 节点 KSampler
VAE 解码器/编码器模型 VAE Loader Latent to Image 等
ControlNet Condition 条件图像等 Apply ControlNet KSampler
Prompt 文本字符串 用户输入 CLIP Text Encode

三. 常见模型格式

1. .safetensors(安全张量)

  • 开发者:由 Hugging Face 团队推出。

  • 优点

    • 安全:不使用 Python pickle,防止执行恶意代码。

    • 更快加载:支持零拷贝映射(mmap),加载速度更快。

    • 结构简单清晰:专门用于张量权重的存储。

  • 使用场景

    • 在 Hugging Face、ComfyUI、Diffusers 等生态中日益流行。

  • 适合谁:推荐在生产或部署时使用,因为它安全、加载快。


 2. .ckpt(Checkpoint)

  • 全称:checkpoint,常见于 TensorFlow、PyTorch。

  • 来源:Stable Diffusion 早期模型多使用此格式(如 v1-5-pruned.ckpt)。

  • 问题

    • 通常使用 Python 的 pickle 保存,存在代码执行风险

    • 体积通常大,因为可能包含训练中所有模块(如优化器、调度器等)。

  • 使用场景

    • 原始模型训练中保存断点,或早期模型发布格式。

  • 适合谁:用于开发调试或旧项目兼容。


 3. .pth(PyTorch权重)

  • 来源:PyTorch 官方推荐格式,用于保存 state_dict

  • 优点

    • 简洁,仅保存模型权重(不包含结构定义)。

  • 问题

    • 同样依赖 Python pickle存在安全隐患

    • 不跨平台,必须在 PyTorch 中读取。

  • 使用场景

    • 自己训练的模型中广泛使用。

  • 适合谁:熟悉 PyTorch 的用户、开发时保存模型权重。


4. .onnx(Open Neural Network Exchange)

  • 来源:微软、Facebook 主导开发的 跨平台格式

  • 优点

    • 跨框架:可在 PyTorch、TensorFlow、ONNX Runtime、NVIDIA TensorRT 等中使用。

    • 适合部署:结构与权重同时包含,适合导入推理引擎。

  • 使用场景

    • 导出模型用于 Web、移动、C++ 等非 Python 环境。

  • 适合谁:需要模型跨平台部署或优化推理性能的开发者。


5. .gguf(Grokking General Unified Format)

  • 来源ggml 系列项目(如 llama.cpp)推出的新格式,继承自 .ggml

  • 目标:用于 轻量化模型的本地推理,尤其适用于 CPU-only 运行、边缘设备。

  • 特点

    • 支持量化(如 Q4_0、Q5_K),文件体积小。

    • 与 LLaMA、Mistral、Gemma 等 LLM 配合使用。

  • 使用场景

    • 本地轻量推理(例如在 Mac、树莓派、安卓手机上运行大模型)。

  • 适合谁:希望在设备端低资源环境中运行 LLM 的用户。

四. 模型的量化与压缩

1. 什么是量化?

在原始训练后的模型中,权重通常是使用 32 位浮点数(float32) 存储的。

而“量化”就是将这些高精度浮点权重,转换为更低位数的整数表示,比如:

类型 原始精度 压缩后的精度 示例
FP32(float32) 32位浮点数 原始模型
Q8 8位整数 精度略下降 常见于轻量推理
Q4_0Q5_K 4位/5位整数 进一步压缩 gguf 格式中常见

2.为什么要量化?

目的 效果
减少文件体积 从几 GB 缩小到几百 MB,适合本地推理(尤其 CPU)
提升推理速度 整数计算比浮点计算快,适用于边缘设备
降低内存占用 低位宽张量占用更少 RAM,可在内存有限设备运行
⚠️ 略微精度损失 通常影响有限,尤其是在大模型中微不足道

3. Q4_0、Q5_K 是什么?

它们是不同的 量化等级/方法,你可以理解为压缩的“清晰度级别”:

量化等级 位宽 精度 文件体积 说明
Q8_0 8 位 精度几乎不变
Q5_K 5 位 性能和质量折中
Q4_0 4 位 极限压缩,精度略降

4. 浮点精度降低(压缩) vs 整数量化(量化)

项目 FP32 ➝ FP16/FP8 FP32 ➝ INT8 / Q4_0
类型 浮点 ➝ 浮点 浮点 ➝ 整数
是否严格算量化 ❌ 严格来说不是 ✅ 是标准量化
是否有指数位 ✅ 有(保留范围) ❌ 无(线性/分段)
计算精度 比较高,近似 FP32 精度低,依赖校准或训练
加速平台 GPU(如 NVIDIA Tensor Cores) CPU / GPU / 推理芯片
AIGC

【AIGC】ComfyUI+Flux日常P图示例:换装、局部修改

今天来介绍一个ComfyUI-Flux的换装工作流。和ComfyUI示例里自带的类似功能工作流相比,此工作流增加了一个“PaintEditor”节点,作用是可以用画笔圈出说要修改的部位,这样可以让ComfyUI做出更精确的修改,同时又尽可能的保留原图其他部分的状态,话不多说,我们先来看一下实际的效果:

Before imageAfter image

(提示词:Change the clothing in the red-framed area to Leopard print skirt everything else in the image exactly the same, including all other people, background, poses, and facial features.)

可以看出,除了提示词要求的修改短裙,包括模特的面部表情、姿势在内的整张图的其他部分均未改变,甚至面部阴影也没有变化。

关于PaintEditor节点,安装地址:https://github.com/Pixelailabs/paint_editor。关键步骤:点击paint_editor节点里的“open paint editor”按钮,并用红笔圈出要修改的部分

如上图,除了修改服装,这个工作流还可以修改图片中的其他元素,比如:

Before imageAfter image

(提示词:Change the horse in the red-framed area to the Ostrich …)

Before imageAfter image

(提示词:Change the character in the red-framed area to the Ultraman…)

点击这里下载此工作流。

——
over
转载请注明出处:http://www.jiangkl.com/2025/07/aigc_comfyui_flux_change_clothes/

Hello World

sp.Skeleton动画Listener汇总

简单总结一下cocos骨骼动画的各种几个回调监听,可以进行更精确的控制特效,免得到时只会this.schedule

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    //整体开始是调用一次
    this.roleAnimation.setStartListener((trackEntry)=>{
        console.log('---->> HeroAI roleAnimation, setStartListener:', trackEntry.trackIndex, trackEntry.animation.name);
    });
    //动画关闭时调用,在setEndListener之后
    this.roleAnimation.setDisposeListener((trackEntry)=>{
        console.log('---->> HeroAI roleAnimation, setDisposeListener:', trackEntry.trackIndex, trackEntry.animation.name);
    });
    //整体结束时调用
    this.roleAnimation.setEndListener((trackEntry)=>{
        console.log('---->> HeroAI roleAnimation, setEndListener:', trackEntry.trackIndex, trackEntry.animation.name);
    });
    //中断时调用,在setEndListener之前
    this.roleAnimation.setInterruptListener((trackEntry)=>{
        console.log('---->> HeroAI roleAnimation, setInterruptListener:', trackEntry.trackIndex, trackEntry.animation.name);
    });
    //每次循环结束时调用
    this.roleAnimation.setCompleteListener((trackEntry)=>{{
        console.log('---->> HeroAI roleAnimation, setCompleteListener:', trackEntry.trackIndex, trackEntry.animation.name);
    });

——
over
转载请注明出处:http://www.jiangkl.com/2025/04/cocos-skeleton-listener

Hello World

cocos.tween动画,时间线控制汇总

本文主要简绍cc.tween与sequence、delay、parallel、repeat和call的各种搭配、混合使用,实现事件序列的串并行控制
1. 简单串行

1
2
3
4
5
6
7
8
// 示例代码,先执行动作1、再执行动作2、然后执行回调
cc.tween(node)
    .to(time1, { position: newPosition }) // 动作1
    .to(time2, { angle: newAngle }) // 动作2
    .call(() => {
        // console.log('>> cc.tween end')
    })
    .start();

2. 并行parallel、延迟delay

1
2
3
4
5
6
7
8
9
// 示例代码,先同步执行动作1和动作2、然后延迟0.5秒、然后执行动作3
cc.tween(node)
    .parallel(
        cc.tween().to(time1, { position: newPosition1 }),// 动作1
        cc.tween().to(time2, { angle: newAngle }),// 动作2
    )
    .delay(0.5)
    .to(time2, { position: newPosition2 }) // 动作3
    .start();

3. 并行parallel、串行sequence、重复repeat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 示例代码 串并行混排、重复
cc.tween(node)
    .repeat(3,  // 让整个 sequence 重复 3 次
        cc.tween().sequence( //先执行第一个parallel,然后等待0.5秒、然后执行第二个parallel
            cc.tween().parallel( //先动作1与动作2串行
                cc.tween().to(1, { position: cc.v2(200, 200) }),  // 动作1
                cc.tween().to(1, { angle: 180 }) //动作2
            ),
            cc.tween().delay(0.5),
            cc.tween().parallel( //后动作3与动作4
                cc.tween().to(1, { position: cc.v2(-200, -200) }).to(1, { position: cc.v2(0, -200) }), //动作3,包含两个串行的子动作
                cc.tween().to(1, { color: cc.Color.RED }) //动作4
            )
        ).call(()=>{
               console.log('>> repeat once'); //每次repeat可以单独定义回调
        }),
 
    ).call(()=>{
        console.log('>> repeat end');} //整体完成的回调
    ).start();

——
over
转载请注明出处:http://www.jiangkl.com/2025/02/cocos-tween_timeline

Hello World

cocos.tween动画,移动曲线参数汇总

1. 缓动曲线:

1
2
3
4
5
6
7
8
9
10
11
// 示例代码
cc.tween(node)
    .to(time, { position: newPosition }, { easing: "sineInOut" }) // 先慢后快
    .start();
// 常用 easing 类型
// "sineIn"	开始慢,后面加速
// "sineOut"	开始快,后面减速
// "sineInOut"	先慢-加速-再慢
// "quadIn"	二次方曲线加速
// "quadOut"	二次方曲线减速
// "quadInOut"	二次方曲线平滑过渡

2. 贝塞尔曲线(Bezier Curve):

1
2
3
4
5
6
7
//示例代码
cc.tween(node)
    .bezierTo(time, cc.v2(100, 200), cc.v2(200, 300), cc.v2(300, 100)) // 1秒内按贝塞尔曲线移动
    .start();
// bezierTo(time, control1, control2, endPos)
// control1 和 control2 是控制点,决定曲线形状。
// endPos 是终点,节点沿着曲线到达该点。

3. 分步依次移动,使用 sequence() 组合多个 to():

1
2
3
4
5
6
7
//示例代码
cc.tween(node)
    .sequence(
        cc.tween().to(time1, { position: cc.v2(100, 200) }, { easing: "sineOut" }),
        cc.tween().to(time2, { position: cc.v2(200, 100) }, { easing: "sineIn" })
    )
    .start();

——
over
转载请注明出处:http://www.jiangkl.com/2025/02/cocos_tween_positin_easing

Hello World

用python提取Excel内的附件mp4

收到一个Excel文档,里面有两段内嵌的mp4视频,手头mac版的Excel打不开这俩附件。其实以前也发现过,无论是内嵌的doc、还是其他文件,mac版的excel似乎都打不开,但那时身边有用 windows的同事,让他帮忙打开再导出就好了。现在身边人全是mac本,手头唯一windows台式机平时只玩游戏,甚至没装office~~
先到的第一个方法是各种在线文档工具,但是,试了google和腾讯的,上传以后都不行。按说微软自家的在线文档总可以吧,好容易登陆了,TM上传这个Excel文件一直失败…
既然此路不通,那就从头开始:给windows装个office~~记得以前有试用版,装好以后能试用一个月。哪知现在的office365不付钱就找不到下载入口(⊙o⊙)…。有想着下载一个旧版的office,最好是破解版的,找了几个渠道,要么不是正常的下载包、要么到了百度网盘~~然后进网盘提示资源已经没了…(还送,好久不用windows,破解软件这么难找了吗 O(∩_∩)O哈哈~)
最后没办法,搜索引擎也找不到靠边的答案,问chatgpt,在chatgpt的提示下,一步步用python解出了附件,具体大概分下面两步:
1. 将excel备份一份,然后将扩展名改成“.zip”,然后解压,按AI的说法,运气好的话,mp4文件直接就在解压包/xl/embeddings目录底下~~我的运气不好,里面是两个bin文件,按chatgpt的说法,mp4数据就包在这个bin里
2. 调下面python脚本,处理bin文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    import olefile #需要安装olefile库
    ole = olefile.OleFileIO('xx/xl/embeddings/oleObject2.bin')
    print(ole.listdir())
    streams = ole.listdir()
    print(streams) #打印出具体的数据流,mp4可能在\x01Ole10Native中,也可能在其他流中
    #提取mp4数据流
    if ole.exists('\x01Ole10Native'):
        with ole.openstream('\x01Ole10Native') as stream:
            data = stream.read()
        # 保存到缓冲文件
        with open('temp.bin', 'wb') as f:
            f.write(data)
        print("Data from \\x01Ole10Native saved as output.bin")
    else:
        print("\\x01Ole10Native stream not found")
    ole.close()
    # 从 MP4 文件中提取数据
    with open('temp.bin', 'rb') as f:
        data = f.read() 
    # 自动查找 MP4 文件头 ("ftyp")
    data_start = data.find(b'ftyp')
    if data_start == -1:
        print("MP4 header not found. The file may not contain valid MP4 data.")
        exit()
    print(f"MP4 header found at offset: {data_start}")
    # 从 mp4 文件头开始提取数据
    # mp4文件头在"ftyp"之前可能还有四个字节空位,具体的可以使用https://hexed.it之类的工具打开二进制文件查看
    data_start = data_start - 4 
    output_file = 'extracted_video.mp4' #输出mp4文件名
    with open(output_file, 'wb') as out_f:
        out_f.write(data[data_start:])
    print(f"File extracted successfully as {output_file}")

———-
over,转载请注明出处:http://www.jiangkl.com/2024/12/excel_mp4_python

AIGC

Midjourney常用参数备忘

–v,选择模型版本
–aspect/–ar,出图宽高比,如 –ar 16:9
–stylize/–s,样式化程度,即更偏艺术风格还是更接近现实,0~1000,默认100
–quality/–q,图像质量,0.25/0.5/1/2,数值越大清晰度越高,时间也越长
–seed,指定种子,保证一致性
–chaos/–c,图像生成的随机性,0~100,数值越高,图像变化越大
–no,排除指定元素,如 –no water
–tile,创建可无缝拼接的重复图案,可用于壁纸、地板
–niji,使用专门动漫和漫画风格设计的版本生成图片,如 –niji 6
–iw,使用单张或多张参考图作为生图的参考,结合提示词生图,0~3,值越大参考程度越大,如 https://xxx/图片url A woman xxx, –iw 1.5
–cref,角色一致性,可与–cw配合使用,可设定生产图片的风格和参考图片的风格相似度,cw越大、可排斥生产图片和参考图片五官、服饰基本一样,如 Science ficton warrior…, –cref https://xxxx/参考图片地址 –cw 100
–sref,参考风格图像,如 –sref retro sculpture, –sref https://xxx/图片地址 –sw 500

Hello World

css-display-flex各种居中对齐,强迫症的福音

先看页面效果

html+css:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
...
    <style>
        div.main{
            margin-left: 2%; width :96%;
            .title{
                width: 100%;display: flex;justify-content: space-between;
                align-items: center;padding: 10px 0;line-height: 16px;
                span{
                    font-size: 16px;color: #333;width: 200px; text-align: left;
                }
                >div{/*右侧单号、箭头*/
                    display: inline-flex;justify-content: right;align-items: center;width: 100px;
                    span{
                        font-size: 14px;color: #999;
                    }
                    img{
                        width: 14px; height: 14px; margin-right: -2px;/*修正png图的框框*/
                    }
                }
            }
            .content{
                width: 100%;
                .order{
                    background-color: #fff;border-radius: 5px;display: flex;
                    justify-content: space-between;align-items: center; margin: 10px 0;    
                    >img{/*商品图*/
                        width: 80px;height: 80px; border: 1px solid blue;
                        border-radius: 5px; margin: 10px;
                    }
                    >div{/*商品图右侧详情*/
                        display: inline-flex;flex-direction: column;
                        justify-content: space-between;align-items: center;
                        height: 80px;margin-right: 10px;
                        >div{/*单号、时间*/
                            display: flex; font-size: 16px;line-height: 16px;
                            span{
                                display:block;font-size: 16px;
                                color: #333;width: 200px;
                                text-align: left;width: 100%;
                            }
                            >span:last-child{/*时间*/
                                font-size: 11px;color: #999;text-align: right;
                            }
                        }
                        >span{/*商品名*/
                            display:inline-block;font-size: 18px;
                            color: #333;font-weight: 900;
                            text-align: left;width: 100%;
                        }
                        >span:last-child{/*规格*/
                            font-size: 11px;color: #999;
                            line-height: 12px;margin-top: -20px;/*拉进商品名与规格*/
                        }
 
                    }
                }
            }
        }
    </style>
    <div class="main">
        <div class="title">
            <span>近期订单</span>
            <div>
                <span>查看全部订单</span>
                <img src="arrow_right_small.png">
            </div>
        </div>
        <div class="content">
            <div class="order">
                <img src="IMG_1101.JPG">
                <div>
                    <div>        
                        <span>订单号: 123456789</span>
                        <span>2024-07-23 10:01:31</span>
                    </div>
                    <span>5090系列散热格窗............</span>
                    <span>红色、水冷款</span>
                </div>
 
            </div>
...

——-
over~~
后记:
记得上小学时,某日,学校请来村里老木匠,做桌椅。木匠逐个做好各种课桌的部件:桌子腿、桌面、桌洞底板,然后一个个部件拼接起来,再在接口处敲几个木削进去,一张桌子完工。老师盯着这一切,跟我们说:看到了吧,老师傅做东西就是有谱,每个部件都刚刚好,一个人轻松组装;这要是不靠谱的小年轻木匠,三五个人辅助也也不见的能拼到一起,而且拼出来桌子可能还桌腿不平摇摇晃晃
每次写页面、css,脑子里想的都是几个人辅助一起拼桌子的画面…虽然前有firebug、后有chrome的开发工具,各种页面布局,也是要反复测试才能勉强完成设计图的目标。当然,大部分时候都不能完全实现效果图,最后就彻底改成position: absolute,各种算坐标,绝对定位~~给人感觉就是:虽然呈现在眼前的貌似是一张桌子,但后面其实是各种钉子、角铁钉住、甚至胶带粘在一起的 O(∩_∩)O哈哈~
近期写小程序,再次开始搞css,发现display:flex“弹性盒模型”真的很好用,这里记个布局范式,便于以后查阅

AIGC 业界杂谈

AI谱曲与舞蹈

本文介绍两个好玩的AI工具,都是今年上半年新推出的,都是国外的的网站,趁现在不用魔法就能白嫖,有兴趣的可以试试:
第一个是AI作曲网站,suno.com,这是我用它谱的曲子,歌词是用chatgpt写的,大家可以听听效果
春之歌 >>
操作不复杂,只要在create页面,上传歌词、设定曲风就可以了
第二个是AI合成舞蹈,viggle.ai,这个用起来相对复杂一些,要选择一个舞蹈动作模版,再选一张四肢清晰的正脸照片,就可以了。这是它的官方宣传视频,

需要注意的是,一定要选正脸照片,否则AI可以能给换张脸^_^;一定要选四肢清晰的照片,不能是穿裙子之类的衣服,否则AI区分不出四肢,出来动作会很奇怪
——over
转载请注明出处: 昆仑的山头

日志 点点滴滴

如何给你的视频增加章节进度条

先说明一下,这篇文章讲的不是如何用代码实现mp4播放器的使用,而是讲在使用“剪映”编辑视频时,如何加入章节提示,并让其跟随视频播放进度向前走,类似下图这样

简单来说,分如下四步,我们结合剪映里的时间线来讲解:
1. 可动进度条:增加一个白场素材,拖到屏幕底端,设置合适的高度;给白场增加一个“线性蒙版”,旋转-90度、视频开始x=-960、结尾x=960,也就是撑到屏幕两端;加关键帧,使其可以显示出播放进度;降低不透明度,和源视频更贴合
2. 背景色:增加一个宽度和白场一样宽的文本框,加空格撑满;文本框“背景”里面加一个背景色,移到白场下面、降低不透明度
3. 章节分割线:增加文本框,增加“|”,调整大小、拖到章节分割位置;复制粘贴到各个段落分割位置
4. 章节说明文字:增加文本框,填写段落名称,拖到对应位置

ok,就是这样
(参考自B站:https://www.bilibili.com/video/BV1Gu4y1U7RM/?p=1&vd_source=87ddd0d31e13cad4e2c834825408fd9b)
——over
转载请注明出处: 昆仑的山头