<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          (附代碼)高級(jí)YoloV5指南,使用WBF來(lái)提升目標(biāo)檢測(cè)性能

          共 10480字,需瀏覽 21分鐘

           ·

          2021-05-31 20:35

          全網(wǎng)搜集目標(biāo)檢測(cè)文章,人工篩選最優(yōu)價(jià)值內(nèi)容

          編者薦語(yǔ)
          WBF算法首先將所有邊界框按照置信度分?jǐn)?shù)的遞減順序進(jìn)行排序;然后生成另一個(gè)可能的框“融合”(組合)列表,并嘗試檢查這些融合是否與原始框匹配;最后使用一個(gè)公式來(lái)調(diào)整坐標(biāo)和框列表中所有框的置信度分?jǐn)?shù)。
          轉(zhuǎn)載自 | AI公園
          作者 | Mostafa Ibrahim

          網(wǎng)上有大量的YoloV5教程,本文的目的不是復(fù)制內(nèi)容,而是對(duì)其進(jìn)行擴(kuò)展。我最近在做一個(gè)目標(biāo)檢測(cè)競(jìng)賽,雖然我發(fā)現(xiàn)了大量創(chuàng)建基線的教程,但我沒(méi)有找到任何關(guān)于如何擴(kuò)展它的建議。此外,我想強(qiáng)調(diào)一下YoloV5配置中影響性能的最重要部分,因?yàn)楫吘箶?shù)據(jù)科學(xué)主要是關(guān)于實(shí)驗(yàn)和超參數(shù)調(diào)整。

          在這之前,我想說(shuō)使用目標(biāo)檢測(cè)模型和使用圖像分類模型在框架和庫(kù)的工作方式上是不同的。這是我注意到的,我花了很長(zhǎng)時(shí)間才弄明白。大多數(shù)流行的目標(biāo)檢測(cè)模型(如YoloV5、EfficientDet)使用命令行接口來(lái)訓(xùn)練和評(píng)估,而不是使用編碼方法。這意味著,你所需要做的就是獲取特定格式的數(shù)據(jù)(COCO或VOC),并將命令指向它。這通常與使用代碼訓(xùn)練和評(píng)估模型的圖像分類模型不同。

          數(shù)據(jù)預(yù)處理

          YoloV5期望你有兩個(gè)目錄,一個(gè)用于訓(xùn)練,一個(gè)用于驗(yàn)證。在這兩個(gè)目錄中,你需要另外兩個(gè)目錄,“Images”和“Labels”。Images包含實(shí)際的圖像,每個(gè)圖像的標(biāo)簽都應(yīng)該有一個(gè)帶有該圖像標(biāo)注的.txt文件,文本文件應(yīng)該有與其對(duì)應(yīng)的圖像相同的名稱。

          標(biāo)注格式如下:

          <'class_id'> <'x_center'> <'y_center'> <width'> <'height'>

          要在代碼中做到這一點(diǎn),你可能需要一個(gè)類似的函數(shù),在原始數(shù)據(jù)幀中有圖像項(xiàng),它們的類id和它們的邊界框:

          def create_file(df, split_df, train_file, train_folder, fold):
              
              os.makedirs('labels/train/', exist_ok=True)
              os.makedirs('images/train/', exist_ok=True)
              os.makedirs('labels/val/', exist_ok=True)
              os.makedirs('images/val/', exist_ok=True)
              
              list_image_train = split_df[split_df[f'fold_{fold}']==0]['image_id']    
              train_df = df[df['image_id'].isin(list_image_train)].reset_index(drop=True)
              val_df = df[~df['image_id'].isin(list_image_train)].reset_index(drop=True)
              
              for train_img in tqdm(train_df.image_id.unique()):
                  with open('labels/train/{train_img}.txt''w+'as f:
                      row = train_df[train_df['image_id']==train_img]\
                      [['class_id''x_center''y_center''width''height']].values
                      row[:, 1:] /= SIZE # Image size, 512 here
                      row = row.astype('str')
                      for box in range(len(row)):
                          text = ' '.join(row[box])
                          f.write(text)
                          f.write('\n')
                  shutil.copy(f'{train_img}.png'
                          f'images/train/{train_img}.png')
                  
              for val_img in tqdm(val_df.image_id.unique()):
                  with open(f'{labels/val/{val_img}.txt''w+'as f:
                      row = val_df[val_df['image_id']==val_img]\
                      [['class_id''x_center''y_center''width''height']].values
                      row[:, 1:] /= SIZE
                      row = row.astype('str')
                      for box in range(len(row)):
                          text = ' '.join(row[box])
                          f.write(text)
                          f.write('\n')
                  shutil.copy(f'{val_img}.png'
                          f'images/val/{val_img}.png')

          注意:不要忘記保存在標(biāo)簽文本文件中的邊界框的坐標(biāo)**必須被歸一化(從0到1)。**這非常重要。另外,如果圖像有多個(gè)標(biāo)注,在文本文件中,每個(gè)標(biāo)注(預(yù)測(cè)+邊框)將在單獨(dú)的行上。

          在此之后,你需要一個(gè)配置文件,其中包含標(biāo)簽的名稱、類的數(shù)量以及訓(xùn)練和驗(yàn)證的路徑。

          import yaml

          classes = [ ‘Aortic enlargement’,
           ‘Atelectasis’,
           ‘Calcification’,
           ‘Cardiomegaly’,
           ‘Consolidation’,
           ‘ILD’,
           ‘Infiltration’,
           ‘Lung Opacity’,
           ‘Nodule/Mass’,
           ‘Other lesion’,
           ‘Pleural effusion’,
           ‘Pleural thickening’,
           ‘Pneumothorax’,
           ‘Pulmonary fibrosis’]

          data = dict(
           train = ‘../vinbigdata/images/train’, # training images path
           val = ‘../vinbigdata/images/val’, # validation images path
           nc = 14# number of classes
           names = classes
           )

          with open(‘./yolov5/vinbigdata.yaml’, ‘w’) as outfile:
           yaml.dump(data, outfile, default_flow_style=False)

          現(xiàn)在,你需要做的就是運(yùn)行這個(gè)命令:

          python train.py — img 640 — batch 16 — epochs 30 — data ./vinbigdata.yaml — cfg models/yolov5x.yaml — weights yolov5x.pt

          從經(jīng)驗(yàn)中需要注意的事情:

          好了,現(xiàn)在我們已經(jīng)瀏覽了基本知識(shí),讓我們來(lái)看看重要的東西:

          1. 別忘了歸一化坐標(biāo)。
          2. 如果你的初始性能比預(yù)期的差得多,那么最可能的原因(我在許多其他參賽者身上看到過(guò)這種情況)是你在預(yù)處理方面做錯(cuò)了什么。這看起來(lái)很瑣碎,但有很多細(xì)節(jié)你必須注意,特別是如果這是你的第一次。
          3. YoloV5有多種型號(hào)(yolov5s、yolov5m、yolov5l、yolov5x),不要只選擇最大的一個(gè),因?yàn)樗赡軙?huì)過(guò)擬合。從一個(gè)基線開始,比如中等大小的,然后試著改善它。
          4. 雖然我是在512尺寸的圖像上訓(xùn)練的,但我發(fā)現(xiàn)用640來(lái)infer可以提高性能。
          5. 不要忘記加載預(yù)訓(xùn)練的權(quán)重(-weights標(biāo)志)。遷移學(xué)習(xí)將大大提高你的性能,并將為你節(jié)省大量的訓(xùn)練時(shí)間(在我的例子中,大約50個(gè)epoch,每個(gè)epoch大約需要20分鐘!)
          6. Yolov5x需要大量的內(nèi)存,當(dāng)訓(xùn)練尺寸為512,批大小為4時(shí),它需要大約14GB的GPU內(nèi)存(大多數(shù)GPU大約8GB內(nèi)存)。
          7. YoloV5已經(jīng)使用了數(shù)據(jù)增強(qiáng),你可以選擇喜歡或不喜歡的增強(qiáng),你所需要做的就是使用yolov5/data/hyp.scratch.yml文件去調(diào)整。
          8. 默認(rèn)的yolov5訓(xùn)練腳本使用weights and biases,說(shuō)實(shí)話,這非常令人印象深刻,它在模型訓(xùn)練時(shí)保存所有度量。但是,如果你想關(guān)閉它,只需在訓(xùn)練腳本標(biāo)記中添加WANDB_MODE= " dryrun "即可。
          9. 我希望早就發(fā)現(xiàn)的一件事是,YoloV5將大量有用的指標(biāo)保存到目錄YoloV5 /runs/train/exp/中。訓(xùn)練之后,你可以找到“confusion_matrix.png”和“results.png”,其中的result .png應(yīng)該是這樣的:

          使用WBF預(yù)處理

          好了,現(xiàn)在你已經(jīng)調(diào)整了超參數(shù),升級(jí)了你的模型,測(cè)試了多種圖像大小和交叉驗(yàn)證?,F(xiàn)在是介紹一些提高性能的技巧的時(shí)候了。

          加權(quán)框融合是一種在訓(xùn)練前(清理數(shù)據(jù)集)或訓(xùn)練后(使預(yù)測(cè)更準(zhǔn)確)動(dòng)態(tài)融合框的方法。

          要使用它對(duì)數(shù)據(jù)集進(jìn)行預(yù)處理,這將大多數(shù)參賽者的性能提高了大約10-20%,你可以這樣使用:

          from ensemble_boxes import *

          for image_id in tqdm(df['image_id'], leave=False):
              image_df = df[df['image_id']==image_id].reset_index(drop=True)
              h, w = image_df.loc[0, ['height''width']].values
              boxes = image_df[['x_min''y_min''x_max''y_max']].values.tolist()
              
              # Normalise all the bounding boxes (by dividing them  by size-1
              boxes = [[j/(size-1for j in i] for i in boxes]
              scores = [1.0]*len(boxes) # set all of the scores to 1 since we only have 1 model here
              labels = [float(i) for i in image_df['class_id'].values]        
              boxes, scores, labels = weighted_boxes_fusion([boxes], [scores], [labels],weights=None,iou_thr=iou_thr,
                                                            skip_box_thr=skip_box_thr)

              list_image.extend([image_id]*len(boxes))
              list_h.extend([h]*len(boxes))
              list_w.extend([w]*len(boxes))
              list_boxes.extend(boxes)
              list_cls.extend(labels.tolist())
              
              # bring the bounding boxes back to their original size  (by multiplying by size - 1)    list_boxes = [[int(j*(size-1)) for j in i] for i in list_boxes]
              new_df['image_id'] = list_image
              new_df['class_id'] = list_cls
              new_df['h'] = list_h
              new_df['w'] = list_w
              
              # Unpack the coordinates from the  bounding boxes    
              new_df['x_min'], new_df['y_min'], \
              new_df['x_max'], new_df['y_max'] = np.transpose(list_boxes)

          這意味著要在將邊框坐標(biāo)保存到標(biāo)注文件之前完成。你還可以嘗試在用YoloV5以同樣的方式預(yù)測(cè)邊界框之后使用它。

          首先,在訓(xùn)練YoloV5之后,運(yùn)行:

          !python detect.py — weights /runs/train/exp/weights\
           — img 640\
           — conf 0.005\
           — iou 0.45\
           — source $test_dir\
           — save-txt — save-conf — exist-ok

          然后提取框、分?jǐn)?shù)和標(biāo)簽:

          runs/detect/exp/labels

          然后傳遞到:

          boxes, scores, labels = weighted_boxes_fusion([boxes], [scores], [labels],weights=None,iou_thr=iou_thr,
                                                        skip_box_thr=skip_box_thr)

          最后的思考

          我希望你已經(jīng)學(xué)到了一些關(guān)于擴(kuò)展你的基線YoloV5的知識(shí),我認(rèn)為最重要的事情總是要考慮的是遷移學(xué)習(xí),圖像增強(qiáng),模型復(fù)雜性,預(yù)處理和后處理技術(shù)。這些是你可以輕松控制和使用YoloV5來(lái)提高性能的大部分方面。


          英文原文:https://towardsdatascience.com/advanced-yolov5-tutorial-enhancing-yolov5-with-weighted-boxes-fusion-3bead5b71688


          ?------------------------------------------------

          雙一流大學(xué)研究生團(tuán)隊(duì)創(chuàng)建,一個(gè)專注于目標(biāo)檢測(cè)與深度學(xué)習(xí)的組織,希望可以將分享變成一種習(xí)慣。

           

          整理不易,點(diǎn)贊三連!

          瀏覽 224
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产一级特A片 | 91传媒在线观看网站 | 日本乱伦视频 | 免费黄色成人视频 | 亚洲精品国产AV |