2020年3月30日 星期一

竹南外海風機群



年初,夫妻到香山海邊休閒時,赫然發現竹南方向海中,隱隱約約透露出佇立的風車群。倆人好奇心起,有志一同,決定延著岸邊公路慢慢向南開,走走停停,最終在竹南龍鳳漁港,近距離親見到這群海中神兵。

海岸邊,波浪起伏,再向前一步就會被退潮的浪頭吞噬。遠方無所止的茫茫大海,看似平和,但任何有坐船出海經驗的人都知道,那裡決對是風急浪湧,絕不平靜。海中直挺挺插入了二十多根灰白風機,畫面是如此的突兀,讓人驚懼。

這種震撼感,比起陸上風機又更直接,還記得第一次在海邊防風林中見到風機拔地而起,就覺得異常詭異,只敢囁囁嚅嚅躲在基柱邊,看著上方巨大扇葉凌空刷過,讓巨大風切聲不斷劃向自己,而這些海中神兵,要有多大的氣力才能對抗強勁的疾風與日夜不停的海流啊。

事實上,陸上風機大約一百公尺高,每根造價接近兩億元,風電賣給台電後,前十年收益是攤提成本,爾後才是獲利。海上風機高約一百八十公尺,體積更為巨大,建造和維護都更艱難,成本大增。但都比不上海上風電高效益,以及沒有土地使用糾紛的巨大優勢,成為未來風電主角。目前竹南外海這22根風機,僅是第一階段,今年底、明年中,苗栗和彰化外海,更將擴展為風機FARM的形式。屆時海上景觀將與現今完全不同,想想有生之年能看到這人造地景藝術在海中綻放盛開,也是奇特的經驗。

---

老婆尤其對這景像著迷,開啟了後續的追拍之旅,一有空就驅車到海邊捕捉這群風車身影,為了追求最好視野,由北而南,自崎頂海水浴場起,經過青草漁港曳船道、龍鳳海灘、龍鳳漁港北堤、南堤、假日之森、紫斑蝶館,最南還到竹南長青之森,五公里距離中,各處沙灘或高地,都有她的足跡。

為了追求更好品質,她更由個上班族,搖身一變成為會定期觀察每日潮汐、天氣能見度、晴雨霧風的天氣之子。

隨著蒐集影像日益豐富,她更決定將其整理為小展覽的核心主題,並且擴大和加深其內容,她認為,海上風機固然壯觀,但若不能結合人民意志,也就只是個建設,尤其風機對附近漁港漁獲和白海豚都有明顯影響,環保、農村轉型、國家意志交互影響下,究竟會走向何方?這些念頭吸引她由海岸邊走入竹南龍鳳宮,試圖藉由拍攝傳統社會信仰支柱,與未來發展進行連結。

龍鳳宮主祭祀媽祖,保佑著竹南沿海漁民生計,她拍攝了八十八尊小媽祖群像,以及空拍千里眼順風耳和大媽祖照,最後更將祭祀、擲筊、保平安的概念,融入作品中,是很有創意的布置方式。

她的作品解說就完全將風機與傳統信仰給了完美結合。

近年來政府在竹南龍鳳漁港打造了首批22支風車矗立於外海。風車約45層樓高,在海上形成巨柱群,與陸上龍鳳宮的媽祖巨神像遙相呼應。

媽祖法力無邊,能呼風喚雨,是俗民信仰的心靈能源。風車可以發電,不造成空汙或輻射汙染,是人類文明的科技能源。風車群高聳壯麗「數大便是美」之奇觀,令人不由產生崇拜景仰之心,成為百姓膜拜的風神指日可待。

美景奇觀當前,水下噪音汙染帶來的瀕危物種與漁獲減少等代價微不足道,化作神桌上一道道獻祭品。

風神仍不斷在擴大建造中,未來將遍佈台灣西海岸,形成心靈與科技兼備的海上風場聖殿。我們是風神時代的見證者,也是受益人。


---

這幾年,政府倡議非核家園,替代能源當道,廠商有利,政府有需求,也不管未來電費會漲多少,就這麼大興土木開始興建風機,我們小小老百姓,對未來也只能求神問卜啦。

2020年3月29日 星期日

筆記:OCT元件資訊



不知為何,對OCT興趣始終不減,持續將資訊整裡如下。

光源


OCT的核心概念是,兩條衍生自同一光源又再合併的光束,若其中一條光束路徑上有不同反射率的物質,就會因為光程差,產生干涉現象。藉由觀測干涉強弱,回推出物質的折射率與厚度。這重要前提是光源的同調性要低。若以數學形式來表示,Delk代表同調光源寬帶幅度,數字越小同調越高,數字越大,形狀就越寬平,MATLAB程式如下(連結)。

k0 = 12E6; %central wave number, green light
delk = 3E6; %wave number spread
S_k = @(k) 1./(delk*sqrt(pi)).*exp(-((k-k0)/delk).^2); %power spectrum of light source
figure
h = ezplot(S_k, [4E6, 20E6]);
title('low coherence light source spectrum',
'Fontsize', 12, 'Fontweight', 'bold'); xlabel('wave number(m^{-1})',
'Fontsize', 12, 'Fontweight', 'bold'); ylabel('Relative intensity',
'Fontsize', 12, 'Fontweight', 'bold'); set(gca, 'Fontsize', 12, 'Fontweight', 'bold');
set(h,'Linewidth',2);
print('low coherence light source spectrum','-dpng');


符合上述低同調光特性的雷射有二種,掃頻雷射及SLD,前者成本過高不予考慮,SLD大致可依波長區分為1550nm,1310nm,830nm三種。不同的波長會影響成像,更重要會連帶影響系統內其他元件的選配,例如光纖和光譜儀。

光源本身,大多都已封裝為蝶形,功率範圍1~10mW,以FC接口向外發射。價格約4500人民幣( 連結 )。

但僅有光源是不夠的,SLD還需要注意電源供應和溫度調整(連結)等driver結構。

電源控制器,可參考Low Cost 200 mA Laser Diode Drivers (連結) (連結) (連結),美金約1200元,台幣約四萬。


溫度調整,可參考ILX 半導體雷射器溫度控制器 LDT-5412 Temperature Controller(連結)。


不論是單獨光源,或組合電源與溫控,或整機等各種組合,或許因為銷量少,價格都居高不下。

各種組合中,整機形式因為功能有廠商保證,選項也多,最受人青睞,缺點當然很明顯,就是貴。THORSLAB為首選,四川綿陽SLD的價格很具吸引力,廣東六朋電子似乎有產品,但客服實在太爛( 連結 ),ExFO SLED 1550nm激光器  連結  二手約五萬台幣。


第二種模式是光源搭配分離的電源供應和溫控,因為各個部件獨立,可自立更換不同實驗光源,目前詢價約五萬台幣。最後一種則是光源搭配簡易drive(捨棄溫控),網路上兩篇Low Cost OCT技術文件似乎都是這種組合,成本約三萬台幣,可惜沒有更多細節。

光路


實驗光路可以是空氣搭配分光鏡,或是光纖(內建分光功能)這兩類。若選擇光纖,還要因為光源選擇的不同(波長),區分為1550nm( 連結 ),1310nm,830nm三類中某一種。供貨廠商包括Thorslab(連結,至少都上萬元台幣),或是TAOBAO便宜貨(連結),價差很大,卻看不出功能差異在哪(保偏??)。

其餘配件還包括了反光鏡、準直鏡、工作平台(光學桌)、量測儀器,還有必須備妥一個簡單的可見光雷射筆,確認光路的正確。

待測物件


OCT的目的就是要量測物件的反射狀態。技術文件中則時常提到洋蔥,但在實驗室中,就只有單(雙)玻片及最後面鏡子。學理上,則可以MATLAB設計出幾個不同層次如下。
zs1 = 0.024000; rs1 = 0.00025;%normal eye AP length
zs2 = 0.024030; rs2 = 0.00010;
zs3 = 0.024090; rs3 = 0.00015;
zs4 = 0.024150; rs4 = 0.00005;
zs5 = 0.024200; rs5 = 0.00020;
zs6 = 0.024310; rs6 = 0.00010;
zs7 = 0.024350; rs7 = 0.00030;%artificial retina layers settings
zs8 = 0.025000; rs8 = 0.99100;%sclera
rR = 1; % reflectivity of reference reflector
前者為距離,後者為折射率,最後面一層模擬完全反射。

TD-OCT


TDOCT會維持待測物這端光距,藉由穩定移動參考端反射鏡,觀察反射訊號強弱,判定反射率。過程牽涉下面幾項硬體設備。

精密步進馬達,馬達精密程度直接決定掃描結果成效,目前實驗室設備,宣稱到1nm,若真要使用,還有待實驗數據。

PD接收裝置,可將光訊號轉變為電訊號。

示波器,接收PD訊號轉變為可閱讀和記錄資訊,如下。


FD-OCT


與TD OCT不同,FD沒有任何移動機制,而是用光譜儀(OSA)接收反射光,並進行反傅立葉轉換。結果如下,可在不同位置觀察到反射率的改變。





OSA種類繁多,OCT應用上會因為實驗光的波長範圍,區分為兩類,1000nm以上或以下。1000nm以上,材料為InGaAs,價格昂貴(連結)。1000nm以下,可以使用為CMOS或是CCD,價格較親民,較常應用在低價OCT中(此兩篇論文,連結  連結 連結 )。工研院的皮膚OCT機器,則是使用OtO台灣超微光學的SE 2030 與HB2030光譜儀模組。

低價OCT為了節省成本,還會以1200條光柵片,搭配相機元件,自製OSA(連結 連結 連結)。

OSA分析系統,連結

平面及環形掃描機制


TDOCT與FDOCT可以得到某個點Z軸各個深度的反射率資訊。若要得到平面資訊(XY),可以利用兩組振鏡(連結)改變掃描方向,如下。或是更先進的MEMS,體積更小,靈敏度更高。


除平面外,結合精巧的工藝,還能達到管壁掃描的功能,結果如下。

連結位置
連結位置

2013年的數字資料,Intravascular optical coherence tomography imaging at 3200 frames per second  (連結)  中文整理資料(連結)。自聚焦透鏡GRIN(連結),可以玩玩看。

影像系統

統合全系統設計( 連結 )

補充MATLAB

連結 連結

其它

OCT at home • Medizinisches Laserzentrum Lübeck GmbH

2020年2月20日 星期四

筆記:人工智慧的應用,雲象科技

組織辨識 連結google ai

最近這幾年,人工智慧相關議題火熱,市場上各家公司不管三七二十一,紛紛宣稱自家產品都內建有人工智慧功能,反正,誰也說不清人工智慧對產品能有何助益,更無法從外表判定一項產品內部是否有使用人工智慧技術。各說各話下,人工智慧在行銷上噱頭意義遠大於實際價值。

不過這當然是我井底之蛙的錯誤印象,台灣各行業人才濟濟,只要留心必定會發現,仍有許多結合實務與學術的應用。前些時間參加研討會,接觸到【雲象科技】,會中並介紹幾項他們已經開發或正在開發產品。


項目合作醫院資料標記正確率其他
鼻咽癌長庚360位6位醫師,每一個區域分別是何種細胞 時間:六個月97%醫學影像解析度非常高,逐一進行掃描,檔案超過GPU所能儲存的範圍。要解決類似問題必須將圖像切割儲存。再針對該問題繼續補上所需的病理切片影像進行訓練後,模型逐漸完備。
脊椎X光片長庚第一階段1500位X光
第二階段18000位
25個脊椎上特點進行標記,再由這些點計算出脊椎的角度。醫生不再需在X光片上畫圖測量角度。
骨髓抹片台大萬張影像,還要標註10萬多顆細胞12位時間:預估兩年骨髓抹片,就包含多種細胞,依其種類和成熟度來分,就有將近40種。

以軟體工程師來評價,這幾項產品都是百分之百以人工智慧為主的服務,經過查證,雲象科技的確也是科技部宣傳人工智慧業務的樣板廠商。所以未來當有人再提出,人工智慧是否能商品化這類質疑時,請他們去看雲象科技,就能得到答案。

--- 第一項收穫,台灣真的有人工智慧為核心的廠商

這些產品使用的技術是物件辨識技術,也是人工智慧各分支中的顯學,廣泛應用在人臉辨識、自動駕駛和生物組織比對,眾多天才投入,和各式各樣的學術競賽(kaggle連結),知名實驗室論文(google lab連結)推波助瀾下,正確率動輒達到百分之九十九,這些都讓局外人(例如我)以為只要用國外已經訓練好的資料庫,直接接入流程,就可以賣出軟體。

所以,當我首次聽到雲象科技介紹相關產品時,只覺得這一切是如此理所當然,只要從網路下載訓練資料,套用現有模型即可啊。演講者繼續在台上口沫橫飛介紹他們如何辛苦的進行資料標記,對坐在台下的我來說,完全無動於衷,甚至一頭霧水。

講者繼續解釋,對雲象科技來說,資料的取得和標記才是重點中的重點,或許因為法規限制,也或許因為解析度的需要,似乎每一個產品線都需要重新掃描取得原始資料。

數位病理的高解析度特性(1GB以上),對硬體的需求也隨之提高。最有挑戰性的狀況,是當一個100層的ResNet分析一張解析度為10,000×10,000的影像時,GPU甚至需要搭配600GB的系統記憶體才能運算,遠遠超過單張32GB內建記憶體的頂級GPU的能力。雖然能用影像切割訓練模型,但縮小影像仍會流失一些資訊。難怪他們也是國網中心的常客。

更重要的是,每個產品都需要投入大量人力進行標記,以月或是年為單位,更是家常便飯,為了加速整體開發時間,最近他們甚至將人才延攬對象擴展至醫生,要聘請醫生來負責不同程度的影像標註。希望能涵蓋專業醫科、醫學檢驗,以及護理相關等領域。

--- 第二項收穫,原始資料的取得和標記,更勝於人工智慧模型

經過前述掃描和標記過程,終於生成產品,這幾項產品的應用都很直覺易懂,所以想像中,當產品推出後,就會得到廣大迴響及高接受度。但演講者卻說,實際情況並非如此。並提出幾點原因。

一、醫療器材審核門檻高。
眾所周知,醫療器材的審核制度繁瑣且複雜,尤其人工智慧是新概念,缺乏可靠的風險評估機制,使得市場先行者必須承擔更多風險。自己從事TYPE C等級醫療產品開發,完全能體會這其中艱辛。

二、仍無法完全取代專業判斷。
目前人工智慧技術已可在大量組織標本中快速且正確圈選出小量癌細胞,對檢驗科醫師來說,這個工具的確能加速癌細胞辨識速度。但相反情況下,現有技術不可能找出全部的癌細胞,也會有錯誤的判斷,仍要人力介入。

三、產品難訂價。
對醫院來說,核磁共振機這類產品有明確的收益,成本和折舊都能精確量化,也容易比價。目前人工智慧服務都屬於附加功能,效益不明確,更難以訂價。

四、新產品難進入舊流程。
醫生大多不願意改變作業流程,且已經花大錢購買的設備,若沒有影像資料出口,也無法進行分析處理,若要進入現有流程,產品設計上就得成為獨立設備,並且重視資料傳輸能力。

--- 第三項收穫,好產品不等於好銷售額

根據資料,這家公司並非全新公司,五年前成立時,是提供玻片掃描、建立數位病理資料庫的服務,讓醫生不必再捧著一盒盒玻片到實驗室用顯微鏡觀察組織切片,當時宗旨是改造數位化程度落後的病理科,和人工智慧沒有關係。當時資本額為六十萬元。

創辦人(台大醫學系畢業,目前還在讀美國南加大博士)是在見識到深度學習在ImageNet影像辨識大賽的潛力後,轉型為醫療影像人工智慧公司,以原有的病理影像為基礎,結合理工科朋友,共同創業,才開啟他們多項人工智慧產品的研究與開發。參考公司登記資料(連結),目前公司資本額為六千萬元,並且朝更多領域擴展中。

--- 第四項收穫,即使有上述種種困難,但只要掛著人工智慧,公司估值的確會成長幾十倍啊(笑)


2020年2月7日 星期五

筆記:TensorFlow語法與使用


  • 深度學習概念(連結)
  • CNN及眾多應用(連結)
  • RNN及眾多應用(連結)
  • TensorFlow安裝(連結)
  • TensorFlow語法與使用(連結)
  • Porting AI ( QCS605 QCS603 Android )(連結)

基本語法

初始化

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

執行訓練

sess.run(tf.train.GradientDescentOptimizer(learning_rate = 0.5)
.minimize(tf.reduce_mean(tf.square(y - y_data))))
y_data是初始設定固定值,y是每次不同變數 可以由
tf.Variable(tf.random_uniform([1], -1.0, 1.0)) 變數會變動產生


取得運作資料

sess.run(W)  中間放入要取得的名稱


Graphs 建立運算元

繼續是引入layer也就是類神經網路的概念。
每一個層的單元類型如下
weights_l1 = tf.Variable(tf.random_normal([1, 10]))#10个神经元
biases_l1 = tf.Variable(tf.zeros([1, 10]))
wx_plust_b_l1 = tf.matmul(x, weights_l1) + biases_l1
l1 = tf.nn.sigmoid(wx_plust_b_l1)
程式化這範例,狀況如下

def add_layer(inputs, input_tensors, output_tensors, activation_function = None):
    W = tf.Variable(tf.random_normal([input_tensors, output_tensors]))
    b = tf.Variable(tf.zeros([1, output_tensors]))
    formula = tf.add(tf.matmul(inputs, W), b)
    if activation_function is None:
        outputs = formula
    else:
        outputs = activation_function(formula)
    return outputs
實際程式化,就如同下述
# 添加 1 個隱藏層  有十個節點,由一對應十
hidden_layer = add_layer(x_feeds, input_tensors = 1, output_tensors = 10, activation_function = None)
# 添加 1 個輸出層  有一個節點,由十對應一
output_layer = add_layer(hidden_layer, input_tensors = 10, output_tensors = 1, activation_function = None)
test5.py是test1.py的改編版本。只不過兩層的activation function都是null。
單純比較test1和test5會發現,兩者的梯度數字明顯不同,在同樣iterator下,正確率也不同。但已經可以驗證神經網路層是有用處的。

test3.py是莫凡test2.py的改編版本,兩者概念相似,只是第一層的activation function稍有不同 l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)。




矩陣運算概念

test27.py


變數

(1) 常數張量:
一開始來看看「常數張量」,常數指的是在Model中不會改變的數值。
tensor = tf.constant([1, 2, 3, 4, 5, 6, 7], dtype=tf.int32)
Random的使用方式 test4.py

(2) 變數張量:
與常數截然不同的就是變數,「變數張量」是指在訓練當中可以改變的值,一般「變數張量」會用作於Machine Learning需要被訓練的參數,如果你沒有特別設定,在最佳化的過程中,Tensorflow會自動調整「變數張量」的數值來最佳化。
tensor = tf.Variable(tf.truncated_normal(shape=(3, 5)))
因為變數通常是未知且待優化的參數,所以我們一般會使用Initalizer來設定它的初始值,tf.truncated_normal(shape=(3,5))會隨機產生大小3x5的矩陣,它的值呈常態分佈但只取兩個標準差以內的數值。
如果今天你想要有一個「變數張量」但是又不希望它因為最佳化而改變,這時你要特別指定trainable為False。
tensor = tf.Variable(5, trainable=False)
Variable 則是在訓練神經網路時,儲存可更新參數的容器。

(3) 置放張量:
另外有一些張量負責擔任輸入窗口的角色,稱為Placeholder。
tensor = tf.placeholder(tf.float32, shape=(None, 1000))
因為我們在訓練之前還尚未知道Data的數量,所以這裡使用None來表示未知。tf.placeholder在Graph階段是沒有數值的,必須等到Session階段才將數值給輸入進去。
x_feeds = tf.placeholder(tf.float32, shape = [None, 1])
sess.run(train, feed_dict = {x_feeds: x_data, y_feeds: y_data})
test29.py
placeholder 是 TensorFlow 中一個很有趣的用法,可以預先在神經網路中 佔位,而不用事先定義好輸入的資料,這也是 TensorFlow 中計算圖(Computing Graph)的概念,之後再使用 Session 將資料傳入計算圖中。
在 placeholder 中定義節點的形狀 shape=(None, 2),None 的意思是二維矩陣的 row 事先尚未定義,也就是「不定義輸入資料的筆數」,隨著透過 Session 將資料傳入計算圖時,動態符合輸入資料的筆數。
往後在訓練神經網路時,可以透過設定超參數 batch_size 決定每次訓練資料的筆數,保持神經網路的彈性。
placeholder 用於在計算圖中傳入 feature 與 label

(4) 操作型張量:
這類張量並不含有實際數值,而是一種操作,常用的「操作型張量」有兩種,第一種是作為最佳化使用,
loss = ...
train_op = tf.train.GradientDescentOptimizer(learning_rate=0.5).minimize(loss)
選擇Optimizer和最佳化的方式來定義最佳化的操作方法,上述的例子是使用learning_rate為0.5的Gradient Descent來降低loss。
另外一種是初始化的操作,
init_op = tf.global_variables_initializer()
這一個步驟是必要的但常常被忽略,還記得剛剛我們定義「變數張量」時有用到Initalizer,這些Initalizer在Graph完成時還不具有數值,必須使用init_op來給予數值,所以記住一定要放init_op進去Graph裡頭,而且必須先定義完成所有會用到的Initalizer再來設定這個init_op。

命名

模組化的程式中使用 with tf.name_scope(): 為每個運算元命名(連結)



TensorBoard


神經網絡運算初始之後,利用 tf.summary.FileWriter() 將視覺化檔案輸出。測試為test6.py。
產生的檔案位置在TensorBoard這個目錄中(自動生成的)
執行 $ tensorboard --logdir="TensorBoard/"


打開瀏覽器,在網址列輸入:http://localhost:6006,就可以在 Graphs 頁籤下看到神經網絡圖。


除了可以使用 with tf.name_scope(): 為每個運算元命名,我們還可以在使用 tf.Variable() 或者 tf.placeholder() 建立變數或輸入資料時,利用 name = 參數進行命名。test7.py

參考資料

我們利用 tf.summary.histogram() 與 tf.summary.scalar() 將訓練過程記錄起來,然後在 Scalars 與 Histograms 頁籤檢視。test8.py

Scalars

Histograms

資料儲存格式


TensorFlow 的模型格式有很多種,針對不同場景可以使用不同的格式,只要符合規範的模型都可以輕易部署到線上服務或移動裝置上,這裡簡單列舉。 
* Checkpoint: 用於儲存模型的權重,主要用於模型訓練過程中引數的備份和模型訓練熱啟動。 
* GraphDef:用於儲存模型的Graph,不包含模型權重,加上checkpoint後就有模型上線的全部資訊。 
* ExportModel:使用 exportor 介面匯出的模型檔案,包含模型 Graph 和權重可直接用於上線,但官方已經標記為 deprecated 推薦使用 SavedModel。 
* SavedModel:使用 saved_model 介面匯出的模型檔案,包含模型 Graph 和許可權可直接用於上線,TensorFlow 和 Keras 模型推薦使用這種模型格式。
 * FrozenGraph:使用 freeze_graph.py 對 checkpoint 和 GraphDef 進行整合和優化,可以直接部署到 Android、iOS 等移動裝置上。 
* TFLite:基於 flatbuf 對模型進行優化,可以直接部署到 Android、iOS 等移動裝置上,使用介面和 FrozenGraph 有些差異。
參考

PB

通常我們使用 TensorFlow時保存模型都使用 ckpt 格式的模型文件,使用類似的語句來保存模型
tf.train.Saver().save(sess,ckpt_file_path,...)
使用如下語句來恢復所有變量信息
saver.restore(sess,tf.train.latest_checkpoint('./ckpt'))
但是這種方式有幾個缺點,首先這種模型文件是依賴TensorFlow 的,只能在其框架下使用;其次,在恢復模型之前還需要再定義一遍網絡結構,然後才能把變量的值恢復到網絡中。
google推薦的保存模型的方式是保存模型為PB 文件,它具有語言獨立性,可獨立運行,封閉的序列化格式,任何語言都可以解析它,它允許其他語言和深度學習框架讀取、繼續訓練和遷移TensorFlow 的模型。它的主要使用場景是實現創建模型與使用模型的解耦, 使得前向推導 inference的代碼統一。另外的好處是保存為 PB 文件時候,模型的變量都會變成固定的,導致模型的大小會大大減小,適合在手機端運行。

根目錄執行test13.py,會執行train和test,並且在最後產生graph.pb檔案。並且用test14.py觀察graph.pb檔案(用TensorBoard打開它)
步驟一,python test14.py --model_dir graph.pb --log_dir tensor/logs/convnet/
步驟二,tensorboard --logdir=tensor/logs/convnet/
步驟三,由瀏覽器開啟http://localhost:6006/。透過瀏覽器的互動觀察,可發現pb檔案中,不僅包含input到conv2d等等的處理過程,也包括teain時設定的各層和降階方式。所以測試程式難度比想像要單純,會寫訓練程式就一定能寫測試程式。

以pb為資料中心的範例test22 這裡直接把資料存graph.pb讀取動作
python train.py  python test.py

這裡有三個項目要討論
1.pb格式, 都是binary形式,如果要產生成txt格式,可以用
tf.train.write_graph(graph, '.', 'graph.pbtxt', as_text=True)
讀取也能夠直接讀取txt但是要例外考慮一些技巧(連結)

2.利用tf.train.write_graph()預設情況下只匯出了網路的定義(並沒有權重),上面test22是因為使用了convert_variables_to_constants,上面test13是因為各個變數都使用constant。如果沒有這兩種,就會變成只有一個空殼。 連結

資料正規化


已訓練完畢的資料集,動則數百M,資料傳送耗時,也無法放入IOT有限的記憶體中。所以第一步驟就是,以較小檔案容量,換取些微準確率。技術上來說,訓練時的確需要大量伺服器協助產生訓練資料。但在測試階段,卻可以藉由犧牲部份準確率,換取減少訓練資料一半以上,讓手持裝置也可以執行分析程式。

2020年1月30日 星期四

閱讀筆記,生命中不能承受之輕 The Unbearable Lightness of Being

不可否認,這拗口的書名,竟然是最強烈吸引我閱讀的動力。試想,如果書名是【生命中不能承受之重】,那就沒有看的必要了,因為任誰都知道,勞苦重擔是痛苦的麻煩的,避之唯恐不及,也不用小說家來告訴我們。作者卻反其道而行,拋出了,輕盈反而無法承受這種奇怪的論點,若不是嘩眾取寵,就是別有深意了。

針對這點,作者(米蘭昆德拉)在書中闡述了他的想法,他說。最沉重的負擔同時也是最激越的生命實現的形象。負擔越沉重,我們的生命就越貼近地面,生命就越寫實也越真實。完全沒有負擔會讓人的存在變得比空氣還輕,會讓人的存在飛起,遠離地面,遠離人世的存在,變得只是似真非真,一切動作都變得自由自在,卻又無足輕重。

從這段文字中,可以看出作者對於重與輕這兩者對立觀念,是有價值判斷的,我們認為的輕,也就是所謂自由自在,在作者眼中,卻可能會變成"無足輕重"的含意。

而整篇故事,又和"重與輕"有什麼關聯呢?這就牽涉到,作者對於生命和存在的的看法。小說中各個主人翁,都是作者構思出的不同存在狀態的個體,他們各有不同成長背景與生命樣貌,但在環境變動下,他們得不斷的進行人生的選擇,所謂的選擇就是前述"重與輕"的選擇。

或許你會說,廢話,人只要活著,當然就是不斷的在選擇,就像不斷在眨眼睛啊,沒錯,但小說家的特長就是,能夠通過哲學思辨和故事敘述,將這個過程立體化,清楚交代了選擇的動機和當下的相法,推導出每個個人都是獨立自主的個體且擁有自我主觀經驗這個結論,並且這些選擇都是不得不,且終究會完成我們的品格、目標和觀點。

----

米蘭昆德拉在這本書中,還提到另一個重要概念,kitsch,也就是媚俗。他拒絕人們,在意識形態的綁架下,將情感誇大為偉大和絕對,並且要求別人也跟著這麼做的行為。

這些意識形態可能都是理所當然的想法,例如Franz偉大的進軍,美國參議員把兒童看成美國幸福的偉大象徵,動員人民參加神聖的五一勞動節遊行,巴黎的捷克異議份子要求所有人都要一致,共產與民主體制裡的意識形態,和靈肉必定分離。這些意識形態隱藏在四個主角的人性底層裡,影響著每次的選擇,因為僵硬的堅持而淪為意識形態的奴隸。

----

以我的解釋,米蘭昆德拉的觀念中,人生本就是一連串的選擇,並且應該是沒有任何外在的東西可以決定人的選擇。人必須由他自己去制定自己的規則,根據自己獨特的規則進行人生的選擇,只有這樣一個獨立的個人才能成為一個真正完整的人。

2019年12月17日 星期二

用光照亮無限想像!結合空拍機光影與風景攝影的嘗試


空拍機在攝影與錄影的兩種應用,雖有動靜之分,手法也各異,但共同特點就是其獨特視角與連續性,原本也以為這就是空拍機所能展現的全部藝術價值,直到看見Reuben Wu(連結)的作品,徹底改變我的想法。

Reuben Wu是專業風景攝影師,擅長拍攝磅礡大景,觀察他最近系列作品FIELD OF INFINITY(連結),除風景外,更大量將空拍機產生的光線線條融入作品中,成為另類美好作品,畫面中,絕美風景就如同大自然的畫布,Reuben Wu再以改裝過空拍機為畫筆,創造出類似光雕形式的風景概念照。

Reuben Wu作品

因為同時結合了藝術與大自然,而且大自然的部分遠重於人工,如夢似幻的靜謐中帶著現代風格,深深吸引我的心。尤其這幾個月間,因為慢跑的關係,時常在傍晚的寶山鄉遊蕩,見著大地由落日餘暉轉為覷黑一片,心理感動卻又不知如何表達,這些作品的確引起我深深共鳴。

除了欣賞,我也想嘗試用這種表現形式,呈現平時慢跑時所見風景。但對我這藝術門外漢來說,似乎有重重困難橫亙在前,摸索一陣後,認為可能有三個部分,首先,得先有能力拍出清新透徹的風景,接下來是控制飛行器飛到指定的位置,最後則是處理光源。

清新透徹的風景


光要拍出清新透徹的風景照就不容易啊。先不論Reuben Wu的美照是在舉世聞名的玻利維亞天空之鏡所拍攝,我只能在收割後的稻田、學校操場練習,即使如此,一開始還選錯時段,在個月黑風高的夜晚,帶著X-T20和28鏡頭亂拍,實驗結果,快門30秒,光圈16,ISO1600時,畫面多半綠黑無法辨識,光圈改10,ISO 3200,亮度雖然提升,畫面卻是死灰一片。第二次換用A7R2拍攝住家附近大樓,快門30秒,光圈22,ISO1600,畫面豐富許多,但根本原因應是時間關係。


觀察Reuben Wu、侯鵬暉(連結)、吳政璋(連結)的作品,發現要畫面中總有大片藍紫或橙色調,應該是夕陽光線,且背景選擇上,地面大多是能反光的水面或平坦路面,比較少灰黑土地。這些都是後續可以改進項目。

另外關於B快門,不論是FUJI或SONY,機身或APP最多都是30秒,只好拿出塵封的Meyin TW-836(連結 連結),搭配特殊控制線後,依照下面步驟進行。

1.RX是發射,TX是接收,如果單個使用,就切換到TX。
2.左上:頻道 左下:聲音亮度 右上:起動暫停 右下:停止 下方:快門。
3.使用上,因為拍攝過程有循環性,可以透過五向的左右鍵調整各階段時間,一:開機準備,這個只有起動時一次,二:拍攝,三:和下次間隔拍攝,四:拍攝張數,五:2到4的這個循環結束後,停留時間,六:整個2到5進行次數。
4.下方四個功能分別是,單拍、連拍、B快門(初次按下為拍攝,再按下為結束,器材會計時)、未知。

目前測試有個困難是,長曝時並沒有LiveView同步監測飛行位置,日後還要再觀察怎麼改進。

飛出線條感的幾何軌跡


第二步是讓飛行器在空中飛(繪)出想要的幾何軌跡。想像著拍照同時還要準確控制飛行器,並且有可能要重複多次,就是個不可能的任務。初步想法是,利用M2P內建Waypoints功能(連結),事先規劃飛行路徑,起飛後即可依此路徑自動飛行,大大降低操控難度,不過,實際使用後發現,WayPoint並不允許兩個相同座標航點存在(即使高度差距很大),可能要詢問DJI論壇。另外,曾試圖用不同軟體如HARMONY(連結),但發現都無法套用到手邊的Smart Controller(連結)。

最後項目:光源


光源是看起來最簡單,實際運作上最困難的項目。無人機因為體機小,負重能力不高,能產生的光源有限,但看Reuben Wu的影片中亮到瞎眼的光,至少有20W吧,究竟是怎麼發出的呢?


亮到瞎眼啦 翻拍自連結

初步想法是購買聚光燈配件(連結 連結 連結 連結 連結),與此同時,有另外解決方案,是片掛在飛行器下方,由3d列印出的L型反光片,牠將原本向下光線轉變為向前,或許能提供足夠光度,另外,為了提供L型反光片空間,還夠買了八公分的增高架,如圖。


實拍


綜合以上,開始我的實拍計畫。第一次實驗,地點是操場,時間約九點(應該挑傍晚),曝光30秒、手動飛行,照片中已清楚可見光路痕跡。美中不足是,因為機翼指示燈會造成殘影,參考手冊後關閉(連結)。


第二次,因為改為傍晚拍攝,畫面較為明亮,曝光時間30杪,光圈22,ISO 50狀況下,利用WayPoint設定路線光軌。雖然有進步,改進部分仍很明顯,地面仍太暗(調ISO或換場景),光軌形狀有待調整,光度偏暗。


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

用光照亮無限想像!結合空拍機光影與風景攝影的嘗試(連結)
空拍機智能飛行與影片編輯(連結)
不平凡的視角(連結)
大疆MAVIC 2 PRO使用記錄(連結)
小四軸的FPV(First Person View)(連結)
第三款小四軸 Tiny QX80(連結)
飛翔吧 WHOOP95(連結)
飛不起來的小四軸(連結)

2019年12月1日 星期日

空拍機智能飛行與影片編輯


空拍的特點是連續性影像帶來的震撼感受,藉著飛行翻越山頭,或由海中低角度向岸邊飛去,視角無限延伸至遠方,類似作品如冰島M2P空拍(連結)、穿越機等(連結)。

與單張照片不同,類似創作需要精確的操控技術,以及一系列影片編輯技術才能完成( 連結 連結 連結)。在過去,這些設備和技術都有很高門檻,需要大型團隊才能完成。到了今天,隨著技術飛躍進步,硬體的品質快速提升、價格也較為親民,而且網路普及後,相關知識以及作品發佈的管道變多,相互刺激的狀況下,即使是小型工作室或個人,也能製作出頗具水準作品。

最近更流行,將單張攝影與連續影片結合成單一影片,以剪輯技術,巧妙的將低角度的相機和高角度的空拍視角融入同一作品,製作出充滿趣味又兼顧流暢性的微電影。例如冰島的旅遊記錄( 連結 ),還有這部影片(連結),作者結合Mavic 2 Pro (空拍), Osmo Action( 運動攝影 ) 和 Sony a6500(攝影),將父子在大山大水間旅行,自由自在的壯闊感受,表露無遺(連結、連結)。

對我來說,這些拍攝或剪輯,既困難又花時間,只可遠觀,不可褻玩焉。這篇記錄僅僅是因為想嘗試拍出類似Reuben Wu的作品(連結),想利用M2P內建的智能飛行模式(軌跡飛行),製作好飛行路徑後,按下按鍵,剩下的就交給無人機自動飛行。

使用者可預先規劃好路線,從A點移動到B點,或再移動到C點,各航點可設定高度,連結後的路徑可設定速度、鏡頭方向(由興趣點決定)和線的類型,並且存成計畫(連結)方便重複執行。

熟悉界面後,大致就能讓飛行器飛出幾何線條,由地面觀察,軌跡飛行的移動速度非常穩定且線條筆直,且能始終維持鏡頭朝向相機方向,非常符合我的需要。美中不足的是,若要在空中畫出一條垂直線,也就是同一個座標點上有兩個不同高度的點,即使高低差距非常多,程式仍然會以距離過短為理由拒絕這組資料,這部份還要再詢問論壇。




類似功能還有縮時攝影中的航點設定,但不透過地圖,而是透過實飛設定,另外DJI還提供SDK(連結)讓外部廠商開發軟體,如litchi。

----

此外還有三種飛行方式。直線、環繞、跟隨,每類中各有不同設定方式和延伸技巧。作法上,可以用手飛,也能用Item22.的智能飛行模式,雖然手飛的喜悅,就像是體會到風箏從手上起飛的感動,但智能飛行 的自動避障功能相對安全,我就能更專注於檢視飛行路徑及四周環境。

直線飛行的概念直覺易懂,但真正飛起來卻不容易,尤其在有需要稍微轉彎的環境下,一般未練習左手操作前往往不夠流暢,造成影片中頻頻出現卡頓感,此時可以使用指點飛行,這個模式下系統會以滑順飛行為目標,過程中不斷調整目標點與現在位置。實際測試結果是,空曠區域可行,若空間太狹小,仍會有卡頓感。

直線飛行的延伸功能有三,【漸遠】是無人機邊後退邊上升,鏡頭跟隨目標拍攝,由近而遠逐步展現出大環境。【小行星】採用軌跡與全景結合的方式,完成一個從局部到全景的影片(連結)。【飛天】是由遠方飛至目標前方一定距離,然後逐漸上升,過程中,雲台角度會自動對準目標,提供很好是覺效果。

另外,除了智能飛行,也可以用手動操作直線飛行,第一是右手向上(直線前進),左手控制雲台逐漸向下,會有衝向物體的感覺,第二是左手維持右上可以達到螺旋向上的效果。


除了以機頭為主的直線飛行,還有另外一種直線飛行是當前飛行朝向為筆直方向,但機頭(相機)方向卻緊緊跟隨目標,這又叫作定向飛行。概念上來看,很像是閱兵,隊伍持續向前,但是大家眼睛會注視著旁邊一個焦點。技巧上,可以用智能飛行的縮時和指點飛行,或是手動操作,左手偏向左,右手畫出12點到6點的順時鐘圓圈,達到類似效果。

第二種飛行技巧為環繞飛行,以拍攝目標為圓心,環繞飛行並生成畫面。手法一,使用視覺設置興趣點,在飛行圖傳畫面中,設置為「興趣點環繞」開始環繞。手法二,懸停在興趣點上空,然後按下遙控器 C1 鍵設置興趣點。

以此為基礎,更複雜的模式還有兩種,【螺旋】飛行器以拍攝目標為中心,螺旋上升拍攝。【彗星】飛行器以初始地點為起點,橢圓軌跡飛行繞到目標後面,並飛回起點拍攝。(連結)



手法三,手動操作,左手向左右手向右(逆時針),或是左手向右右手向左(順時針),微調力度改變半徑和速度。

手法四,立體環繞,想法類似環繞但畫面更自由活潑。手動飛行難度太高,嘗試用智能跟隨來實現牠,步驟包括決定目標物、操縱坐標系統改變為以目標為中心(而非機頭),操作時只要專注控制飛行,不需要考量雲台與航線的組合問題。即使如此,還有許多要實驗部分。

最後一項是智能跟隨,從字面就可以猜想其應用,設定目標後,飛行器會自動跟隨物體移動包括前進,後退,水平或是無論飛行器怎麼移動,視覺中心都維持在目標物。前面幾個功能很適合錄製慢跑。



----

熟悉這幾種飛行技術後,應該就能飛出許多花樣,若搭配著「一鍵短片」,或「錄影」,或「一鍵延時」就能自動生成影片。更多實際練飛,可以到YOUTUBE(連結)看到我的進步歐。

影片部分,M2P可拍攝4K HDR 影片,目前是新手設為1080P。Item15.16 是拍照 / 錄影切換按鍵,按下遙控器上的拍照 / 錄影按鍵亦可達到同樣功能,搭配SD卡為SanDisk Extreme microSDXC UHS-I(V30)(A2) 128GB (推薦)。錄影時,雲台上下可以調整,左右部分無法透過滾輪調整,只能藉著拖曳螢幕達到效果。

延時則是縮時攝影,使用者必須先設置好拍攝間隔和生成視頻時長,飛行器會自動計算所需拍攝時間和張數,此時飛行器速度會降低讓影片不會有晃動感覺。經驗中,幾百張照片,僅能合成五秒左右的影片。操作上,還能按下C1進入恆定速度,直到再C1退出。關於延時,我不瞭解是,牠與錄影後製快轉播放有何不同?

上面幾個短片,是由OpenShot for ubuntu處理。
1.影片,
  a.畫質4K與1080P的確大不同。
  b.切片可組合應用,不同區段有不同速度,也會發現拍攝禎數越高,後製緩慢播放的彈性也越高。反轉功能可以表現出飛機倒飛的感受。
  c.畫面ZOOM(連結)
  d.MASK遮罩(連結)
2.音樂,由MUSIC 下載的 Lovers' Walk。彼此搭配方式(連結)。
3.字幕,並不是文字字幕檔,而是文字轉為svg圖,選擇是黃金底部。
4.預覽和匯出(youtube VGA NTSC 640X480 品質中),若是為讓檔案減少,得要留意原影片屬性。

-----

相關文章
用光照亮無限想像!結合空拍機光影與風景攝影的嘗試(連結)
空拍機智能飛行與影片編輯(連結)
不平凡的視角(連結)
大疆MAVIC 2 PRO使用記錄(連結)
小四軸的FPV(First Person View)(連結)
第三款小四軸 Tiny QX80(連結)
飛翔吧 WHOOP95(連結)
飛不起來的小四軸(連結)