1、在单个 GPU 上再现性能 #179(添加链接描述)
2、如何使用 PyTorch 的 WeightedRandomSampler 或编写自定义采样器添加链接描述
4、使用独立的分段器 #2931添加链接描述
5、How to change the training policy from Iter to Epoch based on the existing training profile ?如何根据已有的训练配置文件的训练政策从Iter改为Epoch? #2908
6、使用 class_weight 时出错 #2723
3、一些管道和 data_preprocessor 建议 #3103
7、MMDetection 图像缩放 Resize 详细说明添加链接描述
(1)
(2)
(3)keep_ratio的设置
# 1 单尺度,不保持宽高比
dict(type='Resize', img_scale=(511, 511), keep_ratio=False)
# 2 单尺度,保持宽高比
dict(type='Resize', img_scale=(1333, 800), keep_ratio=True)
# 3 多尺度,range 模式
dict(
type='Resize',
img_scale=[(1333, 640), (1333, 800)],
multiscale_mode='range',
keep_ratio=True),
# 4 多尺度,value 模式
dict(
type='Resize',
img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736),
(1333, 768), (1333, 800)],
multiscale_mode='value',
keep_ratio=True),
# 5 多尺度,ratio_range 模式,随机采样 ratio_range 范围,然后作用于 img_scale 上
dict(
type='Resize',
img_scale=(640, 640),
ratio_range=(0.8, 1.2),
keep_ratio=True),
前两种情况已经分析过了,需要注意的是在 keep_ratio=True 情况下,img_scale 内部的值顺序不重要,因为其内部会基于 min 和 max 函数重新计算缩放范围。
常用的多尺度训练配置是上面的 3 和 4 例子,具体分为 range 和 value 两种模式。当 img_scale 是 list 类型时候,multiscale_mode 参数才起作用。
(1) range 即在指定的范围内进行随机 resize
在该模式下,img_scale 长度必须是2,内部会基于该 list 重算得到新的缩放范围:
assert mmcv.is_list_of(img_scales, tuple) and len(img_scales) == 2
# 两个 list 中 max 集合,上面输入得到 [1333, 1333]
img_scale_long = [max(s) for s in img_scales]
# 两个 list 中 min 集合,上面输入得到 [640, 800]
img_scale_short = [min(s) for s in img_scales]
# 分别从 max 和 min 集合中随机
long_edge = np.random.randint(
min(img_scale_long),
max(img_scale_long) + 1)
short_edge = np.random.randint(
min(img_scale_short),
max(img_scale_short) + 1)
# 得到新的 img_scale
img_scale = (long_edge, short_edge)
(2) value 即在指定的范围内选择某个尺度进行 resize
在改模式下,会随机从 list 中采样一个新的 img_scale
assert mmcv.is_list_of(img_scales, tuple)
scale_idx = np.random.randint(len(img_scales))
img_scale = img_scales[scale_idx]
return img_scale, scale_idx
以上就是 Resize 函数常用的所有功能。
(3) ratio_range 模式
如果在设置了 ratio_range 情况下,表示会先随机采样缩放 scale 值,然后作用于 img_scale 上,并且在该模式下,[img_scale] 必须长度是 1。
if self.ratio_range is not None:
scale, scale_idx = self.random_sample_ratio(
self.img_scale[0], self.ratio_range)
assert isinstance(img_scale, tuple) and len(img_scale) == 2
# 缩放比例范围
min_ratio, max_ratio = ratio_range
assert min_ratio <= max_ratio
# 随机采样比例
ratio = np.random.random_sample() * (max_ratio - min_ratio) + min_ratio
# 作用于 img_scale 上
scale = int(img_scale[0] * ratio), int(img_scale[1] * ratio)
return scale, None