OpenCV与AI深度学习 | 实战!利用多模态大模型生成绘本

news2024/9/23 15:23:18

本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。

原文链接:实战!利用多模态大模型生成绘本【文末送书】

🚀 引言

在数字时代,技术与创意的结合不断刷新我们的世界观。今天,我们要探索的是一个充满魔法的领域——AI绘本生成!想象一下,孩子们只需轻声说出想法,AI就能为他们绘制出一本本独一无二的绘本,这不再是梦!🌈

🧠 AI的想象力:从想法到绘本

AI如何理解孩子的奇思妙想?从简单的想法到丰富多彩的绘本,这背后可以凭借AI强大的想象力和创造力来实现。🤩这篇文章就带大家从头开始创建一个AIGC应用:“漫画家”,一句话就可以生成一篇绘本。

📚 故事生成:大语言模型的力量

故事是绘本的主题,一个好的故事更能引人入胜,勾起孩子们的兴趣📚。因此,我们需要一个可以自动生成故事的功能🛠️。大语言模型具有强大的文本生成能力,以ChatGPT为例,它写出的故事在一致性、流畅性等方面已经非常强悍了👍,对于人物名字、人物关系和环境的理解也很合理👥🌳。但是,生成的故事可能会过于平凡,缺乏细节和亮点😕。因此,我们需要在故事生成功能的开发中,考虑如何增加故事的吸引力✨,例如,增加一些惊喜和翻转的情节🎉,或者让故事更具有趣味性和教育性🎨📖。

我们选择调用百度文心一言的API来实现故事生成功能,并且使用了一种基于迭代反馈的策略来提升故事的趣味性和吸引力。如果有条件,也可以选择自行收集数据集,专门微调一个故事生成的模型。

我们的策略主要分为三个阶段,第一阶段,我们通过提供故事的背景信息,引导模型生成故事的初稿。在这个阶段,我们的指令是这样的:

你是一位优秀的儿童故事作家,现在你要写一篇童话故事,并通过这个故事传递深刻的哲理和思考。
接下来我给你几个关键信息:{key message}

然后,请你试着以这样的步骤逐步思考:
1.提炼核心思想,从关键信息中找出最主要的思想或主题,这将是故事的核心。
2.将核心思想与儿童故事相连接,创作一个富有想象力的世界,以及生动可爱的角色。
3.起一个有吸引力,充满童话色彩的标题,应当简短、生动,同时也要能够反映故事主题。
4.采用小朋友可以听懂的知识,不要使用太过复杂或专业的词汇。
5.儿童故事是一个充满了想象力和幻想色彩的世界,可以通过夸张、象征等手段来塑造故事中的角色和情节。
6.可以使用拟人的修辞手法,赋予鸟兽虫鱼、花草树木、家具、玩具等生命,使他们拥有人的思想感情。
7.童话故事应当表现出我们对美好的向往和追求,让孩子们在听故事的时候能够学到知识,同时也能够感受到快乐。
8.最后,你应当创作出独一无二的、具有强烈个性的儿童故事,让每一个故事都能够给孩子们留下深刻的印象。
输出格式:基于上述的要求,把关键信息融入儿童故事进行创作,不要输出无关内容和提示信息,直接生成故事,字数在500字左右。

第二阶段,我们让模型基于初稿给出调整优化的修改建议。在这个阶段,我们的指令是这样的:

你认为你所创作的这个故事,有哪些可以改进的地方么?是否存在一些创新的策略,能够使得您的故事更具有吸引力,增加悬念,同时也更具有启发性呢?
在你的创作过程中,考虑一下是否可以引入更多独特和精彩的情节来提升故事的吸引力。这些情节可以是出乎意料的转折,也可以是描绘角色的深度矛盾,或是通过富有哲理的对白为故事增色。
同时,为了提升故事的悬念,您可以尝试通过布置一些未解的谜团,或者在故事的早期阶段就设置一些伏笔,让读者对故事的结局充满期待。
至于如何增加启发性,您可以在故事中加入一些深层次的主题和思考,让读者在享受故事的同时,也能从中领悟到一些人生的真理,或是对于人性、社会等话题的深入思考。
请只给出建议,不要再输出故事内容。

第三阶段,我们让模型基于反馈的建议进行迭代,对初稿再进行修改。在实践中,我们发现文心一言经常会生成一些提示性的信息,因此我们也需要通过指令限制模型不要生成这些信息。在这个阶段,我们的指令是这样的:

请你按照上述修改建议,对初稿故事进行再次修改。请直接输出故事内容,不要给出任何提示信息,例如,不要生成类似“好的,以下是按照您修改建议对初稿故事进行再次修改后的版本”等内容。

这种策略的基本逻辑是,首先我们通过提供一些基本的信息和指令,引导模型生成一个大致的故事初稿。然后,我们再让模型自我批评,给出改进的建议。最后,我们让模型根据这些建议,对故事进行修改和优化。通过这个过程,我们可以逐步引导模型生成出我们想要的故事。

🎨 插画生成:AI的画笔

在儿童故事中,插图的作用是无可替代的🎨📚。可以说,如果故事没有插图,那就像是失去了灵魂🕊️,就如同歌曲失去了旋律一般🎶。对于孩子们来说,插图不仅能激发他们的想象力💡✨,还能帮助他们更好地理解和吸收故事的内容📖。有时候,孩子们甚至能从插图中学到更多的知识📚,这是单纯的文字所无法比拟的📝。

然而,要想让这些AI绘图工具发挥出最大的效果,我们还需要一位了解孩子心理和喜好的专业插画家来提供创作提示。他们能够根据故事的主题和孩子们的喜好,设计出引人入胜的插画内容,并将其提炼成具体的关键词或短句,引导AI工具进行插图创作。

恰好,大语言模型也能够扮演此类角色,通过设置给定的身份,它就能够在此身份下一定程度上完成所给的任务。以下是我们用来让大语言模型根据给定的描述生成Stable Diffusion提示词的提示词:

你是一位专业的儿童插画家和Stable Diffusion提示词专家,不仅具有丰富的绘画技巧和想象力,还对孩子们的心理有深入的理解,知道他们喜欢什么样的插画。你能设计出极具创新性并且能吸引儿童的插画和AI绘画提示词。
提示词是用来引导AI绘画模型创作图像的关键词或短句。它们可以描述图像的各种具体细节,例如人物的外观、背景的环境、颜色的搭配和光线的效果,以及图像的主题和风格。提示词的格式通常包含在括号内的加权数字,这些数字用于指示某些细节的重要性或强调程度。例如,"(masterpiece:1.5)"表示作品的艺术品质是非常重要的。如果使用中括号,如"{blue hair:white hair:0.3}",这表示将蓝色的头发和白色的头发进行混合,其中蓝色头发的占比为0.3。
接下来,你要根据我给你的input,执行以下两步操作:
第一步:发挥你的创造力和想象力,结合孩子们喜欢的元素,根据给的input补充这幅画面的诸多要素,如主体、环境、光线、颜色、情绪和构图等内容,生成一幅完整的画面。
第二步:将第一步生成的画面内容,提炼成核心的关键词。但是这些关键词必须满足以下几个条件:
1.它们必须用英文表示,并用英文半角逗号隔开。
2.它们必须涵盖主体、环境、光线、颜色、情绪、构图等要素。
3.它们的数量必须超过10个,但不多于50个。
4.它们必须是描述画面核心内容的关键词或短句,而不是长句子。
5.对于涉及人物的主题,必须描述人物的眼睛、鼻子、嘴唇,例如 'beautiful detailed eyes, beautiful detailed lips, extremely detailed eyes and face, long eyelashes',这是为了避免Stable Diffusion随机生成变形的面部五官。
6.此外,还可以描述人物的外表、情绪、衣服、姿势、视角、动作、背景等。人物属性中,1girl表示一个女孩,2girls表示两个女孩。
7.附加细节:还可以描述画面的场景细节或人物细节,使图像看起来更丰满、合理。但这部分是可选的,需要注意的是,这些细节不能与主题冲突,需要保持画面的整体和谐。
接下来我将给你提供几个例子:
样例1
input:  一家人在厨房做饭
output: closeup, a family portrait, momn, dad, kitchen in the background 
样例2
input: 蜘蛛侠穿着钢铁侠的战衣
output: batman, wearing a iron man suit, outdoors, background forest, kid, toon, ((pixar style)), 3d, cartoon, detailed face, blue neon eyes, asymmetric, cinematic lighting, batman logo 
样例3
input: 一个小女孩正在摘番茄
output: (tomato girl),(very_softly draw:1.5 , very_carefully drawing:1.5) , (masterpiece , best_quality ) , ( Tomato farm background , Tomato field work clothes ),(great_clear_eyes:1.2),(cartoonish:1.6),(high resolution 4K), (high-detailed), (illustration:1.3), dramatic angle,cinematic shot, (picture_level hyper),happy_smile
样例4
input: 两个小孩划船在海里冒险
output: (best quality, masterpiece),
2boys, boat, ocean, caustics, wave pointing, happy pirate hat, eyepatch, shark, flintlock, (best quality, masterpiece),
仿照以上例子,并不局限于我给你的单词,接下来我再给你一个例子,请你给出一套详细的提示词。直接开始给出提示词即可,不需要有任何其它自然语言描述,也不要有任何中文前缀。
input: {input}
output:

例如,当我们输入童话故事小红帽中的一段话“从前有个可爱的小姑娘,谁见了都喜欢,但最喜欢她的是她的奶奶,简直是她要什么就给她什么。一次,奶奶送给小姑娘一顶用丝绒做的小红帽,戴在她的头上正好合适。从此,姑娘再也不愿意戴任何别的帽子,于是大家便叫她"小红帽"。”,文心一言给我们生成的提示词是“cute girl, everyone loves her, favorite is her grandma, gives her anything she wants. Once, grandma gives her a red velvet hat, fits perfectly. From then on, girl refuses to wear any other hat, so everyone calls her "Red Hat Girl".”,然后我们其输入到Stable Diffusion中,结合KIDS ILLUSTRATION的LoRA模型,就可以生成下图效果。

🔊 语音交互:孩子的语言,AI的心

作为一款面向儿童制作绘本的应用,需要精心设计用户交互🎨📚。由于客户群体的孩子们大部分处于学前阶段,甚至幼儿园阶段🎂,普遍还没有掌握拼音打字的能力🔠,而付出更多时间和精力去学习拼音打字显然不是我们这款应用该做的事🖥️,因此语音交互对于儿童来说是一个更好的选择🎙️。毕竟,相比于拼音和识字,说话是儿童最先掌握的交互技能🗣️,也是他们与外界交流的主要方式🌍,因此语音交互能够覆盖更低年龄段的儿童👶。语音交互既可以让儿童免去打字的困扰⌨️,也可以让他们能够更加轻松地与应用进行交互,使得阅读和学习的过程变得更加愉快和有趣😊📖。

在语音识别方面,我们采用的是Whisper模型。Whisper是由OpenAI训练并开源的通用语音识别模型,基于Transformer的编码器-解码器结构,在68万小时标注的音频数据上进行了训练,表现出强大的泛化能力,并且是一个多任务模型,可以进行多语言语音识别、语音翻译和语言识别。

import librosa  # librosa库用于音频处理
import torch as th
from zhconv import convert  # zhconv库用于进行简繁转换
from transformers import pipeline
from transformers import WhisperTokenizer  # 用于音频数据的分词
from transformers import WhisperFeatureExtractor  # 用于提取音频特征
from transformers import WhisperForConditionalGeneration  # Whisper模型的生成器

# 从预训练模型加载Whisper模型,特征提取器和分词器
model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-small")
feature_extractor = WhisperFeatureExtractor.from_pretrained("openai/whisper-small")
tokenizer = WhisperTokenizer.from_pretrained("openai/whisper-small", language="Chinese", task="transcribe")
device = "cuda:0" if th.cuda.is_available() else "cpu"  # 检查CUDA设备是否可用
pipe = pipeline(
  "automatic-speech-recognition",  # 设置为自动语音识别任务
  model=model,
  feature_extractor=feature_extractor,
  tokenizer=tokenizer,
  chunk_length_s=30,  # 设置音频分块的长度为30秒
  device=device,  # 设置设备
)
# 加载音频文件,并将其输入到处理管道
speech, _ = librosa.load("asr_test_audio.mp3")  # 使用librosa加载音频文件
prediction = pipe(speech)["text"]  # 使用处理管道进行预测,并取出预测结果中的文本部分
print(convert(prediction, "zh-cn"))  # 使用zhconv进行简繁转换,并打印结果

在语音合成方面,我们采用的是Sambert-Hifigan模型。Sambert是由阿里达摩院语音实验室设计、训练并开源的TTS模型,基于Parallel结构进行了改良,以预训练BERT语言模型为编码器,解码器使用了PNCA自回归结构,降低了带宽的要求,支持CPU实时合成。

from modelscope.outputs import OutputKeys
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks

text = "早上好,今天天气真不错!"
model_id = "damo/speech_sambert-hifigan_tts_zhitian_emo_zh-cn_16k"
sambert_hifigan_tts = pipeline(task=Tasks.text_to_speech, model=model_id)

output = sambert_hifigan_tts(input=text)
wav = output[OutputKeys.OUTPUT_WAV]
with open("test_sambert-hifigan_tts.wav", "wb") as f:
    f.write(wav)

以上,我们探索了AI绘本生成的全过程,还深入理解了背后的技术实现,将它们组合在一起,就可以实现一个端到端的绘本生成流程。🤖🧒

🔮 展望未来:AIGC应用将孩子们的创意无限扩展

接下来,我们其实可以将“漫画家”部署成一个WEB服务,再开发一个前端的网页、APP或小程序,这样就可以24h提供服务了。可以参考下面这张系统架构图。

THE END !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

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

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

相关文章

25届计算机毕业设计选题推荐-图书馆智能选座系统

💖🔥作者主页:毕设木哥 精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻 Java实战项目 文章目录 Java实战项目 一、图书馆智能选座系统…

某思CMS V10存在SQL注入漏洞

Fofa: product"魅思-视频管理系统" 框架:ThinkPHP 5,6 1 漏洞分析&复现 位于 /controller/Api.php 控制器中的getOrderStatus 方法POST传入,然后直接拼接了 orderSn 变量到 where 查询中,导致漏洞产生. /** * 查询订单支付状态 */ pub…

猎板PCB大讲堂——全球电子产品中PCB阻燃性能的法规与标准概述

今天猎板PCB来说说PCB的板材的阻燃性!猎板发现有些PCB平台在售的板厂大多为非阻燃系列,而在许多国家和地区,电子产品及其组件,包括印刷电路板(PCB),都必须遵守严格的安全标准,其中包…

项目测试用例:

项目概述 该项目是一款网上点餐系统,满足普通商家和普通用户的基本需求,主要有两大功能模块,分别是管理员模块(商家端)和用户模块(客户端)。系统供管理员登录和普通用户,登录进去会有…

三相可控整流电路 (三相半波,三相桥式)

目录 1. 三相半波整流电路 2. 三相桥式全控整流电路 三相可控整流电路利用三相交流电源,通过可控硅(晶闸管)将交流电整流为直流电。主要有两种常见类型:三相半波整流电路和三相桥式全控整流电路。 1. 三相半波整流电路 三相半波…

Android Studio 2024与2022 解决Read timed out和connect timed out的问题

如果在新建Android项目时报错: Read timed out或者connect timed out 一定可以解决问题的办法如下: 第一步: 打开项目下gradle中的第二个.properties文件,找到这个文件的下载路径,、一般卡顿是因为下载这个文件时网…

知识回顾 - 《Flash Attention为什么这么快?》

作者: Tri Dao, Daniel Y. Fu, Stefano Ermon, Atri Rudra...论文地址: https://arxiv.org/abs/2205.14135项目地址: https://github.com/Dao-AILab/flash-attention摘要 Transformers在处理长序列时速度慢且内存消耗大,因为自注意力的时间和内存复杂度与序列长度的…

误删分区后的数据救赎恢复实战解析

在数字化时代,数据不仅是信息的载体,更是个人记忆与企业资产的宝贵财富。然而,误删分区这一操作失误,却如同暗流涌动,悄无声息地吞噬着用户的重要数据。本文将深入探讨误删分区的现象、影响,并详细介绍一种…

【Linux】探索文件I/O奥秘,解锁软硬链接与生成动静态库知识

目录 1、C文件接口 1.1什么是当前路径? 1.2程序默认打开的文件流: 2、系统文件I/O 2.1.接口介绍: 2.1.1open: 参数讲解; flags如何实现一个参数就可以有多个参数传参的效果? open函数的返回值: 3…

线程池ThreadPoolExecutor实战及其原理分析

1. 线程池简介 线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如Tomcat。 线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算…

香港科技大学工学院2025/2026年度硕士研究生(MSc)项目招生宣讲会——华南师范大学佛山校区

🔔香港科技大学工学院2025/2026年度硕士研究生(MSc)项目招生宣讲会 🕙时间:2024年9月26日(星期四)19:00 🏠地点:华南师范大学佛山校区图书馆电影院 🎆2024T…

Spring6梳理9—— 依赖注入之外部注入对象类型属性

9.1 依赖注入之外部注入对象类型属性 9.1.1 创建dept与emp类 1.dept类 package com.atguigu.spring6.iocxml.ditest;//部门类 public class Dept {private String dname;public String getDname() {return dname;}public void setDname(String dname) {this.dname dname;…

【算法】遗传算法

一、引言 遗传算法(Genetic Algorithm, GA)是一种模拟生物进化过程的启发式搜索算法,它通过模拟自然选择、遗传、交叉和突变等生物学机制来优化问题的解决方案。遗传算法因其通用性、高效性和鲁棒性,在多个领域中得到了广泛应用&a…

【Java】网络编程:TCP_IP协议详解(IP协议数据报文及如何解决IPv4不够的状况)

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 &#x1f354…

Nest.js

Nestjs中文文档链接 TypeORM 中文文档 小满视频 1. 安装Nest.js 安装脚手架 npm i -g nestjs/cli创建nestjs工程 nest new工程目录 app.module.ts 根模块用于处理其他类的引用与共享。app.controller.ts 常见功能是用来处理http请求(处理请求的路径&#xff09…

.net core8 使用JWT鉴权(附当前源码)

说明 该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。 该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。 说明:OverallAuth2.0 是一个简单、易懂、功能强…

焦虑拜拜!这些维生素是你的情绪小太阳✨,焦虑星人必看!

🌿 ‌维生素B群:情绪的调节大师‌ 🎯 说到缓解焦虑,怎能不提维生素B群?它可是个大家庭,包括B1、B2、B6、B12等,每一个都是调节神经系统的关键角色。维生素B群能够促进神经递质的合成&#xff0…

Prometheus监控k8s环境构建

传统架构中比较流行的监控工具有 Zabbix、Nagios 等,这些监控工具对于 Kubernetes 这类云平台的监控不是很友好,特别是当 Kubernetes 集群中有了成千上万的容器后更是如此,本章节学习下一代的云原生监控平台---Prometheus。 一、基于kuberne…

DNS解析域名详解

你有没有想过,当一个url传过来网络对它进行了哪些操作~DNS又是怎样对域名进行解析的~或者我们为什么要用到域名,为什么不直接使用ip地址~ 对于我们而言,面对长串的ip地址,我们更喜欢记忆较短的域名,但是对于路由器来说…

第二证券:降息升温!资金涌入港股,行情还能持续多久?

在美联储行将打开降息影响下,多国股指改写高点。 当时,商场环绕美联储是25个基点仍是50个基点的降息展开预期买卖,资金流向风险财物规划扩大显着。17日,澳大利亚S&P/ASX 200指数股指、印度孟买SENSEX30指数、新加坡富时海峡指…