華為ModelArts-Lab拓展試驗記錄(二) 華為ModelArts-Lab拓展試驗記錄(二)

      網友投稿 844 2025-03-31

      華為ModelArts-Lab拓展試驗記錄(二)


      在2019年7月至2019年12月期間,參加了華為云ModelArt訓練營活動,在ModelArt平臺上,做了一些AI實驗,現在整理一下資料,把我主要做的幾個拓展實驗內容做了記錄,方便以后查閱,且分享給那些對使用華為云ModelArt開發有興趣的朋友。第二個拓展實驗就是訓練營第五期內容的拓展,關于物體檢測的Faster R-CNN算法的使用mAP評價指標。

      1、概述

      本次拓展實驗內容為對Faster R-CNN算法模型使用mAP評價指標進行衡量,在第五期的notebook案例中,并沒有對物體檢測模型的精度進行評估,物體檢測模型的精度使用mAP評價指標進行衡量。要求在notebook案例中,開發代碼,計算出模型的mAP。

      和以前一樣,從最基本概念入手,由淺入深,介紹本次實驗的過程及其內容,并且對實驗代碼做解析。

      1.1、Faster RCNN簡介

      機器視覺領域的核心問題之一就是目標檢測(Object Detection),它的任務是找出圖像當中所有感興趣的目標(物體),確定其位置和大小。Faster RCNN是由Ross Girshick由何凱明等人在2016年將其用于目標檢測任務中,能夠完成高效的與傳統的RCNN相比,利用RPN(Region Proposal Networks)完成候選框的選擇。其發展歷程是:R-CNN——Fast R-CNN——Faster? R-CNN——Mask R-CNN,都是將神經網絡應用于目標檢測的典型代表,Faster? R-CNN具有性能較好,速度較快的優點。

      Faster? R-CNN是在R-CNN,Fast R-CNN基礎之上發展而來,原理圖如下:

      算法步驟

      1.Conv layers:首先使用一組基礎conv+relu+pooling層提取image的feture map。接層。

      2.Region Proposal Networks:RPN網絡用于生成region proposcals.該層通過softmax判斷anchors屬于foreground或者background,再利用box regression修正anchors獲得精確的propocals

      3.Roi Pooling:該層收集輸入的feature map 和 proposcal,綜合這些信息提取proposal feature map,送入后續的全連接層判定目標類別。

      4.Classification。利用proposal feature map計算proposcal類別,同時再次bounding box regression獲得檢驗框的最終精確地位置。

      具體細節這里就不闡述了,以上幾個步驟,在這次實驗中都有涉及。

      1.2、mAP評價指標

      Mean Average Precision(MAP):平均精度均值。P(Precision)精度,正確率。定義為: precision=返回結果中相關文檔的數目/返回結果的數目。 Rec(Recall)召回率:定義為:Recall=返回結果中相關文檔的數目/所有相關文檔的數目。 數學公式理解:

      1)True Positive(真正,TP):將正類預測為正類數;2)True Negative(真負,TN):將負類預測為負類數;3)False Positive(假正,FP):將負類預測為正類數誤報 (Type I error);4)False Negative(假負,FN):將正類預測為負類數→漏報 (Type II error)。

      精確率(precision):P=TP/(TP+FP)(分類后的結果中正類的占比),召回率(recall):recall=TP/(TP+FN)(所有正例被分對的比例。

      華為ModelArts-Lab拓展試驗記錄(二) 華為ModelArts-Lab拓展試驗記錄(二)

      在圖像中,主要計算兩個指標:precision和recall。precision,recall都是選多少個樣本k的函數,如果我總共有1000個樣本,那么我就可以像這樣計算1000對P-R,并且把他們畫出來,這就是PR曲線:這里有一個趨勢,recall越高,precision越低。 平均精度AP(average precision):就是PR曲線下的面積,這里average,等于是對recall取平均。而mean average precision的mean,是對所有類別取平均(每一個類當做一次二分類任務)。現在的圖像分類論文基本都是用mAP作為標準。AP是把準確率在recall值為Recall = {0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1}時(總共11個rank水平上),求平均值。mAP是均精度均值:只是把每個類別的AP都算了一遍,再取平均值。

      AP是針對單個類別的,mAP是針對所有類別的。

      2、mAP檢測實驗

      根據本期實驗內容,結合mAP方式,在modelArt平臺上,先制定檢測流程,在實驗代碼中添加mAP檢測代碼,然后對實驗數據進行mAP檢測。

      2.1、定義檢測數據集

      首先,需要獲取測試數據,依然從VOC2007數據里面獲取,定義一個imdb(檢測數據),作為檢測mAP用。也是利用原來的實驗部分代碼的寫法構成。定義了加載函數 def combined_roidb(imdb_names),里面處理比較常規,選用數據集,對圖像進行了反轉處理。最后返回兩個數據:imdb 和 roidb。

      這里要用到一個python類:pascal_voc,它實際上是集成了imdb類的一個類,實現了各種功能,有興趣的話,可以看它的源代碼。首先要導入一個它的功能函數:

      from?datasets.factory?import?get_imdb

      為了計算mAP,需要修改數據集參數:

      imdb_name?=?"voc_2007_test"

      在訓練之前,我們先要定義好imdb數據,代碼如下:

      #定義加載數據集函數 def?combined_roidb(imdb_names): ???? ????def?get_roidb(imdb_name): ????????#?加載數據集 ????????imdb?=?get_imdb(imdb_name)?#記錄了數據集的路徑之類的信息,函數通過給數據集的名字返回了該數據集對應的類的對象。 ????????print('Loaded?dataset?`{:s}`?for?training'.format(imdb.name)) ????????#?使用ground?truth作為數據集策略 ????????#對每張影像名調用_load_pascal_annotation,即可以知道該函數讀取的是影像對應存儲目標的xml文件。最后返回了“boxes”,“gt_classes”等構成的字典。 ????????imdb.set_proposal_method(cfg.TRAIN.PROPOSAL_METHOD) ????????print('Set?proposal?method:?{:s}'.format(cfg.TRAIN.PROPOSAL_METHOD)) ????????#增加翻轉,對每張影像在上面進行了求最大處理,并記錄影像路徑還有影像高寬等信息在roidb中并返回,返回的roidb是一個長度與影像數一致的列表 ????????roidb?=?get_training_roidb(imdb)? ????????return?roidb ???? ????#對于每個數據集返回了帶有該數據集信息的imdb和包含每張影像感興趣區域信息的roidb(包括每張影像點目標和影像寬高等信息) ????roidbs?=?[get_roidb(s)?for?s?in?imdb_names.split('+')] ????roidb?=?roidbs[0]?#roidb包括數據集所有影像的影像路徑,所有影像對應的目標,以及寬高等信息。 ????if?len(roidbs)?>?1: ????????for?r?in?roidbs[1:]: ????????????roidb.extend(r) ????????tmp?=?get_imdb(imdb_names.split('+')[1]) ????????imdb?=?datasets.imdb.imdb(imdb_names,?tmp.classes) ????else: ????????imdb?=?get_imdb(imdb_names) ????return?imdb,?roidb

      在這里,這個部分主要還是提取VOC2007 的測試數據,作為檢測mAP用。也是利用原來的實驗部分代碼的寫法構成。

      定義了加載函數 def combined_roidb(imdb_names),里面處理比較常規,選用數據集,對圖像進行了反轉處理。最后返回兩個數據:imdb 和 roidb。

      imdb的定義方式:imdb = get_imdb(imdb_name),它是一個基于pascal_voc.py 的類的實例對象,imdb這里的數據集獲取的同時,還做了數據的初始化,get_imdb(imdb_name)將會返回的就是pascal_voc(split, year)這樣一個對象。它們關系:get_imdb->factory->pascal_voc->(繼承)imdb。

      最后,不要忘記imdb, roidb = combined_roidb(imdb_name),這行代碼是加載測試集數據。

      2.2、定義神經網絡

      在測試計算時,還是需要建立神經網絡,用來檢測數據。這里還是根據案例情況,這里還是選擇Vgg16網絡,并且加載我們生成的訓練模型,并且配置正確的參數。

      from?nets.vgg16?import?vgg16 ??net?=?vgg16()

      這里需要定義一下anchor的參數,主要是定義了anchor的尺寸,這里設置anchor_scales = [8, 16, 32]。對base anchor的寬高分別乘以尺寸,從而得到各個不同尺寸的anchor。

      'ANCHOR_SCALES':?[8,?16,?32],

      接著做以下的工作:

      1)net.create_architecture,構建faster rcnn進行計算圖的操作。這里要注意,modelart環境中的參數和其它場景略有差異,是不需要傳sess這個參數的(這個坑了我好久)。這里的參數中,參數ANCHOR_SCALES必須,參數ANCHOR_RATIOS可以省略,其它都按常規傳。

      net.create_architecture(imdb.num_classes,tag='default',anchor_scales=cfg.ANCHOR_SCALES)

      2)加載權重文件,net.load_state_dict方法,主要是加載的文件位于"./models/vgg16-voc0712/vgg16_faster_rcnn_iter_110000.pth",這個就是訓練模型文件。

      net.load_state_dict(torch.load(saved_model,?map_location=lambda?storage,?loc:?storage))???? ????net.eval()

      3)選擇計算設施:net.to(net._device)。

      2.3、圖像檢測和提取

      這個是mAP計算的核心功能,主要是形成可以被計算mAP的圖像文件。以下分三個步驟:

      步驟一、定義目標圖像框容器

      根據每一類文件,每一張圖片,都定義個容器,就是定義一個數據集存儲單元。代碼為:

      all_boxes?=?[[[]?for?_?in?range(num_images)] ?for?_?in?range(imdb.num_classes)]

      這里的只有存儲單元,里面都空值。

      步驟二、分類圖像數據組織和填充,這里首先根據圖像分類,按照類別對檢測數據進行處理。前期處理:

      from?model.test?import?im_detect ??im?=?cv2.imread(imdb.image_path_at(i)) ??scores,?boxes?=?im_detect(?net,?im)

      作用是返回這張圖片中的多個目標和分數,存放在boxes和scores中。

      主要處理:先獲取上述過程中的為每一個圖像分配的存儲單元的尺寸數據,和圖像數據集的數據,檢測后,將數據進行填充。這里代碼主要是:

      inds?=?np.where(scores[:,?j]?>?thresh)[0] ?cls_scores?=?scores[inds,?j] ?cls_boxes?=?boxes[inds,?j*4:(j+1)*4] ?cls_dets?=?np.hstack((cls_boxes,?cls_scores[:,?np.newaxis]))?\ ?????.astype(np.float32,?copy=False) ?keep?=?nms(torch.from_numpy(cls_boxes),?torch.from_numpy(cls_scores),?NMS_THRESH) ?cls_dets?=?cls_dets[keep,?:] ?all_boxes?[j][i]?=?cls_dets

      以上步驟完成后,all_boxes 里面已經有了數據。需要注意,這里的計算時間略長,大概要幾分鐘時間,需要等待。

      步驟三、我們要把all_boxes的數據寫入文件,這里調用imdb的函數:

      imdb._write_voc_results_file(all_boxes)

      write_voc_results_file 函數可以在pascal_voc.py的源代碼中找到,完成之后,我們打開目錄,/data/VOCdevkit2007/result/VOC2007/Main/下面目錄,可以看到,每一類文件都做了單獨存儲,這里要注意,因為是modelart環境,每次產生文件名,里面有個計算機ID代碼,每次啟動,不一定是一樣的。

      2.4、計算AP和mAP

      這里有兩種方式,便捷的方式就是直接調用imdb.evaluate_detections(all_boxes, output_dir),可以忽略一些細節,使用默認設置,直接給出mAP。

      第二種方式,我這里的做法是自己寫了個文件voc_eval.py,提供voc_eval的函數供調用,這樣更加靈活,也能更加符合我進行實驗的目的,可以獲得更加豐富的數據。voc_eval函數:

      def?voc_eval(detpath, ????????annopath, ????????imagesetfile, ????????classname, ????????cachedir, ????????ovthresh=0.5, ????????use_07_metric=False, ????????use_diff=False):

      關鍵理如下:

      1)讀取文件數據,存入數據字典,這里的文件就是上述保存的文件位置,代碼如下:

      recs?=?{}#生成一個字典 ??for?i,?imagename?in?enumerate(imagenames):?#對于每一張圖像進行循環 ????recs[imagename]?=?parse_rec(annopath.format(imagename))#在字典里面放入每個圖像緩存的標簽路徑 ????if?i?%?100?==?0:#在這里輸出標簽讀取進度。 ????????print('Reading?annotation?for?{:d}/{:d}'.format(i?+?1,?len(imagenames)))#從這里可以看出來imagenames是什么,是一個測試集合的名字列表,這個Print輸出進度。#?save ??print('Saving?cached?annotations?to?{:s}'.format(cachefile))#讀取的標簽保存到一個文件里面 ??with?open(cachefile,?'wb+')?as?f:#打開緩存文件 ??pickle.dump(recs,?f)#dump是序列化保存,load是反序列化解析

      2)從以下代碼開始就是具體計算了:

      nd?=?len(image_ids)?#統計檢測出來的目標數量? ??tp?=?np.zeros(nd)#tp?=?true?positive?就是檢測結果中檢測對的-檢測是A類,結果是A類?? ??fp?=?np.zeros(nd)#fp?=?false?positive?檢測結果中檢測錯的-檢測是A類,結果gt是B類。 ??if?BB.shape[0]?>?0:#。shape是numpy里面的函數,用于計算矩陣的行數shape[0]和列數shape[1]

      最后,每一類數據都會返回三個值:

      rec: 召回率

      prec:精確度

      ap:平均精度

      最后得出mAP:0.7020。

      人工智能 AI

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

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

      上一篇:dede:list及dede:arclist 按權重排序的方法
      下一篇:建筑工地管理系統是什么意思?
      相關文章
      在线综合亚洲中文精品| 亚洲乱码国产乱码精品精| 国产成人精品亚洲| 亚洲一级二级三级不卡| 亚洲爆乳无码精品AAA片蜜桃| 亚洲AV美女一区二区三区| 亚洲色大成网站WWW久久九九| 亚洲区小说区图片区| 亚洲国产成人久久综合一区77 | 久久久久亚洲精品美女| 另类专区另类专区亚洲| 国产亚洲日韩在线a不卡| 精品亚洲福利一区二区| 亚洲精品天堂成人片?V在线播放| 国产精品亚洲专区一区| 亚洲黄黄黄网站在线观看| 亚洲精品9999久久久久无码| 亚洲AV无码国产一区二区三区| 午夜亚洲国产理论片二级港台二级| 亚洲精品乱码久久久久久蜜桃图片| 亚洲av成本人无码网站| 国产成人精品亚洲| 亚洲日本韩国在线| 亚洲精品无码av人在线观看 | 国外亚洲成AV人片在线观看| 亚洲男人在线无码视频| 亚洲无线码在线一区观看| 亚洲国产精品无码久久一区二区 | 亚洲AV无码一区二区大桥未久| 一本久久综合亚洲鲁鲁五月天| 亚洲免费在线观看| 亚洲VA中文字幕无码毛片| 91亚洲国产在人线播放午夜 | 亚洲AV成人噜噜无码网站| 亚洲熟妇无码AV| 午夜在线亚洲男人午在线| 国产成人精品日本亚洲专区61| 亚洲成AV人片在线观看| 亚洲第一页在线观看| 国产亚洲精品成人AA片| 婷婷亚洲天堂影院|