上一节,这节我们讲解网页材料在SuperMemo中的处理方法,首先回顾下我们之前流程步骤:
如上图示,在之前的学习中,我们有了解到,可以使用Obsidian进行知识点链接,在Obsidian中创建新节点,关联已存在节点的形式,来获取及扩充我们的学习材料范围.本文正是对此部分内容,对前文进行了工程实践探讨. 如果你还不太清楚相关的概念或流程,你可以先参考我之前的原文大体了解,前文链接如下:
我们主要的学习材料常见为PDF/视频/笔记/网页等四种. 对于PDF/视频/笔记类的材料一般比较好处理,获取到资源后直接把对应的路径信息整理好,放置入SM学习软件即可(操作见上文).但对于网页类的信息处理则比较麻烦,因此本文也把主要的目标放置在介绍网页类材料的处理操作.
在正常的学习过程中,网页类型的信息比较丰富,常见来源如RSS订阅 / 公众号订阅 / 知乎关注/ 引擎工具搜索 / 网址收藏夹等.所有的这些信息都是通过网址链接的形式呈现的.这些网址如果按文件夹结构批量放置于收藏夹来操作会比较麻烦,因为通过文件夹方式管理会遇到怎么命名文件夹的纠结,也会遇到网址信息过多后,内容各种冗余等常见的问题.
这里我先放置一张最终的效果图:(此方案流程及意义: 通过这种方法,我们可以指定关键字检索来批量处理网页材料,对要添加至学习的网页则在左下角保存记录,最终生成的文件可以直接拷贝内容或者改后缀为网页直接用SuperMemo软件来处理,大大的提高了网页材料处理的效率.)
在本文中,我们通过批量对网址链接进行处理,创建了一个交互网页,通过交互式展现,实现快速检索 / 分类 / 整理多个网址.其中具体使用到了streamlit / pyecharts 的 python组件,通过streamlit编写交互式脚本,pyechars进行词云图展示,whoosh进行全文检索.我这里放置了对应的官网链接.
步骤一: 获取多个网址链接,这里通过Edge演示,使用了Copy All URLs插件,具体安装使用如图:
使用插件来获取多个网址
步骤二: 拷贝获取到的链接信息到脚本文件,并通过命令行运行脚本streamlit run Gist2.py,程序会自动打开一个网页.即上面的效果图网页.
先放置获取到的多个网址脚本运行后链接自动打开按关键字搜索使用即可
可以在右上角设置中,设置宽屏及实时运行模式.
设置项配置宽屏及实时模式
步骤三: 直接放置代码了,按需安装对应的Python包,放置多网址链接,命令行直接运行脚本即可.
最新的Gist脚本可通过GitHub访问: https://gist.github.com/ef56f43040244978fd2714608dc3d115
#!/usr/bin/env python# -*- coding: utf-8 -*-# 批量网页分析处理# 作者:一只小胖子# 版本:V0.1# 知乎:https://www.zhihu.com/people/lxf-8868# 使用:# 1.Copy All URLs 插件获取多个网页地址# 2.命令行执行streamlit run Gist2.pyurl_texts = """ 提示: 在这里放置多个网址信息"""# ===== 一.使用pyecharts生成词云图 =====# 参考:朱卫军# 链接:https://zhuanlan.zhihu.com/p/113312256# https://blog.csdn.net/zx1245773445/article/details/98043120import jiebafrom collections import Counterimport pyecharts.options as optsfrom pyecharts.charts import WordCloud# # 读取内容来源,返回文本数组# def get_text(goods, evaluation):# if evaluation == '好评':# evaluation = 1# else:# evaluation = 0# path = 'excel/comments.csv'# with open(path, encoding='utf-8') as f:# data = pd.read_csv(f)# # 商品种类# types = data['类型'].unique()# # 获取文本# # text = data[(data['类型']==goods)&(data['标签']==evaluation)]['内容'].values.tolist()# text = data['内容'].values.tolist()# text = str(text)[1:-1] # 去符号 []# print(types)# return text### stext = get_text('1', '好评')# print(stext)## 结巴分词字典加载 对文本内容进行jieba分词 https://zhuanlan.zhihu.com/p/41032295def split_word(text): word_list = list(jieba.cut(text)) print(len(word_list)) # 去掉一些无意义的词和符号,我这里自己整理了停用词库 with open('停用词库.txt') as f: meaningless_word = f.read().splitlines() # print(meaningless_word) result = [] # 筛选词语 for i in word_list: if i not in meaningless_word: result.append(i.replace(' ', '')) return result# collections 的使用 https://zhuanlan.zhihu.com/p/108713135# 统计词频def word_counter(words): # 词频统计,使用Count计数方法 words_counter = Counter(words) # 将Counter类型转换为列表 words_list = words_counter.most_common(2000) return words_list# 制作词云图def word_cloud(data): ( WordCloud().add( series_name="热点分析", # 添加数据 data_pair=data, # 字间隙rue word_gap=5, # 调整字大小范围 word_size_range=[15, 80], shape="cursive", # 选择背景图,也可以不加该参数,使用默认背景 # mask_image='购物车.jpg') ).set_global_opts( # title_opts=opts.TitleOpts( # title="热点分析", title_textstyle_opts=opts.TextStyleOpts(font_size=12) # ), tooltip_opts=opts.TooltipOpts(is_show=True), ).render("basic.html") # 输出为html格式 )# [测试Demo]:# stext = ''' '书籍1做父母一定要有刘墉这样的心态,不断地学习,不断地进步,不断地给自己补充新鲜血液,让自己保持.',# '书籍1作者真有英国人严谨的风格,提出观点、进行论述论证,尽管本人对物理学了解不深,但是仍然能感受到.书籍', '1作者长篇大论借用详细报告数据处理工作和计算结果支持其新观点。为什么荷兰曾经县有欧洲最高的生产.. 1',# '书籍1作者在战几时之前用了“拥抱"令人叫绝.日本如果没有战败,就有会有美军的占领,没胡官僚主义的延.书籍1作者在少年时即喜阅读,能看出他精读了无数经典,因而他有一个庞大的内心世界。他的作品最难能可贵..',# '书籍1作者有一种专业的谨慎,若能有幸学习原版也许会更好,简体版的书中的印刷错误比较多,影响学者理解.',# '书籍1作者用诗一样的语言把如水般清澈透明的思想娓娓道来,像一个经验丰富的智慧老人为我们解开一个又一.书籍1作者提出了一种工作和生活的方式,作为咨询界的元老,不仅能提出理念,而且能够身体力行地实践,并.'# sword = split_word(stext)# print(sword)# word_stat = word_counter(sword)# print(word_stat)# word_cloud(word_stat)# show_WordCounter()# ===== 二.使用Whoosh进行全文检索 =====# 参考:酷python# 链接:https://zhuanlan.zhihu.com/p/172348363# https://www.cnblogs.com/mydriverc/articles/4136754.htmlimport os, errnofrom whoosh.qparser import QueryParser, MultifieldParser# from whoosh.fields import TEXT, SchemaClassfrom whoosh.query import compound, Term, Queryfrom whoosh.index import create_infrom whoosh.index import open_dirfrom whoosh.fields import *from jieba.analyse import ChineseAnalyzerimport htmlimport reimport jsonimport streamlit as st# 而对于Python 3.X(X >= 2)版本,os.makedirs 函数还有第三个参数 exist_ok,该参数为真时执行mkdir -p,# 但如果给出了mode参数,目标目录已经存在并且与即将创建的目录权限不一致时,会抛出OSError异常def mkdir_p(path): try: os.makedirs(path) except OSError as exc: # Python >2.5 (except OSError, exc: for Python <2.5) if exc.errno == errno.EEXIST and os.path.isdir(path): pass else: raise# 存储schema信息至indexdir目录index_dir = 'es/index_dir_1/'if not os.path.exists(index_dir): mkdir_p(index_dir)# 就如同定义一张mysql里的表,你需要指出需要存储哪些字段,以及这些字段的类型class ArticleSchema(SchemaClass): title = TEXT(stored=True, analyzer=ChineseAnalyzer()) content = TEXT(stored=True, analyzer=ChineseAnalyzer()) author = TEXT(stored=False, analyzer=ChineseAnalyzer())# create_in会创建一个名为index_dir的文件夹,添加文档时,一定要根据你所定义的索引模式进行添加,# 这样就创建好了索引,添加文档的过程,就如同向mysql的表里写入数据。schema = ArticleSchema()ix = create_in(index_dir, schema, indexname='article_index')if not ix: ix = open_dir(index_dir, indexname='article_index')# 处理文档writer = ix.writer()s_url_arr = url_texts.split("<br/>")print("url待处理项: {}".format(len(s_url_arr)))for i in range(len(s_url_arr)): # 网页格式 # reg_arr = re.findall("">(\w.*)</a><br/>", s_url_arr[i]) if str(s_url_arr[i]).__contains__("href"): reg_href = re.findall('href="(.*)"', s_url_arr[i])[0] reg_text = re.findall(">(.*)<", s_url_arr[i])[0] # 其它格式 # if reg_href or reg_text: # print(reg_href, html.unescape(reg_text)) # 更新也会添加重复内容! # writer.update_document(title= reg_href, author="admin") # , content=html.unescape(reg_text)) # add_document # 添加内容 reg_title = html.unescape(reg_text) # .encode('unicode-escape') writer.add_document(title=reg_href, author="admin", content=reg_title) # add_document # print(json.dumps(json_str, sort_keys=True, indent=4, separators=(',', ': '),ensure_ascii=False))# 删除文档# Because "path" is marked as unique,calling update_document with path = u"/a" will# delete any existing document where the path field contains /a writer.delete_by_term("author", "admin")writer.commit()# 设置iframe长宽高r_width = 1200r_height = 400r_scrolling = True# 展示词云图def show_WordCounter(): st_file_arr = [] st_file_lines = open("./basic.html").readlines() for st_file_str in st_file_lines: st_file_arr.append(st_file_str.strip("")) st_file_arr_str = " ".join(st_file_arr) # 显示云图 st.components.v1.html(st_file_arr_str, width=r_width, height=r_height, scrolling=r_scrolling)# 文本输入及展示search_key = "简书"search_key = st.text_input('[1].请输入查询关键词:', search_key)# st.write('你输入的关键词为:', search_key)# st.text('输入关键词为:' + search_key)if not ix: ix = open_dir(index_dir, indexname='article_index')title_lists = []content_list = []href_title_dict = {}with ix.searcher() as searcher: # author_query = [Term('author', 'admin'), Term('author', 'admin')] # content_query = [Term('content', 'python'), Term('content', 'jupyter')] # query = compound.Or([compound.Or(author_query), compound.Or(content_query)]) # content_query = [Term("content", "playwright"), Term("content", "jupyter")] # query = compound.Or(content_query) # 多条件查询 # query = QueryParser("content", ix.schema).parse("简书") # query = MultifieldParser(["content"], ix.schema).parse("知乎") # default_set() # query = _NullQuery() # 搜索所有内容 results = searcher.documents() # print(results) content_all = [] for data in results: content_all.append(data["content"]) sword = split_word("".join(content_all)) print(sword) word_stat = word_counter(sword) print(word_stat) # 生成词云图 word_cloud(word_stat) # 展示词云图 show_WordCounter() if not search_key: st.error("请输入查询条件!") else: # 按关键词查询 query = MultifieldParser(["content"], ix.schema).parse(search_key) print("查询条件:", query) results = searcher.search(query) # print(results[0].fields()) print(query, '一共发现%d份文档。' % len(results)) # 高亮效果 # if len(results) > 0: # data = results[0] # text = data.highlights("content","title") # print(text) for data in results: # json_text = json.dumps(data.fields()["title"], ensure_ascii=False) # print(data.fields()["title"]) reg_href = data.fields()["title"] reg_title = data.fields()["content"] # 网页高亮展示 # reg_title = data.highlights("content") if reg_href not in title_lists and reg_title not in content_list: title_lists.append(reg_href) content_list.append(reg_title) href_title_dict[reg_title] = reg_href # print(data.fields())ix.close()st.text("总共查询到 {} 项".format(len(href_title_dict)))# 写入内容reg_href_s = "" # 选择的URL记录save_file_path = "备注数据.txt"# 下拉框展示select_box_list = list(href_title_dict.keys())if len(select_box_list) > 0: reg_title = st.selectbox('[2].选择要打开的网址:', select_box_list) reg_href = href_title_dict[reg_title] reg_href_s = "{} : {} {}".format(search_key, reg_title, reg_href) st.text('当前选择: {}'.format(reg_href)) # 可通过以下两种方式加载 # url_display = f'<embed type="text/html" src="' + reg_href + '" width="1200" height="600">' # iframe # st.markdown(url_display, unsafe_allow_html=True) st.components.v1.iframe(reg_href, width=r_width, height=r_height, scrolling=r_scrolling) # 按钮 if st.button('保存此条记录'): if not os.path.exists(save_file_path): with open(save_file_path, 'w') as file_: file_.writelines("搜索项 ----- 标题 ------ 链接 -----") pass reg_href_s2_arr = [] # 要写入的内容 with open(save_file_path, 'r') as file_: # 不添加重复内容 search_arr = re.findall(re.escape(reg_href_s), "".join(file_.readlines()), re.I | re.M) print(search_arr) if len(search_arr) == 0: reg_href_s2_arr.append(" " + reg_href_s + "<p>") st.write("写入成功!") elif len(search_arr) == 1 and str(search_arr[0]).strip(" ") == "": st.write("无查询值!") else: st.write("已经存在!") with open(save_file_path, 'a') as file_: if len(reg_href_s2_arr) > 0: file_.writelines("".join(reg_href_s2_arr)) with open(save_file_path, "r") as file_: st_content = (" ".join(file_.readlines())) # <br> # st.components.v1.html(st_content) # 网页高亮展示 st.write(st_content)# 默认展示内容if st.button('加载默认文件'): if os.path.exists(save_file_path): with open(save_file_path, "r") as file_: st.write(" ".join(file_.readlines())) else: st.write("还未保存记录,请先保存!")if st.button('清空文件内容'): # https://blog.csdn.net/weixin_36118143/article/details/111988403 if os.path.exists(save_file_path): os.remove(save_file_path) else: # os.mknod(save_file_path) pass
步骤四: 交互式方案 ipywidgets/ Streamlit/ Plotly Dash , 其它有价值的参考链接.
我是一只热爱学习的小胖子,如果你也热爱学习,并且对SuperMemo感兴趣,欢迎转发和评论!
标题 | 10 Free tools to get started with Data Visualisation-Easily & Instantly.
作者 | Parul Pandey
译者 | 汪鹏(重庆邮电大学)、alexchung(福州大学)
图片来源于rawpixel.com
不要简单地展示数据,用它讲个故事!
是的,我们有数据,并有了数据的洞察,然后呢?显然,下一步将是与人们交流这些发现,以便他们采取必要的行动。最有效的数据交流方式之一就是讲故事。但是要成为有效的讲述者,我们需要简化事情,而不是使事情复杂化,这样使得分析的真正本质不会丢失。
在讲故事和可视化方面,有许多工具可供选择。有些是免费的,有些是付费订阅的。有些简单直观,但缺乏互动性,而有些复杂,需要一些努力才能开始。
如果你刚刚开始使用数据可视化,没有艺术或图形设计经验,或者不想编码,而想立即开始制作图形或地图,那么本文就是为你准备。本文还尝试使用除流行工具(如Tableau Public、Powerbi和Google Charts)之外的其他工具,这些工具其实在数据科学生态系统中很常用。
所以,这里有十个免费提供的工具,让初学者可以立即开始构建漂亮的视觉效果。
这些数据可视化工具都是免费提供的,但是如果你想升级和访问更多选项,尤其是云服务,就需要用到一个高级版本。
Datawrapper可以轻松创建图表和图。只需单击鼠标,即可轻松创建等值线,符号或定位图。同样,您也可以根据数据创建自己选择的图表。这些图表是互动的,响应性的,可嵌入您的网站。该工具的免费版本适用于单个用户,支持10,000个月图表视图。
Datawrapper主要面向记者。世界各地的新闻记者都使用Datawrapper来构建他们的图表和地图。然而,对于任何想要可视化来伴随他们的文章的人来说,它都非常有用。该网站还办了名为CHARTABLE的博客,他们定期撰写有关数据可视化的最佳实践。
处理
只需从Excel或Google表格中复制您的数据即可。您还可以上传CSV文件或链接到URL以获取实时更新图表。只需单击一下,即可从多种图表和地图类型中进自定义和注释图表以使其更有效。将即用型嵌入代码复制到CMS或网站中,或将图表导出为图像或PDF以进行打印。
演示
RAWGraphs是一个开放的Web工具,可以在令人惊叹的d3.js库之上创建基于矢量的自定义可视化库。
RAWGraphs主要被设想为设计师和极客的工具,旨在提供电子表格应用程序(例如Microsoft Excel,Apple Numbers,Google Docs)和矢量图形编辑器(例如Adobe Illustrator,Inkscape等)之间的缺失链接。
RAWGraphs具有高度可定制性和可扩展性,可接受用户定义的新自定义布局。有关如何添加或编辑布局的详细信息,请访问其网站。
处理
RAWGraphs使用表格数据(例如电子表格和逗号分隔值)以及来自其他应用程序的复制粘贴文本(例如Microsoft Excel,TextWrangler,TextEdit等)。基于SVG格式,可以使用矢量图形应用程序轻松编辑可视化以进行进一步细化,或直接嵌入到网页中。
只需在RawGraphs中插入原始数据,在各种可视模型中进行选择,然后调整创建的图表并浏览数据。
使用RAWGraphs的最简单方法是访问官方应用页面上的最新版本。但是,RAWGraphs也可以在您的计算机上本地运行。安装时请遵循Github仓库的说明。
演示
Charted可让您可视化数据并自动创建漂亮的图表。它由Medium的产品科学团队开发。Charted故意保持简单易用。它不存储,操作或转换数据,因此它不是格式化工具。但是,它有一些强大的核心功能:
适用于所有屏幕尺寸,包括显示器
每30分钟重新获取数据并更新图表
将数据系列移动到单独的图表中
调整图表类型,标签/标题和背景
处理
提供数据文件的链接,Charted返回一个漂亮,交互,可共享的数据图表。目前图表支持.csv,.tsv。谷歌电子表格和保管箱共享链接。还可以生成HTML代码,然后可以将其嵌入到网站中。
演示
下载repo并运行npm install以安装依赖项。之后,您将能够runnpm start。这将在localhost:3000启动服务器。或者,它也可以在charted.co上试用。
Chart Studio是Plotly强大的,基于网络的在线图表创建者。它是用于创建D3.js和WebGL图表的最复杂的编辑器之一。它作为基本版本提供,可免费使用。此外,还有付费的企业版和云版。任何人都可以使用源代码集成到他们的应用程序中。
处理
拖放数据文件或通过Falcon SQL客户端连接到SQL。然后只需使用提供的选项即可立即获取交互式图表。
演示
FastCharts是Financial Times DataViz团队的产品。他们最近推出了一个公共版本的内部浏览器图表工具,供人们工作和提供反馈。
该工具可用于:
只需将数据直接粘贴到浏览器中即可制作直线图,条形图和面积图
向绘图的点和/或区域添加注释
下载PNG和可编辑的SVG
虽然这个工具是为内部使用而制作的,但FastCharts在创建演示图表时也在业务的其他部分赢得了声誉 - 这是一个比Excel或Google表格更简单的工具,并为用户提供更专业的图表FT品牌推广。
处理
可以使用CSV或TSV格式的任何数据创建图表,然后可以根据用户的偏好进一步自定义。
演示
这有一个演示GIF,展示如何在一分钟内制作图表。
https://fastcharts.io/
Palladio是一款免费的数据驱动工具,旨在轻松可视化复杂的历史数据。该项目旨在了解如何基于人文查询设计图形界面。Palladio 位于历史与设计的交汇处。
可以使用Palladio创建四种类型的可视化:
地图视图:将坐标数据转换为地图上的点
图表视图:允许您可视化数据的任何两个维度之间的关系
列表视图:可以安排数据的维度以制作自定义列表
图库视图:数据可以在网格设置中显示,以便快速参考
处理
任何可以表格/电子表格格式表示的信息集合都可以与Palladio一起使用,唯一要求所有数据都由分隔符号值(包括逗号,分号和制表符)表示。
我们可以粘贴,上传或提供数据链接,以便创建新的Palladio项目。
演示
Opeheatmap是一个非常简单的工具,可以立即将电子表格转换为地图。从将邻居的房价映射到Twitter,openheatmap可以将所有这些转化为交互式可视化,而不涉及任何复杂性。
处理
只需上传电子表格或提供指向Google云端硬盘的链接即可。如果数据没有问题,您将能够查看下一个地图。您的电子表格应包含要映射的位置的列,一个用于值,另外一个用于每行的时间(如果需要动画地图)。例如:
演示
让我们使用openheatmap展示一下“伦敦地铁站”。
MyHeatMap是另一种可以交互式查看地理数据的工具。 但是,免费版本只允许用户创建最多只有20个数据点的公共地图,实际上这个数据点非常少。Myheatmap输出颜色编码的热图,这些热图非常容易让目标受众理解。 地图不会被标记,旗帜,等高线或不断增长的斑点混乱。 此外,使用myheatmap创建的热图是完全交互式的,具有平移和缩放功能。
处理
用户只需要以CSV格式上传地理数据。 该文件应包含至少包含三个字段的标题行。 其中两个字段必须命名为“纬度”和“经度”,其相应的列必须包含纬度和度经度的地理坐标。
演示
Chartbuilder是一个前端图表应用程序,可以轻松创建简单漂亮的图表。Chartbuilder是用户和导出界面。Chartbuilder支持Atlas开发的所有图表,这是Quartz开发的图表平台。Chartbuilder不是数据分析或数据转换工具。它只是以一致的预定义样式创建图表。
处理
将csv或tsv格式的数据粘贴到chartbuilder中并导出代码以绘制移动友好的响应图表或静态SVG或PNG图表。对于那些对定制图表样式不感兴趣的人,项目地址:http://quartz.github.io/Chartbuilder
它也可以在本地下载和安装。
演示
TimelineJS是一个开源工具,任何人都可以构建视觉丰富的交互式时间表。初学者只需使用Google电子表格即可创建时间表。专家可以使用他们的JSON技能来创建自定义安装,同时保持TimelineJS的核心功能。
TimelineJS可以从各种来源获取媒体。Twitter,Flickr,YouTube,Vimeo,Vine,Dailymotion,谷歌地图,维基百科,SoundCloud,文档云等等!
处理
创建时间表是一个简单的过程。提供了一个电子表格模板,需要填写该模板,然后简单地发布内容。然后,可以将生成的链接嵌入到媒体中或在期望时间线的任何网站上。该网站有一个很好的介绍性视频,以开始使用Timeline JS。
演示
如何在中型博客/网站中呈现时间轴的示例。
曼德拉:一种有目的的生活
TimelineJS Embed
http://cdn.knightlab.com/libs/timeline/latest/embed/index.html
数据可视化不一定非常困难或昂贵。代码肯定会为你提供更多选项来创建和自定义图形,尤其是在数据混乱时,但这些工具在提供即时数据可视化时可以提供很好的选择。这不是一个详尽的列表,我一直在寻找更多的工具,试图简化其他人的可视化过程。
本文编辑:王立鱼
英文原文:https://towardsdatascience.com/10-free-tools-to-instantly-get-started-with-data-visualisation-d7fadb5f6dce
想要继续查看该篇文章相关链接和参考文献?雷锋网雷锋网雷锋网
点击【10种免费的工具让你快速的、高效的使用数据可视化】即可访问!
福利大放送——满满的干货课程免费送!
「好玩的Python:从数据挖掘到深度学习」该课程涵盖了从Python入门到CV、NLP实践等内容,是非常不错的深度学习入门课程,共计9节32课时,总长度约为13个小时。。
课程页面:https://ai.yanxishe.com/page/domesticCourse/37
「计算机视觉基础入门课程」本课程主要介绍深度学习在计算机视觉方向的算法与应用,涵盖了计算机视觉的历史与整个课程规划、CNN的模型原理与训练技巧、计算机视觉的应用案例等,适合对计算机视觉感兴趣的新人。
课程页面:https://ai.yanxishe.com/page/domesticCourse/46
现AI研习社将两门课程免费开放给社区认证用户,只要您在认证时在备注框里填写「Python」,待认证通过后,即可获得该课程全部解锁权限。心动不如行动噢~
认证方式:https://ai.yanxishe.com/page/blogDetail/13999
器之心报道
编辑:Panda W
图像生成、视频生成、整合语音合成的人脸动画、生成三维的人物运动以及 LLM 驱动的工具…… 一切都在这篇文章中。
生成式 AI 已经成为互联网的一个重要内容来源,现在你能看到 AI 生成的文本、代码、音频、图像以及视频和动画。今天我们要介绍的文章来自立陶宛博主和动画师 aulerius,其中按层级介绍和分类了动画领域使用的生成式 AI 技术,包括简要介绍、示例、优缺点以及相关工具。
他写道:「作为一位动画制作者,我希望一年前就有这样一份资源,那时候我只能在混乱的互联网上自行寻找可能性和不断出现的进展。」
本文的目标读者是任何对这一领域感兴趣的人,尤其是不知如何应对 AI 领域新技术发展的动画师和创意人士。另需说明,视频风格化虽然也是相关技术,但本文基本不会涉及这方面。
本文的文章结构。
图像生成
图像生成技术是指使用 AI 模型生成图像的技术,这些 AI 模型的训练使用了静态图像。
将生成的图像用作素材
将任意 AI 应用生成的静态图像用作 2D 剪贴画、数字处理、拼贴等传统工作流程中的素材,或者用作其它 AI 工具的资源,比如提供给图像转视频(image2video)工具来生成视频。除了作为图像和素材来源,这类技术还需依赖剪切和图像编辑等一些常用技能。
短片《Planets and Robots》中使用了数字剪贴画来将生成的 AI 图像动画化,其中的配音也是使用 LLM 基于脚本生成的。
视频链接:https://mp.weixin.qq.com/s?__biz=MzA3MzI4MjgzMw==&mid=2650907887&idx=4&sn=ca30f3fbde94ec74b32d75b638013594&chksm=84e46091b393e987d442c8c414bdb9b76741d60116bee3419f36a3cb5961906e5d33b4ab312b&token=1179435113&lang=zh_CN#rd
优点:
缺点:
免费工具(任何生成图像模型或应用):
插件和附加组件:
此外,Hugging face space 上还有一些免费的演示:https://huggingface.co/spaces
付费工具(任何生成图像模型或应用):
注:动画制作使用的工具包括 After Effects、Moho、Blender……
逐帧生成图像
这类技术是以一种相当程度上立足动画根源的精神来使用生成式扩散图像模型,其是以逐帧方式生成动作序列,就像是传统动画制作的绘制再拍摄过程。其中的一大关键是这些模型在生成每张图像时没有时间或运动的概念,而是通过某种机制或各种应用或扩展来帮助得到某种程度上的动画,从而实现所谓的「时间一致性(temporal consistency)」。
这些技术得到的动画往往会出现闪烁现象。尽管许多使用这些工具的用户会努力清理这些闪烁,但动画师却会把这视为一种艺术形式,称为 boiling。
这方面最常用的是 Stable Diffusion 等开源模型以及基于它们构建的工具。用户可以使用公开的参数来配置它们,还可以将它们运行在本地计算机上。相较之下,MidJourney 工具的模型没有公开,而且主要是为图像生成设计的,因此无法用来生成逐帧动画。
视频链接:https://mp.weixin.qq.com/s?__biz=MzA3MzI4MjgzMw==&mid=2650907887&idx=4&sn=ca30f3fbde94ec74b32d75b638013594&chksm=84e46091b393e987d442c8c414bdb9b76741d60116bee3419f36a3cb5961906e5d33b4ab312b&token=1179435113&lang=zh_CN#rd
动画也可能使用 Stable WarpFusion 来制作,这其中涉及到图像转图像的工作流程,通过一些扭变(置换)将底层的视频输入变成动画。视频作者:Sagans。
用逐帧图像来制作动画通常需要混合使用以下工具:
一步到位的工具(文本转图像)
有一些新技术支持直接通过文本 prompt 和参数调配来生成动画:
在每张生成的图像帧上逐渐进行参数插值,以得到过渡动画。这里的参数可能包括任何与模型相关的设定,比如文本 prompt 本身或底层的种子(隐空间游走)。
prompt 编辑法,即通过逐渐改变权重来创建动画过渡。这里使用了 Depth ControlNet 来保持手部整体形状的一致性。
通过图像到图像技术,将每张生成的图像帧作为输入来生成动画的下一帧。这样在其它参数和种子变化时也可以生成看起来相似的帧序列。这个过程通常由 Deforum 中的「去噪强度」或「强度调度」来控制。起始帧可以是已有的图片。
这是大多数使用 Stable Diffusion 的动画实现的一个核心组件,而 Stable Diffusion 是下列许多应用依赖的技术。这种技术很难平衡,并且很大程度上取决于使用的采样器(噪声调度器)。
使用一张起始图像,然后使用一个稍有不同的 prompt,使其逐帧变化成其它形态。
逐渐变换每一帧生成图像,之后再将其作为 I2I 循环的输入。2D 变换对应于简单的平移、旋转和缩放。3D 技术则会想象一个在 3D 空间中移动的虚拟相机,这通常需要估计每帧生成图像的 3D 深度,然后根据想象中的相机运动来进行变形处理。
想必你已经看过这种无限放大的动画。它的视觉效果如此之棒,是因为其使用了 SD 来持续构建新细节。
运动合成的目标是「想象」后续生成帧之间的运动流,然后使用这个运动流来逐帧执行变形处理,从而基于 I2I 循环注入有机的运动。这通常需要依赖在视频的运动估计(光流)上训练的 AI 模型,只不过其关注的不是后续视频帧,而是后续生成帧(通过 I2I 循环),或是使用某种混合方法。
其它技术还包括图像修复和变形技术搭配使用、采用多个处理步骤或甚至捕获模型训练过程的快照等先进技术。举个例子,Deforum 有很多可供用户调控的地方。
使用 SD-CN Animation 制作,其使用了一种在生成帧之间产生幻觉运动的独特方法。起始图像只是作为起点,没有其它用途。
变换型技术(图像到图像):
此外还可以使用某个来源的输入来助力生成的帧和所得的动画结果:
这类方法范围很广,做法是使用输入视频来混合和影响生成的序列。这些输入视频通常分为多个帧,作用通常是风格化现实视频。在现如今的风格化跳舞视频和表演热潮中,这类技术常被用于实现动漫造型和性感体格。但你可以使用任何东西作为输入,比如你自己动画的粗略一帧或任何杂乱抽象的录像。在模仿 pixilation 这种定格动画技术和替换动画技术方面,这类技术有广泛的可能性。
在每一帧,输入帧要么可以直接与生成图像混合,然后再输入回每个 I2I 循环,要么可以采用更高级的设定附加条件的做法,比如 ControlNet。
Deforum 搭配 ControlNet 条件化处理的混合模式,左图是原视频。遮掩和背景模糊是分开执行的,与这项技术无关。
「光流」是指视频中估计的运动,可通过每一帧上的运动向量表示,其指示了屏幕空间中每个像素的运动情况。当估计出变形工作流程中的源视频的光流后,就可以根据它对生成的帧执行变形,使得生成的纹理在对象或相机移动时也能「粘黏」在对象上。
Deforum 的混合模式支持这种技术搭配各种设置使用。为了得到闪动更少的结果,也会增加 cadence,使得变形的效果更好。遮掩和背景模糊是分开执行的,与这项技术无关。
通过变形工作流程完成的条件处理也可能直接关联 3D 数据,这可以跳过一个可能造成模糊的环节,直接在视频帧上完成处理。
举个例子,可以直接通过虚拟 3D 场景提供 openpose 或深度数据,而不是通过视频(或经过 CG 渲染的视频)估计这些数据。这允许采用最模块化和最可控的 3D 原生方法;尤其是组合了有助于时间一致性的方法时,效果更佳。
这可能是现有技术与用于 VFX 的 AI 技术之间最有潜力的交叉领域,如下视频所示:https://youtu.be/lFE8yI4i0Yw?si=-a-GvsaIVPrdaQKm
有一个广泛应用的工具也使用了该技术,其可简化并自动化用 Blender 生成直接适用于 ControlNet 的角色图像的过程。在这个示例中,ControlNet 使用手部骨架来生成 openpose、深度和法线贴图图像,最终得到最右侧的 SD 结果。(openpose 最终被舍弃了,因为事实证明它不适用于只有手部的情况。)
将所有这些技术结合起来,似乎有无尽的参数可以调整动画的生成结果(就像模块化的音频制作)。它要么可以通过关键帧进行「调度」并使用 Parseq 这样的工具绘制图形,要么可以与音频和音乐关联,得到许多随音频变化的动画。只需如此,你就能使用 Stable Diffusion 帮你跳舞了。
优点:
缺点:
免费工具:
可在 A1111 webui 中使用的工具:
插件和附加组件:
付费工具:
(通常也依赖于 SD,但运行在「云」上,用起来也更简单):
插件和附加组件:
市面上还有许多应用和工具,但如果是付费工具,多半是基于开源的 Deforum 代码。
注:最好的情况是你有足够的优良硬件(即 GPU)在本地运行这些工具。如果没有,你也可以尝试运行在远程计算机上的、功能有限的免费服务,比如 Google Colab。不过,Google Colab 上的笔记本也可以运行在本地硬件上。
视频生成技术
这类技术使用在运动视频上训练的视频生成 AI 模型,另外可以在神经网络层面上使用时间压缩来增强。
目前,这些模型有一个共同特征是它们仅能处理时间很短的视频片段(几秒),并受到 GPU 上可用视频内存的限制。但是,这方面的发展速度很快,并且可以用一些方法将多个生成结果拼接成更长的视频。
视频生成模型
这是指使用从头构建和训练的模型来处理视频。
现今的这类模型得到的结果往往晃动很大、有明显的 AI 痕迹、显得古怪。就像是很久之前生成图像的 AI 模型一样。这个领域的发展落后一些,但进展很快,我个人认为在静态图像生成上取得的进展并不会同等比例地在视频生成方面重现,因为视频生成的难度要大得多。
Paul Trillo 使用 Runway 的 Gen-2,仅通过图像和文本 prompt 让 AI 生成的视频。
视频链接:https://mp.weixin.qq.com/s?__biz=MzA3MzI4MjgzMw==&mid=2650907887&idx=4&sn=ca30f3fbde94ec74b32d75b638013594&chksm=84e46091b393e987d442c8c414bdb9b76741d60116bee3419f36a3cb5961906e5d33b4ab312b&token=1179435113&lang=zh_CN#rd
我认为在这方面,动画和传统电影之间的界限很模糊。只要其结果还与现实有差异,那么我们就可以在一定程度上把它们看作是动画和视频艺术的一种怪异新流派。就目前而言,我认为大家还是别想着用这类技术做真实风格的电影了,只把它视为一种新形式的实验媒体即可。玩得开心哦!
一步到位的工具(文本转视频):使用文本 prompt 生成全新的视频片段
理论上讲,这类技术有无限可能性 —— 只要你能将其描述出来(就像静态图像生成那样),就可能将其用于直播表演或生成任何超现实和风格化的内容。但从实践角度看,为了训练视频模型,收集多样化和足够大的数据集要难得多,因此仅靠文本来设定生成条件,很难用这些模型实现利基(niche)的美学风格。
使用这种方法,只能很宽松地控制创意工作。当与图像或视频条件化处理(即变形工作流程)组合使用时,这种技术就会强大得多。
Kyle Wiggers 做的动画生成测试,使用了 Runway 的 Gen-2
变形:使用文本 prompt,再根据已有的图像或视频进行进一步的条件化处理
很多视频生成工具都能让你以图像为条件生成视频。其做法可以是完全从你指定的图像开始生成,也可以将指定图像用作语义信息、构图和颜色的粗略参考。
人们经常会使用传统的静态图像模型生成起始图像,然后再将其输入视频模型。
这里生成的每一段视频都是使用一张唱片封面作为起始图像,作者:Stable Reel
视频链接:https://mp.weixin.qq.com/s?__biz=MzA3MzI4MjgzMw==&mid=2650907887&idx=4&sn=ca30f3fbde94ec74b32d75b638013594&chksm=84e46091b393e987d442c8c414bdb9b76741d60116bee3419f36a3cb5961906e5d33b4ab312b&token=1179435113&lang=zh_CN#rd
类似于图像生成模型中的图像到图像过程,也有可能将输入视频的信息嵌入到视频模型中,再加上文本 prompt,让其生成(去噪)输出。
我并不理解这其中的具体过程,但似乎这个过程不仅能在逐帧层面上匹配输入视频片段(如同使用 Stable Diffusion 进行风格化处理),而且能在整体和运动层面上匹配。和图像到图像生成过程一样,这个过程受去噪强度控制。
如果运气好并且有合适的 prompt,你也可以输入视频来「启发」模型重新想象源视频中的运动,并以完全不同的形式将其呈现出来。使用 webui txt2vid 中的 Zeroscope 完成,使用了 vid2vid 模式。
优点:
缺点:
免费工具:
插件和附加组件:
付费工具(有试用版):
注:最好的情况是你有足够的优良硬件(即 GPU)在本地运行这些工具。如果没有,你也可以尝试运行在远程计算机上的、功能有限的免费服务,比如 Google Colab,不过大多数免费或试用服务的功能都有限。
使用运动压缩增强的图像模型
随着 AnimateDiff 的日益流行,出现了一个使用视频或「运动」压缩来增强已有图像扩散模型的新兴领域。相比于使用逐帧技术生成的结果,其生成的结果更相近于原生视频模型(如上面介绍的)。这种技术的优势是你还可以使用为 Stable Diffusion 等图像模型构建的工具,如社区创建的任何检查点模型、LoRA、ControlNet 以及其它条件化处理工具。
你甚至有可能通过 ControlNet 提供视频条件化处理,就像是使用逐帧技术一样。社区仍在积极实验这一技术。可用的技术有的来自静态图像模型(比如 prompt 遍历),也有的来自视频原生模型。
如下视频为使用 ComfyUI 中 AnimateDiff 完成的动画,过程使用了多个不同的 prompt 主题。
视频链接:https://www.instagram.com/p/Cx-iecPusza/?utm_source=ig_embed&utm_campaign=embed_video_watch_again
这种技术中的运动本身通常非常原始,只是在视频片段中松散地插入对象和流,这往往会将事物变形成其它模样。不过,这种技术有更好的时间一致性,而且仍处于起步阶段。当场景很抽象,没有具体物体时,这种方法能得到最好的结果。
优点:
缺点:
免费工具:
目前,AnimateDiff (SD v1.5) 的实现一马当先:
付费工具:
整合语音合成的人脸动画
大家都知道,这是一个流行迷因背后的技术。你可能看过一个相对静止的人物(相机可能在移动)只有脸动着说话,这多半是用到了 AI 人脸动画化和语音合成工具的组合方法。
这其中组合了多个技术步骤和组件。其源图像多半是使用图像生成 AI 制作的,但也可以使用任何带有人脸的图像。语音是根据文本生成的,并根据所选任务的音色进行了条件化处理。然后再使用另一个工具(或工具包中的某个模型)合成与音频唇形同步的人脸动画 —— 通常只生成图像中脸部和头部区域的运动。使用预训练的数字化身也能让身体动起来。
视频链接:https://mp.weixin.qq.com/s?__biz=MzA3MzI4MjgzMw==&mid=2650907887&idx=4&sn=ca30f3fbde94ec74b32d75b638013594&chksm=84e46091b393e987d442c8c414bdb9b76741d60116bee3419f36a3cb5961906e5d33b4ab312b&token=1179435113&lang=zh_CN#rd
在发布热门的 Belenciaga 视频之前,作者 demonflyingfox 就已经发布了一篇分步教程:https://youtu.be/rDp_8lPUbWY?si=BWNKe7-KTJpCrNjF
优点:
缺点:
免费工具:
你也可以在网上直接搜索文本转语音服务,不可胜计,但效果多半赶不上 ElevenLabs。
至于全脸动画化,就我所知,目前仅有一些付费应用提供了试用版,而且使用很受限。
付费工具(有试用版):
人脸动画制作(通常会搭配语音合成):
搜索「D-ID 替代品」就能找到很多。
生成三维的人物运动
这是指为 3D 人物合成运动的技术。这类技术可以应用于 3D 动画电影、视频游戏或其它 3D 交互应用。正如图像和视频领域一样,新兴的 AI 工具让人可通过文本来描述人物的运动。此外,一些工具还能根据很少的关键姿势来构建运动或者在交互环境中实时动态地生成动画。
视频链接:https://mp.weixin.qq.com/s?__biz=MzA3MzI4MjgzMw==&mid=2650907887&idx=4&sn=ca30f3fbde94ec74b32d75b638013594&chksm=84e46091b393e987d442c8c414bdb9b76741d60116bee3419f36a3cb5961906e5d33b4ab312b&token=1179435113&lang=zh_CN#rd
Nikita 的充满天才巧思的元人工智能电影预告片,其中将 AI 的运动学习过程展现成了一部滑稽幽默的有趣短片。
由于本文的关注重点是生成工具,因此没有包含自动化某些非创意任务的 AI 应用,比如 AI 驱动的运动跟踪、合成、打码等,例子包括 Move.ai 和 Wonder Dynamics。
优点:
缺点:
免费工具(或可免费使用部分功能的服务):
付费工具:
LLM 驱动的工具
从理论上讲,由于大型语言模型(LLM)在编程任务上表现出色,尤其是经过微调之后,那么我们就可以在制作动画的软件中让其编程和编写脚本。这就意味着按照常规工作流程制作动画时,能让 AI 从头到尾一直辅助。极端情况下,AI 能帮你完成一切工作,同时还能为后端流程分配适当的任务。
在实践中,你也能尝试这么做了!举个例子,Blender 配备了非常广泛的 Python API,允许通过代码操作该工具,因此现在已经有几个类似 ChatGPT 的辅助工具可用了。这个趋势不可避免。只要有代码,LLM 多半就会有用武之地。
优点:
缺点:
免费工具:
付费工具:
注:还有一个即将推出的 ChatUSD—— 这是一个可以操作和管理 USD 的聊天机器人,这是由皮克斯最初创建的标准,用以统一和简化动画电影制作中的 3D 数据交换和并行化。目前没有更多相关消息了,但英伟达似乎很欢迎这项标准并在推动其成为各种 3D 内容的标准,而不只是电影。
终于完结了!内容很多,但我多半还是遗漏了一些东西。你觉得还有什么内容有待补充或还有什么相关工具值得提及,请在评论区与我们分享。
原文链接:https://diffusionpilot.blogspot.com/2023/09/overview-ai-animation.html#id_generative_video_models
*请认真填写需求信息,我们会在24小时内与您取得联系。