2019年7月24日 星期三

[筆記][macOS] Anaconda 安裝 Intel RealSense Python package on Mac

之前介紹過如何在windows上的anaconda安裝realsense的python套件
https://jennyli6079633.blogspot.com/2019/01/anaconda-intel-realsense-python-package.html
不過其實macOS才是最需要自己編譯library的系統啊...(Linux應該也是)
因為直接pip是沒辦法安裝的
官方是說還沒開發出適用Unix平台的pypi安裝法

在這邊介紹一下如何在mac上用cmake編譯pyrealsense並使用:
1. 下載cmake
google一下應該很多資料
連結是我參考的文章
https://blog.csdn.net/baimafujinji/article/details/78588488
照著做直到terminal輸入cmake是可以執行的就行了


2. 下載source code
直接從github clone下來最快
$git clone https://github.com/IntelRealSense/librealsense.git

3. 編譯pyrealsense2
在terminal中進入剛剛clone下來的realsense資料夾
輸入下面的指令
$mkdir build
$cd build
$cmake ../ -DBUILD_PYTHON_BINDINGS=TRUE
$make -j4
*如果environment的python版本不一樣
   在cmake指令後面再加上這個argument就可以了
   -DPYTHON_EXECUTABLE=[full path to the exact python executable]

接著讓電腦跑(伴隨mac的悲鳴??)
都沒有error就OK了

其實跟windows系統的大同小異
不過不用像windows的cmake需要那麼多設定

4. 移動.so並建立symbolic link
跑完之後在librealsens/build/wrappers/python 資料夾中會有這些檔案


我們要建立pyrealsense2與pybackend2移到python的lib並建立的sybolic link
系統才找得到

將pybackend2.2.24.0.cpython-37m-darwin.so
與pyrealsense2.2.24.0.cpython-37m-darwin.so
複製到anaconda3⁩/⁨envs⁩/⁨(Env name)/⁨lib⁩/python3.7/site-packages
並在這個資料夾
然後使用下面的command
$ln -s pyrealsense2.2.24.0.cpython-37m-darwin.so pyrealsense2.so
$ln -s pybackend2.2.24.0.cpython-37m-darwin.so pybackend2.so

目前測試在anaconda的virtual env可行
如果沒有裝虛擬環境
在python的site-package加入也可以

另外還有一個方式是用make install
但是我不想直接裝在我的系統上所以我沒有使用這方法

5. 測試(可import但無法測試是否真的能跑)
進入你的虛擬環境
然後import pyrealsense2
沒有跳出找不到的錯誤就可以了


可惜我的mac沒有usb 3.0可以插所以不能測能不能真的跑起來
看有沒有人可以幫忙測的XDD

歡迎留言討論

Reference:




2019年5月21日 星期二

[語言]一個月新制多益935分!!!我如何準備

為了求職更順利
而且高三時考的多益證照(825分)其實也已經過期了
所以三月的時候決定去考新制多益

考慮到口試完之後會有另一波求職
因此我報考2019/04/28的場次

5/20懷著忐忑的心查成績
結果竟然出乎我預料


(人生的高峰所以請讓我炫耀一下><)

太開心的PO文之後滿多人跑來問我做了什麼準備
所以整理一下我讀了那些書用了什麼資源
讓想準備的人可以參考

1. 刷題
練習題目是最重要的一環
原因是要練習控制時間以及專注度
雖然練習時的時間掌控狀況跟實際考試上一定有落差(比如說練習時都可以剩10分鐘結果實戰時最後十分鐘還剩兩個題組)
不過如果你練習時都寫不完
就要嘗試找出是哪一個部分是弱項最拖時間

我使用的題本是這一本:

New TOEIC多益新制黃金團隊5回全真試題+詳解(附2MP3+防水書套)


我個人覺得他的單字難度與題目方向跟真的多益考試差不多
詳解本有附帶題目也是很棒的設計
PS: 阿滴有推薦這一本的樣子

因為覺得自己閱讀比較弱(考出來之後的確是閱讀比較弱)
我有另外刷閱讀的題目:


但是這一本的題目與單字就有點偏難
直接寫可能會造成自信心低落
時間不夠所以我也只有寫+檢討三回


2. 閱讀的準備
閱讀的部分我覺得我的弱項是一開始的文法與單字部分
所以我用這一本書補強文法:

不過我覺得這一本其實比較適合有多一點時間準備的人
因為他內容真的超多(而且超級重)
基本上我只有翻完他的文法部分而已

3. 聽力的準備(其實沒什麼準備)
聽力的部分我個人認為是無法速成
所以我也沒有特別練習
頂多有空檔的時候看TED(而且還選不是商業的影片哈哈)
考前一天突然想起成大有Eazy Test這個資源
所以就用它的多益訓練課程來練聽力
課程內容提供了滿紮實的考試技巧訓練
(如果我早一點拿出來用或許閱讀會更高分)

4. 單字
單字我也是有空就背
前半個月我用百詞斬(中國大陸的APP)
後半個月我有空就會翻

他的編排方式是單元式
每一單元約40個單字
單元後面會有分級的單字表
可以視自己的程度去選擇要背什麼單字

檢討的時候我也會把不會單字抄下來
好處是很多常出卻不會的單字會因此印象更深刻

5. 檢討
檢討也是很重要的一環
我會在檢討的時候把不會的單字片語或常用句子整理起來
容易搞錯或不會的文法也會再抄寫一遍或自己想例句


以上是我一個月準備新制多益的方法與資源
當然其實我覺得能考成這樣有一部分也是運氣不錯
畢竟我很幸運地坐在撥放器前面
聽力聽得超級清楚

還在徬徨如何準備的朋友可以參考看看
祝福大家都拿到金色證書

2019年5月17日 星期五

[筆記][tensorflow]Batch Normalization Layer用法(Key Variable not found in checkpoint)

最近在改寫3D Faster RCNN時遇到了一些使用上的問題 ,
因此稍微筆記一下。

首先介紹一下Batch Normalization~
Batch Normalization 最早是在2015年被提出,
主要是解決network在訓練過程中遇到的Covariate shift問題
透過正規化minibatch,加速網絡訓練及穩定性。

最常用來解釋Batch nomalization對於增加訓練網絡的穩定性的方式為下圖:


圖片中我們可以看到,
加入Batch normalization的每一層網絡輸出的分布比較常態,
沒有發生有效值被shift到兩個極端,
這對於使用tanh或sigmoid兩種activation function的網絡來說有很大的幫助,
因為這兩個函數最敏感(變化最大)的區域有一定的範圍,
輸入的分佈超過範圍就會有飽和的問題。


因此如果加入Batch normalization,
會讓訓練避免陷入飽和的狀態。

而ReLU雖然不會遇到飽和的問題,
但是使用Batch Normalization還是可以避免梯度爆炸與加速訓練。

目前我謹了解其物理意義,
對於Batch Normalization的數學模型與詳細細節有興趣的朋友也可以去找他的原始paper或是其他資源來看。
或是之後我有空看完也會來努力補上。

接下來是Batch Normalization的tensorflow用法,
我使用的tensorflow版本是1.12。

要將Batch Normalization layer加在convolution layer的activation function之前,
這邊我用的是tf.layers.batch_normalization,
beta值、gamma值、mean與variance等超參數都使用預設值,
這些值可以自己調整,
(另外如果用的是tf.nn.batch_normalization,
就要自己先定義存超參數的tensor。)

要正確的訓練記得將training這個argument設為true。

接下來就是我遇到問題的地方。
因為batch_normalization的參數不屬於trainable variables,
若沒有設定tf.train.Saver儲存global_variable,
儲存的model將不包含訓練好的batch_normalization layer,
inference的時候會出現找不到的錯誤:Key Variable not found in checkpoint
因此在宣告saver時要加入save global variable的設定 var_list=tf.global_variables()



就可以解決了~~


本篇主要是筆記一下
(1) batch normalization的物理意義
(2) tensorflow的寫法
(3) save batch normalization model時的注意事項

參考資料:





https://www.tensorflow.org/api_docs/python/tf/layers/batch_normalization

https://www.tensorflow.org/api_docs/python/tf/nn/batch_normalization

2019年3月18日 星期一

[筆記][Git/Github][存參] 檔案過大 error: File ******** is 527.84 MB; this exceeds GitHub's file size limit of 100.00 MB

最近開始把一些時作放到github上
今天遇到了一個問題
就是我的pretrainied model太大了沒辦法push
但是刪掉了之後
error message還是一直出現

後來搜尋了解決辦法
這裡筆記下來
應該會記的比較清楚
(雖然之後會注意檔案大小不要再亂上傳一通)

Error message:
$ git push origin master
Enumerating objects: 20, done.
Counting objects: 100% (20/20), done.
Delta compression using up to 8 threads
Compressing objects: 100% (14/14), done.
Writing objects: 100% (17/17), 489.89 MiB | 14.18 MiB/s, done.
Total 17 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
remote: error: Trace: 4d46485696166b616f2204cef94eef80
remote: error: See http://git.io/iEPt8g for more information.
remote: error: File xxxxx is 527.84 MB; this exceeds GitHub's file size limit of 100.00 MB
To https://github.com/j6079633/CrossModalDistillation_Keras.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://github.com/j6079633/CrossModalDistillation_Keras.git'

Solution:
$ git filter-branch --tree-filter 'rm -rf path/to/your file' HEAD

這一個指令是過濾過去提交紀錄中超出限制大小的檔案移除。

結束後再下一個push的指令即可

但是因為前面整個流程我亂試一通變得有點亂
所以我有先下一個pull rebase的指令

$ git pull --rebase

如果是只有自己的project
很清楚明白有哪些地方被修改的話
可以使用force pull

$ git push -f

最後進行push就可以了

git 是專案管理滿重要的工具
CP值滿高的技能值
雖然大學時有稍微學一下但後來不常用就忘了
不過現在撿回來磨一下應該還來得及><

參考資料:

https://andy6804tw.github.io/2018/12/09/git-exceeds-size/

https://gitbook.tw/chapters/github/fail-to-push.html

https://blog.yorkxin.org/2011/07/29/git-rebase.html


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