AIGC

玩转StableDiffusion.3——使用tile把随手涂鸦变成美图

ControlNet的出现,在很大程度上弥补了StableDiffusion出图的不可控性,今天就来试试使用里面的tile预处理器,来将随手画的一个草图变成一棵逼真的老树,先看原图:

首先确保已经安装了ControNet插件,模型下载地址:https://huggingface.co/lllyasviel/ControlNet-v1-1/tree/main
“文生图”,输入关键字:1tree,masterpiece,best quality,选择ControNet,“启用”,上传上面的草图,预处理器选择“tile_resample”,模型选择“control_v11file_sd15_tile”,其他保持默认设置

点击“生成”,成品图:

怎么样,纹理细节补充的很完美吧^_^
有人说,同样的功能,“图生图”也能完成。那么,咱们就来比较一下,同样一张草图,“图生图”的输出结果

——over
转载请注明出处: 昆仑的山头

AIGC

玩转StableDiffusion.2——拒绝脸崩,ADtailer的使用

初试StableDiffusion,最容易碰到的问题就是成品脸部异常,表情诡异、甚至不是人脸。特别是当画面中人物较多,或清晰度较低时,出现这种问题的概率更高…比如下面

这时,可以把图片导入到“图生图”,然后逐个“局部重绘”,选中面部后重新渲染。缺点是,这样做太麻烦。那么,有没有更高效的解决方案?有的,插件ADtailer就可以解决这种问题。
ADtailer插件安装地址:https://github.com/bing-su/adetailer.git。安装后,还需要去huggingface下载对应的模型,地址:https://huggingface.co/Bingsu/adetailer/tree/main,下载里面的*.pt文件,放入stable-diffusion-webui/models/adetailer目录,“应用更改并重启”,回到“文生图”界面,选择“启用After Detailer”,“After Detailer模型”选择“face_yolov8n_v2.pt”,如下图

同样的关键字,点“生成”。这次,在图片初稿出现以后,会看到预览区域人物面部出现红框“face 0.x”的字样,这就是插件正在对面部做矫正:

成品:

除了矫正面部,ADtailer还可以选择多个单元,选择对应的模型,修复手部、身体
——over
转载请注明出处: 昆仑的山头

AIGC

玩转StableDiffusion.1 ——安装与试运行

去年曾经用手头mac本装过一次StableDiffusion,当时运行也成功了,但过了一段时间,突然就不行了。因当时忙于别事,没再深究。春节闲来无事,便准备在手头的windows台式机上试试。由于这台windows之前只用来玩游戏,比较“纯洁”,所以安装过程基本顺利。网上有很多StableDiffusion的安装教程,这里只说一下自己碰到的坑吧:python的版本要求。
开始没多想,直接先去python官网找最新版本的python安装,然后下载stable-diffusion-webui安装包,在已打开科学上网的前提下,启动里面的webui.bat,居然失败了…后来发现问题:StableDiffusion所使用的pytorch,python版本不能大于3.10.6。于是回头一路找python降级的方法~~看大家评价,好像不太容易。
那就换个思路吧,用conda装多版本~~安装conda以后,单独create一个AICG专用的python环境,然后将下面的语句加到webui.bat的靠前位置:
set PYTHON=C:/Dev/conda/envs/aipy3.10/python.exe
再次启动,OK,安装成功、web界面成功打开!
(后来才知道,国内有大神做的“秋叶安装包”,里面集成了环境、安装、模型管理等各种功能,NB到掉渣,大家有需要的,可以拿它试试)
~~测试效果,简单提示词这里就不放了,给个复杂点的:best quality,1girl,((color hair)),[pink:blue:pink:blue] hair,purple long dress,(1dog),flowers meadows,[red flower:0.5],[yellow flower::0.6],出来效果:


这里用的大模型是majicmixRealistic_v7,比较写实,效果还不错吧^_^
不过也有瑕疵,可能因为要素过多,裙子颜色、狗,都不太稳定,定义的花海颜色的生效时间也不太对
好在,脸比较完美o(* ̄︶ ̄*)o
~~当然,这么完美的脸,是用了魔法的,具体是什么,下次再说^_^
————
对了,补充一句:相对mac的m1max,StableDiffusion在3080显卡上的出图速度提升了不下5倍,小分辨率的基本都是秒出!!
——over
转载请注明出处: 昆仑的山头

Hello World

pandas日期的高效处理方法

每次碰到dataframe里有datetime字段,都会感觉很麻烦,明明知道pandas里有很多批量处理的方法,但一个datetime改字符串日期,之前试过过很多写法,都不成功,又不甘心用低效的apply,于是动个小聪明,直接前置到提取数据的sql里:SUBSTR(created,1,10) day ^_^
今天又碰到这类问题,数据来源十几张表,而且是之前现成的公共模块,不好随便改sql,无奈找pandas里的处理方法,这次居然轻而易举找到了:
df[‘day’] = df[‘created’].dt.strftime(‘%Y-%m-%d’)
嗯,其实就这么简简单单一行代码~~继而好奇进一步研究了这里面的“dt”对象,除了搭配strftime()做日期格式化,还可以直接dt.year/dt.month/dt/time/dt.quarter/dt.weekday,还有dt.dayofyear/dt.weekofyear,哈哈,没错,可以理解成里面藏了一个map
除了这些,还可以类似这么用:(df[‘日期1’] – df[‘日期2’]).dt.days、(df[‘日期1’] – df[‘日期2’]).dt.total_seconds()

Hello World

dataframe拆字段

比如,数据源某字段格式:“13/34”,来表示门店每日的新老用户数,现在要把它拆成两个字段,以便下一步分析使用。当然,我们首先肯定想到可以apply,可是如果数据量太大,apply就会变得很慢。那么,有没有更快的办法?
当然有了,毕竟pandas总不会让我们失望
df[‘new’], df[‘old’] = df[‘user_count’].str.split(‘/’, 1).str
简简单单一行代码就完成了

———
over, 参考:https://zhuanlan.zhihu.com/p/343895339

Hello World

pandas之pivot_table的使用

pivot_table是将多行数据转成多列的一个函数,作用类似exce的透视表,这里咱们先看一下它的实际处理效果:

再看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
#构建测试数据
df = pd.DataFrame({
	'品类': ['苹果', '橘子', '香蕉', '橘子', '香蕉', '橘子'],
	'日期': ['2023-10-21', '2023-10-21', '2023-10-21', '2023-10-22', '2023-10-23','2023-10-23'],
	'销量': [13, 24, 25, 27, 19, 21]
	},
	columns=['品类', '日期', '销量']
)
print(df)
#日期列转行 index 行索引,columns 要转为列名的行,values 要转为列值的行
df2 = pd.pivot_table(df, index=['品类'], columns=['日期'], values=['销量'])
df2.fillna(0, inplace=True)
print(df2)

———-
over,转载请注明出处:http://www.jiangkl.com/2023/10/pivot_table

Hello World

macOS to_pickle的一个小坑

本地数据分析,mysql提取初始数据后,中间数据准备用pkl暂存,但是实际执行,to_pickle这行报错了:
OSError: [Errno 22] Invalid argument
简单搜了一下解决方案,定位在”pkl对象太大,大于2G,macos无法直接dump”,解决方案是分批存:

不过我没按上面这个方法做,而是用了更偷懒的分段方法:分成两个dkl保存~~(*^▽^*)

Hello World

Label对Drawcall的影响测试

众所周知,drawcall的数量是影响CocosCreator流畅度的一个重要指标,本文主要测试Label与Sprite混排时对性能的影响,主要有下面几个对照量:
1. 运行环境,共三种:
    a. mac端chrome浏览器(开启开发者工具、尺寸模拟iphon12pro)
    b. iphone(8plus)自带浏览器
    c. android(其实是鸿蒙、麒麟820/6G运存)自带浏览器
2. Label属性CacheMode,这里节选一下官方文档:
    a. None: 默认值,Label 中的整段文本将生成一张位图
    b. BitMap: 选择后,Label 中的整段文本仍将生成一张位图,但是会尽量参与 动态合图。只要满足动态合图的要求,就会和动态合图中的其它 Sprite 或者 Label 合并 Draw Call。由于动态合图会占用更多内存,该模式只能用于文本不常更新的 Label
    c. Char: 原理类似 BMFont,Label 将以“字”为单位将文本缓存到全局共享的位图中,相同字体样式和字号的每个字符将在全局共享一份缓存。能支持文本的频繁修改,对性能和内存最友好……不能参与动态合图(同样启用 CHAR 模式的多个 Label 在渲染顺序不被打断的情况下仍然能合并 Draw Call)
3. 节点形态:每一个精灵节点下,加一个Label子节点;精灵节点简单转动或摆动;Label仅显示数字,使用系统字体;测试过程共分三种情况:50/200/1000个节点
4. Label节点除了会修改CacheMode,还会尝试两种情况:不修改文案内容、每秒修改一次文案内容
基本的测试要素就是上面这些,下面来看测试结果

简单总结几个结论:
1. 就像文档里说的,对于固定内容的Label,BitMap确实对性能有巨大帮助,可以通过合批最大程度减少Drawcall
2. 对于Label和Sprite混排的情况,文本如果还要频繁更新,性能必然会受影响,如果预期这类节点数量很多,一定不能这么做
3. 虽然测试用的chrome浏览器已经开启了硬件加速,但或许是对m1mac的适配不好,这次测试chrome浏览器的表现完败,甚至不如六年前的iphone手机。(试了一下mac自带的safar浏览器,表现和iphone手机浏览器差不多)
那么,针对上面提到的第二条,如果确实需要大量、频繁更新的文本,应该怎么办?看文档大概有下面两种解决方案:
1. 使用艺术字图集代替系统字体
2. 将Label节点提出来,不要和Sprite混编
后续有时间试试这两种方案的效果 o(* ̄︶ ̄*)o
————
转载请注明出处:http://www.jiangkl.com/2023/04/cocos_label_drawcall
————
补充:
继续上面的话题,按照第2个解决方案对项目做了“优化”,也就是将所有的Label提取出来,单独放在一个节点了,和Sprite区隔开,测试结果:
1000个节点的情况下,三个端都能轻松运行,FPS 60,Drawcall 5,成功将1000个Label合批到一个Drawcall!

Hello World

闪展腾挪,只为避开apply

apply是pandas一个强大的工具函数,可以逐行对数据进行操作。pandas的优点很多,比如代码简洁、相对直接遍历效率更高;但它的“效率高”是相对的,相对于merge之类的操作,apply的执行时间可能会高出两个数量级。比如下面这行:

1
2
  #为订单数据集增加以后一列:微信支付的金额
  df['pay_wx'] = df.apply(lambda x: (x.pay if x.chan == 'wx' else 0), axis=1)

从上面的代码看,逻辑非常简洁,但是实际测试,50万的数据量,要20秒。下面尝试改造一下

1
2
3
4
  df_wx = df[df['chan'] == 'wx']
  df_wx.rename(columns={'pay': 'pay_wx'}, inplace=True)
  df['pay_wx'] = df_wx['pay_wx']
  df.fillna({'pay_wx': 0}, inplace=True)

代码从一行变成了四行,不过执行效率可以高很多:50万数据,时间大约0.7秒
当然,方法不止一种,对于更见的判断条件,可以直接用merge操作:

1
2
3
4
5
6
7
8
9
10
  #合并某项分类依据
  df['color'] = df.apply(lambda x: ('红' if x.color == '粉红' else x.color), axis=1)
  #使用merge优化
  df_h = df[df['color'] == '粉红'][['id', 'color']]
  df_h['color'] = '红'
  df_nh = df[df['color'] != '粉红'][['id', 'color']]
  df_hs = pd.concat([df_h, df_nh])
  df_hs.rename(columns={'color':'color2'}, inplace=True)
  df = pd.merge(df, df_h, on='id', how='left')
  df['color'] = df['color2']

通过上面这种方法改造,执行时间和第一个方法接近,50万条数据大约0.8秒

———–
转载请注明出处:http://www.jiangkl.com/2022/12/no_apply

他山石 梦游记 美图酷图

峨眉山

记得读高中时,有个爱看武侠的同学,每次见到我都会来一句“你怎么不叫蒋峨眉?”

哈哈,对于大部分非四川的同学,估计都是在“倚天屠龙记”里第一次听说峨眉山,而且大概率是李连杰电影版的倚天屠龙记——“围攻光明顶”可算是金庸武侠的名场面之一。不过,小说里的光明顶在昆仑山,可其实光明顶在峨眉~~O(∩_∩)O哈哈~。另外,小说里峨眉派是道教,可现实是,魏晋时峨眉确实道教兴盛,但到了隋唐,佛教盛行,到明清时,峨眉基本就只有佛寺了,而且成了传说中“普贤菩萨的道场”。再到当代,更是“佛教四大名山之一”,山上分布着大大小小十几处寺庙

这次出来,本来目标是“318国道-拉萨-珠峰大本营”一线,顺道去了张家界和黄山,既然路过四川,也就顺便把峨眉山也逛了。从张家界到峨眉山市,又是一千公里,一天时间刚好。

峨眉山月半轮秋,影入平羌江水流。
夜发清溪向三峡,思君不见下渝州。
——李白 《峨眉山月歌》

峨眉第一亭

峨眉山

一首隔壁眉州老乡的思乡词

归去来兮,吾归何处?万里家在岷峨。
百年强半,来日苦无多。
坐见黄州再闰,儿童尽楚语吴歌。
山中友,鸡豚社酒,相劝老东坡。
云何,当此去,人生底事,来往如梭。
待闲看秋风,洛水清波。
好在堂前细柳,应念我,莫剪柔柯。
仍传语,江南父老,时与晒渔蓑。
——苏轼 《满庭芳·归去来兮》

山亭

万年寺

接引殿

洗象池

清音阁

一线天

一线天,换个角度

金顶

当然,峨眉山最有名的,还有它的猴子

峨眉猴

峨眉猴

最后,来一首李白版的“月亮代表我的心”

我在巴东三峡时,西看明月忆峨眉。
月出峨眉照沧海,与人万里长相随。
黄鹤楼前月华白,此中忽见峨眉客。
峨眉山月还送君,风吹西到长安陌。
长安大道横九天,峨眉山月照秦川。
黄金狮子乘高座,白玉麈尾谈重玄。
我似浮云殢吴越,君逢圣主游丹阙。
一振高名满帝都,归时还弄峨眉月。
——李白 《峨眉山月歌送蜀僧晏入中京》