[OpenR8 解決方案] HttpServer_DeepLearning (OpenR8 Caffe 深度學習伺服器)

一、DeepLearningServer 介紹

 

DeepLearningServer 的功能為讀取已經訓練好的 caffemodel 檔案,透過特定網頁選擇想測試的圖片,看圖片的分類情況。

DeepLearningServer 的流程為下圖 1,每一個步驟於本文件之第三章節做詳細介紹。

 

圖 1. DeepLearningServer的流程 .png

圖 1.DeepLearningServer 的流程。

 

 

二、DeepLearningServer 資料夾介紹

 

DeepLearningServer 位於 OpenR8 的 solution 資料夾內,其中包含:

 

  1. 資料夾:data 資料夾。
  2. flow 檔案:HttpServerDeepLearning.flow。
  3. 圖片:output.jpg (網頁執行結果圖,沒有使用過網頁執行結果時,不會產生)。

 

圖 2.DeepLearningServer位置 .png

圖 2.DeepLearningServer 位置。

 

圖 3.DeepLearningServer資料夾 .png

圖 3.DeepLearningServer 資料夾。

 

【data 資料夾】內有三個檔案,解決方案中【HttpServerDeepLearning.flow】的【Caffe_ 物件偵測_讀取網路】函式會用到。

 

  1. deploy.prototxt:caffe 用的神經網路結構模型。
  2. predefined_classes.txt:caffemodel 當初訓練時的所有分類名稱。
  3. VGG_VOC0712_SSD_300x300_iter_120000.caffemodel:已經訓練好的 caffemodel 檔。

 

 

三、開啟與執行 HttpServerDeepLearning.flow

 

在【OpenR8 資料夾】底下有一個【R8.exe】執行檔。如下圖 4。滑鼠點擊兩下即可執行 R8.exe。

 

圖 4.執行R8.exe .png

圖 4.執行 R8.exe。

 

執行 R8.exe 後,第一次登入需輸入帳號密碼。如下圖 5。

Open Robot ID (Email) : 登入開源機器人俱樂部的帳號。

Password : 登入開源機器人俱樂部會員的密碼。

 

圖 5.登入開源機器人帳號 .png

圖 5.登入開源機器人帳號。

 

請點選【File】=>【Language】=>【繁體中文】=>【確定】。如下圖 6

點選完,請重新啟動 R8.exe。關閉 R8.exe,再次執行 R8.exe。即可顯示繁體中文介面。如下圖 7

 

圖 6.變更語言成為繁體中文介面 .png

圖 6.變更語言成為繁體中文介面。

 

圖 7.繁體中文介面 .png

圖 7.繁體中文介面。

 

請點選【檔案】=>【開啟】=>【進入到 OpenR8 底下的 solution 資料夾】=>【選擇 DeepLearningServe 資料夾】=>【選擇 HttpServerDeepLearning.flow 開啟】,如圖 8圖 9

 

圖 8.選擇HttpServerDeepLearning.flow .png

圖 8.選擇 HttpServerDeepLearning.flow。

 

圖 9.開啟HttpServerDeepLearning.flow .png

圖 9.開啟 HttpServerDeepLearning.flow。

 

開啟後,按下上方【執行】伺服器。

 

圖 10.執行解決方案 .png

圖 10.執行解決方案。

 

 

 

 

 

 

 

四、開啟網頁偵測圖片

 

透過網頁選擇欲測試的圖片,按下 Submit 送出,取得圖片偵測物體的結果。如下圖 11圖 12。

 

圖 11.透過網頁上傳圖片 .png

圖 11.透過網頁上傳圖片。

 

圖 12.偵測結果 .png

圖 12.偵測結果。

 

 

五、HttpServerDeepLearning.flow 流程

 

這個章節主要介紹 HttpServerDeepLearning.flow 流程的函式內容,由於流程內的函式眾多,一時之間有可能難以找到自己想更改的區域或參數(變數)在哪,下表會提供有可能更動的功能與內容,來幫助使用者快速找到想更改的位置。

 

可能自行更改 的功能 下方第幾點的流程函式介紹 更改的參數 欄位名稱 備註
更改成自己訓練的 caffemodel 第2點 Caffe_ 物件偵測_讀取網路 caffeModelPath:按…選擇自己訓練的 caffemodel

要確認分析的類別是否也更新了

(下一列)。

修改類別名稱 的 txt (predefined_classes.txt) 第2點 Caffe_ 物件偵測_讀取網路 labelPath:predefined_classes.txt 的內容換成 caffemodel 內訓練的類別。

要確認 predefined_

classes

.txt 的內容是否與 caffemodel 訓練時的類別一樣

更改測試圖片的網址通道(port) 第4點 HttpServer_Set 埠:8080 => 改成自己想要的通道

第8點【列印單行】

可以順便改成更新後的通道值。

設定網頁連線時間(timeout) 第4點 HttpServer_Set 超時:60 => 改成自己想要的連線時間。  

更改測試網頁內容(http://localhost:8080/

的顯示內容)

第5點 字串_取代 inputString:pageContext 變數的內容 => 改成自己想顯示的網頁內容 這裡的網頁 是 html 的寫法。

更改偵測結果網頁內容(http://localhost:8080/

result 的結果顯示內容)

第30點 字串_取代、

第31點 字串_加法

string6 與 string7 組合出偵測結果網頁內容。 這裡的網頁 是 html 的寫法。
標記框的顏色 第26點 影像_以 Json 畫框 藍色、綠色、紅色  
 
圖 13. HttpServerDeepLearning.flow的流程 .png
圖 13. HttpServerDeepLearning.flow 的流程。
 
  1. Caffe_ 初始化:

一開始會將 Caffe 初始化。

 

圖 14. HttpServerDeepLearning.flow的Caffe_初始化函式 .png

圖 14. HttpServerDeepLearning.flow 的 Caffe_ 初始化函式。

 

  1. Caffe_ 物件偵測_讀取網路:

CaffeObject:來自於上一個【Caffe_ 初始化】的物件。

enableGPU:選擇是否具有 GPU 功能,不填時預設為 CPU 模式。

deployPath:讀取【data 資料夾內】的【deploy.prototxt】。

caffeModePath:讀取【data 資料夾內】的【VGG_VOC0712_SSD_300x300_iter_120000.caffemodel】。

labelPath:讀取【data 資料夾內】的【predefined_classes.txt】,此檔案存放所有類別之名稱。

meanFilePath:計算圖片均值的檔案路徑,這裡填 null

 

圖 15. HttpServerDeepLearning.flow的Caffe_物件偵測_讀取網路 .png

圖 15.HttpServerDeepLearning.flow的Caffe_ 物件偵測_讀取網路。

 

圖 16. 可以使用選擇檔案的方式避免字打錯 .png

圖 16.可以使用選擇檔案的方式避免字打錯。

 

  1. HttpServer_Init:

製作測試用的網頁前先初始化。

 

圖 17. HttpServerDeepLearning.flow的HttpServer_Init .png

圖 17.HttpServerDeepLearning.flow的HttpServer_Init。

 

  1. HttpServer_Set:

設定測試用的網頁使用之通道、執行數量……等。​

 

httpServer:

選擇【HttpServer_Init】所創立的物件。

結果:

網頁設定的成功與否。

埠:

測試用的網頁所連接的通道,這裡填8080

根目錄:

設定讀取或存取時的起始位置,這裡填./

執行緒數量:

一次可執行多少網頁。

最大監聽連線數:

最多可允許多少網頁等待回應。

超時:

網頁超過多少秒後就不回應,這裡填60

 

圖 18. HttpServerDeepLearning.flow的HttpServer_Set .png

圖 18. HttpServerDeepLearning.flow 的 HttpServer_Set。

 

  1. 字串_取代(String_Replace):

這裡的用法為將字串中 “/n” 取代成空白的字串“”,在編輯網頁內容(inputString 所填的參數)時,按下值旁邊的…,會跳出個視窗可用來編輯網頁內容,如圖20,為了容易閱讀、美觀…等原因,會使用 Enter 鍵來換行,但因為換行在字串中會用 /n 來代表換行的意思,所以在字串編輯完後會在字串中出現 n 的字,如圖21,所以為了還原成字串應該呈現的樣貌,如圖22,所以使用【字串_取代】將 /n 換成空白的字。

 

※空白的字意思是什麼都不填,而非空一格

 

輸出字串:輸出將 “/n” 取代成“”的字串。

replaceFrom:將 inputString (網頁內容)的 replaceFrom(/n),替換成 replaceTo()。

replaceTo:將 inputString (網頁內容)的 replaceFrom(/n),替換成 replaceTo()

inputString:網頁內容。

 

圖 19. HttpServerDeepLearning.flow的字串_取代 .png

圖 19. HttpServerDeepLearning.flow 的字串_取代。

 

圖 20. inputString的網頁內容 .png

圖 20. inputString 的網頁內容。

 

圖 21.Enter鍵n的關係 .png

圖 21.Enter 鍵與 /n 的關係。

 

圖 22.正常n的網頁原始碼 .png

圖 22.正常沒有 /n 的網頁原始碼。

 

  1. HttpServer_AddHtmlPage:

將【字串_取代】所輸出的網頁內容,透過此函式輸出,形成一個網頁分頁。

httpServer:選擇和【HttpServer_Set】一樣的物件。

頁面名稱:分頁想取的名稱。

頁面內容:【字串_取代】所輸出的網頁內容。

 

圖 23. HttpServerDeepLearning.flow的HttpServer_AddHtmlPage .png

圖 23. HttpServerDeepLearning.flow 的 HttpServer_AddHtmlPage。

 

  1. 列印單行:

執行時會在 DOS 視窗印出“create a page in:”的字樣。

 

  1. 列印單行:

執行時會在 DOS 視窗印出 “http://localhost:8080/” 的字樣,若自己的網址更換時,可自行變動內容。

 

  1. HttpServer_Start:

開啟網路伺服器。

httpServer:選擇和【HttpServer_Set】一樣的物件。

結果:回傳開啟成功與否的結果。

 

圖 24. HttpServerDeepLearning.flow的HttpServer_Start .png

圖 24. HttpServerDeepLearning.flow 的 HttpServer_Start。

 

  1. HttpServer_Accept:

開啟網路伺服器連線。

httpServer:選擇和【HttpServer_Set】一樣的物件。

httpServerClient:客戶端(client)的物件。

 

圖 25. HttpServerDeepLearning.flow的HttpServer_Accept .png

圖 25. HttpServerDeepLearning.flow 的 HttpServer_Accept。

 

以下函式需開啟測試用網頁才會觸發、執行,如何開啟測試用網頁詳見第四章。

 

  1. HttpServer_GetPostBinary:

取得測試用網頁所發送的圖片內容。

httpServerClient:選擇【HttpServer_Accept】輸出的 httpServerClient 物件。

結果:網頁接收成功與否結果,接收失敗時,其數值會小於0。

二元資料:收到的圖片。

key 名稱:給收到的圖片命名。

 

圖 26. HttpServerDeepLearning.flow的HttpServer_GetPostBinary .png

圖 26. HttpServerDeepLearning.flow 的 HttpServer_GetPostBinary。

 

  1. 整數_比較:

確認【HttpServer_GetPostBinary】的接收是否失敗,所以和0比較。

整數 A:【HttpServer_GetPostBinary】輸出的結果。

整數 B:填數字0。

模式:填數字1 (代表 < 小於 )。

布林:輸出“整數 A”是否小於“整數 B”, “整數 A”小於“整數 B”為 True(1),“整數 A”大於或等於“整數 B”為 False(0)。

 

圖 27. HttpServerDeepLearning.flow的整數_比較 .png

圖 27. HttpServerDeepLearning.flow 的整數_比較。

 

  1. 條件式:

如果【整數_比較】所輸出的結果是 False 時,將不會執行接下來13.到17.

此條件式用意為,如果【HttpServer_GetPostBinary】的接收失敗,在 DOS 視窗印出接收失敗的字樣。

條件式物件:建立一個條件式物件。

布林:是否啟動條件式,這裡填【整數_比較】所輸出的結果

 

圖 28. HttpServerDeepLearning.flow的條件式 .png

圖 28. HttpServerDeepLearning.flow 的條件式。

 

  1. 列印單行:

執行時會在 DOS 視窗印出“!!!!!!! File result:+【HttpServer_GetPostBinary】輸出的結果” 。

 

  1. HttpServer_Write:

在網頁顯示 “No Image File”。

HttpServerClient:選擇【HttpServer_Accept】輸出的 httpServerClient 物件。

字串:輸出顯示的字串(No Image File)。

 

圖 29. HttpServerDeepLearning.flow的HttpServer_Write .png

圖 29. HttpServerDeepLearning.flow 的 HttpServer_Write。

 

  1. HttpServer_Loop:

回到【 HttpServer_Accept】等待接受其他客戶端(client)。

httpServer:選擇和【HttpServer_Accept】一樣的物件。

 

圖 30. HttpServerDeepLearning.flow的HttpServer_Loop .png

圖 30.HttpServerDeepLearning.flow 的 HttpServer_Loop。

 

  1. 條件式結束:

在【條件式】(第13點)到【HttpServer_Loop】(第16點)為滿足【條件式】(第13點)時會做的函式,需要拉【條件式結束】代表【條件式】所做的事到此為止。

條件式物件:選擇和【條件式】同一物件。

 

  1. 影像_開啟二元資料:

將【HttpServer_GetPostBinary】接收到的二元資料轉換成圖檔。

結果:轉換的成功與否,失敗會小於0。

影像:輸出轉換後的圖檔。

二元資料:輸入【HttpServer_GetPostBinary】接收到的二元資料。

 

圖 31. HttpServerDeepLearning.flow的影像_開啟二元資料 .png

圖 31. HttpServerDeepLearning.flow 的影像_開啟二元資料。

 

  1. 整數_比較:

確認【影像_開啟二元資料】所轉換的圖檔是否失敗,所以和0比較。

整數A:【HttpServer_GetPostBinary】輸出的結果。

整數B:填數字0。

模式:填數字1 (代表 < 小於 )。

布林:輸出“整數 A”是否小於“整數 B”, “整數 A”小於“整數 B”為 True(1),“整數 A”大於或等於“整數 B”為 False(0)。

 

圖 32. HttpServerDeepLearning.flow的整數_比較 .png

圖 32.  HttpServerDeepLearning.flow 的整數_比較。

 

  1. 條件式:

如果【整數_比較】(第19點) 所輸出的結果是 False 時,將不會執行接下來20.到24.

此條件式用意為,如果【影像_開啟二元資料】所轉換成圖檔失敗(像是沒圖片、或並非圖片檔案……),在 DOS 視窗印出轉換失敗的字樣。

條件式物件:建立一個條件式物件。

布林:是否啟動條件式,這裡填【整數_比較】所輸出的結果

 

圖 33. HttpServerDeepLearning.flow的整數_比較 .png

圖 33. HttpServerDeepLearning.flow 的整數_比較。

 

  1. 列印單行:

執行時會在 DOS 視窗印出“!!!!!!! Image_Open result:+【影像_開啟二元資料】輸出的結果” 。

 

  1. HttpServer_Write:

在網頁顯示 “Image decode fail!”。

HttpServerClient:選擇【HttpServer_Accept】輸出的 httpServerClient 物件。

字串:輸出顯示的字串(Image decode fail!)。

 

圖 34. HttpServerDeepLearning.flow的HttpServer_Write .png

圖 34.  HttpServerDeepLearning.flow 的 HttpServer_Write。

 

  1. HttpServer_Loop:

回到【 HttpServer_Accept】等待接受其他客戶端(client)。

httpServer:選擇和【HttpServer_Accept】一樣的物件。

 

圖 35. HttpServerDeepLearning.flow的HttpServer_Loop .png

圖 35.  HttpServerDeepLearning.flow 的 HttpServer_Loop。

 

  1. 條件式結束:

在【條件式】(第20點)到【HttpServer_Loop】(第23點)為滿足【條件式】(第20點)時會做的函式,需要拉【條件式結束】代表【條件式】所做的事到此為止。

條件式物件:選擇和【條件式】(第20點)同一物件。

 

  1. Caffe_物件偵測_影像推論:

將【影像_開啟二元資料】所轉換的影像餵入 Caffe 來判斷是否有所屬類別。

caffeObject:【Caffe_ 物件偵測_讀取網路】(第2點) 所選擇的 caffeObject 物件。

outputResult:輸出偵測的結果。

enableGPU:是否具有 GPU 功能,不填時預設為 CPU 模式。

影像:【影像_開啟二元資料】所轉換的影像。

confidenceThreshold:檢測閾值。

 

圖 36. HttpServerDeepLearning.flow的Caffe_物件偵測_影像推論 .png

圖 36.  HttpServerDeepLearning.flow 的 Caffe_ 物件偵測_影像推論。

 

  1. 影像_以 Json 畫方形:

若上一點【Caffe_ 物件偵測_影像推論】有判斷出類別時,會將位置已 Json 的形式輸出,這裡將 Json 讀入,畫在【影像_開啟二元資料】所輸出的影像中。

 

影像:

選擇【影像_開啟二元資料】所輸出的影像。

json:

選擇【Caffe_ 物件偵測_影像推論】所輸出的 outputResult。

畫 json 方形:

輸出畫完矩形的影像。

厚度:

設定矩形線條的粗細(越大越粗)。

藍色:

由於這裡想用綠色的框,所以設0。

綠色:

由於這裡想用綠色的框,所以設255。

紅色:

由於這裡想用綠色的框,所以設0。

填空:

是否將矩形內填滿,是為1、否為0,這裡填0。

是否顯示型式:

是否顯示所屬類別名稱,是為1、否為0,這裡填1。

字串大小:

如果要顯示型式時,其字型大小要多大,這裡填(1.0)。

 

圖 37. HttpServerDeepLearning.flow的影像_以Json畫方形 .png

圖 37. HttpServerDeepLearning.flow 的影像_以 Json 畫方形。

 

  1. 影像_儲存:

將【影像_以 Json 畫方形】所畫完的影像結果輸出成圖片。

影像:選擇【影像_以 Json 畫方形】所輸出的畫 json 方形影像。

影像檔案名稱:儲存的檔名。

 

圖 38. HttpServerDeepLearning.flow的影像_儲存 .png

圖 38. HttpServerDeepLearning.flow 的影像_儲存。

 

  1. Json_ 轉字串:

將【Caffe_ 物件偵測_影像推論】輸出的 outputResult 偵測結果從 json 格式轉成字串格式。

 

圖 39. HttpServerDeepLearning.flow的影像_儲存 .png

圖 39.HttpServerDeepLearning.flow 的影像_儲存。

 

  1. 字串_取代:

利用字串取代的方式加入網頁的換行 ( <br> )。 輸出字串:輸出將“}¸”取代成“}¸<br>”的字串。

replaceFrom:將 inputString (網頁內容)的 replaceFrom(}¸),替換成 replaceTo(}¸<br>)。

replaceTo:將 inputString (網頁內容)的 replaceFrom(}¸),替換成 replaceTo(}¸<br>)

inputString:偵測結果內容。

 

圖 40. HttpServerDeepLearning.flow的字串_取代 .png

圖 40.HttpServerDeepLearning.flow 的字串_取代。

 

  1. 字串_加法:

在要輸出到網頁上的偵測結果內容再加輸出結果影像 (html 寫法) 。

輸出字串:字串 A + 字串 B。

字串 A:【字串_取代】輸出的字串。

字串 B:輸出結果影像 (html 寫法)。

 

圖 41. HttpServerDeepLearning.flow的字串_加法 .png

圖 41.  HttpServerDeepLearning.flow 的字串_加法。

 

圖 42. 輸出結果影像 html寫法 .png

圖 42.輸出結果影像 (html 寫法)。

 

  1. 整數_加法:

​計算執行了幾次的影像類別分析。

整數 A:要計算的參數。

整數 B:每執行一次就加1,所以填1。

整數 C:計算完 +1 的參數(填和整數 A 同一個參數)。

 

圖 43. HttpServerDeepLearning.flow的整數_加法 .png

圖 43. HttpServerDeepLearning.flow 的整數_加法。

 

  1. (灰色的)整數_比較(Int_Compare):

如同備註所述,如果啟用它,在執行三次影像類別分析後關閉伺服器。

整數 A:【整數_加法】所輸出的計算次數。

整數 B:填數字3。

模式:填數字2 (代表 = 等於 )。

布林:輸出“整數 A”是否等於“整數 B”, 等於為True(1),不等於為 False(0)。

 

圖 44. HttpServerDeepLearning.flow的整數_比較 .png

圖 44.  HttpServerDeepLearning.flow 的整數_比較。

 

  1. 條件式:

如果【整數_比較】(第32點) 沒有開啟或所輸出的結果是 False 時,將不會執行接下來33.到36.

此條件式用意為,執行三次影像類別分析後就關閉伺服器。

條件式物件:建立一個條件式物件。

布林:是否啟動條件式,這裡填【整數_比較】(第32點)所輸出的結果

 

圖 45. HttpServerDeepLearning.flow的條件式 .png

圖 45. HttpServerDeepLearning.flow 的條件式。

 

  1. HttpServer_Write:

在網頁顯示 “Server is close.”。

HttpServerClient:選擇【HttpServer_Accept】輸出的 httpServerClient 物件。

字串:輸出顯示的字串(Server is close.)。

 

圖 46. HttpServerDeepLearning.flow的HttpServer_Write .png

圖 46. HttpServerDeepLearning.flow 的 HttpServer_Write。

 

  1. HttpServer_Stop:

停止伺服器去接受其他客戶端(client)。

httpServer:選擇和【HttpServer_Accept】一樣的物件。

結果:是否成功停止的回傳結果。

 

圖 47. HttpServerDeepLearning.flow的HttpServer_Stop .png

圖 47. HttpServerDeepLearning.flow 的 HttpServer_Stop。

 

  1. 列印單行(Println):

在 DOS 視窗印出 HttpServer Stop。

 

  1. If_Else:

如果【整數_比較】(第32點) 沒有開啟或所輸出的結果是 Fasle 時,就將【字串_加法】要顯示在網頁上的內容輸出。

條件式物件:選擇和【條件式】(第33點)一樣的物件。

【If_Else】無法單獨存在,它的前面一定要有【條件式】與它對應,換言之,沒有【條件式】就不會有【If_Else】,但有【條件式】不一定會有【If_Else】

以程式語法來說,【條件式】= if,而【If_Else】= else

 

圖 48. HttpServerDeepLearning.flow的If_Else .png

圖 48.  HttpServerDeepLearning.flow 的 If_Else。

 

  1. HttpServer_Write:

在網頁顯示【字串_加法】的內容,其內容為。

HttpServerClient:選擇【HttpServer_Accept】輸出的 httpServerClient 物件。

字串:輸出顯示的字串(Server is close.)。

 

圖 49. HttpServerDeepLearning.flow的HttpServer_Write .png

圖 49.  HttpServerDeepLearning.flow 的 HttpServer_Write。

 

  1. 條件式結束:

在【條件式】(第33點)到【HttpServer_Write】(第38點)為滿足【條件式】(第33點)與【If_Else】時會做的函式,需要拉【條件式結束】代表【條件式】與【If_Else】所做的事到此為止。

條件式物件:選擇和【條件式】同一物件。

 

  1. HttpServer_Loop:

回到【 HttpServer_Accept】等待接受其他客戶端(client)。

httpServer:選擇和【HttpServer_Accept】一樣的物件。

 

  1. HttpServer_Close:

關閉伺服器。

httpServer:選擇【HttpServer_Accept】輸出的 httpServerClient 物件。

 

  1. 列印單行(Println):

在 DOS 視窗印出“HttpServer_Close”。


延伸閱讀

1.
OpenR8 社群版 - 人人都會用的 AI 軟體 (免費下載)

[CP 值最好的 AI 人工智慧電腦熱賣中]
硬體採用最新最快的 Titan RTX, RTX-2080Ti-11G, 及 TESLA V100!
視窗圖控介面,易學易用。
硬體優勢:針對深度學習最佳化設計,且經過客戶端 24H 運作驗證。
軟體優勢:事先安裝人工智慧軟體及優化設定,每週提供最新 AI 演算法下載。
公司優勢:專業人工智慧機器人設計公司,資本額一億。
歡迎企業、學校、及公家機關大量採購。
可租用,歡迎來信或來電洽詢。
詳細資料請參閱以下網址: https://tw.openrobot.club/ai_computer