華爲雲 ModelArts 操作總結(華爲雲開發者青年班--AI實戰營,黑客鬆大賽)

目錄

訓練作業創建:垃圾分類訓練作業實驗

自動學習創建:垃圾分類

自動學習創建:零代碼美食分類模型開發

數據集創建:使用ResNet50預置算法基於海量數據訓練美食分類模型

訓練作業創建:貓狗識別(智能標註、TensorBoard)

智能標註

訓練作業

Notebook使用:Yolo3物體檢測

附註 : .ipynb內容


參加了華爲雲AI青年班及黑客鬆大賽,學習瞭如何操作華爲雲 ModelArts 控制檯實現自己的模型管理、OBS數據存儲系統管理(可下載 OBS Browser+,方便上傳下載數據,但不用的時候還是要及時關掉,個人感覺比較佔用CPU處理)、模型調優等。

黑客鬆比賽結果
標題

以下通過一些典型內容總結了 華爲雲 ModelArts 控制檯 的主要功能。OBS 數據存儲、模型調優等如果認爲有必要會再寫出來,其實,OBS桶就是一個有收費的存儲站,用它可以很方便和 ModelArts 裏面的數據文件‘通信’---比如,訓練模型的輸出、數據集的調用。

具體相關的文件我上傳了資源,有興趣的去我CSDN主頁下載即可。

首先是註冊華爲雲賬號,註冊過程不多解釋,按提示走即可;然後,進入華爲雲 ModelArts 控制檯官網進去-->產品-->EI企業智能-->EI基礎平臺-->AI開發平臺ModelArts-->進入控制檯;接着便可進行下面的系列內容。

 

訓練作業創建:垃圾分類訓練作業實驗

1. 登陸華爲雲 ModelArts 控制檯,訓練管理 --> 訓練作業--> 創建。

可以設置的參數有:

  • 作業名稱:trainjob-name
  • 算法來源:(多種可選,華爲雲預置了一些經典算法,如yolo3等;也可管理自己的算法;或者自定義算法來源,本項目使用‘常用框架’)‘常用框架’ 的 tensorflow
  • 數據來源:obs桶目錄下存儲的的數據文件【注意,路徑下直接是訓練數據文件,否則可能運行失敗】;
  • 代碼目錄:obs桶目錄下存儲的代碼文件;
  • 啓動文件:代碼目錄下的.py文件;
  • 訓練輸出位置:obs桶目錄下設置的output文件(自己在OBS桶下面新建一個即可)。
  • 運行參數:新增兩=類別個數、配置路徑【obs桶目錄下存儲的代碼文件下的配置文件】。
  • num_classes=8 和 8個類別
  • deploy_script_path= obs://wt.wang-garbage-trainjob/garbage_src/deploy_scripts/ 
  • 作業日誌路徑:obs://wt.wang-garbage-trainjob/log_wwt/

2.  訓練作業任務提交後,可以在訓練管理-訓練作業,中查看‘配置信息’ ‘日誌’ ‘資源佔用情況‘。

3. 訓練作業完畢,進入模型管理-->模型-->‘導入‘模型,(名稱:model-name;版本號; 元模型來源:訓練作業的對應版本; 部署類型:在線服務),設置完點擊’立即創建‘

4. 部署上線,選擇‘在線服務‘中’部署‘(名稱:service-name; 公共資源池-我的模型-模型版本-計算節點規格),部署任務提交。

5. 部署成功後,進行預測。用本地測試圖像進行測試,完成後關閉在線服務。

Notes : deploy_script_path 路徑下包含的兩個配置文件的名稱不能改變,爲“config.json” 和 “customize_service.py”,需要自己編寫,編寫方式可以參考上傳資源裏面的代碼文件書寫方式。

相關步驟的圖示過程如下。

---------------訓練作業創建設置----------------

此處的數據來源錯誤,應該再往下一層進入訓練文件夾。

---------------訓練作業創建完成:查看運行情況----------------

運行失敗,改變訓練數據文件路徑,重新運行,成功。

---------------訓練作業創建設置:常用框架展示例子----------------

---------------代碼文件----------------

---------------數據文件----------------

---------------查看訓練作業運行情況----------------

---------------成功部署後的測試例子----------------

 

自動學習創建:垃圾分類

1. 登陸OBS桶,建桶,上傳數據集(查看我的CSDN資源頁面,對應該標題名稱“自動學習創建:垃圾分類”)。

2. 登陸華爲雲 ModelArts 控制檯,自動學習 --> 圖像分類 --> 創建項目。

3. 接着,根據下面圖示過程,標註數據、訓練、部署、測試即可。

Note:完成後記得釋放資源,避免收費。

 

---------------自動學習創建項目----------------

---------------創建完成後,進入運行頁面,同步、標註數據----------------

---------------標註完數據後,進入模型訓練,可以自己根據情況選擇合適的資源,數據集切分比例---------------

---------------自動學習訓練完成後,點擊“模型部署”----------------

---------------自動學習部署成功,即可預測----------------

 

自動學習創建:零代碼美食分類模型開發

和自動學習的垃圾分類項目類似。(查看我的CSDN資源頁面,對應該標題名稱“自動學習創建:零代碼美食分類模型開發”)。

ModelArts控制檯:自動學習-圖像分類:exeML-proj-name

  1. 數據集輸入輸出位置指定【obs目錄】後,完成項目創建。
  2. 進入項目exeML-proj-name,進行數據標註,標註完開始訓練,(訓練設置指定版本號、訓練驗證數據比例、預期推理硬件、最大推理時長、最大訓練時長、計算規格)。
  3. 訓練結束後,部署上線,部署成功後,進行服務測試,用本地測試圖像進行測試,完成後關閉在線服務。

---------------自動學習,美食數據已經上傳資源---------------

---------------自動學習部署成功,即可預測----------------

數據集創建:使用ResNet50預置算法基於海量數據訓練美食分類模型

---------------目前爲止(2020.5.13),華爲預置算法截圖----------------

1. 首先需要將數據集上傳到OBS桶中。接着在ModelArt創建數據集。(查看我的CSDN資源頁面,對應該標題名稱“數據集創建:使用ResNet50預置算法基於海量數據訓練美食分類模型.zip”)。

2. 登陸ModelArts控制檯,數據管理-->數據集-->創建數據集,名稱爲 dataset-name,參數設置如下

  • 數據集輸入輸出位置:指定【obs目錄】後,標註場景選‘圖片‘,標註類型選’圖像分類‘;完成數據集創建。

3. 點擊進入創建的數據集,開始標註、發佈數據集、並進行一鍵上線。

4. “開始標註” 數據。‘同步數據源‘(數據集輸入輸出位置的同步)後,手工標註沒有標籤的數據,也可以用自動標註(自動標註需要自己先標註一部分,且自動標註後會提示確認自動標註的是否正確,錯了可以修改);

5.“發佈”數據集,(版本號、版本格式、訓練驗證比例),發佈後可以用版本管理查看。6. 數據集中 “一鍵模式上線”任務創建。參數設置如下:

  • 名稱:auto-deploy-name
  • 訓練預置算法:ResNet_v1_50
  • 運行參數:默認,有需要可以自己改。
  • 訓練輸出位置:obs路徑。訓練輸出位置用來保存訓練輸得到的模型和TensorBoard日誌
  • 作業路徑位置:obs路徑。自己建立。
  • 訓練資源池:公共;類型:GPU;規格:CPU8 64GiB GPU1 * nvidia-p100 16GiB;計算節點個數:1
  • 部署資源池:公共;計算節點規格:限時免費CPU;計算節點個數:1. 如果是多個計算節點,就是多實例部署,可以提高API的併發數

7. 提交後,等待,一條龍過程有:初始化訓練-生成模型-部署-完成。中途可以進入相應詳情頁查看訓練詳情、模型詳情、部署/服務詳情等。

  • 比如,查看訓練作詳情。ModelArts --> 訓練管理-->訓練作業 auto-deploy-name點擊進入。查看配置信息、日誌、資源佔用情況。進行在線服務測試。用本地測試圖像進行測試,完成後關閉在線服務。

API接口地址: https://bb06320f3ab241fa93e8c7b655efc909.apig.cn-north-4.huaweicloudapis.com/v1/infers/13fe4db2-382c-4525-b68f-a26bcc13a843

點擊部署服務測試頁面右側的“調用接口指南” 進入如下鏈接:https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0063.html

---------------自動學習,美食數據已經上傳CSDN資源---------------

---------------創建數據集---------------

---------------對創建的數據集,進行任務創建:一鍵模型上線.---------------

----------------一鍵模型上線過程中,可以根據過程自由查看生成的模型、部署詳情頁面等---------------

---------------自動學習部署成功,即可預測---------------

完了後同樣關閉在線服務,避免持續扣費。需要時,重新啓動。

訓練作業創建:貓狗識別(智能標註、TensorBoard)

1. 訓練作業步驟,首先新建OBS桶,把寫的代碼文件、相關數據上傳。

  • .py代碼腳本上傳到obs項目文件夾新建的codes目錄
  • 下載貓狗數據集.tar.gz,無需解壓上傳到obs項目文件夾新建的data目錄
  • 創建訓練作業,步驟同本doc第一節,不過這兒不用新增運行參數。
  • 後續同第一個訓練作業創建的項目。

智能標註

---------------智能標註:數據準備,上傳到桶---------------

(查看我的CSDN資源頁面,資源標題名稱“訓練作業創建:貓狗識別.zip”)

注意:OBS桶名全局唯一,如果創建桶時桶名衝突,需要選擇其他桶名。

上傳剛剛下載的貓狗圖片,並新建一個輸出文件output 一個用於數據標註輸出的文件data_label_out

---------------智能標註:ModelArts 創建數據集,手工標註一些,剩餘點擊智能標註,後續觀察校正即可---------------

Notes:智能標註這個功能個人感覺並不好用。也可能是我沒用好。

智能標註作業完成後,我們需要人工仔細確認每張圖片的智能標註的結果。對標註正確的圖片進行接納;對標註錯誤的進行糾正。修改後,再次智能標註。依據之前處理智能標註結果的流程,處理第二次的智能標註作業。依次地,處理完所有。

訓練作業

(查看我的CSDN資源頁面,代碼"dog_and_cat_train.py"在資源標題名稱“訓練作業創建:貓狗識別.zip”,數據集因爲太大了,CSDN有限制,沒有上傳,感興趣的可以從其他來源搜索獲取。)

---------------數據(無需解壓)、代碼上傳到桶---------------

和之前步驟一樣,創建訓練作業

---------------訓練作業創建---------------

---------------查看訓練作業運行結果---------------

訓練作業頁面,點擊作業名稱,進入作業詳情界面。可以查看到訓練作業的詳情。

---------------創建可視化作業(TensorBoard)查看訓練過程---------------

查看lossaccuracy等參數的變化信息。

訓練詳情頁面右上側,點擊創建可視化作業按鈕(即,創建TensorBoard)。

 

TensorBoard可以直觀地顯示訓練過程中lossaccuracy等評估指標的變化曲線,爲開發者優化模型精度提供依據。

注意:TensorBoard使用完後需要及時關閉,否則會繼續扣費。

---------------訓練完成後,即可部署模型---------------

步驟1 . 需知---推理腳本customize_service.py 和模型配置文件config.json 導入模型文件model下。

customize_service.py 推理腳本中有兩個方法。_preprocess 預處理方法,在推理請求前調用,用於將API接口用戶原始請求數據轉換爲模型期望輸入數據_postprocess 後處理方法,在推理請求完成後調用,用於將模型輸出轉換爲API接口輸出。

config.json 模型部署配置信息,定義了AI引擎的類別,推理腳本需要的Python依賴等。

步驟2 .開始---導入模型。

點擊模型管理界面,然後點擊導入”按鈕。

命名模型,設置版本號,選擇元數據來源:從訓練中選擇。

注意,其他參數會自動加載;推理代碼:https://wt.wang-dogcat-recog.obs.myhwclouds.com/output/model/customize_service.py

步驟3 . 部署模型爲在線服務。

模型管理頁面, 找到之前導入的模型,點擊部署下拉框中的在線服務”。

同樣,命名部署的在線服務的名稱、模型來源等參數。

-模型部署成功如下。

步驟4 . 預測發起

注意:實驗完成後,爲了防止繼續扣費,需要把在線服務停止掉,在線服務停止後可以重新啓動。點擊停止按鈕即可:

Notebook使用:Yolo3物體檢測

(查看我的CSDN資源頁面,資源標題名稱“Notebook:Yolo3物體檢測.zip”)

具體操作步驟:

1. 登陸ModelArts控制檯 --> 開發環境 --> Notebook --> 創建. 

  • 名稱:notebook-obj-dect-yolo;參數:python3-公共資源池-GPU-雲硬盤EVS

----------------------------------Notebook創建------------------------------------------

---------------------------------Notebook 開發環境下編寫代碼---------------------------------------------

點擊‘new’, ’tensorflow-1.13.1’【和anaconda的jupyter notebook一樣操作新建】

經過上面代碼解壓的數據文件,如下。

觀察下載內容:coco是標註的訓練數據文件和一些圖片文件;model_data裏面是模型參數文件和coco數據的類別文件;yolo3裏面是模型源代碼;train.py是訓練代碼,test.jpg用於最後的預測。Font裏面不用在意。

-----------------------------代碼部分運行結果-------------------------------------------

yolo3 相關:

  1. https://mp.weixin.qq.com/s?src=11&timestamp=1587811364&ver=2300&signature=oqxbJ2QesbigUa47KfTIPiAGDvwhXjquIlY8qqP*jkjm9YNiqf9tvMTKfpgpN923utyKMPcxB6kFmCVBM0nkA8y-LcagvWxVqv22XwYKqP*Fn6CvNxXqyKi5mXxtTagf&new=1
  2. https://blog.csdn.net/qq_41375609/article/details/94737915
  3. https://blog.csdn.net/zziahgf/article/details/72819043

----------------------------------代碼文件已經上傳資源------------------------------------------

附註 : .ipynb內容

下面插入的代碼在華爲雲 ModelArts平臺的Notebook 下運行通過。 

# 數據和代碼下載,此處可不要,見CSDN資源文件。
from modelarts.session import Session
sess = Session()

if sess.region_name == 'cn-north-1':
    bucket_path="modelarts-labs/notebook/DL_object_detection_yolo/yolov3.tar.gz"
elif sess.region_name == 'cn-north-4':
    bucket_path="modelarts-labs-bj4/notebook/DL_object_detection_yolo/yolov3.tar.gz"
else:
    print("請更換地區到北京一或北京四")

sess.download_data(bucket_path=bucket_path, path="./yolov3.tar.gz")

# 解壓文件
!tar -xf ./yolov3.tar.gz

# 清理壓縮包
!rm -r ./yolov3.tar.gz

# ------------------------------------------------------
# 準備數據
# ----------------------------------------------------------
from train import get_classes, get_anchors
# 數據文件路徑
data_path = "./coco/coco_data"
# coco類型定義文件存儲位置
classes_path = './model_data/coco_classes.txt'
# coco數據anchor值文件存儲位置
anchors_path = './model_data/yolo_anchors.txt'
# coco數據標註信息文件存儲位置
annotation_path = './coco/coco_train.txt'
# 預訓練權重文件存儲位置
weights_path = "./model_data/yolo.h5"
# 模型文件存儲位置
save_path = "./result/models/"

classes = get_classes(classes_path)
anchors = get_anchors(anchors_path)
# 獲取類型數量和anchor數量變量
num_classes = len(classes)
num_anchors = len(anchors)

# ----------------------------------------------------------
# 讀取標註數據
import numpy as np

# 訓練集與驗證集劃分比例
val_split = 0.1
with open(annotation_path) as f:
    lines = f.readlines()
np.random.seed(10101)
np.random.shuffle(lines)
np.random.seed(None)
num_val = int(len(lines)*val_split)
num_train = len(lines) - num_val

# 數據讀取函數,構建數據生成器。每次讀取一個批次的數據至內存訓練,並做數據增強。
def data_generator(annotation_lines, batch_size, input_shape, data_path,anchors, num_classes):
    n = len(annotation_lines)
    i = 0
    while True:
        image_data = []
        box_data = []
        for b in range(batch_size):
            if i==0:
                np.random.shuffle(annotation_lines)
            image, box = get_random_data(annotation_lines[i], input_shape, data_path,random=True) # 隨機挑選一個批次的數據
            image_data.append(image)
            box_data.append(box)
            i = (i+1) % n
        image_data = np.array(image_data)
        box_data = np.array(box_data)
        y_true = preprocess_true_boxes(box_data, input_shape, anchors, num_classes) # 對標註框預處理,過濾異常標註框
        yield [image_data, *y_true], np.zeros(batch_size)

def data_generator_wrapper(annotation_lines, batch_size, input_shape, data_path,anchors, num_classes):
    n = len(annotation_lines)
    if n==0 or batch_size<=0: return None
    return data_generator(annotation_lines, batch_size, input_shape, data_path,anchors, num_classes)


# ----------------------------------------------------------
# 模型訓練:本案例使用Keras深度學習框架搭建YOLOv3神經網絡。
import keras.backend as K
from yolo3.model import preprocess_true_boxes, yolo_body, yolo_loss
from keras.layers import Input, Lambda
from keras.models import Model
# 初始化session
K.clear_session()


# ----------------------------------------------------------
# 構建神經網絡,可以在./yolo3/model.py文件中查看細節
#
# 圖像輸入尺寸
input_shape = (416, 416)
image_input = Input(shape=(None, None, 3))
h, w = input_shape
# 設置多尺度檢測的下采樣尺寸
y_true = [Input(shape=(h//{0:32, 1:16, 2:8}[l], w//{0:32, 1:16, 2:8}[l], num_anchors//3, num_classes+5)) 
          for l in range(3)]

# ----------------------------------------------------------
# 構建YOLO模型結構
# ----------------------------------------------------------
model_body = yolo_body(image_input, num_anchors//3, num_classes)

# 將YOLO權重文件加載進來,如果希望不加載預訓練權重,從頭開始訓練的話,可以刪除這句代碼
model_body.load_weights(weights_path, by_name=True, skip_mismatch=True)

# 定義YOLO損失函數
model_loss = Lambda(yolo_loss, output_shape=(1,), name='yolo_loss',
    arguments={'anchors': anchors, 'num_classes': num_classes, 'ignore_thresh': 0.5})([*model_body.output, *y_true])

# 構建Model,爲訓練做準備
model = Model([model_body.input, *y_true], model_loss)

# 
# 打印模型各層結構
#
model.summary()

# -----------------------------------------------------------------
# 訓練回調函數定義
# ----------------------------------------------------------
from keras.callbacks import ReduceLROnPlateau, EarlyStopping

# 定義回調方法
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=3, verbose=1) # 學習率衰減策略
early_stopping = EarlyStopping(monitor='val_loss', min_delta=0, patience=10, verbose=1) # 早停策略

# -----------------------------------------------------------------
# 開始訓練
# ----------------------------------------------------------
from keras.optimizers import Adam
from yolo3.utils import get_random_data 

# 設置所有的層可訓練
for i in range(len(model.layers)):
    model.layers[i].trainable = True
    
# 選擇Adam優化器,設置學習率
learning_rate = 1e-4
model.compile(optimizer=Adam(lr=learning_rate), loss={'yolo_loss': lambda y_true, y_pred: y_pred}) 

# 設置批大小和訓練輪數
batch_size = 16
max_epochs = 2
print('Train on {} samples, val on {} samples, with batch size {}.'.format(num_train, num_val, batch_size))
# 開始訓練
model.fit_generator(data_generator_wrapper(lines[:num_train], batch_size, input_shape, data_path,anchors, num_classes),
    steps_per_epoch=max(1, num_train//batch_size),
    validation_data=data_generator_wrapper(lines[num_train:], batch_size, input_shape, data_path,anchors, num_classes),
    validation_steps=max(1, num_val//batch_size),
    epochs=max_epochs,
    initial_epoch=0,
    callbacks=[reduce_lr, early_stopping])

# ---------------------------------------------------------------
import os
os.makedirs(save_path)
# 保存模型
model.save_weights(os.path.join(save_path, 'trained_weights_final.h5'))

# ------------------------------------------------------------------
# 模型測試
# ------------------------------------------------------------------
from PIL import Image
import numpy as np
# 測試文件路徑
test_file_path = './test.jpg'
# 打開測試文件
image = Image.open(test_file_path)
image_ori = np.array(image)
image_ori.shape

# -圖片預處理-
from yolo3.utils import letterbox_image

new_image_size = (image.width - (image.width % 32), image.height - (image.height % 32))
boxed_image = letterbox_image(image, new_image_size)
image_data = np.array(boxed_image, dtype='float32')
image_data /= 255.
image_data = np.expand_dims(image_data, 0)
image_data.shape


import keras.backend as K
sess = K.get_session()

# ----------------------------------------------------------
# 構建模型
# ----------------------------------------------------------
from yolo3.model import yolo_body
from keras.layers import Input
# coco數據anchor值文件存儲位置
anchor_path = "./model_data/yolo_anchors.txt"
with open(anchor_path) as f:
    anchors = f.readline()
anchors = [float(x) for x in anchors.split(',')]
anchors = np.array(anchors).reshape(-1, 2)
yolo_model = yolo_body(Input(shape=(None,None,3)), len(anchors)//3, num_classes)


# 模型權重存儲路徑,加載權重
weights_path = "./model_data/yolo.h5"
yolo_model.load_weights(weights_path)

# 定義IOU以及score:
# IOU: 將交併比大於IOU的邊界框作爲冗餘框去除
# score:將預測分數大於score的邊界框篩選出來
iou = 0.45
score = 0.8

# ----------------------------------------------------------
# 構建輸出 [boxes, scores, classes]
# ----------------------------------------------------------
from yolo3.model import yolo_eval
input_image_shape = K.placeholder(shape=(2, ))
boxes, scores, classes = yolo_eval(
    yolo_model.output, 
    anchors,
    num_classes,
    input_image_shape,
    score_threshold=score, 
    iou_threshold=iou)

# ----------------------------------------------------------
# 進行預測
# ----------------------------------------------------------
out_boxes, out_scores, out_classes = sess.run(
    [boxes, scores, classes],
    feed_dict={
        yolo_model.input: image_data,
        input_image_shape: [image.size[1], image.size[0]],
        K.learning_phase(): 0
    })


class_coco = get_classes(classes_path)
out_coco = []
for i in out_classes:
    out_coco.append(class_coco[i])


print(out_boxes)
print(out_scores)
print(out_coco)

# ----------------------------------------------------------
# 將預測結果繪製在圖片上
# ----------------------------------------------------------
from PIL import Image, ImageFont, ImageDraw

font = ImageFont.truetype(font='font/FiraMono-Medium.otf',
                    size=np.floor(3e-2 * image.size[1] + 0.5).astype('int32'))

thickness = (image.size[0] + image.size[1]) // 300

for i, c in reversed(list(enumerate(out_coco))):
    predicted_class = c
    box = out_boxes[i]
    score = out_scores[i]

    label = '{} {:.2f}'.format(predicted_class, score)
    draw = ImageDraw.Draw(image)
    label_size = draw.textsize(label, font)

    top, left, bottom, right = box
    top = max(0, np.floor(top + 0.5).astype('int32'))
    left = max(0, np.floor(left + 0.5).astype('int32'))
    bottom = min(image.size[1], np.floor(bottom + 0.5).astype('int32'))
    right = min(image.size[0], np.floor(right + 0.5).astype('int32'))
    print(label, (left, top), (right, bottom))

    if top - label_size[1] >= 0:
        text_origin = np.array([left, top - label_size[1]])
    else:
        text_origin = np.array([left, top + 1])

    for i in range(thickness):
        draw.rectangle(
            [left + i, top + i, right - i, bottom - i],
            outline=225)
    draw.rectangle(
        [tuple(text_origin), tuple(text_origin + label_size)],
        fill=225)
    draw.text(text_origin, label, fill=(0, 0, 0), font=font)
    del draw

image

 

  • 備註1:本文相關數據在CSDN資源,歡迎查看。
  • 備註2:本次華爲雲AI項目賽事相關項目沒有完全在本文寫完,因爲筆者認爲,基本流程都是相似的,具體還是要用項目練手,練手資源華爲雲官方都準備好了,見:https://github.com/IamWWT/ModelArts-Lab
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章