Red de conocimiento informático - Aprendizaje de programación - Cómo configurar proto al entrenar el modelo gmm en htk

Cómo configurar proto al entrenar el modelo gmm en htk

Esto depende del tipo de variable específica, consulte un ejemplo:

En los juegos en línea, la sincronización entre jugadores es una de las funciones más básicas y la sincronización se logra mediante la transmisión de coordenadas, así que supongamos que Modelo simple que cuando la posición del jugador cambia, enviará la nueva posición del jugador a todos los jugadores en el mapa y escribirá el siguiente archivo de protocolo basado en esto.

mensaje PlayerPos{

requerido uint32 playerID = 1;

requerido float posX = 2

requerido float posY = 3;

}

Hay un problema con esto, es decir, los juegos de hoy son todos juegos en 3D, por lo que necesitas xyz para representar la posición y otro conjunto de xyz para representar la dirección. Si usa variables simples, esto sería confuso, y dado que la posición y la orientación son en realidad un conjunto de xyz, puede extraer el xyz, convertirlo en un tipo de datos compuesto y colocarlo en un archivo separado. Esto constituye el siguiente documento.

archivo vector.proto

mensaje vector3D{

flotador requerido x = 1

flotador requerido y = 2;

requerido float z = 3

};

archivo Player.proto

importar "vector.proto"; >mensaje PlayerPos {

requerido uint32 playerID = 1;

requerido vector3D pos = 2

}

Compile el archivo vectorial; Primero, preste atención a la ruta cuando utilice la importación. En este ejemplo, los dos archivos están ubicados en el mismo directorio.

protoc --cpp_out=.proto

Se ha generado el archivo correspondiente al proto, pero ¿cómo asignarlo? Después de comprobar la API durante mucho tiempo, no lo sé. en absoluto, así que solo tengo que mirar el archivo de clase generado

//required uint32 playerID = 1;

inline bool has_playerid() const;

inline void clear_playerid();

static const int kPlayerIDFieldNumber = 1;

inline::google.:protobuf::uint32 playerid() const;

inline void set_playerid(::google::protobuf:: uint32 value);

// Requerido .vector3D pos = 2;

inline bool has_pos() const;

inline void clear_pos();

static const int kPosFieldNumber = 2;

inline const::vector3Damp pos() const; inline::vector3D* mutable_pos();

inline::vector3D* release_pos();

inline void set_allocated_pos(:.vector3D* pos);

Algunos códigos fuente generados se enumeran arriba, principalmente variables operativas de la función PlayerPos. El primer playID es muy simple. Puede ver que puede usar set_playerid () directamente, pero para pos anidados, descubrimos que no existe un método set_pos correspondiente, pero Encontré una función set_allocated_pos(), que también comienza con set. Veamos qué hace esta función.

inline void PlayerPos::set_allocated_pos(:vector3D* pos) {

eliminar pos_;

pos_ = pos;

if ( pos) {

set_has_pos(

} más {

clear_has_pos()

}

}

Parece que esto podría ser una tarea, simplemente llame a set_allocated_pos() y mire

PlayerPos player;

vector3D tmp;

p>

tmp.x = 1;

tmp.y = 2;

tmp.z = 3;

player.set_allocated_pos(amp; tmp)

La compilación es normal, pero ocurre un error al ejecutar, ¡y es un error muy extraño!

::vector3D* pos_;

::google::protobuf::uint32 playerid_;

Lo anterior es la forma de almacenamiento de variables en PlayerPos. Lo que se almacena es un puntero. Si tmp es una variable local según la asignación anterior, la variable local se destruirá automáticamente cuando la función regrese y pos_ aún se guarda en la ubicación del tmp destruido, por lo que se producirá un error. Esto se puede resolver usando new Esta pregunta, es decir, el método de asignación es el siguiente

PlayerPos player;

vector3D *tmp = new Vector3D;

tmp-gt; x = 1;

tmp-gt;y = 2;

tmp-gt;z = 3;

player.set_allocated_pos(tmp )

Eso es todo. No hay problemas para compilar y ejecutar.

Otro método es llamar a mutable_pos()

inline::vector3D* PlayerPos::mutable_pos() {

set_has_pos();

if (pos_ == NULL) pos_ = new::vector3D;

return pos_;

}

mutable_pos() en sí mismo tiene un objeto vector3D, y vector3D implementa la sobrecarga de asignaciones, por lo que este problema se puede resolver así

PlayerPos player;

vector3D *tmp = player.mutable_pos()

tmp - gt;x = 1;

tmp-gt;y = 2;

tmp-gt;z = 3;

Reproductor PlayerPos;

vector3D *tmp = reproductor.