当幻想的小说来到现实——基于stable diffusion的小说插画生成

引言

近期文生图大火,而这也激发了我曾经的玄幻小说插画梦,将玄幻带到现实,可惜本人手残,但能用ai作自己梦中的画也是不错的。

先简单介绍一下下stable diffusion

Stable Diffusion 是由 CompVisStability AILAION 的研究人员和工程师开源的文图生成模型。他们使用LAION-5B 数据库子集的512x512大小的图像进行训练。LAION-5B 是目前存在的最大、可免费访问的数据集。

在本篇Notebook中,我们将通过PaddleNLP框架中的Taskflow来调用Stable Diffusion模型,从而可以快速进行AI图像创作。

一、项目简介

  • 要达成的目标是:把看到的小说内容用图画展示出来,也就是给我们所喜爱的小说画个我们梦里的插图
  • 主要思路是:先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

此文章为搬运
原项目链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐