PaddlePaddle / PaddleDetection

Object Detection toolkit based on PaddlePaddle. It supports object detection, instance segmentation, multiple object tracking and real-time multi-person keypoint detection.
Apache License 2.0
12.81k stars 2.89k forks source link

关于旋转检测数据增广的一点建议 #8290

Open DreamMaker777 opened 1 year ago

DreamMaker777 commented 1 year ago

问题描述 Please describe your issue

旋转检测时也需要BatchRandomResize,但是直接使用会默认调用operators.py中的Resize,导致报错。查看代码后建议修改BatchRandomResize类,以支持旋转检测:

from .rotated_operators import RResize #### 修改 class BatchRandomResize(BaseOperator): """ Resize image to target size randomly. random target_size and interpolation method Args: target_size (int, list, tuple): image target size, if random size is True, must be list or tuple keep_ratio (bool): whether keep_raio or not, default true interp (int): the interpolation method random_size (bool): whether random select target size of image random_interp (bool): whether random select interpolation method """

def __init__(self,
             target_size,
             keep_ratio,
             interp=cv2.INTER_NEAREST,
             random_size=True,
             random_interp=False,
             use_rotate = False): ####修改
    super(BatchRandomResize, self).__init__()
    self.use_rotate = use_rotate ####修改
    self.keep_ratio = keep_ratio
    self.interps = [
        cv2.INTER_NEAREST,
        cv2.INTER_LINEAR,
        cv2.INTER_AREA,
        cv2.INTER_CUBIC,
        cv2.INTER_LANCZOS4,
    ]
    self.interp = interp
    assert isinstance(target_size, (
        int, Sequence)), "target_size must be int, list or tuple"
    if random_size and not isinstance(target_size, list):
        raise TypeError(
            "Type of target_size is invalid when random_size is True. Must be List, now is {}".
            format(type(target_size)))
    self.target_size = target_size
    self.random_size = random_size
    self.random_interp = random_interp

def __call__(self, samples, context=None):
    if self.random_size:
        index = np.random.choice(len(self.target_size))
        target_size = self.target_size[index]
    else:
        target_size = self.target_size

    if self.random_interp:
        interp = np.random.choice(self.interps)
    else:
        interp = self.interp
    if self.use_rotate:  ####修改
        resizer = RResize(target_size, keep_ratio=self.keep_ratio, interp=interp)  ####修改
    else:  ####修改
        resizer = Resize(target_size, keep_ratio=self.keep_ratio, interp=interp)  ####修改

    return resizer(samples, context=context)
lyuwenyu commented 1 year ago

收到 如果有兴趣可以提个PR

DreamMaker777 commented 1 year ago

收到 如果有兴趣可以提个PR @lyuwenyu 但是修改后训练的准确率一直为0,: 1 2