Aside

由於Robot Operating System(ROS)的中文資源還幾乎不存在,決定先撒下一點麵包屑,之後有寫出新的也會依序整理到這上面.

我覺得機器人很有可能是未來崛起的一個領域,而要在這個領域做出能推動世界進步的成果,我認為ROS是一個很重要的工具.

希望之後有心做ROS的人學習愉快: D

———————————————–
ROS tutorials系列(適用於ROS Fuerte之前的版本,目前還沒時間寫新的版本)

我的tutorial不詳細go through整個tutorial原文,而是就我認為重要之處詳加說明,而且有些東西原文寫得很清楚我不重複寫,換句話說,我仍預期看這些tutorial時要搭配看原文, 會比較完整

此外我重視連貫性,所以一些零碎的細節觀念我也不會寫,如果重要我會補在最後的tips裡

0. 什麼是ROS?要怎麼做ROS? (做ROS前必看!我盡量寫得淺顯,不是工程師應該也看得懂XD)

1. 淺談ROS file system

2. 新增ROS packages

3. 立ROS packages

4. 了解ROS Nodes

———————————————–

ROS觀念文

簡介CRAM(Cognitive Robot Abstract Machine)

Knowrob簡單概念

Topic, Service和Actionlib的用途與差別

認識ROS stack & package (剛接觸ROS寫的,沒什麼見地Orz)

———————————————–

ROS細節實作文

改launch file中的參數值

如何安裝Household object database

launch file的if, unless條件用法

收到彩色影像,發布灰階影像topic的方法

———————————————–

ROS散文(散亂的雜文,不是散文XD)

PR2開箱文

ROS tutorial 之 Don’t repeat yourself

———————————————–

補個關鍵字

ROS(Robot operating system), 機器人作業系統, 教學文章, 範例, 說明

AMMAI(Week 12) – Rich feature hierarchies for accurate object detection and semantic segmentation

Paper Info

“Rich feature hierarchies for accurate object detection and semantic segmentation.” Girshick, Ross, et al. CVPR 2014.

Motivation

之前的論文主要是將DNN應用在global的影像分類上,但如果我們想將影像中的物體一個個的locate出來並貼上標籤,那就是完全不同的task,所以這篇論文被提出來處理這個問題。

Technical Summary

主要架構圖

1

從主要架構圖可以看出,其實在經過region proposal之後,後面做的事情就像是一般的image classification(不過這篇是使用linear SVM來做分類)。所以在test stage,他們用selective search的方法產生2000個左右的region,接著把每個region都直接warp成227×227的影像,餵進CNN後就都變成同樣長度的特徵向量,再提供給SVM做最後的分類。

能夠做warping的理由也滿直觀的,我覺得warping後的結果依然可以被人所辨識,這表示重要的特徵其實是還留著的,所以CNN理論上也可以萃取出來。

1

另外一點值得關注的點是,他們在training的時候用到了ILSVRC的data來幫忙訓練,因為CNN需要大量的訓練資料,所以不太可能只由PASCAL VOC的data來訓練。他們證明可以先用比較general的大量資料來做預訓練、再用小量的domain specific資料來做訓練。(ILSVRC有1000類、PASCAL VOC只有21類)

Experiment

這個方法在PASCAL VOC上的mAP比之前最好的結果多了30%,非常厲害。

3

2

Contribution

1. 他們把CNN的架構跟bottom up的region proposal方法結合起來,使得CNN也可以處理物體定位跟辨識的問題。

2. 當training data不多的時候,他們也可以利用ILSVRC的data來做pre-training,再用僅有的一些data做fine tuning也可做到不錯的結果。

Question

1. 能不能不要做warping,直接把影像放進227×227的大小,其他塞0就好? 這樣效果會如何?

Tools Learned

Selective search, R-CNN, Region proposal方法(2.1中列了很多)

AMMAI(Week 11) –ImageNet Classification with Deep Convolutional Neural Networks

Paper Info

“ImageNet Classification with Deep Convolutional Neural Networks,” Alex Krizhevsky, Ilya Sutskever, Geoffrey E Hinton, NIPS 2012.

Motivation

這篇論文嘗試把DNN的架構用在ImageNet的比賽上,討論了其中的做法跟需要考慮的設計因素。

Technical Summary

整體的架構圖

1

上面的架構圖是這篇論文的精髓,一開始從最左邊輸入一張224×224影像,然後第一層我們用48個kernel(每個都是11x11x3的大小),所以到第一層會有48張55×55的feature map。然後Max pooling的意思是把值比較大的區塊再取出來(有點取response最強的部分的味道)。之後4層都是一樣的意思。

經過5層的conv跟pooling,最後會得到一個feature vector。接下來再用3層的Fully connected NN來訓練1000種的分類,最後得到分類的結果。所以前面的5層主要是萃取特徵、後面的3層是要做分類。

避免overfitting

他們主要使用了Dropout跟Data augmentation的方法來減少overfitting。

Experiment

他們用ILSVRC的performance來比較

0

2

他們的方法用來作query的效果也很好

1

Contribution

這篇論文算是開啟DNN應用於影像分類的經典論文,之前雖然陸續有一些研究,但都沒有辦法做到這麼好的效果,這篇算是真的用DNN做出很好結果的第一篇。

Tools Learned

CNN, Dropout, Pooling

AMMAI(Week 10) – Story-driven summarization for egocentric video

Paper Info

Z. Lu and K. Grauman. Story-driven summarization for egocentric video. CVPR 2013.

Motivation

這篇論文主要是想把一個egocentric的影片(例如用google glass或go pro拍的影片)所說的故事做一個摘要,這個摘要用幾張字影片截取出的圖片呈現。

Technical Summary

要做到這樣的一個摘要,這篇論文是把影片中重要的影像(subshot)取出來,再把這些影像的因果關係理出來。所以第一個重點就是要怎麼表示subshot,第二個重點就是要怎麼判斷一串subshot好不好。

Goal Definition

首先這篇論文把一個影片表示n個subshot的組合

1

然後假設只取其中K個當作摘要

 2

 所以如果有某種評分的函數,目標就是要挑選最大化這個函數的摘要

3

其中要注意的是他使用了story, importance, diversity當作評分機制

4

Subshot表示法

他們首先將一連串的frame都分成三類中的其中一類-static, transit(人在移動), moving the head(注意力轉移),其中移動跟注意力轉移只要看光流方向就可以決定。接著用MRF把label變得比較smooth,例如static=>transit=>static=>transit這種轉移發生的機率就很低,然後把一串同一個label的frame變成一個subshot。(這就是他們的subshot segmentation方法)

剩下的就只是偵測subshot中有出現的物體,如果有比較多見過的物體就用預先train好的物體模型、如果沒有就用unsupervised的visual word表示。

評分機制

story的評分方式是最有趣的,主要精神是要讓subshot之間的影響大的chain評分高,所以他們定義了objective function:

1

我覺得最有趣的地方在於他們把subshot跟object連成一個bipartite graph,然後從subshot A開始random walk,如果”常常”走到subshot B,表示A跟B之間的連結性很高。(當然這種graph要好,其中的重點就在於edge的權重要怎麼定,這裡是定成object在subshot中出現的頻率)

importance是參考其他paper的方法來計算,而diversity就只是算畫面的差異程度,都不是太重要。

Experiment

我覺得這篇論文的實驗滿值得一看的,因為要是我來做這樣的一個題目,我還真不知道要怎麼量化來比較我的結果是好還是不好。我初步的想法是可以先建立一個資料庫,讓很多人一起來評分,先建立起一個大家普遍覺得好的摘要,然後再用相似性來比較我的摘要跟資料庫提供的正確摘要是不是夠像。

後來發現他們是讓使用者去評分哪一段summary最好,藉以跟其他方法比較。

1

1

Contribution

跟傳統的方法比較起來,這篇論文提出的摘要方法更傾向把影片中事件發生的因果關係找出來。在戲劇的理論中有提到故事跟情節的差異,故事是一串事件的描述,而情節是包含這些事件之間的因果關係,有因果關係才有很多變化可以延伸,有些因果合理卻鮮少發生是造成戲劇張力的重要因素,而電腦怎麼去把這種摘要提升到藝術層次,了解因果是重要的第一步,這是這篇論文的重要貢獻。

Tools Learned

Bipartite graph的設計方法

AMMAI(Week 9) – Latent Dirichlet allocation

Paper Info

“Latent Dirichlet allocation,” D. Blei, A. Ng, and M. Jordan. . Journal of Machine Learning Research, 3:993–1022, January 2003.

Motivation

這篇論文的目標是要改進PLSA方法的缺陷(當training data很多的時候,矩陣會變得很大,造成計算上的麻煩)。

Technical summary

LDA主要概念

1

先看看上圖可以知道LDA跟PLSA的差異在於LDA在document到 topic之間的model變成α-θ-z 的關係,此外,在產生w的機率分佈時也加上β這個機率分佈。

整個流程是

1.透過α產生document的主題機率分佈θ
2.從θ中取樣生成第n個字的主題z(假設有k個主題,那z就是k個裡面的其中一個)
3.透過β跟z產生最後的word

訓練的方法待補

Experiment

比較模型的perplexity(perplexity低表示這個模型較佳)

1

比較分類結果

2

Contribution

LDA這個方法的topic是用機率分佈產生的,所以model 需要 train 的參數也跟著大幅減少(因為不用記每個 document 的topic分布)。

Question

1.為什麼要用Dirichlet distribution當作 p(z|d)的機率分佈?直觀上怎麼理解?

2.加上β的好處是什麼?他跟z的機率分佈差在哪裡?

Tools Learned

LDA

HackNTU – Raspberry Pi相機工作坊

基於一個想多學一點東西的心情,報名了這次的工作坊。不過事實上這個工作坊跟我目前的研究有很大的相關性,我在做的是機器人視覺的相關研究,自然需要接收資訊來源的sensor,也需要處理資料的平台,之前我習慣使用的是Kinect或是camera+機器人;經過這次工作坊則是多了一個選項,Raspberry Pi Camera+Raspberry Pi這個火紅的嵌入式板。

不意外的是,Raspberri Pi跟ROS之間也已經可以整合:

還有一篇好文章可以參考:http://www.intorobotics.com/ros-tutorials-start-working-arduino-raspberry-pi/

附上這個工作坊的內容

  • Raspber 無線網路設定
  • Raspberry Pi Camera簡介,標準 Camera 和 NoIR Camera 介紹、應用介紹、改裝套件介紹、安裝設定
  • 基礎 Camera 使用:使用指令操作 Camera、縮時攝影、使用手機控制、網路串流
  • 進階 Camera 使用:寫程式控制(使用 picamera)、週邊硬體與 Camera 的互動、串接網路服務。文字辨識、人臉辨識

我覺得講師的投影片做得很好,有興趣的人可以自己看,體驗的部份有滿多眉眉角角一時也難以說清XD

http://sosorry.s3.amazonaws.com/raspberrypi/doc/slide/20150502-introduction-to-raspberrypi-camera.pdf

今天的工具除了板子跟相機之外,還有簡易的電子電路工具組(好懷念電子電路實驗啊):

1

IMG_2912

雖然今天來不及全部做完,但還是有做出一些小成果

1. 縮時攝影

2. 按鈕觸發(影片中可以看出按下按鈕會跑出一堆輸出,是因為彈跳問題)

    要處理彈跳問題可以從軟體著手,只要在程式裡面寫清楚超過延遲時間以上的輸入才接受就好。經過處理之後會發現按下按鈕只會跳出一次訊息了!

3. 影像tagging(利用imagga API)

    我寫了一個簡單的shell script,在執行之後會先用目前的相機拍一張照,拍完照之後會上傳到imagga讓server端來辨識,辨識的結果會再輸出到螢幕上,然後我最後再把拍到的照片印出來(不知道為什麼不能把顯示的指令寫到shell script裡面,會失敗)。最後辨識的結果有點好笑,第一次是黑色、第二次是示波器XD 不過還是挺好玩的~

經過一天的工作坊真的讓我對Raspberry Pi的概念有了基本的掌握,而且也跟我之前玩嵌入式或是一些機器人硬體的經驗串連起來,讓我進入開源硬體的門檻大大地下降了,光這一點就讓我覺得收穫頗豐。真的要感謝HackNTU跟熱情推廣的台灣樹莓派啊。

BTW, 後來imagga的成員還寄信問我使用狀況,因為我在註冊的時候填是應用在Raspberry Pi上,所以他們對我的使用情境跟感想很有興趣。簡單回覆我是在工作坊上用到跟覺得速度有點慢之後,他們的CEO/CTO又很快地回信跟我講一些使用上的技巧(短邊300px的影像會最快),我覺得感覺超好的啊~跟世界上另一群很有熱情的人互動總是令人振奮,如果大家對於一些物體辨識等等的電腦視覺技巧有興趣但又想直接用工具的話,可以考慮使用他們的API XD

淺談台灣機器人產業與發展

今天應朋友之邀去他們社團舉辦的亞太菁英培訓營分享自己在機器人這個領域的一些觀察,我自己是把主題定為怎麼發展台灣的機器人產業,比較有明確的主軸。

雖然之前就有此意,但一直沒有完整梳理過自己的思緒,更不要說跟別人分享了。我覺得很幸運能有這次機會讓我把自己的一些想法整理成投影片,也是一個機會吸引更多的人來參與發展機器人產業,我覺得只要能多吸引到一兩個有熱情的人就非常值得了,因為他們還能夠再影響更多人。所以我把重點放在帶得走的思考脈絡而不是一堆知識,這也是為什麼我會把思考架構放在最前面,再用一個case study幫助大家運用這個思考架構,順便看懂Google driver-less car大概的定位在哪邊。另外也提供一個簡單的框架來看產業聚落應有的面貌。我在封面也特意強調”淺”這個字,是希望大家把我講的當一個再往上的跳板,因為這些都只是我現在的觀察(一個平常都只有做研究的人的粗淺觀察),還有很多值得改進的地方。

我在後面還是附上了一些圖片+數據來更清楚地呈現台灣的機器人聚落跟投資狀況,因為這些資料都有其參考價值,一起看有助於更具體地理解現狀,而不只是落於提供思考方法。這份投影片對我來說是一個重要的開始,希望看了投影片的人也可以接收到我的那份熱情XD

收到彩色影像,發布灰階影像topic的方法

最近在做VSLAM相關的東西,剛好要用到web cam來做研究,所以研究了一下ROS的web cam driver,後來決定使用BOSCH寫的usb_cam。不過他們產生的topic只有彩色影像,我需要的是灰階影像,所以自己寫了個小程式來轉灰階。

 #include <ros/ros.h>
 #include <image_transport/image_transport.h>
 #include <cv_bridge/cv_bridge.h>
 #include <sensor_msgs/image_encodings.h>
 #include <opencv2/imgproc/imgproc.hpp>
 #include <opencv2/highgui/highgui.hpp>
 using namespace cv;

 ros::Publisher pub;
 void transformer(const sensor_msgs::Image::ConstPtr& img)
 {
      cv_bridge::CvImagePtr cvimg = cv_bridge::toCvCopy(img , sensor_msgs::image_encodings::BGR8);
      //To Grayscale
      cv::Mat img_conv;
      cv::cvtColor(cvimg->image,img_conv,CV_BGR2GRAY);
      
      //Publish it
      cvimg->image = img_conv;
      cvimg->encoding = "mono8"; //這一行超容易忘記= =
      pub.publish(cvimg->toImageMsg());
 }

 int main(int argc, char** argv)
 {
      ros::init(argc, argv, "color_to_gray_node");
      ros::NodeHandle node;

      pub = node.advertise("/usb_cam/image_mono", 1000);
      ros::Subscriber sub = node.subscribe("/usb_cam/image_raw", 1, transformer);

      ros::spin();
}

其實滿簡單的,不過不熟ROS的人可能會不知道要改msg的encoding(就是cvimg->encoding = “mono8″),所以還是寫一篇出來供之後可能會用到的人參考~

AMMAI HW1 – L1 General學習筆記

最近的事多到有一點誇張啊,趁今天心情不錯來玩一下作業zz

基本上要解Part III需要用到”Semi-supervised face image retrieval using sparse coding with identity constraint”上的第一個reference,也就是L1 General這個工具:http://www.cs.ubc.ca/~schmidtm/Software/L1General.html

乍看之下不知道要怎麼上手,不過幸好他有提供範例,範例永遠是你的好朋友XDDD

我是從Lasso的範例切入:http://www.cs.ubc.ca/~schmidtm/Software/L1General/examples.html#2

基本作法很簡單,就是一直把指令丟進去Matlab然後直接看結果理解就好了哈哈。例如X跟Y的指令我根本就看不懂,不過把指令輸進去之後會發現X是250*50的一個矩陣,Y是一個250*1的向量,所以顯然我們希望用X當作字典來表示Y。

1

再把式子寫出來以利之後比對

2

經過上面的猜測,接下來再看code應該比較好理解。

% LASSO
lambda = 100*ones(nVars,1); %是一個50*1的向量,值都一樣,表示X中每個basis的懲罰是一樣的
funObj = @(w)SquaredError(w,X,y); 
%這個funObj包含了3個重要的項-(wX-y)^2, gradient跟Hessian以利L1General2_PSSgb呼叫

w_init = wRR; %初始值,用在我們的例子的話就是作業Part II得到的sparse representation
wLASSO = L1General2_PSSgb(funObj,w_init,lambda); %然後就算出來了呵呵(這時已經有點崩潰

接下來的問題就是怎麼把下面那個可愛的式子的前兩項寫成funObj了,明天再來想想好了。

1

AMMAI(Week 8) – Probabilistic latent semantic indexing

Paper Info

“Probabilistic latent semantic indexing,” T. Hofmann, SIGIR, 1999.

Motivation

這篇論文主要希望可以取出文件中潛藏的語意,或是影像中潛在的意義,需要做這件事情是因為一份文件中可能有相同的詞但不同意義(例如hard有堅硬或困難之意)或是不同的詞具有相同意思(例如car跟vehicle),這些都會造成搜索文件的困難,所以我們希望機器能夠理解文件背後的”語意”,才能有好的搜索結果。

之前雖然有人提出了LSA的方法,但因為LSA在數學上的一些面向不夠嚴謹導致使用上會有問題,所以這篇論文嘗試解決這個問題。

Technical Summary

因為這篇論文是基於LSA去加強數學上的合理性,所以我們應該先知道什麼是LSA。這個方法從一張圖片中可以很清楚地理解,原始矩陣的每一列表示一個文件,每一行表示一個單詞,透過SVD,我們發現好像有區分兩種不同類型文件的功能。

1

PLSA的物理意義

我們首先要謹記在心的是-我們的原始資料告訴我們P(w|d),透過一個重建的過程,我們可以逼近原始資料提供的資訊:

首先要先假設每個文件產生的機率模型,文件中每個詞的可能class機率模型,最後是每個class產生詞的機率模型,也就是下面的三點

1

用這樣的方式,我們會發現P(w|d)是basis vectors P(w|z)的線性組合(weight是P(z|d)),所以P(w|d)會落在這些basis構成的平面上,也就是下圖想表達的意義。

1

PLSA演算法

一開始我們先把corpus表示成 word-document matrix,其中每個元素是那一個document上該詞的term frequency或tf-idf,接下來我們希望可以最大化log-likelihood function,因為最大化這個log-likelihood function就等同於最小化重建出來的文件跟訓練文件的誤差:

1

然後因為有下面這層關係,所以我們可以透過最佳化上式得到topic跟跟document和word的機率關係:

1

學習的演算法(Tempered EM algorithm)

EM演算法主要是要解所以會輪流把期望值跟其他參數做最佳化,在優化期望值(E)的步驟,會最大化下式:

1

接下來會根據更新的期望值來重新估計參數(M):

2

Experiment

跟LSI的方法比起來確實有較佳的結果。

1

Contribution

LSA 的問題是因為分解得到的奇異值可以是負的,且無法使用機率來表示,沒有 normalize 的機制(機率必須是介於0~1之間,同一樣本空間內的機率值加總要是1),所以這篇論文提出了 PLSA 來解決以上問題,將所有 topic-word、topic-document 關係使用機率來表示,改使用 EM-algorithm 估計出 topic-word、topic-document 機率矩陣的值,所以就解決了奇異值可能小於0和normalize的問題。

Question

1.SVD的物理意義是什麼?為什麼可以取出topic?

Tools learned

LSA, PLSA