14054 views
--- description: OneAI 文件 tags: 案例教學, YOLO, CVAT --- [OneAI 文件](/s/user-guide) # AI Maker 案例教學 - YOLOv7 影像辨識應用 [TOC] ## 0. 部署 YOLOv7 影像辨識應用 在本範例中,我們將使用 AI Maker 針對 YOLOv7 影像辨識應用所提供的 **`yolov7`** 範本,從無到有逐步建立一個 YOLO 影像辨識應用。系統所提供的 **`yolov7`** 範本中事先定義了從訓練任務到推論各階段任務中所需使用的環境變數、映像檔、程式等設定,方便您快速地開發屬於自己的 YOLO 網路。 主要步驟如下: 1. [**資料集準備**](#1-準備資料集) 在此階段,我們要準備機器學習訓練的影像資料集及標註資料,並上傳至指定位置。 2. [**資料標註**](#2-資料標註) 在此階段,我們將標註影像中的物體,這些標註資料稍後會用於神經網路的訓練。 3. [**訓練 YOLO 模型**](#3-訓練-YOLO-模型) 在此階段,我們將設定相關訓練任務,以進行神經網路的訓練與擬合,並將訓練好的模型儲存。 4. [**建立推論服務**](#4-建立推論服務) 在此階段,我們會部署已儲存的模型並進行推論。 5. [**進行影像辨識**](#5-進行影像辨識) 在此階段,我們會示範如何在 JupyterLab 中使用 Python 語言發送推論請求。 6. [**CVAT 輔助標註**](#6-CVAT-輔助標註) 在此階段,將示範如何使用 CVAT 輔助標註功能,降低人工標註的時間。 ## 1. 準備資料集 YOLOv7 模型必須在已標註的資料上進行訓練,以學習該資料中的物件類別。以下將說明兩種資料的準備方法: ### 1.1 上傳自有資料集 在正式開始前,請先準備好欲訓練的資料集,如:貓、狗、人… 等圖片。依照下列步驟,將圖片集上傳至本系統所提供的儲存服務中,並將圖片集依照指定的目錄結構存放,以供後續開發使用。 1. **建立儲存體** 從 OneAI 服務列表選擇「**儲存服務**」,進入儲存服務管理頁面,接著點擊「**+建立**」,新增一個儲存體,例如:**`yolo-dataset`**,這個儲存體稍後會用來存放您的自有資料集。 ![](/uploads/upload_8bec9d37c3207e7787021999ac619faa.png) 2. **檢視儲存體** 完成儲存體的建立後,重新回到儲存服務管理頁面,此時會看到剛剛新增的儲存體已建立完成。 ![](/uploads/upload_9d4f9a9ce09e0b988748088588b37f8e.png) 3. 上傳資料集 點擊建立好的儲存體,然後點選「**上傳**」就可以開始上傳資料集。(請參閱 [**儲存服務**](/s/storage) 說明)。 ![](/uploads/KHDL7EG.png) ### 1.2 上傳自有資料集及已標註的資料 請參照本章節的說明準備及上傳已標註的資料集。 #### 1.2.1 準備自有資料集 本範例將以 Kaggle 網站的 [**COCO128 資料集**](https://www.kaggle.com/datasets/ultralytics/coco128) 為例,此資料集為 [**COCO train 2017**](https://cocodataset.org/#explore) 中的前 128 張圖片,包含圖片以及已經標註好的資料,請先下載此資料集至本機並解壓縮。 ![](/uploads/wjhTPzM.png) 解壓縮後,會在 **coco128** 資料夾中看到 **images** 以及 **labels** 兩個資料夾,其中 **images** 資料夾裡面放的是訓練的圖片,而 **labels** 資料夾存放的是標註資料的文字檔。 ![](/uploads/A97hSrz.png) #### 1.2.2 新增 **data.yaml** 檔案 定義類別數量及類別名稱,本範例使用的 [**COCO128 資料集**](https://www.kaggle.com/datasets/ultralytics/coco128) 有 80 種物件類別,所以我們會在 **coco128** 資料夾中新增一個 **data.yaml** 檔案中定義模型訓練程式所需的相關資訊。 - **`train: ./train.txt`**:定義訓練用的檔案。 - **`val: ./val.txt`**:定義驗證用的檔案。 - **`test: ./test.txt`**:定義測試用的檔案。 - **`nc`** 以及 **`names`** :定義物件類別值及對應的名稱。 ```yaml= train: ./train.txt val: ./val.txt test: ./test.txt #optional # number of classes nc: 80 # class names names: [ 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light', 'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone', 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush' ] ``` #### 1.2.3 準備標註資料的文字檔 本範例使用的 [**COCO128 資料集**](https://www.kaggle.com/datasets/ultralytics/coco128) 已提供標註資料的文字檔。若是使用您自己的資料集,請在 **labels** 資料夾存放每一張圖片檔案所對應的標註資料的文字檔。文字檔的內容需依照 YOYO 格式,由左而右說明如下: ``` 3 0.716912 0.650000 0.069118 0.541176 ``` | 內容 | 說明 | | -------- | -------- | | 3 | 代表標註此物件的 class ID。 | | 0.716912 | 代表該 bounding box 的中心座標 X 與圖片寬的比值,是 bounding box 歸一化後的中心座標 X。 | | 0.650000 | 代表該 bounding box 的中心座標 Y 與圖片高的比值,是 bounding box 歸一化後的中心座標 Y。 | | 0.069118 | 代表該 bounding box 的寬與輸入圖像寬的比值,是 bounding box 歸一化後的寬座標。 | | 0.541176 | 代表該 bounding box 的高與輸入圖像高的比值,是 bounding box 歸一化後的高座標。 | 接著我們會依照 images 資料夾中的圖片檔案列表在 **coco128** 資料夾建立 **train.txt**、**val.txt** 以及 **test.txt** 三個檔案列表,作為 train、validate 以及 test 用途。 #### 1.2.4 新增 **train.txt** 檔案 取所有 images 檔案名稱列表中的 80% (或其它比例,可視需求變更)當作訓練資料集,訓練時 YOLO 會依次讀取該檔內容取出圖片進行訓練,其內容以相對路徑來串接圖片。 :::spoiler **train.txt** ```= ./images/train2017/000000000133.jpg ./images/train2017/000000000136.jpg ./images/train2017/000000000138.jpg ./images/train2017/000000000142.jpg ./images/train2017/000000000143.jpg ./images/train2017/000000000144.jpg ./images/train2017/000000000149.jpg ./images/train2017/000000000151.jpg ./images/train2017/000000000154.jpg ./images/train2017/000000000164.jpg ./images/train2017/000000000165.jpg ./images/train2017/000000000192.jpg ./images/train2017/000000000194.jpg ./images/train2017/000000000196.jpg ./images/train2017/000000000201.jpg ./images/train2017/000000000208.jpg ./images/train2017/000000000241.jpg ./images/train2017/000000000247.jpg ./images/train2017/000000000250.jpg ./images/train2017/000000000257.jpg ./images/train2017/000000000260.jpg ./images/train2017/000000000263.jpg ./images/train2017/000000000283.jpg ./images/train2017/000000000294.jpg ./images/train2017/000000000307.jpg ./images/train2017/000000000308.jpg ./images/train2017/000000000309.jpg ./images/train2017/000000000312.jpg ./images/train2017/000000000315.jpg ./images/train2017/000000000321.jpg ./images/train2017/000000000322.jpg ./images/train2017/000000000326.jpg ./images/train2017/000000000328.jpg ./images/train2017/000000000332.jpg ./images/train2017/000000000338.jpg ./images/train2017/000000000349.jpg ./images/train2017/000000000357.jpg ./images/train2017/000000000359.jpg ./images/train2017/000000000360.jpg ./images/train2017/000000000368.jpg ./images/train2017/000000000370.jpg ./images/train2017/000000000382.jpg ./images/train2017/000000000384.jpg ./images/train2017/000000000387.jpg ./images/train2017/000000000389.jpg ./images/train2017/000000000394.jpg ./images/train2017/000000000395.jpg ./images/train2017/000000000397.jpg ./images/train2017/000000000400.jpg ./images/train2017/000000000404.jpg ./images/train2017/000000000415.jpg ./images/train2017/000000000419.jpg ./images/train2017/000000000428.jpg ./images/train2017/000000000431.jpg ./images/train2017/000000000436.jpg ./images/train2017/000000000438.jpg ./images/train2017/000000000443.jpg ./images/train2017/000000000446.jpg ./images/train2017/000000000450.jpg ./images/train2017/000000000459.jpg ./images/train2017/000000000471.jpg ./images/train2017/000000000472.jpg ./images/train2017/000000000474.jpg ./images/train2017/000000000486.jpg ./images/train2017/000000000488.jpg ./images/train2017/000000000490.jpg ./images/train2017/000000000491.jpg ./images/train2017/000000000502.jpg ./images/train2017/000000000508.jpg ./images/train2017/000000000510.jpg ./images/train2017/000000000514.jpg ./images/train2017/000000000520.jpg ./images/train2017/000000000529.jpg ./images/train2017/000000000531.jpg ./images/train2017/000000000532.jpg ./images/train2017/000000000536.jpg ./images/train2017/000000000540.jpg ./images/train2017/000000000542.jpg ./images/train2017/000000000544.jpg ./images/train2017/000000000560.jpg ./images/train2017/000000000562.jpg ./images/train2017/000000000564.jpg ./images/train2017/000000000569.jpg ./images/train2017/000000000572.jpg ./images/train2017/000000000575.jpg ./images/train2017/000000000581.jpg ./images/train2017/000000000584.jpg ./images/train2017/000000000589.jpg ./images/train2017/000000000590.jpg ./images/train2017/000000000595.jpg ./images/train2017/000000000597.jpg ./images/train2017/000000000599.jpg ./images/train2017/000000000605.jpg ./images/train2017/000000000612.jpg ./images/train2017/000000000620.jpg ./images/train2017/000000000623.jpg ./images/train2017/000000000625.jpg ./images/train2017/000000000626.jpg ./images/train2017/000000000629.jpg ./images/train2017/000000000634.jpg ./images/train2017/000000000636.jpg ./images/train2017/000000000641.jpg ./images/train2017/000000000643.jpg ./images/train2017/000000000650.jpg ``` ::: #### 1.2.5 新增 val.txt 檔案 取所有 images 檔案名稱列表中的 20% (或其它比例,可視需求變更)當作驗證資料集,訓練時 YOLO 會依次讀取該檔內容取出圖片進行 validation,其內容以相對路徑來串接圖片。 :::spoiler **val.txt** ```= ./images/train2017/000000000074.jpg ./images/train2017/000000000077.jpg ./images/train2017/000000000078.jpg ./images/train2017/000000000081.jpg ./images/train2017/000000000086.jpg ./images/train2017/000000000089.jpg ./images/train2017/000000000092.jpg ./images/train2017/000000000094.jpg ./images/train2017/000000000109.jpg ./images/train2017/000000000110.jpg ./images/train2017/000000000113.jpg ./images/train2017/000000000127.jpg ``` ::: #### 1.2.6 新增 **test.txt** 檔案(選擇性) 若您有測試集則可以新增此檔案,其內容以相對路徑來串接圖片。 :::spoiler **test.txt** ```= ./images/train2017/000000000009.jpg ./images/train2017/000000000025.jpg ./images/train2017/000000000030.jpg ./images/train2017/000000000034.jpg ./images/train2017/000000000036.jpg ./images/train2017/000000000042.jpg ./images/train2017/000000000049.jpg ./images/train2017/000000000061.jpg ./images/train2017/000000000064.jpg ./images/train2017/000000000071.jpg ./images/train2017/000000000072.jpg ./images/train2017/000000000073.jpg ``` ::: #### 1.2.7 建立儲存體 從 OneAI 服務列表選擇「**儲存服務**」,進入儲存服務管理頁面,接著點擊「**+建立**」,新增一個儲存體,例如:**`yolo-dataset`**,用來存放自有資料集。 ![](/uploads/upload_abaa0335bf279c45781a9423cd25033c.png) #### 1.2.8 上傳圖片以及標註資料檔案 最後將準備好的自有資料集及標註資料檔案上傳至剛建立的儲存體中,下圖為最終呈現在儲存體的檔案結構。 ![](/uploads/920fw9h.png) ## 2. 資料標註 為了使 YOLO 網路能夠學習與辨認我們所提供影像,我們須先將準備訓練的影像進行標註。本章節中,我們將透過 **AI Maker** 所整合的 **CVAT 工具(Computer Vision Annotation Tool)**,對欲執行訓練的資料進行標註。 在模型訓練好後或是已經有訓練好的模型,可以使用 **CVAT 工具(Computer Vision Annotation Tool)** 的輔助標註功能,來降低人工標註的時間以及成本,請參閱本教學的 [**6. CVAT 輔助標註**](#6-CVAT-輔助標註)。 :::info :bulb: **提示**:若您已經自有資料集以及標註資料,可直接到步驟 [**3. 訓練 YOLO 模型**](#3-訓練-YOLO-模型)。 ::: ### 2.1 啟用與設定 CVAT 點選左側功能列之「**標註工具**」,進入 CVAT 服務首頁。第一次使用需先點擊「**啟用 CVAT 服務**」,每個專案只能開啟一套 CVAT 服務。 ![](/uploads/EGQt7PK.png) CVAT 啟用成功後,會出現 CVAT 服務的連結及預設的帳號及密碼,此時狀態為 **`running`**。點擊基本資訊之「**開啟**」,可在瀏覽器的新視窗中開啟 CVAT 服務的登入頁面。 :::info :bulb: **提示:** 首次啟用 CVAT 建議更改預設的密碼,此密碼沒有期限設定,相同專案之成員,皆可使用此密碼登入 CVAT 服務,為安全考量,請定期更改密碼。 ::: ![完成 CVAT 啟用](/uploads/r4rDqap.png) ### 2.2 使用 CVAT 建立標註任務 1. **登入 CVAT** 點擊「**開啟**」後,在 **CVAT 服務** 的登入頁面輸入帳號及密碼,即可登入 CVAT 服務。 ![](/uploads/upload_00b540746d0ee7e44a7e7a981064973b.png) :::warning :warning: **注意:** 請使用 Google Chrome 瀏覽器登入 CVAT,若使用其他瀏覽器可能會造成不可預期的問題,例如:無法登入或無法成功標註之類的問題。 ::: 2. **建立 CVAT 標註 Task** 成功登入 CVAT 服務後點擊上方「**Tasks**」進入 Tasks 頁面。接著點擊「**+**」再點選「**+ Create a new task**」建立標註任務。 ![](/uploads/upload_0c90fe6ccfce7a531111899ad85e3a5d.png) 3. 「**Create a new task**」視窗中有三個地方需設定: ![](/uploads/upload_91488c823a56dae9d2e4f54bb78292ba.png) * **Name**:輸入此 Task 的名稱,例如:`mytask`。 * **Labels**:設定欲辨識的物件標籤。點擊「**Add label**」,輸入標籤名稱,點擊右側的顏色區塊可設定標籤的顏色,接著按下「**Continue**」繼續增加其他標籤,或點擊「**Done**」完成標籤的設定。此範例中,我們將建立 car、people 與 dog 三個標籤。 ![](/uploads/upload_3bcd5650acb3488d17e3cf22a83829bc.png) ![](/uploads/upload_da5a81b5f2e18127885025cd8febb00e.png) * **Select files**:選擇訓練資料集來源,此範例請點擊 **Connected file share** 選取 **`yolo-dataset`** 儲存體當作資料集來源。關於資料集請參閱 [**1. 準備資料集**](#1-準備資料集)。設定完成後再點擊「**Submit**」即可建立 Task。 ![](/uploads/upload_4d41eafa7d860af442e3d40c365a8f14.png) ![](/uploads/upload_cfd42946e844859ef90bd6355ab2727b.png) :::warning :warning: **注意:CVAT 檔案大小限制** 在 CVAT 服務中,建議您的資料集來源使用儲存服務的儲存體。若您的資料集來源是使用本機端上傳資料,則 CVAT 服務限制每個 TASK 的檔案限制大小為 1 GB。 ::: ### 2.3 使用 CVAT 進行資料標註 完成建立 CVAT 標註的 Task 後,接著即可進行資料標註。 1. **查看建立的 Task** 標註任務建立後會出現在「**Tasks**」列表的最上方,點擊 「**Open**」進入 Task 的詳細資訊頁面。 ![](/uploads/upload_2ee6460beac2ab47bd83f068b38b5d5d.png) 2. **開始進行標註** 在 Task 的詳細資訊頁面,會帶出已建立的物件標籤,當標籤確認無誤後,即可按下 **Job #id** 開始進行標註。其中 **`Task #1`** 代表此 Taskid 為 1,後續的訓練任務會需要此資訊。 ![](/uploads/upload_f29481c8caf377ded9b1c663de652055.png) 3. **標註** 進入標註頁面後,首先會看到一張欲標註的圖片,若圖中有目標物件,即可依下列步驟進行標註。 1. 點選左側工具列的矩形標註工具「**Draw new rectangle**」。 2. 選擇物件所對應的標籤。 3. 框出目標物件。 ![](/uploads/upload_f492ea7e50e66769736ac76353724625.png) 若圖片中存在多個目標物件,請重覆標註動作,直到目標物件皆標註完成。 ![](/uploads/upload_b23b0abe5c79ac88a357857725ec7925.png) 4. **儲存標註結果** 標註數張的圖片後可先點擊左上角「**Save**」儲存標註結果,繼續完成後續的教學。 ![](/uploads/upload_cc21e8bc01434b8ef1b446fb7341f93e.png) :::warning :warning: **注意:** 在標註過程中保持隨時存檔的好習慣,以免因不可抗力之因素,造成做白工。 ::: ### 2.4 下載標註資料 標註完成後,可將標註好資料匯出至儲存服務中,再於 AI Maker 中進行模型的訓練。 回到「**Tasks**」頁面,點擊欲下載 Task 右側的 「**Actions**」再點選「**Export task dataset**」。 ![](/uploads/upload_e25b7e45c6be56c87caa87356bf2451c.png) 出現 **Export task as a dataset** 視窗後,選取欲匯出的標註資料格式及儲存體。本範例將匯出 **YOLO 1.1** 格式的標註資料到 **`yolo-dataset`** 儲存體中。 ![](/uploads/upload_6a678187b676ab22dd4b073e535a5271.png) 此時回到儲存體 **`yolo-dataset`**,會多出一個 **Export** 的資料夾,下載的標註資料會按照 Task id 及資料格式的路徑存放。本範例 Task id 為 1,格式為 **YOLO 1.1**,所以下載的標註資料會放在 **/Export/1/YOLO 1.1/** 資料夾中。 ![](/uploads/upload_1f1409bb4d89fb75fc7bfe34ae7a0884.png) ## 3. 訓練 YOLO 模型 完成 [**資料集的準備**](#1-準備資料集) 後,就可以使用這些資料,來訓練與擬合我們的 YOLO 網路了。接下來您可以使用 [**AI Maker 訓練任務**](#31-建立訓練任務) 來訓練我們的 YOLO 網路。 ### 3.1 建立訓練任務 從 OneAI 服務列表選擇「**AI Maker**」,再點擊「**訓練任務**」,進入訓練任務管理頁面後,切換至「**一般訓練任務**」,接著點擊「**+建立**」,新增一個訓練任務。 ![](/uploads/upload_23c6fdd3e1f534366eba29c61b4c55d9.png) - **一般訓練任務** 根據您所給定的訓練參數,執行一次性的訓練。 - **Smart ML 訓練任務** 可自動調整超參數,能夠有效地將計算資源用於多個模型訓練,節省您在分析和調整模型訓練參數上的時間和成本。 #### 3.1.1 一般訓練任務 建立訓練任務可分成五個步驟: 1. **基本資訊** 首先是基本資訊的設定,我們先選擇 **一般訓練任務**,並選用系統內建的 **`yolov7`** 範本,來帶入固定使用的環境變數與設定,設定畫面如下: ![](/uploads/q9MX3aw.png) 2. **硬體設定** 參考目前的可用配額與訓練程式的需求,從列表中選出合適的硬體資源。 :::info :bulb:提示: 建議選擇具有 **共享記憶體** 的硬體,以免因為資源不足而導致訓練失敗。 ::: 3. **儲存設定** 這個階段預設一組儲存設定,名稱:**`dataset`**,掛載路徑:**`/dataset`**,請選擇您存放訓練資料的儲存體,例如:**`yolo-dataset`**。 ![](/uploads/upload_5e2f45862ea249b845cdf65947620489.png) :::info :bulb: **提示:關於預訓練權重** * 為了加快訓練收斂,系統內建 **COCO datasets** 訓練出來的預訓練權重檔。其預訓練權重檔跟您所使用哪種 **MODEL_TYPE** 有關,其對應關係請參閱 [**3.1.3 進階環境變數**](#313-進階環境變數)。 * 如果您要使用自己預訓練的模型可以在 **輸入來源** 新增一組儲存設定,名稱:**`weights`**,掛載路徑:**`/weights`**,並選擇您存放預訓練模型的儲存體,例如:**`yolov7-weights`**。 ![](/uploads/8M3r0wE.png) ::: 4. **變數設定** 當在填寫基本資訊,選擇套用 **`yolov7`** 的範本,會自動帶入基本的變數與命令,變數設定值可依照開發需求來進行調整或新增,範本 **`yolov7`** 所提供的參數描述如下。 | 變數 | 預設值 | 說明 | | ----- | -------| ---- | | WIDTH|640|設置圖片進入網路的寬度。| | HEIGHT|640|設置圖片進入網路的高度。| | BATCHSIZE|16|即 batch size,每個 batch 的大小值,每一個 batch 更新一次模型。| | EPOCHS | 300 | 設定訓練任務的 epoch 數目。| | MODEL_TYPE|yolov7 | 設定訓練的模型,可輸入 **yolov7、yolov7-tiny、yolov7-x、yolov7-w6、yolov7-e6、yolov7-d6、yolov7-e6e** 等,詳細說明請參見 [**3.1.3 進階環境變數**](#313-進階環境變數)。| | CVAT_TASK_ID |==cvat_task_id==|請將此參數值修改成欲使用 **CVAT** 標註資料的 **Task ID**,Task ID 可至 CVAT 的 Tasks 頁面查詢。若您使用自有的資料集及標註資料,請設定為 **none**。| 以下為 **使用 CVAT 工具標註的資料** 和 **使用自有資料集及標註資料** 的變數設定範例。不在範本預設帶出的進階環境變數,可參考 [**3.1.3 進階環境變數**](#313-進階環境變數) 依需求自行新增。 | 一般訓練任務變數設定範例 <br> 使用CVAT工具標註的資料 | 一般訓練任務變數設定範例 <br>使用自有資料集及標註資料| | :--------: | :--------: | | ![](/uploads/upload_f77612c90d2ec0a02eb9de9cd5684327.png)|![](/uploads/upload_c946ac91fe6912e47a851a1bb78deab2.png)| :::info :bulb: **提示:** * 如果資料集來源是來自 CVAT 標註的,記得設定對應的 CVAT TASK ID。 * 如果資料集來源自有的資料集,記得設定對應的 **`DATA_YAML`** 以及 YAML 檔案中對應的 **`train`**、**`val`** 及 **`test`**(選擇性)欄位值。 ::: 5. **檢閱 + 建立** 最後,確認填寫的資訊,就可按下建立。 #### 3.1.2 Smart ML 訓練任務 在 [**上一小節 3.1.1**](#311-一般訓練任務) 中介紹的是 **一般訓練任務** 的建立,這邊來介紹 **Smart ML 訓練任務** 的建立,您可以只選擇任一種訓練方法或比較兩種訓練方法的差異。兩者流程大致相同,但會多出額外參數需要設定,在此僅說明多出的變數: 1. **基本資訊** 當設定方法為 Smart ML 訓練任務後,會進一步要求挑選 Smart ML 訓練任務所要使用的 **演算法**,可選擇的演算法如下: - **Bayesian**:根據環境變數、超參數的設置範圍和訓練的次數,能有效地執行多項訓練任務,以找到更好的參數組合。 - **TPE**:Tree-structured Parzen Estimator,與 Bayesian 演算法類似,可優化高維度超參數的訓練任務。 - **Grid**:經驗豐富的機器學習使用者可以指定超參數的多個值,系統將根據超參數列表的組合執行多個訓練任務,並獲得計算結果。 - **Random**:在指定範圍內隨機選擇用於訓練任務的超參數。 ![](/uploads/h6WDknk.png) 2. **變數設定** Smart ML 訓練任務在變數設定的頁面中,會多出 **超參數** 與 **任務次數** 的設定。 | 欄位名稱 | 說明 | | --- | --- | | 環境變數 | 輸入環境變數的名稱及數值。這邊的環境變數除了包含訓練執行的相關設定外,也包括了訓練網路所需的參數設定 | | 超參數<sup style="color:red"><b>\*</b></sup> | **(Smart ML 訓練任務)** 這是告訴任務,有哪些參數需要進行嘗試。每個參數在設定時,須包含參數的名稱、類型及數值(或數值範圍),選擇類型後(整數、小數和陣列),請依提示輸入相對的數值格式 | | 目標參數<sup style="color:red"><b>\*</b></sup> | **(Smart ML 訓練任務)** 在使用 **`Bayesian`** 或 **`TPE`** 演算法時,會基於 **目標參數** 的結果來反覆調校出合適參數來為作為下次訓練任務的基準。訓練結束會回傳一值做為最終結果,這邊為該值設定名稱及目標方向。例如:若回傳的數值為準確率,則可命名為 accuracy,並設定其目標方向為最大值;若回傳的值為錯誤率,則命名為 error ,其方向為最小值。| | 命令 | 輸入欲執行的命令或程式名稱。根據此映像檔所提供的指令為:`sh -c "/yolov7/train.sh"` | | 任務次數<sup style="color:red"><b>\*</b></sup> | **(Smart ML 訓練任務)** 即訓練次數設定,讓訓練任務執行多次,以找到更好的參數組合 | 其中,**環境變數** 與 **超參數** 可以互相移動。若您想固定該參數,則可將該參數從超參數區域中移除,新增至環境變數區域,並給定固定值;反之,若想將該參數加入嘗試,則將它從環境變數中移除,加入至下方的超參數區域。 範本中的預設的 **超參數** 說明如下: | 名稱 | 數值範圍 | 說明 | | ---- | ---- | ---- | | lr0 | 0.001 ~ 0.01 | **學習速度** 的參數,在模型學習初期時,可以設定大一點,以加速訓練。在學習後期,需要設定小一點,避免發散。 | | degrees |0 ~180 |透過調整圖片的 **角度**,設定為 5 表示圖片將會旋轉 -5 ~ 5 度來得到更多的樣本數。| | mosaic|0.01~1.0|設定在每次加載圖像進行訓練時產生一個新的獨特圖片(原始圖像加上 3 個隨機圖像)。| | mixup|0.01~1.0|就是將原圖像和隨機選取的圖像以一定比例混合生成新的圖像。| 當然您也可以客製化自己的超參數,可參考 [**hyp.scratch.custom.yaml**](https://github.com/WongKinYiu/yolov7/blob/main/data/hyp.scratch.custom.yaml) 裡面的參數,填上欲加入的參數以及對應的範圍值。 以下為 **使用 CVAT 工具標註的資料** 和 **使用自有資料集及標註資料** 的變數設定範例。不在範本預設帶出的進階環境變數,可參考 [**3.1.3 進階環境變數**](#313-進階環境變數) 依需求自行新增。 | SMART ML 訓練任務變數設定範例 <br> 使用CVAT工具標註的資料 | SMART ML 訓練任務變數設定範例 <br>使用自有資料集及標註資料| | :--------: | :--------: | | ![](/uploads/8mYSqpl.png) |![](/uploads/sbhjPl6.png)| #### 3.1.3 進階環境變數 進階的環境變數說明如下,可依需求自行新增。 | 變數 | 預設值 | 說明 | | -------- | -------- | -------- | | WEIGHT| default |使用權重;可填的內容有:**none**、**default** 或 **權重檔案路徑**;下表會有更多說明。| | DATA_YAML|default|data yaml 檔案;若您使用自有的資料集,請設定此環境變數。| | HYP_YAML|default|hyp yaml 超參數檔案;下表會有更多說明。| | CFG_YAML|default|cfg yaml 檔案;下表會有更多說明。| | CVAT_VAL_TASK_ID|none|(選擇性)使用哪些 CVAT task id 當驗證集。| | CVAT_TEST_TASK_ID|none|(選擇性)使用哪些 CVAT task id 當測試集。 | | TRAIN_VALIDATION_RATE|8:2|從訓練集資料以 8:2 的比例隨機劃分訓練集以及驗證集,若您沒有定義驗證集則系統會按此比例切割資料集。| | EXTRA_PARAMETER|none|yolov7 [**train.py**](https://github.com/WongKinYiu/yolov7/blob/main/train.py#L528) 的進階參數。| | EXTRA_TEST_PARAMETER|none|yolov7 [**test.py**](https://github.com/WongKinYiu/yolov7/blob/main/test.py#L291) 的進階參數。| 以下說明 MODEL_TYPE、WEIGHT、HYP_YAML、CFG_YAML 這幾個環境變數的關係,更多關於 **MODEL_TYPE** 的資訊,請參考 [**YOLOv7 官方文件**](https://github.com/WongKinYiu/yolov7)。 | MODEL_TYPE | WEIGHT | HYP_YAML |CFG_YAML| | :---- |:-------- | ---- | -------| | yolov7 |none:<br>不使用預訓練的權重,從頭開始訓練。<br>default:<br>使用內建的 [yolov7_training.pt](https://github.com/WongKinYiu/yolov7/releases/tag/v0.1) 預訓練權重。<br>path file: 使用自訂的權重檔。|default:<br>使用內建的 [hyp.scratch.p5.yaml](https://github.com/WongKinYiu/yolov7/blob/main/data/hyp.scratch.p5.yaml) 超參數檔案。<br>path file:<br>使用自訂的<br>超參數檔案。|default:<br>使用內建的 [coco.yaml](https://github.com/WongKinYiu/yolov7/blob/main/data/coco.yaml)<br>path file:<br>使用自訂的 data yaml。| | yolov7-tiny |none:<br>不使用預訓練的權重,從頭開始訓練。<br>default:<br>使用內建的 [yolov7_tiny.pt](https://github.com/WongKinYiu/yolov7/releases/tag/v0.1) 預訓練權重。<br>path file: 使用自訂的權重檔。|default:<br>使用內建的 [hyp.scratch.tiny.yaml](https://github.com/WongKinYiu/yolov7/blob/main/data/hyp.scratch.tiny.yaml) 超參數檔案。<br>path file:<br>使用自訂的<br>超參數檔案。|deafult:<br>使用內建的 [yolov7-tiny.yaml](https://github.com/WongKinYiu/yolov7/blob/main/cfg/training/yolov7-tiny.yaml)<br>path file:<br>使用自訂的 cfg yaml。 | yolov7-x|none:<br>不使用預訓練的權重,從頭開始訓練。<br>default:<br>使用內建的 [yolov7x_training.pt](https://github.com/WongKinYiu/yolov7/releases/tag/v0.1) 預訓練權重。<br>path file: 使用自訂的權重檔。|default:<br>使用內建的 [hyp.scratch.p5.yaml](https://github.com/WongKinYiu/yolov7/blob/main/data/hyp.scratch.p5.yaml) 超參數檔案。<br>path file:<br>使用自訂的<br>超參數檔案。|deafult:<br>使用內建的 [yolov7-x.yaml](https://github.com/WongKinYiu/yolov7/blob/main/cfg/training/yolov7-x.yaml)<br>path file: 使用自訂的 cfg yaml。 | yolov7-w6|none:<br>不使用預訓練的權重,從頭開始訓練。<br>default:<br>使用內建的 [yolov7x_training.pt](https://github.com/WongKinYiu/yolov7/releases/tag/v0.1) 預訓練權重。<br>path file: 使用自訂的權重檔。|default:<br>使用內建的 [hyp.scratch.p6.yaml](https://https://github.com/WongKinYiu/yolov7/blob/main/data/hyp.scratch.p6.yaml) 超參數檔案。<br>path file:<br>使用自訂的<br>超參數檔案。|deafult:<br>使用內建的 [yolov7-w6.yaml](https://github.com/WongKinYiu/yolov7/blob/main/cfg/training/yolov7-w6.yaml)<br>path file:<br>使用自訂的 cfg yaml。 | yolov7-e6|none:<br>不使用預訓練的權重,從頭開始訓練。<br>default:<br>使用內建的 [yolov7-e6_training.pt](https://github.com/WongKinYiu/yolov7/releases/tag/v0.1) 預訓練權重。<br>path file:<br>使用自訂的權重檔。|default:<br>使用內建的 [hyp.scratch.p6.yaml](https://https://github.com/WongKinYiu/yolov7/blob/main/data/hyp.scratch.p6.yaml) 超參數檔案。<br>path file:<br>使用自訂的<br>超參數檔案。|deafult:<br>使用內建的 [yolov7-e6.yaml](https://github.com/WongKinYiu/yolov7/blob/main/cfg/training/yolov7-e6.yaml)<br>path file:<br>使用自訂的 cfg yaml。 | yolov7-d6|none:<br>不使用預訓練的權重,從頭開始訓練。<br>default:<br>使用內建的 [yolov7-d6_training.pt](https://github.com/WongKinYiu/yolov7/releases/tag/v0.1) 預訓練權重。<br>path file:<br>使用自訂的權重檔。|default:<br>使用內建的 [hyp.scratch.p6.yaml](https://https://github.com/WongKinYiu/yolov7/blob/main/data/hyp.scratch.p6.yaml) 超參數檔案。<br>path file:<br>使用自訂的<br>超參數檔案。|deafult:<br>使用內建的 [yolov7-d6.yaml](https://github.com/WongKinYiu/yolov7/blob/main/cfg/training/yolov7-d6.yaml)<br>path file:<br>使用自訂的 cfg yaml。 | yolov7-e6e|none:<br>不使用預訓練的權重,從頭開始訓練。<br>default:<br>使用內建的 [yolov7-e6e_training.pt](https://github.com/WongKinYiu/yolov7/releases/tag/v0.1) 預訓練權重。<br>path file:<br>使用自訂的權重檔。|default:<br>使用內建的 [hyp.scratch.p6.yaml](https://https://github.com/WongKinYiu/yolov7/blob/main/data/hyp.scratch.p6.yaml) 超參數檔案。<br>path file:<br>使用自訂的<br>超參數檔案。|deafult:<br>使用內建的 [yolov7-e6e.yaml](https://github.com/WongKinYiu/yolov7/blob/main/cfg/training/yolov7-e6e.yaml)<br>path file:<br>使用自訂的 cfg yaml。 #### 3.1.4 環境變數設定範例 本小節會以 **使用 CVAT 工具標註的資料** 或是 **使用自有的資料集** 兩種情境來說明環境變數的設定。 1. **使用 CVAT 工具標註的資料** 環境變數設定範例:當訓練 yolov7-x 的模型時,使用內建的 yolov7x_training.pt 進行 Transfer Learning(參見上表);使用 CVAT 對應的TASK ID:1 和 2 當訓練集;TASK ID:3 當驗證集;TASK ID:4 和 5 當測試集。 | 名稱 | 數值 | |------|-------| | MODEL_TYPE|yolov7-x| | CVAT_TASK_ID|1, 2| | CVAT_VAL_TASK_ID|3| | CVAT_TEST_TASK_ID|4, 5| 2. **使用自有資料集及標註資料** 環境變數設定範例:當訓練 yolov7-x 的模型時,使用內建的 yolov7x_training.pt 進行 Transfer Learning(參見上表);並指定訓練集、驗證集以及測試集及類別檔案(DATA_YAML)的所在路徑。 |名稱 | 數值 | |------|-------| | MODEL_TYPE|yolov7-x| | CVAT_TASK_ID|none| | DATA_YAML|/dataset/data.yaml| 其中 data.yaml 的內容請參照 [**1.2.2 新增 data.yaml 檔案** ](#122-新增-datayaml-檔案) 的設定說明。 :::info :bulb: **提示:** 1. 請記得把 CVAT_TASK_ID 移除或者設定為 none。 2. 請確認所選擇的儲存體中有相對應的檔案。 ::: 3. **使用自有資料集及預訓練模型** * 儲存設定範例 - 請在輸入來源的 **`dataset`** 設定中,選擇您存放自有資料集及標註資料的儲存體,例如:**`yolo-dataset`**。 - 請新增一組儲存設定,名稱:**`weights`**,掛載路徑:**`/weights`**,並選擇您存放預訓練模型的儲存體,例如:**`yolov7-weights`**。 ![](/uploads/8M3r0wE.png) * 環境變數設定範例:當訓練 yolov7-x 的模型時,使用您指定的預訓練模型權重檔:/weights/my.pt 進行 Transfer Learning。 | 名稱 | 數值 | |------|------| | MODEL_TYPE|yolov7-x| | WEIGHT|/weights/my.pt| ### 3.2 啟動訓練任務 完成訓練任務的設定後,回到訓練任務管理頁面,可以看到剛剛建立的任務。點擊該任務,可檢視訓練任務的詳細設定。若此時任務的狀態顯示為 **`Ready`**,即可點擊 **啟動**,執行訓練任務。 ![](/uploads/upload_d9d117fad1c7559f29d295dd98beefc2.png) 啟動後,點擊上方的「**運行列表**」頁籤,可以在列表中查看該任務的執行狀況。在訓練進行中,可以點擊任務右方清單中的「**查看日誌**」或「**查看詳細狀態**」,來得知目前執行的詳細資訊。若是在進行 Smart ML 訓練任務,清單中會多出「**查看超參數**」,此選項可以讓您查看此訓練任務所使用的參數組合。 ![](/uploads/upload_bed3de6a9e1a424f4634ed9575c36f37.png) ### 3.3 檢視訓練結果 操作步驟請參閱 [**AI Maker > 檢視訓練結果**](/s/ai-maker#檢視訓練結果) 文件,其中訓練任務的 Metrics 可以參考以 mAP_0.5,以本例來說即為 mAP_0.5,值越大越好。 ![](/uploads/upload_35f2b236c205c22759628e996a5bf509.png) ### 3.4 註冊模型 從運行列表中挑選出符合預期的結果,再點選右側「**註冊模型**」,將之儲存至模型庫中;若無符合預期結果,則重新調整環境變數與超參數的數值或數值範圍。 ![](/uploads/upload_9d285855b25a620fa8b9481567c2e150.png) 出現 **註冊模型** 視窗後,選擇 **模型來源** 和 **模型目錄**,點擊 **模型目錄** 選單可輸入欲建立的模型目錄名稱,例如:`mymodel` 或選擇既有的模型目錄。 ![](/uploads/upload_4b9a22763dbad7a514719f8a8e9f452d.png) :::info :bulb: **提示:模型來源** * `best.pt` 代表最佳模型權重。 * `last.pt` 代表最後一次訓練後的模型權重。 ::: 註冊模型後,會進入模型版本管理頁面。在列表中可看到模型的版本、類別、描述、來源與結果等資訊。 ![](/uploads/upload_d4c128a65bf6d32a949b8d486d26d9cb.png) ## 4. 建立推論服務 當您訓練好 YOLO 網路後,並儲存訓練好的模型,這時您可藉由 **推論** 功能將其部署至應用程式或服務以執行推論。 ### 4.1 建立推論 從 OneAI 服務列表選擇「**AI Maker**」,再點擊「**推論**」,進入推論管理頁面,並按下「**+建立**」,建立一個推論服務。推論服務的建立步驟說明如下: 1. **基本資訊** 首先先將建立方式改成 **自訂**,以套用公用範本 **`yolov7`** 載入預設設定,將模型部署成推論 REST 端點。不過雖藉由範本載入預設設定,但所要載入的模型名稱與版號仍須使用者手動設定。 - **名稱** 載入後模型的檔案名稱,與程式進行中的讀取有關,這值會由 `yolov7` 推論範本設定。 - **模型名稱** 所要載入模型的名稱,即我們在 [**3.4 註冊模型**](#34-註冊模型) 中所儲存的模型。 - **版本** 所要載入模型的版號,亦是 [**3.4 註冊模型**](#34-註冊模型) 中所設定的版號。 - **掛載位置** 載入模型所在位置,與程式進行中的讀取有關,這值會由 `yolov7` 推論範本設定。 ![](/uploads/upload_ccfae81e30318b3fbdacc00b9572ace7.png) 2. **硬體設定** 參考目前的可用配額與訓練程式的需求,從列表中選出合適的硬體資源。 為了讓有最佳體驗,因此在挑選硬體時,請選擇包含 GPU 的規格。 3. **儲存設定** 此步驟無須設定。 4. **變數設定** 在變數設定頁面,這些指令與參數,會在套用 **`yolov7`** 的範本時自動帶入。 ![](/uploads/O7sLNYy.png) 5. **進階設定** * **監控資料** 此監控用途在於觀測推論服務一段時間內,API 呼叫次數以及推論結果所呈現的統計資訊。 ![](/uploads/upload_b4aec455a44c0db19976cf45463658ce.png) | 名稱 | 類別 |說明 | |-----|-----|------------| | object_detect | 標籤 | 在指定的時間區間內,該物件被偵測出所累計的總次數。<br>換言之,可看出各類別在一段時間內的分佈狀況。<br>![](/uploads/upload_c7747e73fb3bbb2daaf222157a4384c1.png)| | confidence | 數量 | 在某個時間點呼叫推論 API 一次,該物件被偵測出的信心值。<br>![](/uploads/upload_03c563aaf4460e30ba399413c5dc034e.png)| 6. **檢閱 + 建立** 最後,確認填寫的資訊,就可按下建立。 ### 4.2 進行推論 完成推論服務的設定後,回到推論管理頁面,可以看到剛剛建立的任務,點擊該列表,可檢視該服務的詳細設定。當服務的狀態顯示為 **`Ready`** 時,點擊「**查看日誌**」。 ![](/uploads/upload_c4e19f27e04e96b003b531c7cf5107d1.png) 若在日誌中有看到以下訊息,表示推論服務已經在運作中,即可以開始連線到推論服務進行推論。 ![](/uploads/upload_d6124f6435a02bcb7986bd5562e98ea9.png) 在詳細設定中值得注意的是「**網址**」,由於目前推論服務為了安全性的考量沒有開放對外的服務埠,但我們可以透過 **筆記本服務** 來跟我們的已經建立好的推論服務溝通,溝通的方式就是透過推論服務提供的「**網址**」,在下一章節會說明如何使用。 ![](/uploads/upload_97d3a7214eb77276127b8adca3b9b390.png) :::info :bulb: **提示:推論服務網址** - 文件中的網址僅供參考,您所取得的網址可能會與文件中的不同。 - 為安全性考量,目前推論服務提供的 **網址** 僅能在系統的內部網路中使用,無法透過外部的網際網路存取。 - 若要對外提供此推論服務,請參考 [**AI Maker > 對外提供服務**](/s/ai-maker#進行推論) 說明。 ::: 若要查看推論監控,可點擊「**監控**」頁籤,即可在監控頁面看到相關資料,如下圖所示。 ![](/uploads/upload_aa8cd5cbd8e84952a896fe447251c4cb.png) 點選期間選單可篩選特定期間呼叫推論 API 的統計資訊,例如:1 小時、3 小時、6 小時、12 小時、1 天、7 天、14 天、1 個月、3 個月、6 個月、1 年或自訂。 ![](/uploads/upload_a074311c7aaea03c588d1c3e0146a178.png) :::info :bulb: **提示:關於觀測期間的起始與結束時間** 例如當前時間為 15:10,則: - **1 小時** 的範圍是指 15:00 ~ 16:00(並非指過去一小時 14:10 ~ 15:10) - **3 小時** 的範圍是指 13:00 ~ 16:00 - **6 小時** 的範圍是指 10:00 ~ 16:00 - 以此類推 ::: ## 5. 進行影像辨識 在這一章節,我們將使用 [**筆記本服務**](/s/notebook) 提供的 PyTorch 的開發框架 `PyTorch-22.08-py3`,來啟動 JupyterLab 與推論服務進行連線。 ### 5.1 建立筆記本服務 從服務列表選擇「**筆記本服務**」,在筆記本服務管理頁面點擊「**+建立**」。 1. **基本資訊** 在建立筆記本服務時,挑選 **`PyTorch-22.08-py3`** 開發框架。 ![](/uploads/upload_c2147231eb459dc157424d40572098f0.png) 2. **硬體設定** 參考目前的可用配額與程式需求,從列表中選出合適的硬體資源,此處可以不用配置 GPU。 3. **儲存設定** 此步驟無須設定。 4. **檢閱 + 建立** 最後,確認填寫的資訊,就可按下建立。 ### 5.2 使用 JupyterLab 筆記本服務建立成功後進入筆記本服務的詳細資訊頁面, 在 **連線** 區塊,點擊「**啟動**」即可在瀏覽器中開啟 JupyterLab。 ![](/uploads/upload_02b7918f22135770f343973c51947844.png) ### 5.3 進行推論 開啟 JupyterLab,我們可以複製 [**5.4 附件程式碼**](#54-附件程式碼) 到 Notebook 裡面執行,請依您的環境,修改此份程式碼進行推論,程式碼說明如下。 #### 1. 發送請求 本範例使用 requests 模組產生 HTTP 的 POST 請求,並將圖片與參數作為一個字典結構遞給 JSON 參數。 ```python=1 # Initial Setup: # INFE_URL:Inference URL # threshold:Yolov7 inference threshold # image_path:Image full path # result_path:Result save full path INFE_URL = "http://myinference-i.abf29785-7dd8-4c15-a06a-733f124772b3:9999" threshold = 0.5 image_path = "/workspace/dog.jpg" result_path = "/workspace/result/" # Case2、Infrence ROUTE = "/yolov7/detect" url = "{base}{route}".format( base=URL_BASE, route=ROUTE) with open(image_path, "rb") as inputFile: data = inputFile.read() body = {"image": base64.b64encode(data).decode("utf-8"), "thresh": threshold} res = requests.post(url, json=body) status_code = res.status_code content = json.loads(res.content) content = json.dumps(content, indent=4) print("[code]:\t\t{code}\n[content]:\n{text}".format(code=status_code,text=content)) ``` 其中有幾個變數需特別注意: * **`INFE_URL`** 需要填入推論服務的網址連結。 本範例 **`INFE_URL`** 為 **`http://myinference-i.abf29785-7dd8-4c15-a06a-733f124772b3:9999`**,請修改成您的推論服務網址連結。 * **`threshold`** 是指當預測出來的信心值必須大於該值才能被歸類為該類別。 * **`image_path`** 則是所要推論的圖片位置,其中本範例的圖片是透過下面指令取得。<br><br> ```shell= wget https://raw.githubusercontent.com/WongKinYiu/yolov7/main/deploy/triton-inference-server/data/dog.jpg -P /workspace/ ``` #### 2. 取回結果 完成物件偵測後,結果將以 JSON 格式回傳: * **`results`**:為一物件陣列,包含一個或多個偵測物件結果,其中包含: - **`points`**:[xmin, ymin, xmax, ymax]。 - **`label`**:該物件的分類結果。 - **`confidence`**:該物件分類的信心分數。 當取得這些資訊後,我們可以按此繪製 bounding。 ![](/uploads/lJ3wE1d.png) 透過以上程式,即可向推論服務發送請求,並取回偵測結果,繪製到原圖上。 :::info :bulb: **提示:** 本範例僅支援顯示英文標註。 ::: ### 5.4 附件程式碼 :::spoiler **程式碼** ```python=1 import numpy as np import base64 import io import os import requests import json from PIL import Image as Images,Image,ImageDraw from IPython.display import Image, clear_output, display import cv2 %matplotlib inline from matplotlib import pyplot as plt from pathlib import Path from os.path import join # Initial Setup: # INFE_URL:Inference URL # threshold:Yolov7 inference threshold # image_path:Image full path # result_path:Result save full path INFE_URL = "http://myinference-i.abf29785-7dd8-4c15-a06a-733f124772b3:9999" threshold = 0.5 image_path = "/workspace/dog.jpg" result_path = "/workspace/result/" # Case1、Connect test URL_BASE = "{url}".format(url=INFE_URL) ROUTE = "/yolov7" url = "{base}{route}".format( base=URL_BASE, route=ROUTE) try: res = requests.get(url) print("[code]:\t\t{code}\n[content]:\t{text}".format(code=res.status_code,text=res.text)) except requests.exceptions.RequestException as e: print(e) # Case2、Infrence ROUTE = "/yolov7/detect" url = "{base}{route}".format( base=URL_BASE, route=ROUTE) with open(image_path, "rb") as inputFile: data = inputFile.read() body = {"image": base64.b64encode(data).decode("utf-8"), "thresh": threshold} res = requests.post(url, json=body) status_code = res.status_code content = json.loads(res.content) content = json.dumps(content, indent=4) print("[code]:\t\t{code}\n[content]:\n{text}".format(code=status_code,text=content)) # Display Result def arrayShow(imageArray): resized = cv2.resize(imageArray, (500, 333), interpolation=cv2.INTER_CUBIC) ret, png = cv2.imencode('.png', resized) return Image(data=png) if not os.path.exists(result_path): os.makedirs(result_path) output = join(result_path,str(Path(image_path))) color = (255, 0, 0) detected = res.json() objects_json = json.loads(detected.get('results')) oriImage = cv2.imread(image_path) img_pil = Images.fromarray(cv2.cvtColor(oriImage, cv2.COLOR_BGR2RGB)) draw = ImageDraw.Draw(img_pil) for obj in objects_json: xmin = (obj['points'][0]) ymin = (obj['points'][1]) xmax = (obj['points'][2]) ymax = (obj['points'][3]) label = (obj['label']) confidence = obj['confidence'] pos = tuple((int(xmin),int(ymin))) box = (int(xmin), int(ymax)), (int(xmax), int(ymin)) draw.text(pos, label, fill = color) draw.rectangle(box,outline="green") cv_img = cv2.cvtColor(np.asarray(img_pil),cv2.COLOR_RGB2BGR) cv2.imwrite(output, cv_img) img = arrayShow(cv_img) clear_output(wait=True) display(img) ``` ::: ## 6. CVAT 輔助標註 CVAT 提供輔助標註功能,可以大幅度降低人工標註的時間。由於使用 CVAT 提供輔助標註功能需要有深度學習模型,這部分可以參考 [**訓練 YOLO 模型**](#3-訓練-YOLO-模型),訓練出自己的深度學習模型,本章節將介紹如何在 CVAT 標註工具中使用訓練好的深度學習模型進行的影像資料的輔助標註。 ### 6.1 建立 YOLOv7 輔助標註服務 使用 AI Maker 系統提供 **yolov7-cvat** 推論範本,可以讓您快速建立 **yolov7 model** 的輔助標註推論服務。 首先點選左側「**推論**」,進入「**推論管理**」頁面,並按下「**+建立**」,建立一個推論服務。 1. **基本資訊** 輸入推論服務基本資訊,請選擇 **`yolov7-cvat`** 範本,並在「**來源模型**」中選擇要用來執行輔助標註的模型名稱及版本。 ![](/uploads/SW6rbGh.png) 2. **硬體設定** 參考目前的可用配額與訓練程式的需求,從列表中選出合適的硬體資源。 :::info :bulb: **提示:** 為了有更好更快速的輔助標註功能體驗,硬體設定請選擇有 GPU 的硬體選項。 ::: 3. **儲存設定** 此步驟無須設定。 4. **變數設定** 在變數設定頁面,這些指令與參數,會在套用 **`yolov7-cvat`** 範本時自動帶入。 ![](/uploads/bhgSIRX.png) 5. **後續步驟** 後續步驟與其他任務的步驟相似,這邊就不再贅述。 ### 6.2 連結至 CVAT 當您建立好一個 YOLOv7 輔助標註推論服務後,還需要再一步驟讓您的推論服務連結至 CVAT。AI Maker 的推論服務中連結至 CVAT 服務的設定有三個地方: 1. 「**CVAT 管理**」頁面 點選左側功能列之「**標註工具**」,進入 CVAT 服務首頁。第一次使用需先點擊「**啟用 CVAT 服務**」,每個專案只能開啟一套 CVAT 服務。 進入「**CVAT 管理**」頁面後,點擊 **連結推論服務至 CVAT** 區塊下方的「**新增**」按鈕,若已有推論服務連結至 CVAT,則此按鈕會變成「**編輯**」。 ![](/uploads/MgTYHY8.png) 出現 「**連結推論服務至CVAT**」視窗後,再選擇欲連結的推論服務。 ![](/uploads/rh0kjvI.png) 2. 「**推論管理**」頁面 點選左側功能列「**推論**」進入「**推論管理**」,將滑鼠移動到欲進行自動標註的任務右側的更多選項圖示,接著點選「**連結至 CVAT**」。 ![](/uploads/upload_a5d34f8aa175aa1f177752b7aa455215.png) 3. 「**推論詳細資料**」頁面 點擊欲連接 CVAT 的推論任務列表,進入「**推論詳細資料**」頁面,再點擊上方「**連接至 CVAT**」圖示。 ![](/uploads/upload_78a00d5750418c629562fcf8f49ea0f7.png) ### 6.3 使用 CVAT 輔助標註功能 當您完成了上述的步驟,接下來就可以登入 CVAT 使用輔助標註功能。使用步驟請參考下列說明: 1. 查看 CVAT Model  進入 CVAT 服務頁面後點選上方的 「**Models**」,就可以看到您剛剛連結至 CVAT 的推論服務。 ![](/uploads/lvpqbmW.png) 2. 啟用輔助標註功能 進入「**Tasks**」頁面後找到要標註的 Task,然後將滑鼠移動到欲進行自動標註的任務右側「**Actions**」的更多選項圖示,接著點選「**Automatic annotation**」。 ![](/uploads/upload_db08a32d3df879d0a5bb62b211aa2ef3.png) 出現「**Automatic annotation**」視窗後點擊「**Model**」下拉選單,選取已連結的推論任務。 ![](/uploads/upload_d3f421637ecdd5a5e256425496bd5184.png) 接著設定模型與任務 Label 對應,最後點擊「**Annotate**」執行自動標註。 ![](/uploads/upload_03a168df5c39d0bc4ff9823012757ecc.png) 自動標註任務開始後,可以看到完成的百分比,標註大量的資料會需要一些時間,標註完成後畫面上會出現標註完成的提示。 ![](/uploads/upload_9a5737e66f9c6b1c628169cbf61f7819.png) 標註完成後,進入 CVAT 標註工具頁面檢視自動標註的結果,若對自動標註的結果不滿意,可再進行人工標註校正或重新訓練優化模型。 ![](/uploads/upload_4f9643e996c0e5f1813c9790bf0b695c.png)