2019年1月14日 星期一

[筆記][Python] XML檔案讀寫(ElementTree and Minidom)

目前用Pascal VOC的格式來存取我的資料,所以python讀寫XML檔就變成是重要的一環,以下紀錄是XML檔的讀寫,也方便自己複習,不用每次都還要問google先生。
以下皆使用ElementTree與Minidom這兩個XML的Python API

  • Import ElementTree
    用cElementTree會比較快因為它是C語言寫的,可以直接使用硬體,下面的import方式就是主要import cElementTree,若沒有C語言base的,才改用python base的套件
    try:
        import xml.etree.cElementTree as ET
    except ImportError:
        import xml.etree.ElementTree as ET
  • 讀取檔案與解析node
    ElementTree讀取檔案的方式也很簡單,只要在建立ElementTree物件的時候給他XML檔案位置即可
    file_name = 'path_to_file'
    tree = ET.ElementTree(file=file_name)

    至於為什麼物件的命名是用tree呢?這是因為XML的格式就好像一棵樹一樣,由一個跟節點延伸出分支,然後各分支又可延伸出更多分支
    以PascalVOC為例
    root
            |--folder
            |--filename
            |--source
                   |--database
                   |--annotation
                   |--image
                   |--flickrid
            |--owner
                   |--flickrid
                   |--name
            |--size
                   |--width
                   |--height
                   |--depth
            |--segmented
            |--object
                   |--name
                   |--pose
                   |--truncated
                   |--difficult
                   |--bndbox
                           |--xmin
                           |--ymin
                           |--xmax
                           |--ymax
            |--object
            ...
    有了xml tree物件之後,便可以開始讀取裡面的node。我自己會用到的為以下3種
    1. 直接遍歷屬於root的節點(不過需要事先知道要找的node在哪一層,才能再更進去找)
    root = tree.getroot()
    for elem in root:
        print(elem.tag, elem.attrib, elem.text)
    
    2. 利用iter()進行節點遍歷
    for elem in tree.iter():
        print(elem.tag, elem.attrib, elem.text)
    
    3.利用iter(tag="node_name")針對特定節點遍歷
    for elem in tree.iter(tag='bndbox'):
        print(elem.tag, elem.attrib, elem.text)
  • 寫入XML檔案
    要製作自己的資料集,寫入xml檔其實是最快的方式,接下來的紀錄是我用xml.dom.minidom來寫檔(VOC格式)
    1. 建立root
    import xml.dom.minidom    
    #create empty root
    doc = xml.dom.minidom.Document() 
    #create root node
    root = doc.createElement('annotation')
    doc.appendChild(root)
    2. 建立子節點並幫子節點接上文字節點(text部分視為末端點)
    nodeFolder = doc.createElement('folder')
    nodeFolder.appendChild(doc.createTextNode(folder))
    3. 建立將子節點接到根結點或其他子節點上
    root.appendChild(nodeFolder)
    4. 開檔以及將建立好的xml tree寫入
    f_n = "file_name.xml"
    fp = open(f_n, 'w')
    doc.writexml(fp, indent='\t', addindent='\t', newl='\n',
                                            encoding="utf-8")

    到這邊就完成了
    不過要注意的一點是節點順序,建立的順序錯誤,檔案的節點順序就會錯誤
以上就是有關於xml讀寫方式的小小記錄,不過我覺得寫入的方式有點冗長,或許用ElemntTree可以更快也更統一,之後有空會來研究看看。



參考資料:
https://pycoders-weekly-chinese.readthedocs.io/en/latest/issue6/processing-xml-in-python-with-element-tree.html

https://docs.python.org/2/library/xml.etree.elementtree.html

http://note.qidong.name/2017/11/write-xml-with-minidom/

https://docs.python.org/2/library/xml.dom.minidom.html

2019年1月4日 星期五

[筆記][電腦] Anaconda 安裝 Intel RealSense Python package

沒想到重新開始寫部落格竟然寫這個XD

目前碩二,實作的東西是利用深度學習模型來完成電腦視覺相關的任務,要做電腦視覺當然要有眼(攝)睛(影機)。因為要做的是堆疊物體的偵測,需要深度影像,但是kinect停產了...所以我們改用Intel RealSense D435~

不過RealSense的python package要裝在Anaconda,或是windows OS上,有點複雜,花了一點時間才裝好...也害怕以後忘記怎麼裝,因此在這裡紀錄一下

[6/12更新]
已經測試在anaconda直接使用pip安裝pyrealsense2不會有問題
應該是該團隊已經修正為可以簡單安裝的方式
如果使用
pip install pyrealsense2
指令安裝後使用有問題的話
再考慮自己make source的方式

好了廢話完畢,開始安裝

1. Git clone source code
首先去librealsense的github頁面下載或clone source code
(建議用git clone的方式,因為之後make的時候也會需要git,乾脆一次裝好)



2. Make source code
這裡要使用CMake,記得下載CMake Windows Source,解壓縮後打開<cmake path>/bin/cmake-gui.exe


source code的部分是剛剛clone下來的librealsense src code
build的destination則在librealsense src code的root directory下新建一個build
Group與Advanced兩個option要記得check
接下進行Configure


我之後會使用VS2015來build,也可以使用自己習慣的IDE來build
Finish之後進行第一次Configure
(這邊可能會發生CMake Error could not find git for clone of libusb,解決方式一是我一開始提到的安裝git,另一個方式是在error發生之後,在BUILD中,取消勾選BUILD_WITH_TM2,不過因為有看到有人說取消勾選並不會解決問題,所以我安裝git)

然後會出現一堆紅色底的configuration,


將BUILD>BUILD_PYTHON_BINDINGS勾選起來,再按一次Configure
然後又有error!!


在Ungrouped Entries>PYTHON_EXCUTABLE欄位中
填上你的conda environment中的python.exe路徑
以我電腦上的路徑就是C:\Users\(User name)\Anaconda3\envs\(Env name)\python.exe

然後就可以Generate VS專案
Generate好之後,點Open Project,VS就會被開啟,直接按Debug/Compile


等一段時間之後就make好了~

3. Install package to Anaconda virtual environment
make完成後,在librealsense/build/Debug中會有下列幾個檔案
"pybackend2.cp36-win_amd64.pyd"
"pyrealsense2.cp36-win_amd64.pyd" 
將這兩個檔案的檔名更改成
"pybackend2.pyd" 
"pyrealsense2.pyd"

接下來將這兩個檔案和"realsense2.dll"複製到C:\Users\(User name)\Anaconda3\envs\(Env name)\DLLs
還有"realsense2.lib"複製至C:\Users\(User name)\Anaconda3\envs\(Env name)\libs

4. Test installation
實際跑librealsense的python example看看有沒有裝成功
(env_name) D:\RealSense\librealsense\wrappers\python\examples>python python-tutorial-1-depth.py


出現以下畫面就是成功了!


感覺以後就會常常用到,因此做個紀錄,也希望幫助到大家

Reference: https://github.com/IntelRealSense/librealsense/issues/1657