【GiantPandaCV導語】本文主要介紹最最最基礎的tikz指令和一些繪制CNN時需要的基礎的LaTeX知識,希望能在盡可能短的時間内學會并實作使用tikz這個LaTeX工具包來繪制卷積神經網絡示意圖。

之前看到tikz可以畫出這種圖,感覺特别專業,是以萌發出了解一下tikz的想法。
在電腦上安裝過LaTeX都知道,LaTeX安裝包巨大,并且安裝速度緩慢,下載下傳和安裝的時間需要幾乎一下午才能完成。慶幸的是有一個平台可以線上編譯文檔,那就是overleaf,如今overleaf也推出了中文版本網站:https://cn.overleaf.com/ 以下代碼全部是在overleaf平台上編寫運作得到的。
最左側是項目檔案清單,中間是代碼編輯區,右側是可視化區,十分友善,隻要網絡通常,就可以友善地得到結果。并且這個平台提供了好多模闆,可以直接使用,太太太太太棒啦。
快速熟悉還是要推薦《minimaltikz》這本電子書,可以直接通路http://cremeronline.com/LaTeX/minimaltikz.pdf擷取或者在背景回複latex擷取。
這本書一共24頁,算是盡量壓縮了内容了,在這一節中将分析一下其中給的幾個例子,用于快速入門:
所有tikz繪制圖像的代碼都應該在tikzpicture這個環境中使用。
直角坐标系下:(\(<a>\),\(<b>\))的形式代表二維坐标系中的一個點,機關是cm。
極坐标系下:(\(<\theta>\):\(<r>\)),\(\theta\)代表極角,機關是度。
\coordinate可以對某個點進行重命名如:
那最基礎的畫幾條線的實作是通過\draw完成:
--符号代表兩點之間的連線,可以連續連結多段。cycle代表讓路徑回到起點,生成閉合路徑。
\draw還可以添加選項,比如讓線變粗、變紅、箭頭等需求,都很簡單。
畫一些曲線就需要使用circle、rectangle、arc等進行限制。
這是練習畫弧線的時候想練習的一個例子,結果如下
in代表進入的角度,out代表出來時候的角度,為了友善,筆者畫了一個輔助圖,對照代碼友善了解。
domain限制變量範圍,然後可以畫圖,結果如下:
通過fill參數控制結果,效果如下:
使用\node
舉個例子:
其實CNN畫圖主要用的是畫一條線的功能,下面來看如何畫CNN。
對于一個初學者來說,https://github.com/HarisIqbal88/PlotNeuralNet 這個庫雖然畫的很好,但是難度曲線太高了,退而求其次,使用https://github.com/pprp/SimpleCVReproduction/tree/master/tikz_cnn 進行解析。
首先介紹一個LaTeX中用于封裝的指令,\newcommand,當我們不希望寫很長的指令,那就需要類似函數的一個方式,封裝好固定的操作,根據傳入參數完成執行。
舉一個例子:
輸出結果就是:我喜歡你
假設以下指令調用,結果會是什麼?
顯示結果如下:
卷積神經網絡的示意圖實際上是一個個立方體構成的,立方體之間可能會有額外連線,代表特征融合;還可能需要題注,為這個特征圖立方體進行命名;必須要有立方體的位置資訊,長寬高;還需要顔色填充的功能;
綜合以上需求,這個函數提供了9個參數分别是:
由于每繪制一個立方體,右側立方體的X偏置就應該加上左側立方體的Depth值,這部分代碼這樣處理的。
指派過程:
計算立方體表面坐标(将點可視化是額外添加的,為了便于了解)
計算7個頂點位置,被擋住的也可以計算,但是因為這裡不打算繪制是以不計算。
繪制立方塊之間的連線:
繪制立方體主體部分,也就是将7個點連接配接起來。
填充顔色:

上邊的圖是通過以下代碼生成的:
需要注意的是#8和#9指令,mid_front代表的是連結#8=mid的front部分,front也可以被top、back、bottom取代。
https://cn.overleaf.com/project/5e8c38c31cccb20001a4998d
https://cn.overleaf.com/project/5f50b21ae802b6000155ec4f
https://github.com/HarisIqbal88/PlotNeuralNet
https://github.com/pprp/SimpleCVReproduction/tree/master/tikz_cnn
代碼改變世界