classL2CS(nn.Module):"""L2CS Gaze Detection Model. This class is responsible for performing gaze detection using the L2CS-Net model. Ref: https://github.com/Ahmednull/L2CS-Net Methods: forward: Performs inference on the given image. """def__init__(self,block,layers,num_bins):self.inplanes=64super(L2CS,self).__init__()self.conv1=nn.Conv2d(3,64,kernel_size=7,stride=2,padding=3,bias=False)self.bn1=nn.BatchNorm2d(64)self.relu=nn.ReLU(inplace=True)self.maxpool=nn.MaxPool2d(kernel_size=3,stride=2,padding=1)self.layer1=self._make_layer(block,64,layers[0])self.layer2=self._make_layer(block,128,layers[1],stride=2)self.layer3=self._make_layer(block,256,layers[2],stride=2)self.layer4=self._make_layer(block,512,layers[3],stride=2)self.avgpool=nn.AdaptiveAvgPool2d((1,1))self.fc_yaw_gaze=nn.Linear(512*block.expansion,num_bins)self.fc_pitch_gaze=nn.Linear(512*block.expansion,num_bins)# Vestigial layer from previous experimentsself.fc_finetune=nn.Linear(512*block.expansion+3,3)forminself.modules():ifisinstance(m,nn.Conv2d):n=m.kernel_size[0]*m.kernel_size[1]*m.out_channelsm.weight.data.normal_(0,math.sqrt(2.0/n))elifisinstance(m,nn.BatchNorm2d):m.weight.data.fill_(1)m.bias.data.zero_()def_make_layer(self,block,planes,blocks,stride=1):downsample=Noneifstride!=1orself.inplanes!=planes*block.expansion:downsample=nn.Sequential(nn.Conv2d(self.inplanes,planes*block.expansion,kernel_size=1,stride=stride,bias=False,),nn.BatchNorm2d(planes*block.expansion),)layers=[]layers.append(block(self.inplanes,planes,stride,downsample))self.inplanes=planes*block.expansionforiinrange(1,blocks):layers.append(block(self.inplanes,planes))returnnn.Sequential(*layers)defforward(self,x):x=self.conv1(x)x=self.bn1(x)x=self.relu(x)x=self.maxpool(x)x=self.layer1(x)x=self.layer2(x)x=self.layer3(x)x=self.layer4(x)x=self.avgpool(x)x=x.view(x.size(0),-1)# gazepre_yaw_gaze=self.fc_yaw_gaze(x)pre_pitch_gaze=self.fc_pitch_gaze(x)returnpre_yaw_gaze,pre_pitch_gaze