上一節,這節我們講解網頁材料在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小時內與您取得聯系。