Scheaven
2021-09-18 291deeb1fcf45dbf39a24aa72a213ff3fd6b3405
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
B
¸_ò6ã@sîdZddlZddlmZddlmZddlmZddd    d
d d œZGd d„dej    ƒZ
Gdd„dej    ƒZ Gdd„dej    ƒZ Gdd„dej    ƒZ Gdd„dej    ƒZGdd„dej    ƒZGdd„dej    ƒZGdd„dej    ƒZd"dd„Ze ¡d d!„ƒZdS)#z4
@author:  xingyu liao
@contact: liaoxingyu5@jd.com
éN)Únn)Ú
functionalé)ÚBACKBONE_REGISTRYz@https://drive.google.com/uc?id=1LaG1EJpHrxdAxKnSCJ_i0u-nbxSAeiFYz@https://drive.google.com/uc?id=1uwA9fElHOk3ZogwbeY5GkLI6QPTX70Hqz@https://drive.google.com/uc?id=16DGLbZukvVYgINws8u8deSaOqjybZ83iz@https://drive.google.com/uc?id=1rb8UN5ZzPKRc_xvtHlyDh-cSz88YX9hsz@https://drive.google.com/uc?id=1sr90V6irlYYDd4_4ISU2iruoRG8J__6l)Ú
osnet_x1_0Z osnet_x0_75Z
osnet_x0_5Z osnet_x0_25Úosnet_ibn_x1_0cs*eZdZdZd    ‡fdd„    Zdd„Z‡ZS)
Ú    ConvLayerz%Convolution layer (conv + bn + relu).rrFc    s\tt|ƒ ¡tj|||||d|d|_|r>tj|dd|_n t |¡|_tj    dd|_
dS)NF)ÚstrideÚpaddingÚbiasÚgroupsT)Úaffine)Úinplace) ÚsuperrÚ__init__rÚConv2dÚconvÚInstanceNorm2dÚbnÚ BatchNorm2dÚReLUÚrelu)ÚselfÚ in_channelsÚ out_channelsÚ kernel_sizer    r
r ÚIN)Ú    __class__©ú./modeling/backbones/osnet.pyr#s
 
 zConvLayer.__init__cCs"| |¡}| |¡}| |¡}|S)N)rrr)rÚxrrrÚforward=s
 
 
zConvLayer.forward)rrrF)Ú__name__Ú
__module__Ú __qualname__Ú__doc__rr!Ú __classcell__rr)rrr s rcs*eZdZdZd‡fdd„    Zdd„Z‡ZS)ÚConv1x1z1x1 convolution + bn + relu.rc    sFtt|ƒ ¡tj||d|dd|d|_t |¡|_tjdd|_    dS)NrrF)r    r
r r T)r)
rr'rrrrrrrr)rrrr    r )rrrrGs
 zConv1x1.__init__cCs"| |¡}| |¡}| |¡}|S)N)rrr)rr rrrr!Us
 
 
zConv1x1.forward)rr)r"r#r$r%rr!r&rr)rrr'Dsr'cs*eZdZdZd‡fdd„    Zdd„Z‡ZS)Ú Conv1x1Linearz)1x1 convolution + bn (w/o non-linearity).rcs6tt|ƒ ¡tj||d|ddd|_t |¡|_dS)NrrF)r    r
r )rr(rrrrrr)rrrr    )rrrr_szConv1x1Linear.__init__cCs| |¡}| |¡}|S)N)rr)rr rrrr!fs
 
zConv1x1Linear.forward)r)r"r#r$r%rr!r&rr)rrr(\sr(cs*eZdZdZd‡fdd„    Zdd„Z‡ZS)ÚConv3x3z3x3 convolution + bn + relu.rc    sFtt|ƒ ¡tj||d|dd|d|_t |¡|_tjdd|_    dS)NérF)r    r
r r T)r)
rr)rrrrrrrr)rrrr    r )rrrros
 zConv3x3.__init__cCs"| |¡}| |¡}| |¡}|S)N)rrr)rr rrrr!}s
 
 
zConv3x3.forward)rr)r"r#r$r%rr!r&rr)rrr)lsr)cs(eZdZdZ‡fdd„Zdd„Z‡ZS)Ú LightConv3x3zHLightweight 3x3 convolution.
    1x1 (linear) + dw 3x3 (nonlinear).
    c    s^tt|ƒ ¡tj||ddddd|_tj||dddd|d|_t |¡|_tj    dd|_
dS)    NrrF)r    r
r r*)r    r
r r T)r) rr+rrrÚconv1Úconv2rrrr)rrr)rrrr‰s
 zLightConv3x3.__init__cCs,| |¡}| |¡}| |¡}| |¡}|S)N)r,r-rr)rr rrrr!šs
 
 
 
 
zLightConv3x3.forward)r"r#r$r%rr!r&rr)rrr+„s r+cs*eZdZdZd
‡fdd„    Zdd    „Z‡ZS) Ú ChannelGatezMA mini-network that generates channel-wise gates conditioned on input tensor.NFÚsigmoidécsàtt|ƒ ¡|dkr|}||_t d¡|_tj|||dddd|_d|_    |rft 
||ddf¡|_    tj dd|_ tj|||dddd|_ |dkr¢t ¡|_n:|dkrºtj dd|_n"|dkrÎt ¡|_ntd     |¡ƒ‚dS)
NrTr)rr r
)rr/rÚlinearzUnknown gate activation: {})rr.rÚ return_gatesrÚAdaptiveAvgPool2dÚglobal_avgpoolrÚfc1Únorm1Ú    LayerNormrrÚfc2ÚSigmoidÚgate_activationÚIdentityÚ RuntimeErrorÚformat)rrZ    num_gatesr2r:Ú    reductionÚ
layer_norm)rrrr¨s:     
 
  zChannelGate.__init__cCs\|}| |¡}| |¡}|jdk    r,| |¡}| |¡}| |¡}| |¡}|jrT|S||S)N)r4r5r6rr8r:r2)rr Úinputrrrr!Ðs
 
 
 
 
 
 
zChannelGate.forward)NFr/r0F)r"r#r$r%rr!r&rr)rrr.¥s!r.cs*eZdZdZd‡fdd„    Zdd„Z‡ZS)    ÚOSBlockz"Omni-scale feature learning block.Féc sîtt|ƒ ¡||}t||ƒ|_t||ƒ|_t t||ƒt||ƒ¡|_    t t||ƒt||ƒt||ƒ¡|_
t t||ƒt||ƒt||ƒt||ƒ¡|_ t |ƒ|_ t||ƒ|_d|_||krÄt||ƒ|_d|_|rÞtj|dd|_t d¡|_dS)NT)r )rrArr'r,r+Úconv2arÚ
SequentialÚconv2bÚconv2cÚconv2dr.Úgater(Úconv3Ú
downsamplerrrr)rrrrZbottleneck_reductionÚkwargsZ mid_channels)rrrrßs2  
  zOSBlock.__init__c Cs¢|}| |¡}| |¡}| |¡}| |¡}| |¡}| |¡| |¡| |¡| |¡}| |¡}    |jdk    r|| |¡}|    |}
|jdk    r˜| |
¡}
|     |
¡S)N)
r,rCrErFrGrHrIrJrr) rr ÚidentityÚx1Zx2aZx2bZx2cZx2dÚx2Zx3Úoutrrrr!s
 
 
 
 
(
 
 
 
 
zOSBlock.forward)FrB)r"r#r$r%rr!r&rr)rrrAÜsrAcs<eZdZdZd ‡fdd„    Zd dd„Zdd„Zd    d
„Z‡ZS) ÚOSNeta
Omni-Scale Network.
 
    Reference:
        - Zhou et al. Omni-Scale Feature Learning for Person Re-Identification. ICCV, 2019.
        - Zhou et al. Learning Generalisable Omni-Scale Representations
          for Person Re-Identification. arXiv preprint, 2019.
    Fc sútt|ƒ ¡t|ƒ}|t|ƒks&t‚|t|ƒdks:t‚td|dddd|d|_tjdddd|_    |j
|d|d|d|dd|d    |_ |j
|d|d|d|ddd
|_ |j
|d|d|d|dd d
|_ t|d|dƒ|_| ¡dS) Nrr*réé)r    r
r)r    r
T)Úreduce_spatial_sizer)rSF)rrPrÚlenÚAssertionErrorrr,rÚ    MaxPool2dÚmaxpoolÚ _make_layerr-rIÚconv4r'Úconv5Ú _init_params)rÚblocksÚlayersÚchannelsrrKZ
num_blocks)rrrr s6
 
 
zOSNet.__init__c        Cspg}| ||||d¡x&td|ƒD]}| ||||d¡q$W|rf| t t||ƒtjddd¡¡tj|ŽS)N)rrrR)r    )ÚappendÚrangerrDr'Ú    AvgPool2d)    rÚblockÚlayerrrrSrr]ÚirrrrXJs    zOSNet._make_layercCsæxà| ¡D]Ô}t|tjƒrJtjj|jddd|jdk    rÞtj |jd¡q
t|tj    ƒrxtj |jd¡tj |jd¡q
t|tj
ƒr¦tj |jd¡tj |jd¡q
t|tj ƒr
tj  |jdd¡|jdk    r
tj |jd¡q
WdS)NÚfan_outr)ÚmodeÚ nonlinearityrrg{®Gáz„?) ÚmodulesÚ
isinstancerrÚinitÚkaiming_normal_Úweightr Ú    constant_rÚ BatchNorm1dÚLinearÚnormal_)rÚmrrrr[cs  
 
zOSNet._init_paramscCs@| |¡}| |¡}| |¡}| |¡}| |¡}| |¡}|S)N)r,rWr-rIrYrZ)rr rrrr!ys
 
 
 
 
 
z OSNet.forward)F)F)    r"r#r$r%rrXr[r!r&rr)rrrPs
,
rPÚc
sÌddl‰ddl}ddl}ddlm}ddl}ddl}| t¡}‡fdd„}|ƒ}    ˆj     
|    d¡}
yˆ  |
¡Wn2t k
rž} z| j|j krŒn‚Wdd} ~ XYnX|d} ˆj     
|
| ¡} ˆj     | ¡sÖ|jt|| dd    t | ¡}| ¡}|ƒ}gg}}xl| ¡D]`\}}| d
¡r"|d d…}||krV|| ¡| ¡krV|||<| |¡n
| |¡qW| |¡| |¡t|ƒdkrš| d  | ¡¡n.| d  | ¡¡t|ƒdkrÈ| d |¡¡dS)z‡Initializes model with pretrained weights.
 
    Layers that don't match with pretrained layers in name or size are kept unchanged.
    rN)Ú OrderedDictc s6d}d}d}ˆj ˆ |ˆj ˆ ||¡d¡¡¡}|S)NÚ
TORCH_HOMEÚXDG_CACHE_HOMEz~/.cacheÚtorch)ÚpathÚ
expanduserÚgetenvÚjoin)ÚENV_TORCH_HOMEÚENV_XDG_CACHE_HOMEÚDEFAULT_CACHE_DIRÚ
torch_home)ÚosrrÚ_get_torch_home‘sz0init_pretrained_weights.<locals>._get_torch_homeÚ checkpointsz _imagenet.pthF)Úquietzmodule.rQzsThe pretrained weights from "{}" cannot be loaded, please check the key names manually (** ignored and continue **)z9Successfully loaded imagenet pretrained weights from "{}"zM** The following layers are discarded due to unmatched keys or layer size: {})rÚerrnoÚgdownÚ collectionsrsÚwarningsÚloggingÚ    getLoggerr"rwrzÚmakedirsÚOSErrorÚEEXISTÚexistsÚdownloadÚ
model_urlsrvÚloadÚ
state_dictÚitemsÚ
startswithÚsizer_ÚupdateÚload_state_dictrTÚwarnr=Úinfo)ÚmodelÚkeyrƒr„rsr†r‡Úloggerr€r~Ú    model_dirÚeÚfilenameÚ cached_filerZ
model_dictZnew_state_dictZmatched_layersZdiscarded_layersÚkÚvr)rrÚinit_pretrained_weightsƒsX 
 
 
    
 
 
r¡cCs\|jjj}|jjj}dddg}ddddg}ttttg|||ƒ}|rFdnd}|rXt||ƒ|S)zd
    Create a OSNet instance from config.
    Returns:
        OSNet: a :class:`OSNet` instance
    rRé@éi€irr)ÚMODELÚBACKBONEÚPRETRAINÚWITH_IBNrPrAr¡)ÚcfgÚpretrainÚwith_ibnÚnum_blocks_per_stageZnum_channels_per_stager˜Z pretrain_keyrrrÚbuild_osnet_backboneÕs    
 
 
 
r¬)rr)r%rvrÚtorch.nnrÚFÚbuildrrŽÚModulerr'r(r)r+r.rArPr¡Úregisterr¬rrrrÚ<module>s&   $!7;l
R