2018年2月22日 星期四

ADAM裡的渲染與著色:第三章

作者:John Parsaie, 江毅冰 原文
潤稿:Kelvin


你看過了ADAM: The Mirror 和 ADAM: Episode 3 影片了嗎?這兩部短片獲得了超過百萬的點閱率,很多人都想知道由著名電影"第九區"導演Neill Blomkamp和他的團隊Oats Studios 如何使用Unity 來製作出這樣酷炫的效果。你可以閱讀我們一系列的文章。

光照


本文作者由Made with Unity團隊的軟體工程師John Parsaie與Unity技術美術總監江毅冰共同完成。John Parsaie在ADAM電影中負責像是表面散射、透明後期處理、Alembic圖形整合等等。


江毅冰,在加入Unity之前就職於頑皮狗、皮斯克等知名公司裡的AAA產品團隊,參與製作的作品包括Uncharted 4(頑皮狗)、怪獸電力公司和汽車總動員2等(Pixar)和無敵破壞王(Disney)等作品製作。


佈景:按幀分解


在即時ADAM系列電影中所呈現的令人震撼的效果,是在Unity中用大量元件組裝而成的。在這篇文章中,我們會著重說明Oats Studios是怎麼實現這些效果的。所以如果你想瞭解在某一幀這些美術如何使用它們的自訂Shader,請繼續閱讀下去。


本文所分析的ADAM 3中的一幀畫面



本文中我們將用RenderDoc打開ADAM 3的一幀畫面,為你剖析視覺效果背後的一些內幕。


RenderDoc是個十分實用的幀分析和圖形除錯工具。RenderDoc已經與Unity的編輯器整合。想瞭解更多關於RenderDoc與Unity的資訊請到這裡



渲染G-Buffer


ADAM 2與ADAM 3都是使用Unity 2017.1的Deferred渲染路徑來渲染的。這代表所有不透明的物件都會被渲染到一組緩衝區中,而這些緩衝區就被稱為G-Buffer或Geometry Buffer。G-Buffer包含了渲染管線下實現光照計算所需的所有資料。


左下方的G-Buffer和 alpha通道



透過設定多個渲染目標(MRT),對顯示的每個不透明物件,都可以在相同的draw call中將以下資料寫入到G-Buffer的所有四個組成部分中。

1.Diffuse Color RGB/Occlusion A(ARGB32)
幾何體的“固有顏色”和烘焙環境遮蔽。

2. Specular Color RGB/Smoothness A(ARGB32)
Unity支援鏡面和金屬PBR工作流程。但在內部,這二個工作流程的輸入內容最後寫入緩衝區的資訊是相同的。這是為了統一相同著色模型下的PBR輸入,後面將會用到這個模型。


3. World Normal RGB/Unused A (ARGB2101010)
更高精度的緩衝區會用來存儲每個圖元所處的世界空間法線或表面的朝向。這個資訊對於計算光源照度至關重要。


4. Emission, Ambient RGB / Unused A(ARGBHalf)
自發光和環境GI被渲染到這個緩衝區中。之後,這個緩衝區也在管線後期中被用來收集反射和累積光照。根據使用者設定,此緩衝區設定為LDR或HDR格式。ADAM就是用HDR光照渲染的。


注意:在管線中,使用自訂著色模型的透明和不透明物品的處理方式不同。


深度-模板緩衝區(The depth-stencil buffer)


在渲染G-Buffer時,場景的深度也被渲染到相應的特殊緩衝區中。對於即時圖形來說,深度資訊的存儲十分重要,它對我們在將場景投影到二維空間的過程中或之後保持物件的三維感至關重要。重建圖元的世界位置也很必要,這稍後在延遲著色中會用到。更重要的是,這是我們耳熟能詳且深受喜愛的即時高級後期處理特效的關鍵組成部分。


深度緩衝區(左)和 模板緩衝區(右)


模板緩衝區與深度緩衝區共用著相同的資源。在根據圖元受到渲染的內容分類圖元時,模板緩衝區尤其有用。我們在之後還可以使用這些資訊來區分圖元,並選擇要怎樣處理它們。在Unity中模板緩衝區被用作光剔除遮罩。在ADAM中,它也被用來標記呈現出次表面散射(SSS)的對象。



次表面配置緩衝區(Subsurface profile buffer)


對於次表面散射,渲染器也會在G-Buffer產生期間將索引寫入額外的緩衝區,該緩衝區之後會用於查找來自次表面配置資訊的重要資料。這個緩衝區還存儲一個表示散射發生次數的標量。


次表面配置緩衝區:(R)配置索引 (G)散射半徑



如上所述,這些重要資料來自使用者在編輯器建立的次表面漫反射配置資訊。這些使用者自訂的配置資訊決定了漫射光在高度半透明介質中的散射方式。


次表面漫反射配置資訊


我們也可以通過這些設定資訊來控制正向散射和透射率。例如:光線在穿透耳朵和鼻孔時的效果。所有這些資訊都會發送到GPU並在之後讀取。



下一步


G-Buffer完成渲染後,複雜的場景幾何計算就會被移到少數幾個緩衝區上,在之後進行計算。這樣做能使以後所有計算的效能消耗較為固定和可預測,這是因為光照計算在這時對於場景幾何複雜性來說,完全是未知的。然而,在主要光照計算之前,還有一些關鍵的預備性步驟,這些步驟將在下面進行探討。


環境反射光效果


透過使用G-Buffer中創建的資料,我們會對天空盒立方體貼圖運行計算以獲取環境反射資訊。這個計算將粗糙度、法線、視角方向、鏡面反射顏色等資訊考慮在內,並且通過一系列的方程來從環境中產生符合物理規律的鏡面反射效果。這些反射效果會被添加到自發光HDR緩衝區中。



環境反射光





陰影


到了這一步,幾乎所有渲染器所需的初步工作都已經完成。於是,渲染器進入到延遲光照處理階段,由陰影效果處理開始。

Unity在其定向光處理上使用了一種眾所周知的技術,名為級聯陰影貼圖(CSM)。這個技術的原理很簡單:距離越遠,我們眼睛能看到的細節就越少,既然如此,為什麼要把大量精力放在對電腦圖形學中的遠處細節的計算上呢? CSM便是基於這個事實,根據物體與攝像機的距離分佈或級聯陰影圖的解析度。


級聯陰影貼圖(左)和聚光陰影貼圖(右)



在這個鏡頭中,定向光CSM實際上只用在環境幾何體上,而畫面中二名角色的光照則由一組聚光燈處理!有一些鏡頭是這樣處理的,因為它給了Oats Studios的燈光師更多的靈活性,從而能突出鏡頭中的關鍵視覺效果。



螢幕空間陰影



我們還使用了一個名為“螢幕空間陰影(screen-space shadows)”的技術,有時也稱為“接觸陰影”,它通過深度緩衝區中的光線步進來提供細節豐富的陰影。這種技術尤其重要,因為它能夠捕捉攝影測量法構建的環境中顆粒狀陰影的細節,這些細節有時甚至是CSM都無法捕捉到的。螢幕空間陰影和Unity的陰影貼圖技術被一同用來“填補”漏光。



延遲著色


在以上步驟完成後,我們就有了足夠的資訊來對光照場景進行逐圖元重構。



一次延遲光照處理中讀取的所有資訊


延遲光照處理過程將針對視圖中的所有光照進行處理,每次都會將光照累積到HDR緩衝區。G-Buffer的內容是根據當前光照的資訊(包括陰影貼圖)來計算的。


首先,從深度緩衝區重建圖元的世界空間位置,該位置後續被用於計算從表面點到眼睛的方向。這對確定依賴視角的鏡面反射效果來說十分重要。陰影和其它光照資訊(例如剪影等)也會被彙集成一個標量,用以計算衰減後的最終效果。接下來,所有表面資料都從G-Buffer中取出。最後,所有資訊都被送到我們的著色模型,這是一個基於物理的微縮焦雙向反射分佈函數(BRDF),進行最後的著色處理。



所有最終光照都會累積到不透明物體上,次表面物件除外



在這時,我們已經有了一個近乎完全著色的場景,但是那些白色的輪廓怎麼辦?如果你還記得的話,那些是我們在範本緩衝器中標記的用於次表面散射的圖元,它們的著色處理尚未完成。



次表面散射


前面有簡單地提到,次表面散射是漫反射光的散射和再現,多見於半透明介質中最典型的例子之一是皮膚。而且在所有非金屬中都會有不同程度的次表面散射,只不過多數時候我們並不會注意到。

但是在即時電腦圖形下,次表面散射究竟代表著什麼呢?


散射距離比圖元小(左) 散射距離比圖元大(右)


這個問題的答案其實引出了一個更大的問題。上面的二個圖都包含一個代表圖元的綠色圓圈,以及位於其中心的入射光。藍色箭頭表示漫反射光線,橙色箭頭表示鏡面反射光線。左圖顯示所有漫射光線會在材質中散射,並在相同圖元的邊界內重新出現。由於幾乎所有要渲染的材質都會出現這種情況,我們可以假設漫射光是從入射點發出的。

當渲染的材質對漫反射光線散射過多時,會出現問題,光線會重新出現在圖元的邊界之外,如右圖所示。之前的假設在這樣的情況下毫無説明,我們需要探索更先進的技術來解決這個問題。



漫反射光(左) 鏡面反射光(右)



遵循當前最先進的即時次表面散射技術,我們對光照應用了特殊的螢幕空間模糊。但是在此之前,我們必須確保將漫反射和鏡面反射光照分離到各自的緩衝區中。為什麼要這樣做呢?回顧一下這些圖表,你會發現鏡面反射光會從表面立即反射,不參與任何次表面現象。所以我們至少應該在執行次表面光照估算之前,將它與漫反射光照分離。


在下圖中,你可以更清楚地看到二種光照的不同效果。請注意,所有的鏡面反射光都已與漫反射光完全分離,從而可以在完成左側的輻射/漫反射緩衝區所需的工作的同時,不用擔心損壞鏡面反射的高頻細節的完整性。



漫反射緩衝區(左)鏡面反射緩衝區(右)



基於由自訂次表面配置資訊創建並發送而來的擴射內核,螢幕空間模糊效果近似於這種次表面散射現象。



多個次表面配置資訊可被用在不同的材質上



通過在計算結束時將漫反射光和鏡面反射光相結合,我們便把之前的問題給解決了!像這樣的技術在估算圖元到達範圍外的散射時是非常有效的。此時場景中的所有不透明物件現在都被著色了。



場景中的所有不透明物件都已被完全著色



接下來是渲染螢幕空間反射(SSR)、天空盒(Skybox)、螢幕空間環境遮蔽(SSAO)和透明度。下面你可以逐步觀察這些過程的變化。



對SSR、天空盒、SSAO和透明度進行的渲染



運動模糊(motion blur)的重要性


運動模糊在影片中的確起到了關鍵的作用。雖然它提供了可以控制影片品質的另一個微妙維度,但對某些鏡頭來說它是一把兩面刃。


運動向量紋理(左)用運動向量計算的運動模糊(右)



當然,渲染運動模糊需要渲染器瞭解運動本身。這些資訊通過首先渲染初步的運動向量貼圖而來。這個緩衝區是通過計算螢幕空間中當前頂點位置和先前頂點位置之間的差值,產生用於計算運動模糊的速度。


我們還做了一些額外的工作,以正確地從Alembic流獲得運動向量。有關詳細資訊,請閱讀文章



後製特效


應用後期處理特效之前和之後的效果


我們終於來到了最後的後期處理過程。在這一步中,最終色彩分級、ACES色調映射、暈影、泛光和景深合成到一起,生成一個接近完成的圖像。但是,Marian的防護面罩去哪了?



Marian的防護面罩


在使用到該技術的行業中,處理即時圖形的透明效果是一個老生常談的問題。諸如景深、螢幕空間反射、運動模糊和環境遮蔽等效果的主幹部分都需要從場景深度進行一些空間感知/重建,但是對於被透明物體覆蓋的圖元,要怎麼處理呢?你將需要二個或更多的深度值!

首先將所有不透明的物件渲染到場景中,然後是一個針對透明物件清單所特有的自後向前的特殊正向的繪製向處理過程,將每一遍個繪製處理階段混合到幀緩衝,但而不寫入深度緩衝。這樣做可以盡可能地規避這個問題,對於大多數物件,比如角色的眉毛或霧,這樣的處理效果還不錯。


Marian的防護面罩帶有一些不現實的反射效果,無AO,DoF不正確,無運動模糊


然而從上面的例子可以看出,我們不能在Marian的透明防護面罩上規避這個問題,因為這個防護面罩在影片超過一半時間中都有出現。針對這種情況,我們需要某種替代方案。

最終產品製作階段的解決方案是將透明物件延遲到二個完全著色幀之間的合成階段中進行渲染。正如前文所說,第一幀包含了除了防護面罩外的所有物件。在第一幀渲染完成後,G-Buffer和深度被放置到第二幀的第二個渲染階段中,其中防護面罩被渲染為不透明物件。





防護面罩的透明處理被延遲到二個完全著色幀之間的合成階段



在第二幀的第二個後製處理過程中,通過使用原始幀的G-Buffer和深度的內容,我們可以成功地獲得防護面罩的正確的SSR、SSAO、運動模糊和景深效果。要使面具回到原始幀,只需根據防護面罩的alpha進行合成,這個alpha將會因為運動模糊或景深效果而被模糊。



應用和沒有應用這個技術的畫面。請注意右邊預期的遮蔽效果



透過對Marian的防護面罩進行這樣的處理,我們將它很好地整合到了畫面中,如上面所示。你會注意到右圖中有正常的SSR和AO。雖然這並不是透明問題的全方位解決方案,但是這種技術解決了原來的極端情況,並為透明物件提供了完整的後期處理支援。



畫龍點睛:火焰


Oats Studios將室內的火焰系統運用得很好,完全提升了影片的畫面品質。通過在時間軸中進行動畫和排序,這些鏡頭光暈被添加到圖像幀畫中,產生最終的圖像。



最後的著色幀以及準備添加在上面的鏡頭光暈



成品效果

至此,你已瞭解我們所提到的所有東西是如何在運行時進行渲染的。


Marian拿著石頭靠近她的人質哥哥


總的來說,把框架細分是團隊為適應製作需求做出的一些選擇,而逐幀分解不僅是理解這些選擇的好方法,也是一個可以從中獲取有用資訊並應用到你自己專案的好方案。

想了解更多圖形框架相關資訊可以搜尋Adrian Courrèges’學習系列。


未來展望


Unity計畫在2018年為每個使用者呈上更強的圖形功能,例如影片中使用的次表面散射。我們稱之為可程式設計腳本渲染管線(SRP),它是Unity 2018 beta版提供的一套新API,開發者可以用它自訂渲染器。我們還將發佈SRP的範本,稱為高清渲染管道(HDRP),這是個包含次表面散射等新功能的現代渲染器。《ADAM》中使用的次表面散射是從HDRP直接移植到Unity 2017.1的現存渲染器中的。

如果你想要瞭解更多SRP的資訊,以及今年Unity將推出的新圖形功能,請閱讀Unity 2018中的圖形渲染



我們已經揭秘了一系列Unity 2017的功能,例如:Timeline、Cinemachine、Post-Processing Stack以及30 FPS即時渲染是如何幫助Oats Studios這樣的團隊改變電影製作的未來的。希望未來有更多Unity製作影視作品的佳作產生。

2018年1月15日 星期一

Unity 2018.1 測試版發佈


作者:Carlos Rincon 原文
潤稿:Kelvin Lo


Unity 2018.1的測試版已發佈,開發者可以下載並開始熟悉新功能。Unity 2018.1測試版中有大改進並加入了大量新功能。 例如:針對Metal的Tessellation、針對GI的GPU Instancing支援、針對編輯器匯入設定和元件的Presets功能、 支援PS4的動態解析度、全景360圖像和影片錄製(測試版)、測試版的圖片動畫API、FBX匯入改進、新的粒子系統改進等等。

你可以從這裡下載,記得看一下發佈紀錄

新渲染架構:Scriptable Render Pipeline


作為Unity 2018.1版本的一部分,我們引入新的即時渲染架構設定Scriptable Render Pipeline ,簡稱SRP。我們將在未來的版本中不斷改進它並加入新功能。SRP可以讓開發者和技術美術充分展現新一代硬體和GPU的效能,不在需要研究數百萬行的C++引擎代碼。SRP是一個可擴展的管線,通過C#程式和材質著色器輕鬆訂製渲染管線。

我們會提供一些範例,這些範例可以利用SRP從輕度和高畫質的管線開始介紹,針對不同場景做優化。輕度的目標場景是跨平台專案,而高畫質則是針對更高標準的場景,例如PC或遊戲機這樣的高效能的平台。

SRP目前還在測試階段,你當然可以繼續使用內建的渲染管線和原有的設定。

Shader視覺化設計工具 - Shader Graph


為配合SRP而設計的Shader視覺化設計工具Shader Graph,能幫助開發者、美術進行視覺化的著色器構建。不必寫程式,只要在一個編輯器中建立並連接節點,就可以設計和除錯Shader,每一步都可以預覽。



在Unity 2018.1 的下一個測試版本中,我們會把這個功能整合到Unity裡面,會用一個讓使用者體驗比較好的的工作流程。如果你已迫不及待地想試試看這個功能,我們製作了一個SRP的簡單範例,它是基於輕量管線來構建的,你可以下載範例專案,並使用Unity 2018. 1 測試版打開它! 任何問題回報可以回報在此論壇討論


即將來臨:C# Job System


在Unity 2018.1 測試版週期裡,我們還會整合C# Job System和一個新的測試系統Entity Component System,簡稱ECS。未來這將使編寫安全的多執行緒程式和提高效能變得更加容易。

系統需求更改


  • Unity 2018.1 測試版中移除編輯器中針對Substance Designer材質導入的內建支援,我們建議改用由Allegorithmic提供的外部匯入套件,方能保持最新的版本來匯入和使用Substance Designer材質。 想了解關於這個決定的緣由,可以看這裡
  • 移除了對Wii U的支援。 
  • 移除了在standalone打包流程裡對Windows XP的支援。Windows Vista現在是Windows standalone流程裡所支援最舊的作業系統。 
  • 我們還放棄了對MonoDevelop-Unity的支援,這代表現在Visual Studio是MacOS和Windows系統上的推薦和支援的C#編輯器。 
  • 因為Visual Studio for Mac需要MacOS 10.11,所以Unity編輯器對MacOS系統的需求也已變為MacOS 10.11。 

逐步移除舊粒子特效系統


從Unity 2018.1開始,我們將逐步移除舊粒子特效系統(Legacy Particle System)。我們的目標是在Unity 2018.2中完全移除舊粒子特效系統。在Unity 3.5中它被一個新的系統Shuriken所替換,並從Unity 5.4開始被完全棄用。我們的分析顯示,它的使用量已幾乎為零,所以我們決定移除舊粒子系統。

如果這對你的專案有影響,建議:

你可以從Unity 2017.3 版本粒子系統的改進一文中找到一些關於Unity 2017.3中最新粒子系統改進的範例


未來展望


正如任何測試版專案一樣,你將能提前體驗仍在開發中的功能。但那也代表著體驗到的Unity版本會比較不穩。要使用測試版很簡單。只要到我們的beta測試區,閱讀指南並下載安裝程式即可。

我們也建議你註冊成為Beta版測試開發者(文章最下面)。註冊後你將能收到新版本的可用通知,以及如何成為有效測試開發者的提示。Unity 2018.1 測試版本對所有Unity開發者免費。在release notes裡,你能看到當下發佈版本中所有的新功能、改進以及bug修復的資料清單。

2018年1月11日 星期四

Unity 2018.1開始停止支援MonoDevelop-Unity

作者:Lukasz Paczkowski 原文
潤稿:Kelvin Lo


從Unity 2018.1開始,Unity將不在綁定與MonoDevelop-Unity一起發行,並且在Unity 2018.1後的版本也不再支援使用MonoDevelop-Unity開發。

隨著Unity中.NET 4.6腳本執行庫(測試版)的升級,Unity開始支援C# 6.0及後面版本提供的全新C#功能。為這些新的C#功能提供一個適合的IDE體驗,對於我們來說也十分重要。

目前的MonoDevelop-Unity 5.9.6並不支援最新的C#功能,也無法在Unity裡除錯這些.NET 4.6的程式。因此我們將做出二項改變。

  1. 從Unity 2018.1開始將不再支援MonoDevelop-Unity 5.9.6。MacOS和Windows的安裝程式也會將它移除。
  2. 從Unity 2018.1開始,Visual Studio for Mac將作為MacOS上的唯一C# IDE。在Windows上會繼續保留Visual Studio 2017 Community,並不再將MonoDevelop-Unity作為選項。

自Unity 5.6.1開始,Visual Studio for Mac已整合 Unity的連接套件,即支援最新的C#功能也支援在.NET 4.6程式執行時上除錯C#程式。MacOS上的MonoDevelop-Unity開發者可以下載並安裝Visual Studio for Mac並開始使用。


C# IDE選項


除了Visual Studio for Mac和Visual Studio 2017 Community之外,現在還有一些其它的C# IDE可用。

Visual Studio Code (Windows, macOS, Linux)

在Preferences裡將Visual Studio Code設定為外部編輯器時,Unity就可以在Visual Studio Code裡打開程式。要支援C#代碼編輯與Unity C#除錯,還需要安裝下列內容。



JetBrains Rider (Windows, macOS, Linux)

當在Preferences裡將JetBrains Rider設定為外部編輯器時,Unity就可以在JetBrains Rider裡打開程式腳本。

JetBrains Rider是一款基於IntelliJ和ReSharper的.NET IDE,並包含ReSharper大部分功能。Rider還支援所有最新的C# 6.0功能,以及在Unity中進行.NET 4.6腳本運行庫上的C#除錯。查看更多相關內容

2017年12月24日 星期日

[攻略]Unity - 3D小球機器學習專案架設

整理潤稿:Wei J,Kelvin Lo

本文將分享如何安裝Unity機器學習代理工具(Unity Machine Learning Agents),並透過官方範例3D小球,了解整個環境的安裝方法。

在本文中使用的案例是3D平衡小球(3D Balance Ball)的運行環境。該環境包含多個平板和小球。這些平板可以自己做縱向及橫向旋轉,來保持小球不掉離平板。每個平板都是一個代理,通過保持小球在平板上的時間得到獎勵;掉出平板,則會扣除獎勵。這個訓練過程的目的在於讓平板學習永遠不讓球落下。 

3D小球實際成果展示

-------------------------------------
整篇文章為參考以下文件列表所整合的一個攻略流程:
Windows 10安裝攻略 by Jason Weimann
Mac安裝攻略 by 
鲍健运
專案Github
整合Unity教學
Ptyhon與其他軟體安裝
--------------------------------------------------

開始:


如果你要架在Windows 10平台上:

本教學需要安裝的軟體清單如下:
Nvidia CUDA toolkit - CUDA 8.0.61
CUDNN檔案 - CUDA 8.0使用的v6.0版
安裝Anaconda會安裝以下套件:
- Python
- Jupyter
- TensorFlow
- Matplotlib
- numpy
- pillow
- docopt
Unity範例專案


設定Unity機器學習代理工具和TensorFlow環境(Windows 10)
本章節轉載由Jason Weimann所寫的文章,說明在Windows 10上如何設定Unity機器學習和TensorFlow環境。本章節完成後會繼續說明如何設定Unity官方的機器學習展示專案 - 3D Ball。

說明

  • 本章節針對Windows 10平台,Mac環境設定請跳過本章節。 
  • 請注意軟體所對應的版本,如果版本不同可能會導致安裝不成功。 
  • 下載和安裝軟體前請關閉Unity和Visual Studio,並確認你的Windows 10電腦採用NVIDIA顯卡,因為本文所使用的GPU加速工具包是NVIDIA的CUDA。 

安裝CUDA工具


首先需要下載CUDA 8.0.61。請到GUDA下載頁面,選擇下載CUDA Toolkit 8.0 GA2。 (會有很多新版本,但本案要下載這個版本)




下載完成後執行安裝,當出現下圖所示的選擇安裝介面。請選擇“Express”,一直下一步到完成CUDA工具的安裝。



安裝CUDA深度神經網路資料庫CUDNN


接下來需要下載CUDA深度神經網路庫(CUDA Deep Neural Network),簡稱CUDNN。它是專門針對深度神經網路框架設計的一套GPU計算加速方案。全世界的深度學習研究者和框架開發者都使用CUDNN來增強GPU計算效能。這讓他們能專注於訓練神經網路、開發軟體應用,不用在低級別的GPU性能調整上耗費時間。CUDNN支持當下流行的各種深度學習框架,包括Caffe2、MATLAB、Microsoft Cognitive Toolkit、TensorFlow和PyTorch等。

CUDNN下載頁面,選擇CUDA 8.0使用的v6.0版本下載。當下載CUDNN時,Nvidia 會要求你登入,可以註冊一個免費帳號登入。





下載完成後解壓縮會有三個目錄(bin、include和lib資料夾),確定CUDA工具安裝完成後,把這三個目錄複製到CUDA 8.0工具資料夾。 

一般來說安裝CUDA時的預設路徑是:
C:\Program Files\NVIDIA GPU Computing Toolkit\cuda\v8




複製bin、include和lib資料夾到\
NVIDIA GPU Computing Toolkit\cuda\v8目錄底下

設定環境變數和路徑


接下來需要幫Windows系統增加環境變數和路徑設定。


1.開啟檔案總管,在本機上按右鍵選內容
2.進入系統控制台後選進階系統設定
3.點選進階頁面底下的環境變數




4.點"新增"按鈕。 
加一個CUDA_HOME,數值設為: 
C:\Program Files\NVIDIA GPU Computing Toolkit\cuda\v8.0(路徑是你的CUDA安裝路徑)

選擇"確定"。




編輯路徑Path

先找到Path,反白後點"編輯",會開出系統路徑快捷表。



新增兩個系統路徑。
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\extras\CUPTI\libx64


最上面兩個是安裝CUDA時產生的不要去動它
新加的路徑會在最下面,注意不要打錯字了


安裝Anaconda


為了要安裝Python和Jpyther套件,為了避免繁瑣的安裝流程,建議採用Anaconda來安裝會比較容易。
到Anaconda的下載頁面,下載Python 3.6,選擇64位版本。下載完成後安裝Anaconda,按照系統下一步到完成安裝


安裝完成後你應該可以在快速選單找到Anaconda Prompt。開啟它。 



接下來所有的Command line指令都是在
Anaconda Prompt執行。

下一步,我們要創建使用Python 3.5.2的執行環境。在Anaconda Prompt中輸入指令來建立環境:

conda create -n tensorflow-gpu python=3.5.2


然後輸入指令啟動剛剛創建的環境:

activate tensorflow-gpu


最後用這個指令安裝TensorFlow:

pip install tensorflow-gpu


當安裝完成後,你就可以輸入指令啟動Python來測試剛剛的流程是否成功。指令為:

python


然後輸入指令測試:import tensorflow as tf


下載Unity的範例專案 


接下來要下載本次的3D小球專案,你需要從GitHub頁面下載專案,可以直接下載並解壓縮到任意位置。或是透過Github Desktop直接克隆一份道你電腦上。為了讓工作輕鬆建議不要太深的目錄,例如D:\ml\就好。

接下來從選單找到Anaconda Prompt。用右鍵點擊Anaconda Prompt,選擇更多->"以系統管理員身份執行"(Run as administrator)。




剛剛解壓縮後的Unity - 3D小球專案目錄下有一個python目錄。從這個Anaconda prompt視窗把目錄切換到剛下載好的ml-agents專案裡的python目錄位置。 

例如:我專案放在D:\ml\ml-agents\,那麼我們要把目錄切換到D:\ml\ml-agents\python。執行:

cd d:\ml\ml-agents\python


然後要安裝Html5lib庫,輸入指令:

conda install --force html5lib


然後輸入:

pip install .


注意:"pip install ." 最後有個點.


如果以上步驟一切正常,你就可以到下一章節
用TensorFlow和機器學習設定你的Unity專案了。
----------------------------
如果你要架在Mac OSX平台上:

  • macOS版本要求:OS X El Capitan(10.11)及以上。 
  • 建議下文中所使用的軟體版本都使用最新的版本。 

安裝Homebrew


對於許多使用macOS作為作業系統的開發者來說,一般習慣於使用命令列安裝所需應用,當然這樣也能顯得很geek。而Homebrew也是很常用的套裝軟體管理工具,能在Mac中方便的安裝軟體或者卸載軟體。

打開Terminal應用,輸入以下命令下載安裝最新的Homebrew。


/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安裝完Homebrew後,建議重啟Terminal。


透過Homebrew 安裝 Python 3


Python是機器學習常用的語言,TensorFlow就使用它作為主要開發語言。作為解釋語言,它不需要進行編譯,對於機器學習所需要的大量原型化和反覆運算處理有相當高的效率。而且Python開發生態成熟,有許多庫可供使用。通過pip(Python Package Index)工具,你可以安裝各種基於Python的庫。

輸入 
brew install python 3 安裝 Python 3。在安裝完Python 3之後,建議重啟Terminal。 


安裝專案所需Python庫和工具

以下說明兩種安裝路線:可以二選一

路線一:
安裝Jupyter Notebook

Jupyter Notebook是一個開源的Web應用程式,可以讓你建立和共用包含即時程式碼,方程式,視覺化和說明文本的文檔。 用途包括:資料清理與轉換,數值類比,統計建模,機器學習等等。

輸入 pip3 install jupyter 安裝Jupyter Notebook。


安裝NumPy

NumPy是Python語言的開源數學擴展庫。支援高級大量的維度數組與矩陣運算,此外也針對陣列運算提供大量的數學函式程式庫。由於NumPy剛剛宣佈不再支援Python 2,所以建議直接使用Python 3。

輸入 pip3 install numpy 安裝 NumPy。


安裝Pillow

Pillow是PIL(Python Imaging Library,Python圖像庫)的一個分支,提供了對於開發者許多比較友好和直觀的功能。

輸入 pip3 install pillow 安裝 Pillow。


安裝docopt

docopt是Python的命令列參數解析器,其基於多年來用於描述程式介面的説明資訊而設計的,因此可以給開發者清晰的輸出體驗。

輸入 pip3 install docopt 安裝 docopt 。


安裝TensorFlow

TensorFlow是現今非常流行的使用資料流程圖進行數值計算的開源軟體庫。圖中的節點代表數學運算, 而圖中的邊則代表在這些節點之間傳遞的多維陣列。這種靈活的架構可讓你使用一個 API 將計算工作部署到設備、伺服器或者移動設備中的一個或多個CPU或 GPU。TensorFlow 最初是由Google 機器智慧研究部門的 Google Brain 團隊中的研究人員和工程師開發的,用於進行機器學習和深度神經網路研究, 但它是一個非常基礎的系統,因此也可以應用於眾多其他領域。

輸入 pip3 install tensorflow 安裝 TensorFlow。

路線二:
Python庫快捷安裝

一步步通過pip3安裝這些庫可能有些麻煩,如果你已經安裝了Python 3,並且克隆了Github上完整的ml-agents專案。


你可以打開Terminal,把目錄改到ml-agents專案下python的目錄(目錄每個人都不同):

cd /Users/(你的名字)/UnityMachineLearningAgents/python 。

輸入“pip3 install .”,安裝以上所有的Python庫和工具(install後面有個.號不要漏掉)。


完成安裝

如果你按照以上2種方法順利操作的話Mac環境下Unity Machine Learning Agents所需功能基本安裝完畢。你就可以開始用TensorFlow和機器學習配置你的Unity專案了。

-----------------------------

上面的環境安排好了之後,接下來我們就可以到Unity裡面設定要學習的內容

確保你已經下載Unity在GitHub上的ml-agents專案。
確保使用Unity 2017.1 或以上版本


設定Unity環境


啟動Unity,開啟剛剛下載資料裡的unity-environment目錄(本展示專案)。

在啟動視窗中,選擇Open,並在彈出的檔流覽視窗中,選擇unity-environment,點擊Open。



注意:如彈出警告”Opening Project in Non-Matching Editor Installation”,請直接忽略。


打開專案後,在Project視窗,到資料夾Assets/ML-Agents/Examples/3DBall/,按兩下Scene檔的圖示開啟場景。




點擊功能列Edit -> Project Settings -> Player,選中Resolution and Presentation裡的Run in Background屬性。

將Resolution and Presentation中的Display Resolution Dialog屬性,選擇Disabled。




在左邊的場景hierarchy 視窗中,展開Ball3DAcademy遊戲物件,並選中它的子物件Brain3DBrain,在右邊的Inspector中查看屬性。

將物件的Type of Brain設定為External。
(註:設為External是為了在外部做訓練,未來把訓練資料放回專案後,設回Internal就可以在Unity裡面看到訓練後的行為)




點擊File -> Build Settings
選擇目標平台。(選項)勾選Development Build來記錄除錯資訊。點Build開始打包。
重要:存檔路徑請直接指定ml-agents底下的python目錄,給予的檔名也請記住,待會設定要填入一樣的檔名。





用強化學習訓練大腦

測試Python API

---Windows---
如果上面已經跑過Jupyter安裝流程,你可以:
開啟Anaconda Prompt
切換目錄到專案的python目錄

cd d:\ml\ml-agents\python

執行jupyter notebook

開啟瀏覽器localhost:8888就會看到jupyter notebook在python的位置被打開(目錄資料結構確保和下圖相同)






用PPO訓練模型


下一步我們訓練代理,讓它在平台上平衡小球的位置,我們會使用一個叫做近端策略優化(Proximal Policy Optimization),簡稱PPO的強化學習演算法。這個演算法經過實驗,證明是十分安全、高效且比其他強化學習演算法實用性更強的,所以我們選擇這個演算法來作為Unity機器學習代理的範例演算法。


如果想要瞭解更多關於近端策略優化演算法的資訊,請參閱OpenAI發佈的文章


現在請按照下面步驟操作:


  • 在Jupyter中打開PPO.ipynb
  • 修改env_name的值 = 剛剛打包的專案檔名稱
  • run_path目前設定為ppo,依需求可以改到別的目錄也可以不改
  • 按途中的前進按鈕,執行PPO.ipynb的程式,注意不要執行"Export the trained Tensorflow graph."這行文字後的程式。



(選項)針對本專案如果你想要快點訓練完成,可以多調整以下設定:
max_steps = 5000
buffer_size = 5000
batch_size = 512

觀察訓練過程


如果順利的話,你的機器人應該已經開始訓練了。要更仔細地觀察訓練過程,你可以使用Tensorboard。

在Anaconda Prompt視窗切換目錄到專案的python目錄


cd d:\ml\ml-agents\python

輸入:

tensorboard --logdir=summaries



然後在瀏覽器中打開localhost:6006





從Tensorboard上,你會看到以下多個統計圖:


  • 累計獎勵(Cumulative Reward):所有代理各自的平均累計獎勵。在成功的訓練過程中,這個變數應該會增大。
  • 數值損失(Value Loss) :數值函式更新時的平均損失。這關係到模型是否能預測每個狀態下的數值。在成功的訓練過程中,這個變數會減小。
  • 策略損失(Policy Loss) :策略函式更新時的平均損失。這關係到策略(決定行為的過程)的變化大小。在成功的訓練過程中,這個變數的大小會減小。
  • 事件長度(Episode Length) :設定環境下,所有代理中每個事件的平均長度。
  • 數值估計(Value Estimates) :代理所存取的所有狀態下的平均數值估計。在成功的訓練過程中,這個變數數值會增大。
  • 策略信息量(Policy Entropy):這個變數告訴你模型的決定隨機度有多大。在成功的訓練過程中,這個變數會緩慢減小。如果它減小得太快,beta hyperparameter應該會增大。



將訓練好的模型載入Unity環境


經過一段時間訓練後,當訓練過程顯示的平均獎勵大於等於75時,你可以回到PPO檔案繼續往下執行Export the trained Tensorflow graph這一區,匯出保存資料。

資料會存在python/models/ppo(檔案裡面run_path所指的目錄)
會看到一個同名.bytes




停止執行PPO就能停止訓練。現在你就已經有訓練好的TensorFlow模型。你必須將保存的模型轉換為Unity可使用的格式,透過以下步驟載入到Unity專案中。

把訓練好的bytes檔案複製到:
Assets/ML-Agents\Examples\3Dball\TFModels




設定對TensorFlowSharp的支援


因為對TensorFlowSharp的支持目前還處於實驗階段,預設情況下它是被禁用的。要打開它,你必須按照下列步驟。
請注意Internal Brain模式只在完成以下步驟後才能使用。


  • 確保使用的是Unity 2017.1以上版本。
  • 從這裡下載TensorFlowSharp套件,並匯入Unity中。
  • 功能表選擇Edit -> Project Settings -> Player。找到Other Settings,在Scripting Runtime Version屬性中選擇Experimental (.NET 4.6 Equivalent),在Scripting Defined Symbols屬性中,加入ENABLE_TENSORFLOW。(請注意:多個平台代表每個平台都要設定)
  • 重開Unity


務必重開之後回來確認Symbols還在


  • 重新開啟3DBall場景
  • 從場景的hierarchy視窗選擇Ball3DBrain物件
  • 如下圖將Type of Brain改為Internal
  • 如下圖將Graph Model指定剛剛匯入的.bytes檔



  • 將Graph Placeholder的size值設為1
  • 增加名為epsilon的placeholder,設定類型為floating point,範圍從0到0。


注意:上面這兩個設定應該在專案裡已經設好了。
設定這兩個步驟是有必要的,因為3DBall是個持續的控制環境,而TensorFlow模型會用噪音參數來決定行動。但那樣的情況下控制過程是離散的,所以不需要epsilon變數)

最後按Play按鈕,查看訓練後的結果在Unity Editor裡呈現。


流程非常繁瑣但現在你應該可以看到被訓練好的模型已經能自行控制平衡小球的行為。

Jason Weimann的兩段教學影片對本專案非常有幫助,建議遇到問題的開發者可以參考這兩段影片

Unity3D Machine Learning Setup for ML-Agents on Windows 10 with Tensorflow

關於我自己

我的相片
Unity台灣官方部落格 請上Facebook搜尋Unity Taiwan取得Unity中文的最新資訊