結構化隨機森林源碼分析

文章信息與源碼來源
  • <Structured Class-Labels in Random Forests for Semantic Image Labelling>
  • http://www.dsi.unive.it/~srotabul/#publications

Random Tree 類庫設計分析

  • 看完作者的源碼,對C++的繼承與派生,派生,更爲深刻的理解。基類指定規則,固定好程序的算法框架或者是邏輯流程,派生類則給出一個具體的細節化的方案,使用什麼樣的數據類型,具體每一步的執行過程怎麼定義;使用模板類給出抽象化的類型,使用virtual函數給出抽象的流程,比如在RT中的split虛函數,作爲構樹過程中很重要的一環,基類指定了這個函數實現的是對當前節點的數據分流功能,規定函數的輸入是當前節點Node,返回值是數據的分流結果,左右數據流的統計信息,當前節點的路徑選擇函數的參數,但是至於怎樣的實現,是在派生類中完成的。
  • 幾個具體的RT成員分析:RT在設計過程中更加註重的是構樹這個過程以及樹本身的物理含義,從數據結構的角度分析:與上一篇文章相似,節點在構樹過程中需要保存哪些信息,路徑選擇函數的參數信息,自己的左右兩個孩子節點的鏈接信息,自己要處理的數據流的頭尾信息,如果是leaf節點,自己對應做出的預測是什麼?驅動節點生成的結構:程序邏輯上是非leaf節點都要加入隊列建立自己的孩子節點。
    • ①建立root節點,使用這棵樹的全部訓練樣本初始化root節點
    • ② 將root 加入到驅動隊列vec_0中
    • ③ 檢測驅動隊列vec_0中有節點存在,逐個爲所有的節點選擇最優的數據流分割方案,保存最優的路徑分割函數的參數,輸出分割後的數據流(已經完成了重排序,排序總是一個焊好的功能),如果能並生成自己的左右孩子節點(構建好鏈接關係),使用分流的數據分別初始化孩子節點,leaf == false;如果當下節點不能生成孩子節點, leaf==true;
    • ④檢測vec_0中的所有節點,如果是非leaf節點,將孩子節點全部放入vec_1中,如果是leaf節點,依據該節點的所有數據流,生成節點標籤Prediction,但是不加入vec;
    • ⑤ vec_0 vec_1 地位交替,清空已經處理完的那個vec,作爲下一層孩子節點加入訓練的驅動結構,直到另一個vec也是空,只有leaf==false 的節點纔會有子節點,才能把子節點加入到vec中繼續對數據進行分流。


RT或者Random Foresrt引入結構化信息

  • pixel - image patch - feature patch - RF - label patch - label ;
  • 所謂的結構化信息,在這篇文章中指的是上下像素類別的位置信息,原來對於一個點pt(x,y),取出局部patch,計算feature vector ,按照pt對應的類別標籤完成訓練,訓練樣本是從Rn -> R ; 機構化的信息,類別不再是real value ,而是一個具有相互制約關係的vector,反應在圖像上就是像素與其鄰域像素的各自類別的對應關係信息,從feature patch ==> label  變化 feature patch ==》 label patch ;輸出的變化帶來的問題
    • ① 對於分流評價的指標:information gain 的計算
    • ② 訓練過程中隨機樹的leaf節點的輸出怎樣計算:從leaf的數據流中找出最好的一個作爲標籤
    • ③ 使用過程中,一個樣本使用RF,每一個RT都會有個標籤輸出,怎樣進行merge model 
    • ④ 一個像素點pt 使用Structured RF 後會產生一個label patch , 相鄰位置的像素點pt-0也會產生label patch 來影響當前節點的label,怎樣確定!


源碼分析

  • 虛函數的使用
  • 模板類的構建與使用
  • 面型對象的多態機制,什麼時候 以及爲什麼使用多態
  • 怎樣閱讀C++的類庫?流程!
  • 基於RT實現自己的解決方案,需要考慮哪些問題?




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章