YOLOv5學(xué)習(xí)(二):數(shù)據(jù)集加載

數(shù)據(jù)加載

yolov5的數(shù)據(jù)加載部分由create_dataloader函數(shù)實(shí)現(xiàn)(位于utils/datasets.py)醉鳖,其中關(guān)于數(shù)據(jù)增強(qiáng)和加載的部分主要由LoadImagesAndLabels和InfiniteDataLoader負(fù)責(zé)近忙,并基于torch_distributed_zero_first(rank)進(jìn)行不同進(jìn)程之間的數(shù)據(jù)同步纹笼。

數(shù)據(jù)同步

在yolov5的模型訓(xùn)練中涉及了多進(jìn)程并行運(yùn)算滔吠。其中,主進(jìn)程實(shí)現(xiàn)數(shù)據(jù)的預(yù)讀取并緩存盅惜,然后其它子進(jìn)程則從緩存中讀取數(shù)據(jù)并進(jìn)行一系列運(yùn)算糙捺。為了完成數(shù)據(jù)的正常同步,yolov5中基于torch.distributed.barrier()函數(shù)實(shí)現(xiàn)了上下文管理器torch_distributed_zero_first:

@contextmanager
def torch_distributed_zero_first(local_rank: int):
    """
    Decorator to make all processes in distributed training wait for each local_master to do something.
    """
    if local_rank not in [-1, 0]:
        torch.distributed.barrier()
    yield
    if local_rank == 0:
        torch.distributed.barrier()

torch_distributed_zero_first使用方式:

with torch_distributed_zero_first(rank):
     dataset = LoadImagesAndLabels(......)

rank表示當(dāng)前的進(jìn)程號(hào)候味,主進(jìn)程由編號(hào)0表示刃唤,子進(jìn)程則由編號(hào)1、2白群、3...等表示尚胞。上述代碼的運(yùn)行邏輯:

  1. 進(jìn)入torch_distributed_zero_first(rank)上下文作用域;
  2. 判斷當(dāng)前進(jìn)程號(hào)local_rank是否為-1或0帜慢,如果不是則說(shuō)明為子進(jìn)程笼裳,運(yùn)行torch.distributed.barrier()等待主進(jìn)程的數(shù)據(jù)處理完畢,如果是則當(dāng)前為主進(jìn)程崖堤,不需要等待侍咱;
  3. yield后,運(yùn)行with作用域范圍內(nèi)的代碼密幔;
  4. 作用域范圍內(nèi)代碼運(yùn)行完成后楔脯,繼續(xù)yield的后續(xù)操作,判斷當(dāng)前進(jìn)程號(hào)是否為0(即是否為主進(jìn)程)胯甩,如果是昧廷,則運(yùn)行torch.distributed.barrier()可以解開其它子進(jìn)程的阻塞。

注意 對(duì)于torch.distributed.barrier()函數(shù)的作用可以參考https://stackoverflow.com/questions/59760328/how-does-torch-distributed-barrier-work進(jìn)行理解偎箫。

數(shù)據(jù)增強(qiáng)

數(shù)據(jù)增強(qiáng)相關(guān)的方法在LoadImagesAndLabels類中實(shí)現(xiàn)木柬。

Rectangular Training

通常YOLO系列網(wǎng)絡(luò)的輸入都是預(yù)處理后的方形圖像數(shù)據(jù),如416 * 416淹办、608 * 608眉枕。當(dāng)原始圖像為矩形時(shí),會(huì)將其填充為方形(如下圖:方形輸入),但是填充的灰色區(qū)域其實(shí)就是冗余信息速挑,不論是在訓(xùn)練還是推理階段谤牡,這些冗余信息都會(huì)增加耗時(shí)。

方形輸入

為了減少圖像的冗余數(shù)據(jù)姥宝,輸入圖像由方形改為矩形(如下圖:矩形輸入):將長(zhǎng)邊resize為固定尺寸(如416)翅萤,短邊按同樣比例resize,然后把短邊的尺寸盡量少地填充為32的倍數(shù)腊满。

矩形輸入

這種方法在推理階段稱為矩形推理(Rectangular Inference)套么,在訓(xùn)練階段則稱為矩形訓(xùn)練(Rectangular Training)。推理階段直接對(duì)圖像進(jìn)行resize和pad就行碳蛋,但是訓(xùn)練階段輸入的是一個(gè)批次的圖像集合胚泌,需要保持批次內(nèi)的圖像尺寸一致,因此處理邏輯相對(duì)復(fù)雜一些疮蹦。

代碼:

        if self.rect:
            # Sort by aspect ratio
            # 首先根據(jù)高寬比排序诸迟,就可以保證每個(gè)batch內(nèi)的圖像高寬比相近。
            s = self.shapes  # wh
            ar = s[:, 1] / s[:, 0]  # aspect ratio    高/寬
            irect = ar.argsort()
            self.img_files = [self.img_files[i] for i in irect]
            self.label_files = [self.label_files[i] for i in irect]
            self.labels = [self.labels[i] for i in irect]
            self.shapes = s[irect]  # wh
            ar = ar[irect]

            # Set training image shapes
            shapes = [[1, 1]] * nb    # hw
            for i in range(nb):
                ari = ar[bi == i]
                mini, maxi = ari.min(), ari.max()
                if maxi < 1:    # 高寬比最大值都小于1愕乎,則說(shuō)明batch內(nèi)的圖全都是高小于寬
                    shapes[i] = [maxi, 1]   # 設(shè)置寬為固定比例1阵苇,高的比例為maxi
                elif mini > 1:   # 高寬比最小值都大于1,說(shuō)明batch內(nèi)的圖都是高>寬
                    shapes[i] = [1, 1 / mini]    # 設(shè)置高為固定比例1感论,寬的比例為1 / mini

運(yùn)行邏輯:

  1. 根據(jù)數(shù)據(jù)集中所有圖像的shape計(jì)算高寬比ar绅项;
  2. 對(duì)長(zhǎng)寬比ar進(jìn)行argsort,即對(duì)ar內(nèi)的元素進(jìn)行排序(升序)比肄,并針對(duì)排序后的元素對(duì)應(yīng)取得其在ar中的索引快耿,構(gòu)成索引序列irect;
  3. 根據(jù)索引序列irect取得排序后的self.img_files芳绩、self.label_files掀亥、self.labels 、self.shapes和ar妥色;
  4. 初始化nb(即batch數(shù)量)個(gè)shape為[1,1]搪花,組成shapes;
  5. 從ar中對(duì)應(yīng)取出每個(gè)batch的高寬比列表ari嘹害,取其中的最大撮竿、最小值;
  6. 如果當(dāng)前batch的高寬比最大值小于1笔呀,則將shapes內(nèi)該batch對(duì)應(yīng)的值設(shè)為[maxi, 1]幢踏,而如果最大值<=1且最小值>1,則設(shè)置為[1, 1 / mini]许师,如果都不符合默認(rèn)[1,1]房蝉。

參考:https://github.com/ultralytics/yolov3/issues/232

Mosaic

未完待續(xù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末僚匆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子搭幻,更是在濱河造成了極大的恐慌白热,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粗卜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡纳击,警方通過(guò)查閱死者的電腦和手機(jī)续扔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)焕数,“玉大人纱昧,你說(shuō)我怎么就攤上這事”づ猓” “怎么了识脆?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)善已。 經(jīng)常有香客問(wèn)我灼捂,道長(zhǎng),這世上最難降的妖魔是什么换团? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任悉稠,我火速辦了婚禮,結(jié)果婚禮上艘包,老公的妹妹穿的比我還像新娘的猛。我一直安慰自己,他們只是感情好想虎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布卦尊。 她就那樣靜靜地躺著,像睡著了一般舌厨。 火紅的嫁衣襯著肌膚如雪岂却。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天邓线,我揣著相機(jī)與錄音淌友,去河邊找鬼。 笑死骇陈,一個(gè)胖子當(dāng)著我的面吹牛震庭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播你雌,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼器联,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼二汛!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起拨拓,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤肴颊,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后渣磷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婿着,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年醋界,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了竟宋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡形纺,死狀恐怖丘侠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逐样,我是刑警寧澤蜗字,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站脂新,受9級(jí)特大地震影響挪捕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜戏羽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一担神、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧始花,春花似錦妄讯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至浇垦,卻和暖如春炕置,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背男韧。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工朴摊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人此虑。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓甚纲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親朦前。 傳聞我的和親對(duì)象是個(gè)殘疾皇子介杆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348