Video_based_ReID_RNN

Prefacio

A continuación, echemos un vistazo a uno de los métodos de agregación temporal del modelo de entrenamiento de re-reconocimiento de peatones por video: RNN.
Este es un modelo de uso común en el entrenamiento de modelos de secuencia. RNN puede extraer la información contenida en imágenes continuas. Aquí se utiliza la estructura RNN más simple.
Los resultados de las pruebas actuales de este método no son tan buenos como los de otros tipos, como la Parte B:
Inserte la descripción de la imagen aquí

Entrada de modelo

La diferencia entre la entrada y la anterior está solo en la red de paso:

  • imgs
    • imgs.size () = [b, s, c, h, w]
    • En el nivel de entrenamiento, b es por lotes y generalmente se establece en 32, seq_len se establece en 4, c es el número de canales es 3, h es la altura de la imagen, w es la anchura de la imagen

Parámetros de inicialización del modelo

        model = models.init_model(name=args.arch, num_classes=dataset.num_train_pids, loss={
    
    'xent', 'htri'})
  • name El nombre del modelo utilizado
  • dataset.num_train_pids El número de clasificaciones durante la clasificación
  • pérdida xent = pérdida de entropía cruzada htri = triple pérdida

Realización de modelos

class ResNet50RNN(nn.Module):
    def __init__(self, num_classes, loss={
    
    'xent'}, **kwargs):
        super(ResNet50RNN, self).__init__()
        self.loss = loss
        resnet50 = torchvision.models.resnet50(pretrained=True)
        self.base = nn.Sequential(*list(resnet50.children())[:-2])
        self.hidden_dim = 512
        self.feat_dim = 2048
        self.classifier = nn.Linear(self.hidden_dim, num_classes)
        #                   输入特征维数2048              LSTM中隐层的维度              循环神经网络的层数
        #输入的数据shape=(batch_size,seq_length,embedding_dim),而batch_first默认是False,所以我们的输入数据最好送进LSTM之前将batch_size与seq_length这两个维度调换?
        self.lstm = nn.LSTM(input_size=self.feat_dim, hidden_size=self.hidden_dim, num_layers=1, batch_first=True)

	# x = [32,4,3,224,112] [b,s,c,h,w]
    def forward(self, x):
        # b=32
        b = x.size(0)
        # t= 4
        t = x.size(1)
        # x = [128,3,224,112]
        x = x.view(b*t,x.size(2), x.size(3), x.size(4))
		# x = [128,2048,7,4]
        x = self.base(x)
		# [128,2048,1,1]
        x = F.avg_pool2d(x, x.size()[2:])
        x = x.view(b,t,-1)
        # x = [32,2048,4]
        # 使用RNN直接获取特征
        # output = [32,4,512]?
        output, (h_n, c_n) = self.lstm(x)
        # output = [32,512,4]
        output = output.permute(0, 2, 1)
        # f = [32,512]
        f = F.avg_pool1d(output, t)
        f = f.view(b, self.hidden_dim)
        
        if not self.training:
            return f
        y = self.classifier(f)

        if self.loss == {
    
    'xent'}:
            return y
        elif self.loss == {
    
    'xent', 'htri'}:
            return y, f
        elif self.loss == {
    
    'cent'}:
            return y, f
        else:
            raise KeyError("Unsupported loss: {}".format(self.loss))

Supongo que te gusta

Origin blog.csdn.net/qq_37747189/article/details/114746628
Recomendado
Clasificación