用Python和OpenCV為對象檢測任務實現(xiàn)最流行、最高效的數(shù)據(jù)擴充
數(shù)據(jù)擴充是一種增加數(shù)據(jù)集多樣性的技術(shù),無需收集更多真實數(shù)據(jù),但仍有助于提高模型精度并防止模型過擬合。
在本文中,你將學習使用Python和OpenCV為對象檢測任務實現(xiàn)最流行、最高效的數(shù)據(jù)擴充過程。
即將引入的一組數(shù)據(jù)擴充方法包括:
1.隨機裁剪
2.Cutout
3.顏色抖動
4.增加噪音
5.過濾
首先,在繼續(xù)之前,讓我們導入幾個庫并準備一些必要的子例程。
import os
import cv2
import numpy as np
import random
def file_lines_to_list(path):
'''
### 在TXT文件里的行轉(zhuǎn)換為列表 ###
path: 文件路徑
'''
with open(path) as f:
content = f.readlines()
content = [(x.strip()).split() for x in content]
return content
def get_file_name(path):
'''
### 獲取Filepath的文件名 ###
path: 文件路徑
'''
basename = os.path.basename(path)
onlyname = os.path.splitext(basename)[0]
return onlyname
def write_anno_to_txt(boxes, filepath):
'''
### 給TXT文件寫注釋 ###
boxes: format [[obj x1 y1 x2 y2],...]
filepath: 文件路徑
'''
txt_file = open(filepath, "w")
for box in boxes:
print(box[0], int(box[1]), int(box[2]), int(box[3]), int(box[4]), file=txt_file)
txt_file.close()
下面的圖片是在這篇文章中使用的示例圖片。
隨機裁剪隨機裁剪隨機選擇一個區(qū)域并進行裁剪以生成新的數(shù)據(jù)樣本,裁剪后的區(qū)域應具有與原始圖像相同的寬高比,以保持對象的形狀。
從上圖中,左側(cè)圖像表示具有邊界框(紅色)的原始圖像,通過裁剪橙色框內(nèi)的區(qū)域創(chuàng)建一個新樣本作為右側(cè)圖像。在新示例的注釋中,將刪除與左側(cè)圖像中的橙色框不重疊的所有對象,并細化位于橙色框邊界上的對象的坐標,使其適合新圖像示例。原始圖像的隨機裁剪輸出為新裁剪圖像及其注釋。
Cutout
Terrance DeVries和Graham W.Taylor在2017年的論文中介紹了Cutout,它是一種簡單的正則化技術(shù),用于在訓練過程中隨機屏蔽輸入的方塊區(qū)域,可用于提高卷積神經(jīng)網(wǎng)絡(luò)的魯棒性和整體性能。
這種方法不僅非常容易實現(xiàn),而且還表明它可以與現(xiàn)有形式的數(shù)據(jù)擴充和其他正則化工具結(jié)合使用,以進一步提高模型性能。
如本文所述,剪切用于提高圖像識別(分類)的準確性,因此,如果我們將相同的方案部署到對象檢測數(shù)據(jù)集中,可能會導致丟失對象的問題,尤其是小對象。
在下圖中,cutout區(qū)域(黑色區(qū)域)內(nèi)的大量小對象被移除,這不符合數(shù)據(jù)擴充的精神。
為了使這種方式適用于對象檢測,我們可以進行簡單的修改,而不是僅使用一個蒙版并將其放置在圖像中的隨機位置。當我們隨機選擇一半數(shù)量的對象并將剪切應用于這些對象區(qū)域時,效果會更好。增強圖像如下圖中的右圖所示。
剪切輸出是新生成的圖像,我們不移除對象或更改圖像大小,則生成圖像的注釋與原始圖像相同。
def cutout(img, gt_boxes, amount=0.5):
'''
### Cutout ###
img: 圖像
gt_boxes: format [[obj x1 y1 x2 y2],...]
amount: 蒙版數(shù)量/對象數(shù)量
'''
out = img.copy()
ran_select = random.sample(gt_boxes, round(amount*len(gt_boxes)))
for box in ran_select:
x1 = int(box[1])
y1 = int(box[2])
x2 = int(box[3])
y2 = int(box[4])
mask_w = int((x2 - x1)*0.5)
mask_h = int((y2 - y1)*0.5)
mask_x1 = random.randint(x1, x2 - mask_w)
mask_y1 = random.randint(y1, y2 - mask_h)
mask_x2 = mask_x1 + mask_w
mask_y2 = mask_y1 + mask_h
cv2.rectangle(out, (mask_x1, mask_y1), (mask_x2, mask_y2), (0, 0, 0), thickness=-1)
return out
顏色抖動
ColorJitter是另一種簡單的圖像數(shù)據(jù)增強,我們可以隨機改變圖像的亮度、對比度和飽和度。我相信這個技術(shù)很容易被大多數(shù)讀者理解。
增加噪聲在一般意義上,噪聲被認為是圖像中的一個意外因素,然而,幾種類型的噪聲(例如高斯噪聲、椒鹽噪聲)可用于數(shù)據(jù)增強,在深度學習中添加噪聲是一種非常簡單和有益的數(shù)據(jù)增強方法。在下面的示例中,為了增強數(shù)據(jù),將高斯噪聲和椒鹽噪聲添加到原始圖像中。
對于那些無法識別高斯噪聲和椒鹽噪聲之間差異的人,高斯噪聲的值范圍為0到255,具體取決于配置,因此,在RGB圖像中,高斯噪聲像素可以是任何顏色。相比之下,椒鹽噪波像素只能有兩個值0或255,分別對應于黑色(PEPER)或白色(salt)。
濾波本文介紹的最后一個數(shù)據(jù)擴充過程是濾波。與添加噪聲類似,濾波也簡單且易于實現(xiàn)。實現(xiàn)中使用的三種類型的濾波包括模糊(平均)、高斯和中值。
總結(jié)
在這篇文章中,向大家介紹了一個關(guān)于為對象檢測任務實現(xiàn)數(shù)據(jù)增強的教程。你們可以在這里找到完整實現(xiàn)。
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
即日-12.26立即報名>>> 【在線會議】村田用于AR/VR設(shè)計開發(fā)解決方案
-
1月8日火熱報名中>> Allegro助力汽車電氣化和底盤解決方案優(yōu)化在線研討會
-
即日-1.14火熱報名中>> OFweek2025中國智造CIO在線峰會
-
即日-1.24立即參與>>> 【限時免費】安森美:Treo 平臺帶來出色的精密模擬
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍皮書》
-
精彩回顧立即查看>> 【線下會議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
推薦專題
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容