对VOC目标检测数据进行增强
生活随笔
收集整理的這篇文章主要介紹了
对VOC目标检测数据进行增强
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
VOCDateAugment
目的:對VOC數(shù)據(jù)集的對象檢測的數(shù)據(jù)進(jìn)行數(shù)據(jù)增強(qiáng)。
本人編寫了一個(gè)腳本,在沒使用腳本前請前去除沒有打標(biāo)簽的圖片或多余的標(biāo)簽文件。并請確保標(biāo)簽文件和圖片命名一樣。
如果好用請給我一顆?,謝謝!!!
代碼地址:https://github.com/Mygithub-Yao/tools-VOC
visualiztion模塊
這個(gè)模塊是腳本,主要功能是通過圖片和其label文件,生成帶bboxs的圖片。效果如下圖片
ImgParser模塊
里面有class ImgParser類,類提供了5個(gè)圖片數(shù)據(jù)增強(qiáng)的功能,分別是:加噪音(高斯),反轉(zhuǎn),旋轉(zhuǎn),平移,光度隨機(jī)調(diào)節(jié)。
def addNoise_Img(self, img=None): def filp_img(self, img=None, filp=1): def rotate_Img(self, img=None, angle=5, scale=1.): def shift_Img(self,x,y,img=None): def changeLight_Img(self, img=None):功能展示:
if __name__ == '__main__':I = ImgParser()I.setImg(r'.\TestDate\Images\000004.jpg')img5, _ =I.rotate_Img()img = [I.addNoise_Img()/255,I.changeLight_Img(),I.filp_img(),I.shift_Img(50,50),img5]pic = ['noise', 'changeLight', 'filp', 'shift','rotate']plt.figure(figsize=(8,6))for i in range(5):plt.subplot(2, 3, i + 1)plt.imshow(img[i])plt.title(pic[i])plt.show()#存儲(chǔ),不要映射回去[0,1]# cv2.imwrite(r'.\TestDate\Images\000004_noise.jpg',I.addNoise_Img())LabelParser模塊
此功能模塊主要是對標(biāo)簽進(jìn)行處理的,里面包含一個(gè)class LabelParser的類,并且提供一下功能:
#從xml文件中提取bounding box信息, 格式為[[ name,x_min, y_min, x_max, y_max]] def getObject(self,XMLpath =None):#對label文件中的所有目標(biāo)對象進(jìn)行反轉(zhuǎn),默認(rèn)存儲(chǔ)在原文件 def reverse_Object(self,filp=0,save_path=None):#根據(jù)仿射變換矩陣來對對象標(biāo)簽進(jìn)行轉(zhuǎn)換,默認(rèn)保存路徑為原文件,也可以指定新的路徑 def rotate_Object(self, rot_mat,w,h,c,save_path =None, folder_name=None):#復(fù)制當(dāng)前XML文件到指定的新目錄下 def copyXML(self, save_path, newname):#刪除標(biāo)簽文件里的對應(yīng)對象,默認(rèn)寫回到原文件,如果指定新的保存路徑,信息將保存到新的文件中 def deleteObject(self, ObjectName, save_path=None):#更改當(dāng)前xml文件的對象名,默認(rèn)寫回原文件,也可以通過NewPath指定新的保存路徑 def change_ObjectName(self, oldName, newName, save_path=None):#返回標(biāo)簽圖片的寬,高,通道 def getImg_size(self):#文件默認(rèn)存儲(chǔ)路徑為原文件,可以通過NewPath指定新的保存路徑 def changeImg_size(self, newsize, save_path=None):#設(shè)置要解析的標(biāo)簽文件 def setXML(self,path):一個(gè)小示例:
if __name__ == '__main__': #加載paser = LabelParser(r'.\TestDate\label\000004.xml')#改變圖片大小paser.changeImg_size([1222,1250],r'.\TestDate\label')#獲取圖片sizeprint(paser.getImg_size())#改變對象名,默認(rèn)寫回加載文件,也可以指定新的路徑。paser.change_ObjectName('car', 'bigcar',save_path='.\TestDate\label')#刪除指定Object#paser.deleteObject('star')#獲得對象數(shù)據(jù)print(paser.getObject())#對label里面的框做鏡像反轉(zhuǎn),并指定新保存路徑paser.reverse_Object(filp=0, save_path='.\TestDate\label')DataAugmentVOC模塊
此模塊提供簡易的批處理數(shù)據(jù)增強(qiáng),通過新建類DataAugmentVOC來提供批量VOC數(shù)據(jù)集的數(shù)據(jù)增強(qiáng)。
提供以下功能:
#圖片反轉(zhuǎn),默認(rèn)水平反轉(zhuǎn) def filp(self,filp=1):#對VOC數(shù)據(jù)集的數(shù)據(jù)進(jìn)行旋轉(zhuǎn),生成新的旋轉(zhuǎn)圖片和新的label文件 def rotate(self,angle=5, scale=1.):#對VOC數(shù)據(jù)集的所有圖片調(diào)節(jié)亮度,并復(fù)制一份label文件,r指定亮化值 def changeLight(self,r=None):#對VOC數(shù)據(jù)集的所有圖片添加高斯噪音,并復(fù)制一份label文件 def addNoise(self):小示例:
if __name__ == '__main__':start = time.time()V = DataAugmentVOC(rootpath=r'.\TestDate\VOC')V.addNoise()V.changeLight()V.rotate(angle=15)V.filp(filp=1)end =time.time()print("total of {}".format(end-start))生成結(jié)果保存在新文件夾:
結(jié)果圖片:(部分)
總結(jié)
以上是生活随笔為你收集整理的对VOC目标检测数据进行增强的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络布线应该如何连接电脑如何连接上网设置
- 下一篇: 目标检测 /yolo算法原理的详解