|
|
|
|
using ZeroLevel.Services.Serialization;
|
|
|
|
|
|
|
|
|
|
namespace ZeroLevel.ML.DNN.Models
|
|
|
|
|
{
|
|
|
|
|
public class YoloPrediction
|
|
|
|
|
: IBinarySerializable
|
|
|
|
|
{
|
|
|
|
|
public int Class { get; set; }
|
|
|
|
|
public float Cx { get; set; }
|
|
|
|
|
public float Cy { get; set; }
|
|
|
|
|
public float W { get; set; }
|
|
|
|
|
public float H { get; set; }
|
|
|
|
|
public float Score { get; set; }
|
|
|
|
|
public string Label { get; set; } = string.Empty;
|
|
|
|
|
|
|
|
|
|
public float X { get { return Cx - W / 2.0f; } }
|
|
|
|
|
public float Y { get { return Cy - W / 2.0f; } }
|
|
|
|
|
|
|
|
|
|
public float Area { get { return W * H; } }
|
|
|
|
|
|
|
|
|
|
public string Description
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return $"{Label} ({(int)(Score * 100)} %)";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public float this[int index]
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
switch (index)
|
|
|
|
|
{
|
|
|
|
|
case 0: return Cx;
|
|
|
|
|
case 1: return Cy;
|
|
|
|
|
case 2: return Cx + W;
|
|
|
|
|
case 3: return Cy + H;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Serialize(IBinaryWriter writer)
|
|
|
|
|
{
|
|
|
|
|
writer.WriteInt32(Class);
|
|
|
|
|
writer.WriteFloat(Cx);
|
|
|
|
|
writer.WriteFloat(Cy);
|
|
|
|
|
writer.WriteFloat(W);
|
|
|
|
|
writer.WriteFloat(H);
|
|
|
|
|
writer.WriteFloat(Score);
|
|
|
|
|
writer.WriteString(Label);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Deserialize(IBinaryReader reader)
|
|
|
|
|
{
|
|
|
|
|
Class = reader.ReadInt32();
|
|
|
|
|
Cx = reader.ReadFloat();
|
|
|
|
|
Cy = reader.ReadFloat();
|
|
|
|
|
W = reader.ReadFloat();
|
|
|
|
|
H = reader.ReadFloat();
|
|
|
|
|
Score = reader.ReadFloat();
|
|
|
|
|
Label = reader.ReadString();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|