顯示具有 影像辨識 標籤的文章。 顯示所有文章
顯示具有 影像辨識 標籤的文章。 顯示所有文章

2018年3月9日 星期五

物件辨識學習 - 2

看了 openCV 的官方文件,大致了解 openCV 在物件辨識的能力,包括用SIFT、SURF、FAST、BRIEF、ORB等特性尋找方法,其中ORB 應該是最快的吧? HARRIS,SIFT,SURF 等都可以精確地辨識,但以openCV 的說明,這些都太耗記憶體,對於embeded system 不利,所以他們(openCV LABs)又找出一個可以更快的方式來找出圖形特性。

至於比對的方法,官方文件就提 Brute-Force(暴力比對,因為就是一個一個試), 速度上應該會很慢,所以我就沒特別看。另一個就是FLANN 比對法,基本上要用FLANN 要給定不同的參數,例如如果用SIFT 那就要:

# FLANN parameters
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50)   # or pass empty dictionary
flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(des1,des2,k=2)

但如果是用ORB,參數就不一樣:
FLANN_INDEX_LSH = 6
index_params = dict(algorithm=FLANN_INDEX_LSH,
                    table_number=6,   # 12
                    key_size=12,      # 20
                    multi_probe_level=1) # 2
search_params = dict(checks=50)   # or pass empty dictionary
flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(des1, des2, k=2)

我用6張蝦子的圖來測試,以圖6為 trainImage, 圖1-5為QueryImage,
其中SIFT 方法都有對應點,但可惜對應點都不對。例如頭對到尾,或對去不同蝦子。
但以ORB方法比對,有2張圖完全比對不出來,有2張圖比對點不對,但有一張圖的比對點準確率應該有9成以上,我覺得可以⋯⋯哈哈哈。

再回到上一篇用findHomography 的方法來找物體,大概看了一下,這篇對Homography(全像攝影)有比較淺顯的介紹。大概就是原始物件圖可以透過矩陣轉換來算出其投射在其他平面的樣貌,這個轉換可以findHomography 得出 H,所以原圖可以透過H 換算成旋轉和縮放的新
圖。上一篇用findHomography 的部分,就是用來找出新圖經轉換後的位置,以畫出綠框。
即以下:
if(len(goodMatch) > MIN_MATCH_COUNT):
        tp = []
        qp = []
        for m in goodMatch:
            tp.append(trainKP[m.trainIdx].pt)
            qp.append(queryKP[m.queryIdx].pt)
        tp, qp = np.float32((tp, qp))
        H, status = cv2.findHomography(tp, qp, cv2.RANSAC, 3.0)
        h, w = trainImg.shape
        traingBorder = np.float32([[[0, 0], [0, h-1], [w-1, h-1], [w-1, 0]]])
        queryBorder = cv2.perspectiveTransform(traingBorder, H)
        cv2.polylines(QueryImgBGR, [np.int32(queryBorder)], True, (0, 255, 0), 5)
        cv2.drawKeypoints(QueryImgBGR, queryKP,QueryImgBGR,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

對於以SIFT 或 ORB 找出對應點,再以findHomography 畫出新圖的物件位置,對於使用者來說,會容易理解多了。
但至此為止,「物件」辨識都還算是在圖學的階段,還不到AI 的程度。因為至此為止,它就是辨識兩個圖形的相似度,來確認新物件是不是與原物件為同一物件,若新物件的拍攝角度不同,少了某些特徵,openCV 應該就認不出來了。如果是以AI,它又是怎麼去辨認的呢?我想到的是建立一個3*3*3 的原始物件拍攝角度的「基圖」,讓每個新圖都與其比對,應該可以,但似乎會太耗CPU 和 Memory,而且速度也不快。

2018年3月8日 星期四

物件辨識學習 - 1

看了一篇Siraj Raval 的物件辨識教學,直撥錄製下來的,
它是用OpenCV來實現辨識功能,
我原本期待OpenCV真能做到簡單辨識我要的物件,
可惜畢竟OpenCV 終究只是影像處理,
所以它用的原理是將草草莓的顏色強化,
再將其紅色區域標示出來,
雖然在單一的草莓圖裡,的確可以辨識出來,
但如果是一坉草莓,或是白草莓,
甚或是紅色的東西,
它可能就會辨識不出來,
或誤認為是草莓了。

簡單說,它只是辨識出紅色的區域,
而不是真的由AI去辨識出草莓,
這對簡單的圖形很有用,
因為不用經過大量的運算,即可辨識出特定顏色或形狀,
速度可以很快。

但若圖形內容數量多或複雜時,
就沒作用了,
而且,其實這支程式也不知道它標出來的東西是什麼。
基本上,這支程式是沒AI功能的。

但如果用在RPi 上可以速度非常快的執行,
AI在RPi 上,可能效果不好吧,我猜。

等我學到了再說⋯⋯

另外找到了這篇,也是單純用OpenCV 來做,但有圖像辨識的功能,
好像比較有深度,我試著用我的手機當辨識物,
sample 是開機畫面的手機,
不管是正面或是正面斜面,可以很快地辨識出來,
但是若關機,或是背面,因為畫面差異太大,
它就無法辨識。
而且sample 必須佔滿整個sample 的畫面,
如果你隨便拍一張sample 照,
還先必須將它修成滿版才行,
不知圓的它能不能辨識出來。
也就是說,對於靜物它可以很快地辨識,
但如果形狀或色彩變化太大,它就無法辨識了。
如果要做為動物的辨識,就可能沒辦法了。
但仍不失為一個有效的方法。

PS. 試了一個圓柱體的盒子,以斜的方式拍攝當sample,果然它只能辨識出斜角度的圓盒,以正面或伏面,它都認不出來。因為底部是純白的,以底部為主,同樣的角度,它也認不出來。還有,大小必須和sample 類似,拉太遠或太近,同樣它也辨識不出來。但它的SIFT 演算法還是值得了解一下。

2017年6月12日 星期一

Google Video Intelligence 學習筆記

Google Video Intelligence 學習筆記

除了前面所述 Google Cloud vision,透過靜態照片來由Google Cloud Vision AI 來辨識之外,Google另一項影像辨識功能,即透過影片(video) 來進行影像辨識。

這篇有介紹如何進行Google Video Intelligence 的 快速入門。

在這篇的範例,需要先安裝Google Cloud SDK,再請先安裝

開啟一個專案

  1. 在Google Cloud Platform 內,先建立一個新的專案。
  2. 到 API 管理介面,啟用 Google Video Intelligence API
  3. 然後在 API 管理介面內,點選「憑證」,建立API 金鑰,它會跳出一個視窗,告訴你在使用此API 時,用 key=API_KEY 來傳送金鑰,所以記得要先把你的API 金鑰剪下來,貼在你的文字檔裡。如下圖:

設定授權

在你安裝好 Google Cloud SDK 後,在其目錄下就會有 cloud 這支程式:
  1. 建立一個服務帳號,叫 quickstart:
  1. gcloud iam service-accounts create quickstart

  2. 建立 service account key file,其中your-project-123 是你剛才建立的專案名稱全名(即加上 - 後面的數字串):
  3. gcloud iam service-accounts keys create key.json \
    --iam-account quickstart@your-project-123.iam.gserviceaccount.com
  4. 授權給你的service account,並把你的service account key file 位置傳送過去
  5. gcloud auth activate-service-account --key-file key.json
  6. 取得授權,並將它顯示在螢幕上:
  7. gcloud auth print-access-token
你會看到程式大概五秒之後會顯示一長串亂碼,那其實就是你的key,也就是上面圖示顯示的那塊。

進行 Video 辨識請求

  1. 用文字編輯器,將下列文字copy 到你的文字檔裡,用來產生一個 JSON 要求檔,就叫 request.json但要記得,將你的檔案copy 到你的 google cloud storage 內。目前google video intelligence 只支援將影片上傳到其google cloud storage 內做辨識,並不支援其他任何方式(如 streaming)。像下面的範例就是在cloud storage 建立一個 video 目錄,再把 chicago.mp4 上傳到這個video 目錄下。
  2. {
       "inputUri":"gs://cloud-ml-sandbox/video/chicago.mp4",
       "features": [
           "LABEL_DETECTION"
       ]
    }
    
  3. 利用 curl 指令來產生影像辨識要求 (videos:annotate),將下方的 ACCESS_TOKEN h利用剛才印出的那一長串亂碼(即access token) 取代,其餘照抄(下面這指令全在同一行內, \表連續行):
  4. curl -s -k -H 'Content-Type: application/json' \
        -H 'Authorization: Bearer ACCESS_TOKEN' \
        'https://videointelligence.googleapis.com/v1beta1/videos:annotate' \
        -d @request.json
    Video intelligence API 會產生一個 operation 以處理你的辨識要求。上述指令下完會,會顯示它產生的 operation name:
      {
        "name": "us-west-18358601230245040268"
      }
      
    1. 這時Google 已經開始在分析你的影片,你可以傳遞operation name 並透過 v1.operations  來取得分析結果:
    2. curl -s -k -H 'Content-Type: application/json' \
          -H 'Authorization: Bearer ACCESS_TOKEN' \
          'https://videointelligence.googleapis.com/v1/operations/OPERATION_NAME'
      你會看到Google 回應你分析的結果,如果分析尚未完成,那在 done 這個值會是 false:
      {
        "name": "OPERATION_NAME",
        "metadata": {
          "@type": "type.googleapis.com/google.cloud.videointelligence.v1beta1.Annota
      tionProgressMetadata",
          "progressMetadata": [
            {
              "inputUri": "gs://cloud-ml-sandbox/video/chicago.mp4",
              "progressPercent": 0,
              "startTime": "2016-09-22T21:41:56.766091Z",
              "lastUpdateTime": "2016-09-22T21:42:03.889743Z"
            }
          ]
        },
        "done": false,
        ...
      }
      
    在分析完所有資料後,你再下一次上述指令,就可以看到Google Video intelligence 對你的影片做的完整分析內容。其中 description 欄表示它判斷可能的物件名稱,confidence 表信心值,或簡單說,它猜此物件的正確率大約是多少。

    結論


    基本上Google Video intelligence 可以辨識出的物件仍然有限,尤其影片不清楚時,所以它的信心值都不高。它目前可以做物件分析,臉部分析,標題分析和場景變換的辨認。它可以用來判斷你的影片內出現了那些東西,但無法很精確地辨識出人臉或(誰)出現在影片裡。但Apple 的 照片 程式可以將類似的人臉整合成一個群組,再給人類進行更正確的判斷是否為同一個人。我想,應該要做到這樣的程度才夠吧。而且,影片還要上傳到google storage才能辨識,還不夠方便。不過,Google 也強調,這是beta,還沒算正試的服務,就玩玩看囉。



    2017年6月5日 星期一

    Google Cloud Vision 學習筆記 1

    與其自己重新學習影像辨識和AI,不如直接站在巨人的肩膀上⋯⋯

    先從 Google 提供的 5 分鐘 quickstart 來學。

    以Quickstart 的介紹,要透過Vision API 來使用 Google cloud vision,要透過下列三步驟:


    • 建立 Cloud Storage 空間。Creating a Cloud Storage bucket.
    • 將你的照片上傳至建立的Cloud Storage 並設定為公開。Uploading your image to Cloud Storage and making it public.
    • 以照片來向Vision API 要求辨識。Making a request to the Vision API with that image.

    照Google 的說法,上述步驟約要5分鐘的時間,可以建立一個 5GB 的免費儲存空間,並且每個月可丟 1000次以內的免費辨識服務要求。

    在開始建立Google Storage 之前,要先在Google Platform Console 建立一個專案。
    1. 到專案頁面,建立一個新的專案。我先建立一個叫 Cloud-Vision-test 的專案名稱,但Google 的回應有點慢,它跳到所有專案的頁面,卻沒看到剛建立的 Colud-Vision-test 專案名稱。我馬上再建一個新的,當它refresh 完頁面後,才發現重覆建立了。所以專案建立的按鈕按下後,要稍等一下。
    2. 啟動計費功能。可能我之前已啟動,所以畫面直接跳到專案內容畫面。
    3. 啟動Cloud Vision API. 中間欄有API 的選項,點選後會出現Google Cloud Platform 的所有 API,利用Filter 的方式,輸入 vision ,就可以看到Cloud Vision API。點選後會出現下列圖片。

    然後點選啟用,就會出現目前此 API 的使用情形。但因為我們還沒有任何使用,所以畫面呈現出的都是空值。

    接下來建立 Cloud Storage bucket。
    1. 在 Cloud Platform Console 裡,連到 Cloud Storage 畫面。
    2. 點選「建立bucket」。

    3. 在建立 bucket 的對話畫面中,設定以下屬性:

    • 名稱:可以任意指定,但因為bucket 的資料是公開的,如果你的名稱內含機密資訊,那可能會被其他人看到。所以我用內建的名稱就好,內建的不會選一個和別人一樣的吧。
    • 儲存級別:文件是建議選用 Milti-Regional。但我看了級別的說明,Multi-Regional 是適合需要經常跨國存取的資料,又說可用來串流播放影片及代管熱門網路內容。但我只是要用自己上傳的影片,可是Regional 又只提到可用來儲存資料及執行資料分析,不知能否上傳圖片。我先試試Regional 了好。
    • Regional 位置:如果選用 Multi-Regional , 那 Regional位置只有 亞洲、歐盟和美國可以選,可能它會直接放在這幾個地區的不同storage site 吧。但如果是選 Regional, 則可以選 上述三洲的不同地區。亞洲有asia-east1, asia-northeast1 和 asia-sourtheast1 可選。台灣的位置有點尷尬,所以我直接選 asia-northeast1
    4. 點選建立。

    建立對 Cloud Vision API 服務的要求

    1. 下載 他建議的 demo-image.jpg
    2. 開啟 Cloud Platform Console Storage Brower, 選定 bucket, 然後點選上傳檔案,並選擇剛剛下載的 demo-image.jpg 來上傳。
    3. 上傳檔案後,畫面會出現已上傳的通知,並且在畫面上呈現出已上傳的檔案列表。在我們剛上傳的 demo-image.jpg 後䤏有個「公開共用」的選項,將其點選。
    4. 透過以下的程式範例,來執行 Vision API 請求。 將其中的 image.source.imageUri 的 bucket 字眼改成你剛才在bucket 內建立的名稱和圖片檔名,再按下EXECUTE後,不出一秒的時間,就會得到 AI 辨識後的 JSON 結果檔。
    5. 執行結果如下:


    搞定!!!

    清除

    為了避免無謂的被Google Cloud Platform 扣款(可能你自己不自覺地測試超過1000次),所以 Google 也很貼心的建議你,如果測試完後,就把用不到的 bucket 砍了。夠貼心吧。

    後記
    上傳了幾個自己的圖檔去辨識,好像都沒能辨識出來⋯⋯