当幻想的小说来到现实——基于stable diffusion的小说插画生成
ocr提取小说摘要,生成小说插画,将梦里小说的模样带到现实。
当幻想的小说来到现实——基于stable diffusion的小说插画生成
引言
近期文生图大火,而这也激发了我曾经的玄幻小说插画梦,将玄幻带到现实,可惜本人手残,但能用ai作自己梦中的画也是不错的。
先简单介绍一下下stable diffusion
Stable Diffusion 是由 CompVis、Stability AI 和 LAION 的研究人员和工程师开源的文图生成模型。他们使用LAION-5B 数据库子集的512x512大小的图像进行训练。LAION-5B 是目前存在的最大、可免费访问的数据集。

在本篇Notebook中,我们将通过PaddleNLP框架中的Taskflow来调用Stable Diffusion模型,从而可以快速进行AI图像创作。
- 论文地址:High-Resolution Image Synthesis with Latent Diffusion Models
- 原版模型:https://github.com/CompVis/stable-diffusion
- pytorch版模型:https://huggingface.co/CompVis/stable-diffusion
- Huggingface团队有关该模型的介绍:https://huggingface.co/blog/stable_diffusion (强烈建议阅读一下该blog!)
一、项目简介
- 要达成的目标是:把看到的小说内容用图画展示出来,也就是给我们所喜爱的小说画个我们梦里的插图
- 主要思路是:先ocr提取文本,然后提取摘要,然后生成图片
- 提取文本用到了paddleocr
- 提取摘要使用paddlehub调用文心大模型
- 生成图片采用stable diffusion模型
运行本项目最好采用了v100 32g的算力 以防算力不够无法运行
二、安装相关包
主要是hub、paddlenlp、和一些其它的依赖包
注意paddlenlp得版本得大于2.3.0 不然会报错
!pip install --upgrade paddlepaddle-gpu
!pip install paddlenlp==2.4.0
!pip install shapely -i https://pypi.tuna.tsinghua.edu.cn/simple
!pip install pyclipper -i https://pypi.tuna.tsinghua.edu.cn/simple
!pip install regex
!pip install --upgrade paddlehub
三、加载相关的数据
即我们所看到的小说章节的图片
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
test_img_path = ["./dopocangqiong.png"]
img1 = mpimg.imread(test_img_path[0])
plt.figure(figsize=(10,10))
plt.imshow(img1)
plt.axis('off')
plt.show()
<Figure size 1000x1000 with 1 Axes>
四、加载ocr预训练模型并提取文本
import paddlehub as hub
# 加载移动端预训练模型
ocr = hub.Module(name="chinese_ocr_db_crnn_mobile")
[2022-10-20 11:39:25,339] [ WARNING] - The _initialize method in HubModule will soon be deprecated, you can use the __init__() to handle the initialization of the object
import cv2
# 读取测试文件夹test.txt中的照片路径
np_images =[cv2.imread(image_path) for image_path in test_img_path]
results = ocr.recognize_text(
images=np_images, # 图片数据,ndarray.shape 为 [H, W, C],BGR格式;
use_gpu=False, # 是否使用 GPU;若使用GPU,请先设置CUDA_VISIBLE_DEVICES环境变量
output_dir='ocr_result', # 图片的保存路径,默认设为 ocr_result;
visualization=False, # 是否将识别结果保存为图片文件;
box_thresh=0.5, # 检测文本框置信度的阈值;
text_thresh=0.5) # 识别中文文本置信度的阈值;
pro=''
for result in results:
data = result['data']
save_path = result['save_path']
for infomation in data:
print('text: ', infomation['text'], '\nconfidence: ', infomation['confidence'], '\ntext_box_position: ', infomation['text_box_position'])
pro+=infomation['text']
print(pro)
[2022-10-20 11:39:26,055] [ WARNING] - The _initialize method in HubModule will soon be deprecated, you can use the __init__() to handle the initialization of the object
text: 云雾硫韵庞大山脉,在此刻就犹如一头即将苏醒的远古凶兽般,一道道低沉的轰隆隆声响,从山
confidence: 0.9596802592277527
text_box_position: [[34, 8], [724, 8], [724, 26], [34, 26]]
云雾硫韵庞大山脉,在此刻就犹如一头即将苏醒的远古凶兽般,一道道低沉的轰隆隆声响,从山
text: 脉高空中传出,而且伴随着这股巨响出现的,还有着那铺天盖地的浩瀚能量
confidence: 0.9882534146308899
text_box_position: [[31, 35], [564, 35], [564, 53], [31, 53]]
云雾硫韵庞大山脉,在此刻就犹如一头即将苏醒的远古凶兽般,一道道低沉的轰隆隆声响,从山脉高空中传出,而且伴随着这股巨响出现的,还有着那铺天盖地的浩瀚能量
text: “!
confidence: 0.6421520709991455
text_box_position: [[42, 81], [85, 81], [85, 96], [42, 96]]
云雾硫韵庞大山脉,在此刻就犹如一头即将苏醒的远古凶兽般,一道道低沉的轰隆隆声响,从山脉高空中传出,而且伴随着这股巨响出现的,还有着那铺天盖地的浩瀚能量“!
text: 浓郁云雾中,浩瀚的能量急速翻涌,到得最后,甚至是传出了犹如海浪翻涌般的浪花声音,这奇异一
confidence: 0.9763447046279907
text_box_position: [[32, 128], [730, 128], [730, 145], [32, 145]]
云雾硫韵庞大山脉,在此刻就犹如一头即将苏醒的远古凶兽般,一道道低沉的轰隆隆声响,从山脉高空中传出,而且伴随着这股巨响出现的,还有着那铺天盖地的浩瀚能量“!浓郁云雾中,浩瀚的能量急速翻涌,到得最后,甚至是传出了犹如海浪翻涌般的浪花声音,这奇异一
text: 幕,令得不少人皆是惊叹出声,大自然果然无奇不有。
confidence: 0.9802252650260925
text_box_position: [[32, 152], [407, 153], [407, 171], [32, 170]]
云雾硫韵庞大山脉,在此刻就犹如一头即将苏醒的远古凶兽般,一道道低沉的轰隆隆声响,从山脉高空中传出,而且伴随着这股巨响出现的,还有着那铺天盖地的浩瀚能量“!浓郁云雾中,浩瀚的能量急速翻涌,到得最后,甚至是传出了犹如海浪翻涌般的浪花声音,这奇异一幕,令得不少人皆是惊叹出声,大自然果然无奇不有。
text: 庞大的能量潮汐,伴随着涌动,片刻后,居然是直接冲出了云雾,哗啦啦的急速扩散而出,弦得一些
confidence: 0.9574014544487
text_box_position: [[31, 199], [736, 199], [736, 217], [31, 217]]
云雾硫韵庞大山脉,在此刻就犹如一头即将苏醒的远古凶兽般,一道道低沉的轰隆隆声响,从山脉高空中传出,而且伴随着这股巨响出现的,还有着那铺天盖地的浩瀚能量“!浓郁云雾中,浩瀚的能量急速翻涌,到得最后,甚至是传出了犹如海浪翻涌般的浪花声音,这奇异一幕,令得不少人皆是惊叹出声,大自然果然无奇不有。庞大的能量潮汐,伴随着涌动,片刻后,居然是直接冲出了云雾,哗啦啦的急速扩散而出,弦得一些
text: 停留天空的人影急忙闪掠而下,若是被那股恐怖的能量潮席卷而进,即便是斗宗强者,恐怕不死也
confidence: 0.9774854779243469
text_box_position: [[32, 224], [735, 224], [735, 242], [32, 242]]
云雾硫韵庞大山脉,在此刻就犹如一头即将苏醒的远古凶兽般,一道道低沉的轰隆隆声响,从山脉高空中传出,而且伴随着这股巨响出现的,还有着那铺天盖地的浩瀚能量“!浓郁云雾中,浩瀚的能量急速翻涌,到得最后,甚至是传出了犹如海浪翻涌般的浪花声音,这奇异一幕,令得不少人皆是惊叹出声,大自然果然无奇不有。庞大的能量潮汐,伴随着涌动,片刻后,居然是直接冲出了云雾,哗啦啦的急速扩散而出,弦得一些停留天空的人影急忙闪掠而下,若是被那股恐怖的能量潮席卷而进,即便是斗宗强者,恐怕不死也
text: 得脱层皮。
confidence: 0.959040641784668
text_box_position: [[30, 249], [102, 251], [102, 270], [30, 268]]
云雾硫韵庞大山脉,在此刻就犹如一头即将苏醒的远古凶兽般,一道道低沉的轰隆隆声响,从山脉高空中传出,而且伴随着这股巨响出现的,还有着那铺天盖地的浩瀚能量“!浓郁云雾中,浩瀚的能量急速翻涌,到得最后,甚至是传出了犹如海浪翻涌般的浪花声音,这奇异一幕,令得不少人皆是惊叹出声,大自然果然无奇不有。庞大的能量潮汐,伴随着涌动,片刻后,居然是直接冲出了云雾,哗啦啦的急速扩散而出,弦得一些停留天空的人影急忙闪掠而下,若是被那股恐怖的能量潮席卷而进,即便是斗宗强者,恐怕不死也得脱层皮。
text: 巨大的能量潮汐成五彩斑澜颜色,在阳光的照射下,犹如条宽故无比的五彩河流,横挂天空,绚丽
confidence: 0.9573021531105042
text_box_position: [[34, 297], [728, 297], [728, 315], [34, 315]]
云雾硫韵庞大山脉,在此刻就犹如一头即将苏醒的远古凶兽般,一道道低沉的轰隆隆声响,从山脉高空中传出,而且伴随着这股巨响出现的,还有着那铺天盖地的浩瀚能量“!浓郁云雾中,浩瀚的能量急速翻涌,到得最后,甚至是传出了犹如海浪翻涌般的浪花声音,这奇异一幕,令得不少人皆是惊叹出声,大自然果然无奇不有。庞大的能量潮汐,伴随着涌动,片刻后,居然是直接冲出了云雾,哗啦啦的急速扩散而出,弦得一些停留天空的人影急忙闪掠而下,若是被那股恐怖的能量潮席卷而进,即便是斗宗强者,恐怕不死也得脱层皮。巨大的能量潮汐成五彩斑澜颜色,在阳光的照射下,犹如条宽故无比的五彩河流,横挂天空,绚丽
text: 无比,然而就是在这幅绚丽之下,卸是隐藏着致命般的危机
confidence: 0.9849212169647217
text_box_position: [[35, 325], [453, 325], [453, 339], [35, 339]]
云雾硫韵庞大山脉,在此刻就犹如一头即将苏醒的远古凶兽般,一道道低沉的轰隆隆声响,从山脉高空中传出,而且伴随着这股巨响出现的,还有着那铺天盖地的浩瀚能量“!浓郁云雾中,浩瀚的能量急速翻涌,到得最后,甚至是传出了犹如海浪翻涌般的浪花声音,这奇异一幕,令得不少人皆是惊叹出声,大自然果然无奇不有。庞大的能量潮汐,伴随着涌动,片刻后,居然是直接冲出了云雾,哗啦啦的急速扩散而出,弦得一些停留天空的人影急忙闪掠而下,若是被那股恐怖的能量潮席卷而进,即便是斗宗强者,恐怕不死也得脱层皮。巨大的能量潮汐成五彩斑澜颜色,在阳光的照射下,犹如条宽故无比的五彩河流,横挂天空,绚丽无比,然而就是在这幅绚丽之下,卸是隐藏着致命般的危机
五、对提取文本生成摘要
这里有两个轻量模型的选择,一个是使用hub调用文心ernie_zeus,另一个则是使用paddlenlp的taskflow调用文本摘要模型,这部分也建议自训练一个模型进行使用,这可以使得我们的插画更加符合我们的梦境。
# 准备生成摘要所需的接口
# 加载模型
# model = hub.Module(name='ernie_zeus')
from paddlenlp import Taskflow
summarizer = Taskflow("text_summarization")
# 文本摘要
# print(pro)
# result = model.custom_generation(pro)
# txt_smr = result
# print(txt_smr)
result =summarizer(pro)
txt_smr=result
print(txt_smr)
在摘要的基础上增加我们个人的梦境因素的prompt使得生成的插画更加符合我们梦里的模样。
prompt_add=["云雾环绕的高山 , 阳光盛大,五彩河流,仙境 ,数字艺术"]
txt_smr=txt_smr[0]+prompt_add[0]
print(txt_smr)
《幻城》云雾硫韵能量潮汐成五彩斑澜颜色云雾环绕的高山 , 阳光盛大,五彩河流,仙境 ,数字艺术
由于stable diffusion是一个英文模型,所以我们需要将这些我们提取的文本摘要翻译成英文。
这边我们使用paddlehub中内置的文本翻译模型,轻量且准确率高。
#文本翻译
import paddlehub as hub
model = hub.Module(name='transformer_zh-en', beam_size=5)
src_texts = [txt_smr]
n_best = 3 # 每个输入样本的输出候选句子数量
trg_texts = model.predict(src_texts, n_best=n_best)
print(trg_texts)
六、基于stable diffusion插画生成
用于使用hub调用stable diffusion不太稳定,所以我们还是使用paddlenlp的taskflow对stable进行调用
from PIL import Image
# module = hub.Module(name='stable_diffusion')
text_to_image = Taskflow("text_to_image", model="CompVis/stable-diffusion-v1-4")
prompt = [
trg_texts[2]+",novel cover,Makoto Shinkai style,hot-blooded,4k"
]
image_list = text_to_image(prompt)
for batch_index, batch_image in enumerate(image_list):
# len(batch_image) == 2 (num_return_images)
for image_index_in_returned_images, each_image in enumerate(batch_image):
each_image.save(f"stable-diffusion-figure_{batch_index}_{image_index_in_returned_images}.png")
display(image_list[batch_index][image_index_in_returned_images])
[2022-10-20 11:40:35,667] [ INFO] - Downloading tokenizer_config.json from https://bj.bcebos.com/paddlenlp/models/community/CompVis/stable-diffusion-v1-4/tokenizer_config.json
100%|██████████| 194/194 [00:00<00:00, 120kB/s]
[2022-10-20 11:40:35,779] [ INFO] - We are using <class 'paddlenlp.transformers.clip.tokenizer.CLIPTokenizer'> to load 'CompVis/stable-diffusion-v1-4'.
[2022-10-20 11:40:35,782] [ INFO] - Downloading https://bj.bcebos.com/paddlenlp/models/community/CompVis/stable-diffusion-v1-4/vocab.json and saved to /home/aistudio/.paddlenlp/models/CompVis/stable-diffusion-v1-4
[2022-10-20 11:40:35,785] [ INFO] - Downloading vocab.json from https://bj.bcebos.com/paddlenlp/models/community/CompVis/stable-diffusion-v1-4/vocab.json
100%|██████████| 842k/842k [00:00<00:00, 9.27MB/s]
[2022-10-20 11:40:35,964] [ INFO] - Downloading https://bj.bcebos.com/paddlenlp/models/community/CompVis/stable-diffusion-v1-4/merges.txt and saved to /home/aistudio/.paddlenlp/models/CompVis/stable-diffusion-v1-4
[2022-10-20 11:40:35,966] [ INFO] - Downloading merges.txt from https://bj.bcebos.com/paddlenlp/models/community/CompVis/stable-diffusion-v1-4/merges.txt
100%|██████████| 512k/512k [00:00<00:00, 3.26MB/s]
[2022-10-20 11:40:36,192] [ INFO] - Downloading https://bj.bcebos.com/paddlenlp/models/community/CompVis/stable-diffusion-v1-4/added_tokens.json and saved to /home/aistudio/.paddlenlp/models/CompVis/stable-diffusion-v1-4
[2022-10-20 11:40:36,194] [ INFO] - Downloading added_tokens.json from https://bj.bcebos.com/paddlenlp/models/community/CompVis/stable-diffusion-v1-4/added_tokens.json
100%|██████████| 2.00/2.00 [00:00<00:00, 1.16kB/s]
[2022-10-20 11:40:36,269] [ INFO] - Downloading https://bj.bcebos.com/paddlenlp/models/community/CompVis/stable-diffusion-v1-4/special_tokens_map.json and saved to /home/aistudio/.paddlenlp/models/CompVis/stable-diffusion-v1-4
[2022-10-20 11:40:36,271] [ INFO] - Downloading special_tokens_map.json from https://bj.bcebos.com/paddlenlp/models/community/CompVis/stable-diffusion-v1-4/special_tokens_map.json
100%|██████████| 478/478 [00:00<00:00, 289kB/s]
[2022-10-20 11:40:36,347] [ INFO] - Already cached /home/aistudio/.paddlenlp/models/CompVis/stable-diffusion-v1-4/tokenizer_config.json
[2022-10-20 11:40:36,350] [ WARNING] - ftfy or spacy is not installed using BERT BasicTokenizer instead of ftfy.
[2022-10-20 11:40:36,423] [ INFO] - Downloading model_config.json from https://bj.bcebos.com/paddlenlp/models/community/CompVis/stable-diffusion-v1-4/model_config.json
100%|██████████| 661/661 [00:00<00:00, 490kB/s]
[2022-10-20 11:40:36,503] [ INFO] - We are using <class 'paddlenlp.transformers.clip.modeling.CLIPForImageGeneration'> to load 'CompVis/stable-diffusion-v1-4'.
[2022-10-20 11:40:36,505] [ INFO] - Downloading https://bj.bcebos.com/paddlenlp/models/community/CompVis/stable-diffusion-v1-4/model_state.pdparams and saved to /home/aistudio/.paddlenlp/models/CompVis/stable-diffusion-v1-4
[2022-10-20 11:40:36,507] [ INFO] - Downloading model_state.pdparams from https://bj.bcebos.com/paddlenlp/models/community/CompVis/stable-diffusion-v1-4/model_state.pdparams
100%|██████████| 5.10G/5.10G [01:46<00:00, 51.7MB/s]
[2022-10-20 11:42:22,633] [ INFO] - Already cached /home/aistudio/.paddlenlp/models/CompVis/stable-diffusion-v1-4/model_config.json
0it [00:00, ?it/s]
0it [00:00, ?it/s]
display(image_list[0][0])
七、个人建议和总结
- 不建议生成的插画里面包含捏脸的元素,可能很大程度上带来感官不适应。
- 非常欢迎生成景色插画,这个在本项目可以有较好的生成效果。
- 未来期待,将文本摘要部分进行自训练,这样可以让效果达到更佳。
- 当然如果用可能,将sd改成可中文的也是不错的可惜本人能力不行(bushi)
如果大家想要尝试用stable diffusion捏脸
欢迎大家使用军哥写的项目来调参
四行PaddleNLP代码体验Stable Diffusion:https://aistudio.baidu.com/aistudio/projectdetail/4459390?sUid=590128&shared=1&ts=1666097025761
此文章为搬运
原项目链接
更多推荐
所有评论(0)