private CellDimensions MapBoundingBoxToCell(int x, int y, int box, BoundingBoxDimensions boxDimensions) =>
 new CellDimensions
 {
     X      = ((float)x + Sigmoid(boxDimensions.X)) * CELL_WIDTH,
     Y      = ((float)y + Sigmoid(boxDimensions.Y)) * CELL_HEIGHT,
     Width  = (float)Math.Exp(boxDimensions.Width) * CELL_WIDTH * anchors[box * 2],
     Height = (float)Math.Exp(boxDimensions.Height) * CELL_HEIGHT * anchors[box * 2 + 1],
 };
Ejemplo n.º 2
0
        public IList <YoloBoundingBox> ParseOutputs(float[] yoloModelOutputs, float threshold = .3F)
        {
            uint rowStride    = BoxesPerCell * selectedOutput.Dimension * (5 + classCount);
            uint columnStride = BoxesPerCell * (classCount + BoxInfoFeatureCount);

            var boxes = new List <YoloBoundingBox>();


            for (uint row = 0; row < selectedOutput.Dimension; row++)
            {
                for (uint column = 0; column < selectedOutput.Dimension; column++)
                {
                    for (uint box = 0; box < BoxesPerCell; box++)
                    {
                        uint channel = (box * (classCount + BoxInfoFeatureCount));
                        for (uint i = 0; i < BoxInfoFeatureCount; i++)
                        {
                            var index = GetOffset(row, column, channel + i);
                        }

                        float confidence = GetConfidence(yoloModelOutputs, row, column, channel);
                        if (confidence < threshold)
                        {
                            continue;
                        }

                        BoundingBoxDimensions boundingBoxDimensions = ExtractBoundingBoxDimensions(yoloModelOutputs, row, column, channel);
                        CellDimensions        mappedBoundingBox     = MapBoundingBoxToCell(row, column, box, boundingBoxDimensions);

                        float[] predictedClasses = ExtractClasses(yoloModelOutputs, row, column, channel);

                        var(topResultIndex, topResultScore) = GetTopResult(predictedClasses);
                        var topScore = topResultScore * confidence;
                        if (topScore < threshold)
                        {
                            continue;
                        }
                        boxes.Add(new YoloBoundingBox()
                        {
                            Dimensions = new BoundingBoxDimensions
                            {
                                X      = mappedBoundingBox.X,
                                Y      = mappedBoundingBox.Y,
                                Width  = mappedBoundingBox.Width,
                                Height = mappedBoundingBox.Height,
                            },
                            Confidence = topScore,
                            Label      = configuration.Labels[topResultIndex],
                            BoxColor   = classColors[topResultIndex % classColors.Length]
                        });
                    }
                }
            }
            return(boxes);
        }
Ejemplo n.º 3
0
        public IList <YoloBoundingBox> ParseOutputs(float[] yoloModelOutputs, float threshold = .3F)
        {
            var boxes = new List <YoloBoundingBox>();

            var featuresPerBox = BOX_INFO_FEATURE_COUNT + CLASS_COUNT;
            var stride         = featuresPerBox * BOXES_PER_CELL;

            for (int row = 0; row < ROW_COUNT; row++)
            {
                for (int column = 0; column < COL_COUNT; column++)
                {
                    for (int box = 0; box < BOXES_PER_CELL; box++)
                    {
                        var channel = (box * (CLASS_COUNT + BOX_INFO_FEATURE_COUNT));

                        BoundingBoxDimensions boundingBoxDimensions = ExtractBoundingBoxDimensions(yoloModelOutputs, row, column, channel);

                        float confidence = GetConfidence(yoloModelOutputs, row, column, channel);

                        CellDimensions mappedBoundingBoxes = MapBoundingBoxToCell(row, column, box, boundingBoxDimensions);

                        if (confidence < threshold)
                        {
                            continue;
                        }

                        float[] predictedClasses = ExtractClasses(yoloModelOutputs, row, column, channel);

                        var(topResultIndex, topResultScore) = GetTopResult(predictedClasses);
                        var topScore = topResultScore * confidence;

                        if (topScore < threshold)
                        {
                            continue;
                        }

                        boxes.Add(new YoloBoundingBox()
                        {
                            Dimensions = new BoundingBoxDimensions
                            {
                                X      = (mappedBoundingBoxes.X - mappedBoundingBoxes.Width / 2),
                                Y      = (mappedBoundingBoxes.Y - mappedBoundingBoxes.Height / 2),
                                Width  = mappedBoundingBoxes.Width,
                                Height = mappedBoundingBoxes.Height,
                            },
                            Confidence = topScore,
                            Label      = labels[topResultIndex],
                            BoxColor   = classColors[topResultIndex]
                        });
                    }
                }
            }
            return(boxes);
        }
Ejemplo n.º 4
0
        private CellDimensions MapBoundingBoxToCell(uint x, uint y, uint box, BoundingBoxDimensions boxDimensions)
        {
            var result = new CellDimensions
            {
                X      = ((float)x + Sigmoid(boxDimensions.X)) * cellWidth,
                Y      = ((float)y + Sigmoid(boxDimensions.Y)) * cellHeight,
                Width  = (float)Math.Exp(boxDimensions.Width) * selectedOutput.Anchors[box * 2],
                Height = (float)Math.Exp(boxDimensions.Height) * selectedOutput.Anchors[box * 2 + 1],
            };

            return(result);
        }
Ejemplo n.º 5
0
        private BoundingBoxDimensions ExtractBoundingBoxDimensions(float[] modelOutput, uint x, uint y, uint channel)
        {
            var result =
                new BoundingBoxDimensions
            {
                X      = modelOutput[GetOffset(x, y, channel)],
                Y      = modelOutput[GetOffset(x, y, channel + 1)],
                Width  = modelOutput[GetOffset(x, y, channel + 2)],
                Height = modelOutput[GetOffset(x, y, channel + 3)]
            };

            return(result);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// для обработки выходных данных, создаваемых моделью
        /// </summary>
        /// <param name="yoloModelOutputs"></param>
        /// <param name="threshold"></param>
        /// <returns></returns>
        public IList <YoloBoundingBox> ParseOutputs(float[] yoloModelOutputs, float threshold = .3F)
        {
            var boxes = new List <YoloBoundingBox>();

            for (int row = 0; row < ROW_COUNT; row++)
            {
                for (int column = 0; column < COL_COUNT; column++)
                {
                    for (int box = 0; box < BOXES_PER_CELL; box++)
                    {
                        var channel = (box * (CLASS_COUNT + BOX_INFO_FEATURE_COUNT));
                        BoundingBoxDimensions boundingBoxDimensions = ExtractBoundingBoxDimensions(yoloModelOutputs, row, column, channel);
                        float          confidence        = GetConfidence(yoloModelOutputs, row, column, channel);
                        CellDimensions mappedBoundingBox = MapBoundingBoxToCell(row, column, box, boundingBoxDimensions);
                        if (confidence < threshold)
                        {
                            continue;
                        }

                        //получение вероятности распределения прогнозируемых классов для текущего ограничивающего прямоугольника
                        float[] predictedClasses = ExtractClasses(yoloModelOutputs, row, column, channel);
                        //получить значение и индекс класса с наибольшей вероятностью для текущего поля и вычислить его оценку
                        var(topResultIndex, topResultScore) = GetTopResult(predictedClasses);
                        var topScore = topResultScore * confidence;
                        if (topScore < threshold)
                        {
                            continue;
                        }

                        boxes.Add(new YoloBoundingBox()
                        {
                            Dimensions = new BoundingBoxDimensions
                            {
                                X      = (mappedBoundingBox.X - mappedBoundingBox.Width / 2),
                                Y      = (mappedBoundingBox.Y - mappedBoundingBox.Height / 2),
                                Width  = mappedBoundingBox.Width,
                                Height = mappedBoundingBox.Height,
                            },
                            Confidence = topScore,
                            Label      = labels[topResultIndex],
                            BoxColor   = classColors[topResultIndex]
                        });
                    }
                }
            }

            return(boxes);
        }
Ejemplo n.º 7
0
    public IList <BoundingBox> ParseOutputs(Tensor modelTensorOutput, float threshold = 0.3F)
    {
        List <BoundingBox> boxes = new List <BoundingBox> ();

        for (int row = 0; row < COL_COUNT; row++)
        {
            for (int colum = 0; colum < ROW_COUNT; colum++)
            {
                for (int box = 0; box < BOXES_PER_CELL; box++)
                {
                    int channel = (box * (classCount + BOX_INFO_FEATURE_COUNT));
                    BoundingBoxDimensions bbd = ExtractBoundingBoxDimensions(modelTensorOutput, colum, row, channel);
                    float confidence          = GetConfidence(modelTensorOutput, colum, row, channel);

                    CellDimensions mappedBoundingBox = MapBoundingBoxToCell(colum, row, box, bbd);

                    if (confidence < threshold)
                    {
                        continue;
                    }

                    float[] predictedClasses = ExtractClasses(modelTensorOutput, colum, row, channel);
                    var(topResultIndex, topResultScore) = GetTopResult(predictedClasses);
                    var topScore = topResultScore * confidence;

                    if (topScore < threshold)
                    {
                        continue;
                    }


                    boxes.Add(new BoundingBox {
                        Dimensions = new BoundingBoxDimensions {
                            X      = (mappedBoundingBox.X - mappedBoundingBox.Width / 2),
                            Y      = (mappedBoundingBox.Y - mappedBoundingBox.Height / 2),
                            Width  = mappedBoundingBox.Width,
                            Height = mappedBoundingBox.Height,
                        },
                        Confidence = topScore,
                        Label      = labels[topResultIndex],
                        BoxColor   = colors[topResultIndex]
                    });
                }
            }
        }
        return(boxes);
    }
        private static BoundingBoxDimensions MapBoundingBoxToCell(int row, int column, int box, BoundingBoxPrediction boxDimensions)
        {
            const float cellWidth  = ImageSettings.imageWidth / columnCount;
            const float cellHeight = ImageSettings.imageHeight / rowCount;

            var mappedBox = new BoundingBoxDimensions
            {
                X      = (row + Sigmoid(boxDimensions.X)) * cellWidth,
                Y      = (column + Sigmoid(boxDimensions.Y)) * cellHeight,
                Width  = (float)Math.Exp(boxDimensions.Width) * cellWidth * boxAnchors[box].x,
                Height = (float)Math.Exp(boxDimensions.Height) * cellHeight * boxAnchors[box].y,
            };

            // The x,y coordinates from the (mapped) bounding box prediction represent the center
            // of the bounding box. We adjust them here to represent the top left corner.
            mappedBox.X -= mappedBox.Width / 2;
            mappedBox.Y -= mappedBox.Height / 2;

            return(mappedBox);
        }
        public IList <YoloBoundingBox> ParseOutputs(float[] yoloModelOutputs, float threshold = .3F)
        {
            var boxes = new List <YoloBoundingBox>();

            for (int row = 0; row < ROW_COUNT; row++)
            {
                for (int column = 0; column < COL_COUNT; column++)
                {
                    for (int box = 0; box < BOXES_PER_CELL; box++)
                    {
                        //Dentro do loop mais interno, calcule a posição inicial da caixa atual na saída de um modelo unidimensional.
                        var channel = (box * (CLASS_COUNT + BOX_INFO_FEATURE_COUNT));

                        //Diretamente abaixo disso, use o método ExtractBoundingBoxDimensions para obter as dimensões da caixa delimitadora atual.
                        BoundingBoxDimensions boundingBoxDimensions = ExtractBoundingBoxDimensions(yoloModelOutputs, row, column, channel);

                        //Em seguida, use o método GetConfidence para obter a confiança para a caixa delimitadora atual.
                        float confidence = GetConfidence(yoloModelOutputs, row, column, channel);

                        //Depois disso, use o método MapBoundingBoxToCell para mapear a caixa delimitadora atual para a célula atual que está sendo processada.
                        CellDimensions mappedBoundingBox = MapBoundingBoxToCell(row, column, box, boundingBoxDimensions);

                        //Antes de efetuar qualquer processamento adicional, verifique se seu valor de confiança é maior que o limite fornecido.
                        //Se não for, processe a próxima caixa delimitadora.
                        if (confidence < threshold)
                        {
                            continue;
                        }


                        //Caso contrário, continue processando a saída.A próxima etapa é obter a distribuição de probabilidade das classes previstas
                        //para a caixa delimitadora atual usando o método ExtractClasses.
                        float[] predictedClasses = ExtractClasses(yoloModelOutputs, row, column, channel);


                        //Em seguida, use o método GetTopResult para obter o valor e o índice da classe com a maior probabilidade para a caixa atual e computar sua pontuação.
                        var(topResultIndex, topResultScore) = GetTopResult(predictedClasses);
                        var topScore = topResultScore * confidence;

                        //Use o topScore para novamente manter somente as caixas delimitadoras que estão acima do limite especificado.
                        if (topScore < threshold)
                        {
                            continue;
                        }

                        //Por fim, se a caixa delimitadora atual exceder o limite, crie um objeto BoundingBox e adicione-o à lista boxes.
                        boxes.Add(new YoloBoundingBox()
                        {
                            Dimensions = new BoundingBoxDimensions
                            {
                                X      = (mappedBoundingBox.X - mappedBoundingBox.Width / 2),
                                Y      = (mappedBoundingBox.Y - mappedBoundingBox.Height / 2),
                                Width  = mappedBoundingBox.Width,
                                Height = mappedBoundingBox.Height,
                            },
                            Confidence = topScore,
                            Label      = labels[topResultIndex],
                            BoxColor   = classColors[topResultIndex]
                        });
                    }
                }
            }

            return(boxes);
        }