File size: 4,037 Bytes
e8b0040
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
from timm.data.auto_augment import rand_augment_transform, augment_and_mix_transform, auto_augment_transform
from timm.data.transforms import RandomResizedCropAndInterpolation
from PIL import Image
import torchvision.transforms as transforms
import cv2
import numpy as np
import torchvision.transforms.functional as F


# 添加jpeg压缩
class JPEGCompression:
    def __init__(self, quality=10, p=0.3):
        self.quality = quality
        self.p = p

    def __call__(self, img):
        if np.random.rand() < self.p:
            img_np = np.array(img)
            _, buffer = cv2.imencode('.jpg', img_np[:, :, ::-1], [int(cv2.IMWRITE_JPEG_QUALITY), self.quality])
            jpeg_img = cv2.imdecode(buffer, 1)
            return Image.fromarray(jpeg_img[:, :, ::-1])
        return img


# 原始数据增强
def transforms_imagenet_train(
        img_size=(224, 224),
        scale=(0.08, 1.0),
        ratio=(3./4., 4./3.),
        hflip=0.5,
        vflip=0.5,
        auto_augment='rand-m9-mstd0.5-inc1',
        interpolation='random',
        mean=(0.485, 0.456, 0.406),
        jpeg_compression = 0,
):
    scale = tuple(scale or (0.08, 1.0))  # default imagenet scale range
    ratio = tuple(ratio or (3./4., 4./3.))  # default imagenet ratio range

    primary_tfl = [
        RandomResizedCropAndInterpolation(img_size, scale=scale, ratio=ratio, interpolation=interpolation)]
    if hflip > 0.:
        primary_tfl += [transforms.RandomHorizontalFlip(p=hflip)]
    if vflip > 0.:
        primary_tfl += [transforms.RandomVerticalFlip(p=vflip)]

    secondary_tfl = []
    if auto_augment:
        assert isinstance(auto_augment, str)

        if isinstance(img_size, (tuple, list)):
            img_size_min = min(img_size)
        else:
            img_size_min = img_size

        aa_params = dict(
            translate_const=int(img_size_min * 0.45),
            img_mean=tuple([min(255, round(255 * x)) for x in mean]),
        )
        if auto_augment.startswith('rand'):
            secondary_tfl += [rand_augment_transform(auto_augment, aa_params)]
        elif auto_augment.startswith('augmix'):
            aa_params['translate_pct'] = 0.3
            secondary_tfl += [augment_and_mix_transform(auto_augment, aa_params)]
        else:
            secondary_tfl += [auto_augment_transform(auto_augment, aa_params)]

    if jpeg_compression == 1:
        secondary_tfl += [JPEGCompression(quality=10, p=0.3)]

    final_tfl = [transforms.ToTensor()]

    return transforms.Compose(primary_tfl + secondary_tfl + final_tfl)


# 推理(测试)使用
def create_transforms_inference(h=256, w=256):
    transformer = transforms.Compose([
            transforms.Resize(size=(h, w)),
            transforms.ToTensor(),
        ])
    
    return transformer


def create_transforms_inference1(h=256, w=256):
    transformer = transforms.Compose([
        transforms.Lambda(lambda img: F.rotate(img, angle=90)),
        transforms.Resize(size=(h, w)),
        transforms.ToTensor(),
    ])

    return transformer


def create_transforms_inference2(h=256, w=256):
    transformer = transforms.Compose([
        transforms.Lambda(lambda img: F.rotate(img, angle=180)),
        transforms.Resize(size=(h, w)),
        transforms.ToTensor(),
    ])

    return transformer


def create_transforms_inference3(h=256, w=256):
    transformer = transforms.Compose([
        transforms.Lambda(lambda img: F.rotate(img, angle=270)),
        transforms.Resize(size=(h, w)),
        transforms.ToTensor(),
    ])

    return transformer


def create_transforms_inference4(h=256, w=256):
    transformer = transforms.Compose([
        transforms.Lambda(lambda img: F.hflip(img)),
        transforms.Resize(size=(h, w)),
        transforms.ToTensor(),
    ])

    return transformer


def create_transforms_inference5(h=256, w=256):
    transformer = transforms.Compose([
        transforms.Lambda(lambda img: F.vflip(img)),
        transforms.Resize(size=(h, w)),
        transforms.ToTensor(),
    ])

    return transformer