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
U
¸_ò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Úxr"r"r#Úforward=s
 
 
zConvLayer.forward)rrrF©Ú__name__Ú
__module__Ú __qualname__Ú__doc__rr(Ú __classcell__r"r"r r#r sørcs*eZdZdZd‡fdd„    Zdd„Z‡ZS)ÚConv1x1z1x1 convolution + bn + relu.rc    sFtt|ƒ ¡tj||d|dd|d|_t |¡|_tjdd|_    dS)NrrFr    Tr)
rr/rrrrrrrr©rrrr
r r r"r#rGsù     zConv1x1.__init__cCs"| |¡}| |¡}| |¡}|Sr$r%r&r"r"r#r(Us
 
 
zConv1x1.forward)rrr)r"r"r r#r/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 )rr1rrrrrr)rrrr
r r"r#r_sÿzConv1x1Linear.__init__cCs| |¡}| |¡}|Sr$)rrr&r"r"r#r(fs
 
zConv1x1Linear.forward)rr)r"r"r r#r1\sr1cs*eZdZdZd‡fdd„    Zdd„Z‡ZS)ÚConv3x3z3x3 convolution + bn + relu.rc    sFtt|ƒ ¡tj||d|dd|d|_t |¡|_tjdd|_    dS)NérFr    Tr)
rr3rrrrrrrrr0r r"r#rosù     zConv3x3.__init__cCs"| |¡}| |¡}| |¡}|Sr$r%r&r"r"r#r(}s
 
 
zConv3x3.forward)rrr)r"r"r r#r3lsr3cs(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)    NrrFr2r4r    Tr) rr5rrrÚconv1Úconv2rrrr)rrrr r"r#r‰s(ÿù     zLightConv3x3.__init__cCs,| |¡}| |¡}| |¡}| |¡}|Sr$)r6r7rrr&r"r"r#r(šs
 
 
 
 
zLightConv3x3.forwardr)r"r"r r#r5„s r5cs*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 rr9rÚlinearzUnknown gate activation: {})rr8rÚ return_gatesrÚAdaptiveAvgPool2dÚglobal_avgpoolrÚfc1Únorm1Ú    LayerNormrrÚfc2ÚSigmoidÚgate_activationÚIdentityÚ RuntimeErrorÚformat)rrZ    num_gatesr<rDÚ    reductionÚ
layer_normr r"r#r¨s@     ûû  ÿzChannelGate.__init__cCs\|}| |¡}| |¡}|jdk    r,| |¡}| |¡}| |¡}| |¡}|jrT|S||Sr$)r>r?r@rrBrDr<)rr'Úinputr"r"r#r(Ðs
 
 
 
 
 
 
zChannelGate.forward)NFr9r:Fr)r"r"r r#r8¥sù(r8cs*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)NTr)rrKrr/r6r5Úconv2arÚ
SequentialÚconv2bÚconv2cÚconv2dr8Úgater1Úconv3Ú
downsamplerrrr)rrrrZbottleneck_reductionÚkwargsZ mid_channelsr r"r#rßs8  þýü
  zOSBlock.__init__c Cs¢|}| |¡}| |¡}| |¡}| |¡}| |¡}| |¡| |¡| |¡| |¡}| |¡}    |jdk    r|| |¡}|    |}
|jdk    r˜| |
¡}
|     |
¡Sr$)
r6rMrOrPrQrRrSrTrr) rr'ÚidentityÚx1Zx2aZx2bZx2cZx2dÚx2Zx3Úoutr"r"r#r(s
 
 
 
 
(
 
 
 
 
zOSBlock.forward)FrLr)r"r"r r#rKÜs
û$rKcs<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) Nrr4réé)r
r r)r
r T)Úreduce_spatial_sizer)r]F)rrZrÚlenÚAssertionErrorrr6rÚ    MaxPool2dÚmaxpoolÚ _make_layerr7rSÚconv4r/Úconv5Ú _init_params)rÚblocksÚlayersÚchannelsrrUZ
num_blocksr r"r#r s<úûûzOSNet.__init__c        Cslg}| ||||d¡td|ƒD]}| ||||d¡q"|rb| t t||ƒtjddd¡¡tj|ŽS)N)rrr\)r
)ÚappendÚrangerrNr/Ú    AvgPool2d)    rÚblockÚlayerrrr]rrgÚir"r"r#rbJs     þÿzOSNet._make_layercCsâ| ¡D]Ô}t|tjƒrHtjj|jddd|jdk    rÜtj |jd¡qt|tj    ƒrvtj |jd¡tj |jd¡qt|tj
ƒr¤tj |jd¡tj |jd¡qt|tj ƒrtj  |jdd¡|jdk    rtj |jd¡qdS)NÚfan_outr)ÚmodeÚ nonlinearityrrg{®Gáz„?) ÚmodulesÚ
isinstancerrÚinitÚkaiming_normal_Úweightr Ú    constant_rÚ BatchNorm1dÚLinearÚnormal_)rÚmr"r"r#recs&  ÿ
 
zOSNet._init_paramscCs@| |¡}| |¡}| |¡}| |¡}| |¡}| |¡}|Sr$)r6rar7rSrcrdr&r"r"r#r(ys
 
 
 
 
 
z OSNet.forward)F)F)    r*r+r,r-rrbrer(r.r"r"r r#rZs û1ù
rZÚc
sÈddl‰ddl}ddl}ddlm}ddl}ddl}| t¡}‡fdd„}|ƒ}    ˆj     
|    d¡}
zˆ  |
¡Wn2t k
rž} z| j|j krŒn‚W5d} ~ XYnX|d} ˆj     
|
| ¡} ˆj     | ¡sÖ|jt|| dd    t | ¡}| ¡}|ƒ}gg}}| ¡D]`\}}| d
¡r |d d…}||krT|| ¡| ¡krT|||<| |¡n
| |¡q| |¡| |¡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©Úosr"r#Ú_get_torch_home‘s
ÿþÿz0init_pretrained_weights.<locals>._get_torch_homeÚ checkpointsz _imagenet.pthF)Úquietzmodule.r[zsThe 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Ú collectionsr}ÚwarningsÚloggingÚ    getLoggerr*rr„ÚmakedirsÚOSErrorÚEEXISTÚexistsÚdownloadÚ
model_urlsr€ÚloadÚ
state_dictÚitemsÚ
startswithÚsizeriÚupdateÚload_state_dictr^ÚwarnrGÚinfo)ÚmodelÚkeyrŽrr}r‘r’Úloggerr‹rˆÚ    model_dirÚeÚfilenameÚ cached_filer›Z
model_dictZnew_state_dictZmatched_layersZdiscarded_layersÚkÚvr"r‰r#Úinit_pretrained_weightsƒsd 
 
 
    
 
þÿÿÿþÿr¬cCs\|jjj}|jjj}dddg}ddddg}ttttg|||ƒ}|rFdnd}|rXt||ƒ|S)zd
    Create a OSNet instance from config.
    Returns:
        OSNet: a :class:`OSNet` instance
    r\é@éi€irr)ÚMODELÚBACKBONEÚPRETRAINÚWITH_IBNrZrKr¬)ÚcfgÚpretrainÚwith_ibnÚnum_blocks_per_stageZnum_channels_per_stager£Z pretrain_keyr"r"r#Úbuild_osnet_backboneÕs    
 
 
 
r·)r|)r-r€rÚtorch.nnrÚFÚbuildrr™ÚModulerr/r1r3r5r8rKrZr¬Úregisterr·r"r"r"r#Ú<module>s*   ö$!7;l
R