【華為云-上云之路】【2020華為云AI實戰營】【每天進步一點點】基于ModelArts 實現人臉識別(MXNET)

      網友投稿 675 2025-03-31

      什么是ModelArts? 來看看介紹

      這里我們用到的就是ModelArts中的NoteBook,也用到了OBS桶。正好在ModelArts上做了一個人臉識別的云端實驗,在這里分享一下執行過程,下面開始吧。

      1. 創建NoteBook

      選擇左側欄,點擊“開發環境”-> “Notebook”->“創建”,如下圖所示:

      進入Notebook創建頁面。參數:

      ① 計費方式:按需計費

      ② 名稱:任意,如face_recognition

      ③ 自動停止:關閉

      ④ 工作環境:Python3

      ⑤ 資源池:公共資源池

      ⑥ 類型:GPU

      ⑦ 規格:GPU: 1*v100NV32 CPU: 8 核 64GiB

      ⑧ 存儲配置:云硬盤⑧ 磁盤規格:默認

      參數填寫完畢后,點擊“下一步”,查看Notebook實例預覽信息,確認無誤后點擊“提交”。創建任務提交成功,點擊頁面的“返回Notebook列表”,返回Notebook列表頁,等待Notebook創建成功,創建成功后狀態會變成“運行中”,如下圖所示:

      2. 創建Notebook Python開發環境

      點擊“打開”按鈕進入Notebook。點擊“New” ->”MXNet 1.2.1”創建 Notebook Python開發環境。如下圖所示:

      重命名剛剛創建的Notebook Python開發環境。點擊“Untitled”,我們可以填寫一個跟本實驗相關的名稱,然后點擊“Rename”按鈕,如下圖所示:

      我們打印一行字符串,按Shift+Enter(該組合鍵是Notebook中執行代碼的快捷鍵)或者點擊下圖“Run”。

      print("hello?notebook!")

      查看代碼執行結果。如下圖所示:

      3.?準備源代碼和數據

      相關資源已經保存在OBS中,通過ModelArts SDK將資源下載,并解壓到當前目錄下。解壓后,當前目錄包含src和data兩個目錄,分別存有源代碼和數據集(可進入Notebook查看)。代碼如下:

      from?modelarts.session?import?Session session?=?Session() if?session.region_name=='cn-north-4': ????session.download_data(bucket_path='ai-course-common-20-bj4/face_recognition/face_recognition.tar', ????path='./face_recognition.tar') else: ????session.download_data(bucket_path='ai-course-common-20/face_recognition/face_recognition.tar', ????path='./face_recognition.tar') #?使用tar命令解壓資源包 !tar?xf?./face_recognition.tar

      日志如下:

      Successfully download file ai-course-common-20-bj4/face_recognition/face_recognition.tar from OBS to local ./face_recognition.tar

      如下圖所示:

      執行成功,回到ModelArts“Notebook”列表即可看到資源,后面步驟生成的文件及文件夾同樣可以這樣查看,如下圖所示:

      4. 創建OBS桶

      鼠標移動到云桌面瀏覽器頁面中左側菜單欄,點擊“服務列表”-> 選擇“存儲”的“對象存儲服務”,進入后右上角點擊“創建桶”。

      參數:

      ① 區域:華北-北京四

      ② 桶名稱:自定義即可(需要記住此名稱以備后續步驟使用)

      ③ 存儲類別:標準存儲

      ④ 桶策略:私有

      ⑤ 歸檔數據直讀:關閉

      ⑥ 多AZ:關閉

      點擊右下角“立即創建”,如下圖所示:

      5. 配置信息

      將運行結果上傳至OBS中,設置相關的參數(使用自己真實的桶名替換掉*號):

      ? BUCKET_NAME:自己的OBS桶名。

      切換至前面創建的Notebook Python開發環境界面,將下方代碼拷貝粘貼并替換桶名稱后,執行“run”,此段代碼無輸出。

      BUCKET_NAME?=?'*' UNIQUE_ID?=?'face-data' OBS_BASE_PATH?=?BUCKET_NAME?+?'/'?+?UNIQUE_ID

      6. 導入基本信息

      執行以下代碼,導入使用的Python開發基本工具庫,代碼無輸出。

      MXNet框架是我們使用的AI編程框架;

      argparse庫用于解析外部輸入參數;

      src.face_resnet包含了人臉識別的卷積模型骨干。

      import?os import?mxnet?as?mx import?argparse from?src.face_resnet?import?get_symbol import?warnings warnings.filterwarnings('ignore') import?logginglogger?=?logging.getLogger() logger.setLevel(logging.INFO)

      訓練數據量和訓練的關系說明:

      per_batch_size:指在每個GPU上一次訓練一批數據的大小,調整這個值越大,表示一次訓練的數據量也就越大,這個公式代表了梯度更新的方法大小,

      m為batch_size大小,

      Var是指方差,顯然當batch_size越大,方差也就越大,而方差越大,也就表示數據越穩定,在深度學習中也就表示訓練得越穩定。

      結合上面講的學習率大小的調整,在顯存可承受范圍內,越大的batch_size使得學習更穩定情況下,學習率也可以隨著調整得更大。

      def?parse_args(): ????parser?=?argparse.ArgumentParser(description='Train?face?network') ????parser.add_argument('--data_dir',?default='data', ????????????????????????help='training?set?directory')#?訓練數據路徑 ????parser.add_argument('--train_url',?type=str,?default='ckpt', ????????????????????????help='train?path')#?訓練模型輸出路徑 ????parser.add_argument('--num_epoch',?type=int,?default=20, ????????????????????????help='training?epoch?size.')#?訓練epoch數量 ????parser.add_argument('--num_layers',?type=int,?default=18, ????????????????????????help='specify?network?layer,?18?50?100')#?使用的ResNet卷積層層數 ????parser.add_argument('--image_size',?default='112,112', ????????????????????????help='specify?input?image?height?and?width')#?輸入圖像的大小,高、寬 ????parser.add_argument('--lr',?type=float,?default=0.005, ????????????????????????help='start?learning?rate')#?訓練開始的學習率大小 ????parser.add_argument('--wd',?type=float,?default=0.0005, ????????????????????????help='weight?decay')#?權值衰減系數 ????parser.add_argument('--mom',?type=float,?default=0.9, ????????????????????????help='momentum')#?動量 ????parser.add_argument('--per_batch_size',?type=int,?default=8, ????????????????????????help='batch?size?in?each?context')#?每一個GPU的batch?size大小 ????parser.add_argument('--epoch_image_num',?type=int,?default=200, ????????????????????????help='image?size?in?one?epoch')#?訓練樣本大小 ????parser.add_argument('--train_file',?type=str,?default='celeb_train.rec', ????????????????????????help='train')#?訓練數據文件 ????parser.add_argument('--val_file',?type=str,?default='celeb_val.rec', ????????????????????????help='val')#?驗證集文件 ????parser.add_argument('--num_classes',?type=int,?default=5, ????????????????????????help='classes?number')#?分類數 ????parser.add_argument('--num_embed',?type=int,?default=8, ????????????????????????help='embedding?number')#?嵌入層神經元數量 ????parser.add_argument('--num_gpus',?type=int,?default=1, ????????????????????????help='GPUs?number')#?GPU數量 ????parser.add_argument('--save_frequency',?type=int,?default=1, ????????????????????????help='save?frequency')#?保存模型的頻率 ????parser.add_argument('--export_model',?type=bool,?default=False, ????????????????????????help='change?train?url?to?model,metric.json')#是否改變train?url結構 ???? ????args,?_?=?parser.parse_known_args() ????return?args args?=?parse_args()

      #?模型所在的環境,指cpu或者哪塊gpu ctx?=?[mx.gpu(x)?for?x?in?range(args.num_gpus)]?if?args.num_gpus>0?else?[mx.cpu()] print(ctx)

      設置超參,就是在訓練前需要人工指定的參數。設置訓練需要的超參:

      設置模型訓練的設備環境;

      【華為云-上云之路】【2020華為云AI實戰營】【每天進步一點點】基于ModelArts 實現人臉識別(MXNET)

      設置訓練時的batch size,固定圖像大小的信息,和梯度歸一化等參數;

      設置優化器參數;

      設置訓練時的回調函數;

      設置模型參數初始化方法

      #?一次訓練輸入的batch?size大小的數據 batch_size?=?int(args.per_batch_size?*?(args.num_gpus?if?args.num_gpus>0?else?1)) print('batch?size:?',?batch_size) #?輸入圖像的高和寬 image_h,?image_w?=?[int(x)?for?x?in?args.image_size.split(',')] print('image?height:?',?image_h,?',?image?width:?',?image_w) #?梯度歸一化參數,大小為1.0?/?batch_size _rescale?=?1.0?/?batch_size print('rescale?grad:?',?_rescale)

      #?優化器參數,包含學習率調度器、權值衰減系數等 optimizer_params?=?{'learning_rate':?args.lr, ????????????????????'wd'?:?args.wd, ????????????????????'lr_scheduler':?None, ????????????????????'clip_gradient':?5, ????????????????????'momentum'?:?args.mom, ????????????????????'multi_precision'?:?True, ????????????????????'rescale_grad':?_rescale, ????????????????????} print(optimizer_params)

      #?每一個step訓練完后的操作 batch_end_callbacks?=?[mx.callback.Speedometer(batch_size,?10,?auto_reset=True)] #?每一個epoch訓練完后的操作 #?這里的模型保存路徑為模型輸出文件目錄下的model目錄,模型文件以face開頭 epoch_end_callbacks?=?mx.callback.do_checkpoint( ????os.path.join(args.train_url,'model/face'),?args.save_frequency) #?模型評估方法,準確度和交叉熵 eval_metrics?=?[mx.metric.Accuracy(),?mx.metric.CrossEntropy()]

      #?模型參數的初始化方法 initializer?=?mx.init.Xavier(rnd_type='gaussian',?factor_type="out",?magnitude=2)

      7. 讀取數據集,準備訓練

      人臉識別數據集使用的是明星人臉圖像集CelebFace,經過人臉3D對齊等操作制作成了適合分類模型訓練的數據,每張圖像的大小為112*112,樣本圖像如下:

      數據集格式為MXNet專用的rec格式,rec格式的數據集相比原圖讀取速度更快。使用MXNet自帶的mx.io.ImageRecordIter方法讀取rec格式數據集,mx.io.ImageRecordIter可以在讀取數據時就實現數據增強的方法,這里做了隨機翻轉、數據集重新洗牌等增強。拷貝執行如下代碼,這里定義數據加載器的對象,加載成功會打印輸出 “data loaded!”。

      #?訓練集和驗證集的rec文件路徑 path_imgrec?=?os.path.join(args.data_dir,?args.train_file) path_val_imgrec?=?os.path.join(args.data_dir,?args.val_file) #?使用mxnet自帶的mx.io.ImageRecordIter加載數據 val_dataiter?=?mx.io.ImageRecordIter( ????????path_imgrec=path_val_imgrec, ????????data_shape=(3,?image_h,?image_w), ????????batch_size=batch_size, ????????resize=image_w,?????????????????#?圖像按照其最短邊resize到定義好的寬長 ????????shuffle=False, ????????preprocess_threads=2) train_dataiter?=?mx.io.ImageRecordIter( ????????path_imgrec=path_imgrec, ????????data_shape=(3,?image_h,?image_w), ????????num_parts=1,????????????????????#?訓練的節點數 ????????part_index=0,???????????????????#?本機所在的節點id ????????batch_size=batch_size, ????????resize=image_w, ????????rand_crop=False, ????????rand_mirror=True,??????????????#?圖像隨機翻轉 ????????shuffle=True,??????????????????#?數據集隨機洗牌 ????????preprocess_threads=2) print('data?loaded!')

      import?matplotlib.pyplot?as?plt next_data_batch?=?next(iter(train_dataiter)) img?=?next_data_batch.data[0][0].transpose(axes=(2,1,0)) img?=?img.asnumpy().astype('uint8') #?畫圖,數據增強后的圖片 %matplotlib?inline fig?=?plt.figure() plt.imshow(img) plt.show()

      搭建網絡,人臉識別算法使用的模型骨干(backbone)為ResNet-50,基于ResNet-50模型構建人臉識別神經網絡。src目錄(打開的Notebook下可以查看)下的face_resnet.py源代碼文件加載模型骨干,并將其分類層作為嵌入層,分類數設置為嵌入層神經元數。在嵌入層后面接一個分類數為num_classes的分類層,就可以得到本實驗的人臉識別神經網絡了。拷貝執行如下代碼,這里會輸出一個 mx.mod.Module 對象。

      #?初始化模型參數為None,這里可以加載預訓練的模型參數 arg_params?=?None aux_params?=?None #?得到嵌入層模型的Symbol embedding?=?get_symbol(num_classes=args.num_embed,?num_layers=args.num_layers) #?設置分類層的權值 _weight?=?mx.symbol.Variable("fc7_weight", ?????????????????????????????shape=(args.num_classes,?args.num_embed), ?????????????????????????????lr_mult=1.0,?wd_mult=1.0) _bias?=?mx.symbol.Variable('fc7_bias',?lr_mult=2.0,?wd_mult=0.0) #?全連接層 fc7?=?mx.sym.FullyConnected(data=embedding,?weight?=?_weight, ????????????????????????????bias?=?_bias,?num_hidden=args.num_classes,?name='fc7') all_label?=?mx.symbol.Variable('softmax_label') softmax?=?mx.symbol.SoftmaxOutput(data=fc7,?label?=?all_label,?name='softmax') #?輸入模型環境和Symbol model?=?mx.mod.Module(context=ctx,?symbol=softmax) print(model)

      開始訓練

      model_output_dir?=?args.train_url?+?'/model/' if?os.path.exists(model_output_dir)?==?False: ????os.makedirs(model_output_dir) model.fit(train_dataiter, ??????????begin_epoch????????=?0, ??????????num_epoch??????????=?args.num_epoch, ??????????eval_data??????????=?val_dataiter, ??????????eval_metric????????=?eval_metrics, ??????????kvstore????????????=?'local', ??????????optimizer??????????=?'nag', ??????????optimizer_params???=?optimizer_params, ??????????initializer????????=?initializer, ??????????arg_params?????????=?arg_params, ??????????aux_params?????????=?aux_params, ??????????allow_missing??????=?True, ??????????batch_end_callback?=?batch_end_callbacks, ??????????epoch_end_callback?=?epoch_end_callbacks?)

      部分日志如下:

      8. 執行推理

      模型推理共分為以下幾個步驟:

      導入讀取圖片所需的庫;

      輸出測試的原圖;

      測試原圖轉換成模型需要的數據;

      加載推理使用的模型結構;

      推理計算并輸出結果。

      代碼如下:

      import?moxing?as?mox #?The?obs_dst_path?pattern:?{BUCKET_NAME}/{UNIQUE_ID}/face_recognition/results/{TRAIN_URL} obs_dst_path?=?"s3://"?+?OBS_BASE_PATH?+?"/face_recognition/results/"?+?args.train_url?+?'/' mox.file.copy_parallel(args.train_url+'/model', ??????????????????????obs_dst_path)

      import?mxnet.image?as?image import?moxing?as?mox import?mxnet?as?mx import?matplotlib.pyplot?as?plt import?os

      #?設置類別名,由于不能知道每張人臉的真實名字,用數字來替代 class_names?=?range(5) #?人臉圖像路徑,這里可以任意選擇一張人臉圖像,并上傳到自己的OBS路徑 #?如s3://ai-course-001/face_recognition/data/下的test.png file_name?=?args.data_dir?+?'/test.png' #?以二進制形式,將圖片讀入內存 img?=?mox.file.read(file_name,?binary=True) #?查看圖片 orig_img?=?mx.img.imdecode(img,?to_rgb=1).asnumpy().astype('uint8') plt.imshow(orig_img) plt.show()

      #?圖像處理 #?將圖像處理成(3,112,112)大小 [h,?w]?=?[112,?112] img_arr?=?mx.img.imdecode(img,?to_rgb=1) #?首先轉換成NDArray形式 img_arr?=?mx.img.resize_short(img_arr,?w,?0) #?翻轉,經過翻轉的圖像不能通過plt顯示 img_arr?=?mx.nd.transpose(img_arr,?(2,?0,?1)) img_arr?=?mx.nd.expand_dims(img_arr,?axis=0) #?將圖像綁定到cpu上 d?=?[img_arr.as_in_context(mx.cpu())] print(d)

      #?模型文件位置,比如由上面訓練得到的位置train_url+'model', #?這個路徑位置下面必須有.json和.params的模型文件 ckpt?=?os.path.join(args.train_url,?'model/face') #?加載第幾個epoch load_epoch?=?1 #?加載模型文件,sym為推理模型結構,arg_params,?aux_params為模型參數 sym,?arg_params,?aux_params?=?mx.model.load_checkpoint(ckpt,?load_epoch) #?選擇使用cpu進行推理,數據名默認為data,推理無需輸入label mx_model?=?mx.mod.Module(symbol=sym,?context=mx.cpu(), ??????????????????????????????????????data_names=['data'],?label_names=None) #?綁定模型計算模塊到底層計算引擎,綁定的數據大小默認為(1,3,112,112) mx_model.bind(for_training=False,?data_shapes=[('data',(1,3,112,112))]) #?設置模型的參數 mx_model.set_params(arg_params,?aux_params,?allow_missing=True)

      #?模型結果后處理方法 def?_postprocess(data): ????dim?=?len(data[0].shape) ????if?dim?>?2: ????????data?=?mx.nd.array(np.squeeze(data.asnumpy(),?axis=tuple(range(dim)[2:]))) ????#?將得到的結果排序,選擇可能性最大的類別 ????sorted_prob?=?mx.nd.argsort(data[0],?is_ascend=False) ????top_prob?=?list(map(lambda?x:?int(x.asscalar()),?sorted_prob[0:2])) ????#?輸出推理得到的類別和對應可能性 ????return?{"predicted_label":?class_names[top_prob[0]], ????????????"scores":?[[class_names[i],?float(data[0,?i].asscalar())]?for?i?in?top_prob]} #?進行前向推理 mx_model.forward(mx.io.DataBatch(d)) #?輸出 print(_postprocess(mx_model.get_outputs()[0]))

      最后得到輸出

      至此,基于ModelArts的MXNET框架的人臉識別完成了,包括訓練和推理,快來試試吧。最后附上完成代碼,在附件,下載解壓縮后,上傳face_recognition.ipynb到NoteBook中,逐步運行即可。

      附件: face_recognition.zip 71.65KB 下載次數:3次

      EI 人工智能 ModelArts 華為云ModelArts

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:WPS如何快速找到上次編輯的位置并開始繼續編輯
      下一篇:wps文字表格怎樣設置對齊
      相關文章
      亚洲国产精品尤物YW在线观看| 亚洲午夜无码久久久久小说| 亚洲人成人无码.www石榴| 亚洲欧洲日产国码久在线观看 | 久久亚洲AV成人无码国产电影| 亚洲另类春色国产精品| 亚洲s色大片在线观看| 国产精品亚洲精品日韩已方| 国产成人亚洲精品91专区高清 | 亚洲国产综合精品中文字幕| 五月天婷亚洲天综合网精品偷| 亚洲AV永久无码精品一福利| 亚洲中文无码永久免费| 亚洲一区中文字幕| 亚洲国产中文在线视频| 91亚洲国产成人久久精品| 亚洲第一网站免费视频| 亚洲丝袜美腿视频| 亚洲欧洲免费视频| 亚洲男女性高爱潮网站| 亚洲成aⅴ人片在线观| 亚洲精品一卡2卡3卡三卡四卡| 亚洲视频在线观看免费视频| 少妇中文字幕乱码亚洲影视| 老司机亚洲精品影院| 亚洲视频一区在线| 亚洲三级在线播放| 国产亚洲精品成人AA片| 亚洲欧洲av综合色无码| 亚洲AV无码专区亚洲AV桃| 国产亚洲一卡2卡3卡4卡新区| 国产亚洲综合视频| 亚洲一区日韩高清中文字幕亚洲| 丁香五月亚洲综合深深爱| 亚洲精品无码av人在线观看 | 久久久久噜噜噜亚洲熟女综合| 国产综合精品久久亚洲| 亚洲国产三级在线观看| 亚洲人成网站影音先锋播放| 亚洲日本国产乱码va在线观看| 亚洲资源最新版在线观看|