dataset中图像处理提速小技巧

图像增广中,边缘填充颜色写元组还是写单一数值

一,写元组:

self.border_fill_value = 114, 114, 114  # 定义为元组



# 仿射变换的时候的写法:

merge_mosaic_image = cv2.warpAffine(merge_mosaic_image, M, 
                                            (self.image_size, self.image_size), 
                                            flags=cv2.INTER_LINEAR, 
                                            borderMode=cv2.BORDER_CONSTANT,
                                            borderValue=self.border_fill_value) # 本身定义的时候就是元组,直接传入就行


# 四周填充
image = cv2.copyMakeBorder(image, pad_top, pad_bottom, pad_left, pad_right, 
                           borderType=cv2.BORDER_CONSTANT,
                           value=self.border_fill_value)

此时的加载速度为:

二、写数值的时候:

self.border_fill_value = 114  # 定义为数值形式



# (B, G, R)
# (114, 0, 0)  这里的borderValue需要写元组,底层是c++ 速度快
merge_mosaic_image = cv2.warpAffine(merge_mosaic_image, M, 
                                   (self.image_size, self.image_size), 
                                   flags=cv2.INTER_LINEAR, 
                                   borderMode=cv2.BORDER_CONSTANT,
                                   borderValue=(self.border_fill_value, self.border_fill_value, self.border_fill_value))


# 四周填充
image = cv2.copyMakeBorder(image, pad_top, pad_bottom, pad_left, pad_right, 
                           borderType=cv2.BORDER_CONSTANT,
                           value=(self.border_fill_value, self.border_fill_value, self.border_fill_value))

此时的速度:

速度是原来的1.72倍。

所以: np.full 如果填充的是tuple,会造成性能严重影响,所以填充的值一定要给int

warpAffine中提供的borderValue必须是tuple,如果是数值,就等同于(114, 0, 0),这并不是预期的颜色,而提供tuple,会在C++层面被解析正确高效的处理,不存在np.full的问题。C++中memset -—> cpu直接提供的指令,是非常高效的。如果提供的是tuple,只能循环赋值,这里指的是np.full

你可能感兴趣的:(YOLO,人工智能,计算机视觉)