公司动态
ultralytics-yolov8的数据增强
因为项目上想做光照增强在ultralytics-yolov8中在Config.yaml中的配置中没有找到想做自己加一个我进入到data/augment中发现了发现了隐藏的Albumentations太惊讶了藏大太深了必须得看代码一、ultralytics-yolov8中在Config.yaml中配置的数据增强理解1、hsv_h, hsv_s, hsv_v可以这样理解hsv中的h 是指什么颜色S是指这个颜色浓不浓V是值颜色亮不亮。H0是大致对应红色H30时可能在黄色或橙色附近H60可能变成绿色。顺序就是红、橙、黄、绿、青、蓝、紫S255的时候就是非常鲜艳的红色S100时红色没有那么鲜艳S0时完全没有颜色V100时当把V提高到150图片变亮把V减少为50的时候图片变暗下面是ultralytics-yolov8中RandomHSV中的核心操作ifself.hgainorself.sgainorself.vgain:dtypeimg.dtype# uint8rnp.random.uniform(-1,1,3)*[self.hgain,self.sgain,self.vgain]# random gainsxnp.arange(0,256,dtyper.dtype)# lut_hue ((x * (r[0] 1)) % 180).astype(dtype) # original hue implementation from ultralytics8.3.78lut_hue((xr[0]*180)%180).astype(dtype)lut_satnp.clip(x*(r[1]1),0,255).astype(dtype)lut_valnp.clip(x*(r[2]1),0,255).astype(dtype)lut_sat[0]0# prevent pure white changing color, introduced in 8.3.79hue,sat,valcv2.split(cv2.cvtColor(img,cv2.COLOR_BGR2HSV))im_hsvcv2.merge((cv2.LUT(hue,lut_hue),cv2.LUT(sat,lut_sat),cv2.LUT(val,lut_val)))cv2.cvtColor(im_hsv,cv2.COLOR_HSV2BGR,dstimg)# no return needed关键是操作比例r_h ∈[-hgain,hgain]r_s ∈[-sgain,sgain]r_v ∈[-vgain,vgain]和三个公式H(Hr_h ×180)%180Sclip(S ×(1r_s),0,255)Vclip(V ×(1r_v),0,255)比如 随机出来r [0, -0.2, 0.4]H H, S 0.8 *S, V 1.4 X V2、degree, translate, scale, shear, perspective想要理解这些数据增强对图片的影响必须知道这些背后是怎么操作的2.1 这几种是怎么共同作用的这几个是叠加执行不是随机选择一个的affineRandomPerspective(degreeshyp.degrees,translatehyp.translate,scalehyp.scale,shearhyp.shear,perspectivehyp.perspective,pre_transformNoneifstretchelseLetterBox(new_shape(imgsz,imgsz)),)2.1 degrees 旋转degrees 参数是图像旋转的度数(/- deg)arandom.uniform(-degrees,degrees)2.2 scale缩放srandom.uniform(1-scale,1scale)2.3 translate平移Δx∈[−translate⋅W,translate⋅W]Δy∈[−translate⋅H,translate⋅H]2.4 box处理不直接对 bbox 的 (x1,y1,x2,y2) 做变换而是先取 bbox 的 4 个角点 → 对 4 个角点做和图片完全一样的 M 变换 → 再用变换后的 4 个点重新计算一个能包住目标的最小 xyxy 框。二、ultralytics-yolov8中数据增强的思考这种数据增强会导致目标框切割但是YOLO会把bbox裁剪到图像范围内也就是目标框还剩多少全靠随机值一种是目标框完全在图像外面这张样本就变成了无目标框的背景一种情况是目标被切成了一个条条已经完全和目标外形不一样了ultralytics-yolov里面的数据增强包括mosaic、mixup、cutmix等是适合coco类型的图片的在图像中目标本身可能出现在任意位置、大小变化比较大、部分遮挡、部分出画面、视角变化比较大所以比较强的Mosaic、RandomPerspective、MixUp、CopyPaste、CutMix、scale、translate通常是比较有价值的三、实际应用我的应用场景是固定摄像头、固定角度、目标位置范围有效、目标大小范围有效、目标形态基本固定光照影响比较大3.1 第一阶段使用 Ultralytics YOLOv8 内置的数据增强方式MixUp、CopyPaste、CutMix关闭轻微degrees0~2、translate0.02-0.05、scale0.05-0.1shear和perspective关闭H 0.015 S 0.23.2 第二阶段使用 Ultralytics YOLOv8 中增加额外的亮度增强增加 RandomBrightness亮度增强有三种brightnessgamma, contrast三种不是叠加而是每次选择一种brightnessRGB三个通道增加或者减去一个相同的值gamma contrastreturnCompose([pre_transform,MixUp(dataset,pre_transformpre_transform,phyp.mixup),CutMix(dataset,pre_transformpre_transform,phyp.cutmix),Albumentations(p1.0,transformsgetattr(hyp,augmentations,None)),RandomHSV(hgainhyp.hsv_h,sgainhyp.hsv_s,vgainhyp.hsv_v),RandomBrightness(p0.5),RandomFlip(directionvertical,phyp.flipud,flip_idxflip_idx),RandomFlip(directionhorizontal,phyp.fliplr,flip_idxflip_idx),]3.3 第三个阶段扩展到其他摄像头的角度增加 RandomTranslate目标在当前摄像头下的角度和形态是不变化的但是目标同时也会出现在其他摄像头的角度下发现如果不把其他摄像头下的目标加入训练时其他摄像头下的目标分值很低在0.3~0.4左右所以尝试用数据增强将模型扩展到其他摄像头角度下增加模型的扩展性。第三阶段只针对translate把translate的平移限制增加box的限制不切割boxreturnCompose([pre_transform,MixUp(dataset,pre_transformpre_transform,phyp.mixup),CutMix(dataset,pre_transformpre_transform,phyp.cutmix),Albumentations(p1.0,transformsgetattr(hyp,augmentations,None)),RandomHSV(hgainhyp.hsv_h,sgainhyp.hsv_s,vgainhyp.hsv_v),RandomTranslate(translate1.0,p0.2),RandomBrightness(p0.5),RandomFlip(directionvertical,phyp.flipud,flip_idxflip_idx),RandomFlip(directionhorizontal,phyp.fliplr,flip_idxflip_idx),]之前在别的摄像头角度下的目标分数都很低训练的时候加入RandomTranslate后其他角度下的目标分数值增加到0.8~0.9.3.4 如何在Config.yaml中对自己增加的增强例如RandomBrightness和RandomTranslate进行参数控制如果直接在配置文件中写入random_translate: 0.3 的概率程序报错random_translate is not a valid YOLO argumnets .在 ultralytics/cfg/default.yaml中增加 random_translate:0.3 #probability random_brightness:0.3 #probabilitydefault.yaml 只是一个模板告诉你都有哪些配置参数在你配置中加入这两个参数然后再代码中使用如下returnCompose([pre_transform,MixUp(dataset,pre_transformpre_transform,phyp.mixup),CutMix(dataset,pre_transformpre_transform,phyp.cutmix),Albumentations(p1.0,transformsgetattr(hyp,augmentations,None)),RandomHSV(hgainhyp.hsv_h,sgainhyp.hsv_s,vgainhyp.hsv_v),RandomTranslate(translate1.0,phyp.random_translate),RandomBrightness(phyp.random_brightness),RandomFlip(directionvertical,phyp.flipud,flip_idxflip_idx),RandomFlip(directionhorizontal,phyp.fliplr,flip_idxflip_idx),]