Десериализуйте неизвестный тип с protobuf-сетью

Сверточные нейронные сети, реализованные в общих структурах, таких как TensorFlow, PyTorch и т. Д., Сохраняют каналы в плоском виде. То есть каждый канал (R, G, B или Y, U, V) хранится в непрерывной области со всеми пикселями в изображении (ширина х высота). Это в отличие от формата, в котором данные канала чередуются внутри каждого пикселя. Таким образом, вам нужно будет сэмплировать субсэмплированные УФ-каналы, чтобы они соответствовали размеру Y-канала, а затем подать их в сеть так же, как данные RGB.

Другие считают, что он работает нормально, но не достигает производительности RGB. См. https://github.com/ducha-aiki/caffenet-benchmark/blob/master/Colorspace.md и Влияние цветового пространства изображения на производительность сверточных нейронных сетей К. Суманта Reddy; Упасна сингх; Пракаш К Уттам.

Маловероятно, что преобразование YUV в RGB станет узким местом. RGB имеет явное преимущество в том, что можно использовать много превосходных моделей с предварительной подготовкой (трансферное обучение).

21
задан Nick VanderPyle 24 March 2009 в 15:36
поделиться

2 ответа

Сначала; для использования сети, существует SerializeWithLengthPrefix и DeserializeWithLengthPrefix которые обрабатывают длину для Вас (дополнительно с тегом). MakeGenericMethod взгляды хорошо на первый взгляд; и это на самом деле соединяется очень тесно к незаконченной фиксации работы, которую я делал для реализации стека RPC: незаконченный код has an override of DeserializeWithLengthPrefix это берет (по существу) a Func<int,Type>, разрешить тег к типу, чтобы помочь десериализовать неожиданные данные на лету.

Если тип сообщения на самом деле касается наследования между BaseMessage и BeginRequest, затем Вам не нужно это; это всегда переходит к самому верхнему типу контракта в иерархии и прокладывает себе путь вниз (из-за некоторых проводных деталей).

Также - у меня не было шанса протестировать его, но следующее могло бы нарушить это:

[ProtoMember(1)]
public override UInt16 messageType
{
    get { return 1; }
}

Это отмечено для сериализации, но не имеет никакого механизма для того, чтобы установить значение. Возможно, это - проблема? Попытайтесь удалить [ProtoMember] здесь, так как я не делаю это полезно - это (что касается сериализации), в основном дубликат [ProtoInclude(...)] маркер.

7
ответ дан 29 November 2019 в 21:57
поделиться

Другой способ справиться с этим - использовать protobuf-net для «тяжелой работы», но использовать собственный заголовок сообщения. Проблема с обработкой сетевых сообщений заключается в том, что они могут быть разбиты через границы. Это обычно требует использования буфера для накопления чтений. Если вы используете свой собственный заголовок, вы можете быть уверены, что сообщение находится там целиком, прежде чем передать его в protobuf-net.

Например:

Отправить

using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
    MyMessage message = new MyMessage();
    ProtoBuf.Serializer.Serialize<BaseMessage>(ms, message);
    byte[] buffer = ms.ToArray();

    int messageType = (int)MessageType.MyMessage;
    _socket.Send(BitConverter.GetBytes(messageType));
    _socket.Send(BitConverter.GetBytes(buffer.Length));
    _socket.Send(buffer);
}

Получить

protected bool EvaluateBuffer(byte[] buffer, int length)
{
    if (length < 8)
    {
        return false;
    }

    MessageType messageType = (MessageType)BitConverter.ToInt32(buffer, 0);
    int size = BitConverter.ToInt32(buffer, 4);
    if (length < size + 8)
    {
        return false;
    }

    using (MemoryStream memoryStream = new MemoryStream(buffer))
    {
        memoryStream.Seek(8, SeekOrigin.Begin);
        if (messageType == MessageType.MyMessage)
        {
            MyMessage message = 
                ProtoBuf.Serializer.Deserialize<MyMessage>(memoryStream);
        }
    }
}

Последний метод будет "опробован" в буфере аккумулятора, пока не будет достаточно данных. Как только требование к размеру выполнено, сообщение может быть десериализовано.

3
ответ дан 29 November 2019 в 21:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: