Oblix/yolov8x-doclaynet_ONNX

Oblix
Detección de objetos

Oblix/yolov8x-doclaynet_ONNX es un modelo para la detección de objetos y segmentación de layout de documentos, compatible con Transformers.js y con pesos en formato ONNX. Ideal para aplicaciones que requieren identificación precisa de estructuras de documentos.

Como usar

Para usar este modelo, primero se debe instalar la librería de Transformers.js desde NPM utilizando:

npm i @xenova/transformers

Ejemplo: Realizar detección de objetos con Oblix/yolov8x-doclaynet_ONNX.

import { AutoModel, AutoProcessor, RawImage } from '@xenova/transformers';

const model = await AutoModel.from_pretrained(
  "Oblix/yolov8x-doclaynet_ONNX",
  {
    quantized: false,
  }
);
const processor = await AutoProcessor.from_pretrained("Oblix/yolov8x-doclaynet_ONNX");

const url = 'https://huggingface.co/DILHTWD/documentlayoutsegmentation_YOLOv8_ondoclaynet/resolve/main/sample1.png';
const rawImage = await RawImage.fromURL(url);
const { pixel_values } = await processor(rawImage);
const output = await model({ images: pixel_values });

// Post-process:
const permuted = output.output0[0].transpose(1, 0);
// `permuted` es un Tensor de forma [ 8400, 15 ]:
// - 8400 cuadros delimitadores potenciales
// - 15 parámetros para cada cuadro:
//   - los primeros 4 son las coordenadas de los cuadros delimitadores (x-center, y-center, ancho, alto)
//   - los 11 restantes son las probabilidades para cada clase

// Código de ejemplo para formatearlo correctamente:
const results = [];
const threshold = 0.5; // Ajuste el umbral según sea necesario
const [scaledHeight, scaledWidth] = pixel_values.dims.slice(-2);
for (const [xc, yc, w, h, ...scores] of permuted.tolist()) {
  // Obtener valores de píxeles, teniendo en cuenta el tamaño original de la imagen
  const x1 = (xc - w / 2) / scaledWidth * rawImage.width;
  const y1 = (yc - h / 2) / scaledHeight * rawImage.height;
  const x2 = (xc + w / 2) / scaledWidth * rawImage.width;
  const y2 = (yc + h / 2) / scaledHeight * rawImage.height;

  // Obtener la mejor clase
  const argmax = scores.reduce((maxIndex, currentVal, currentIndex, arr) => currentVal > arr[maxIndex] ? currentIndex : maxIndex, 0);
  const score = scores[argmax];
  if (score < threshold) continue; // No es lo suficientemente confiable

  const label = model.config.id2label[argmax];
  results.push({
    x1, x2, y1, y2, score, label, index: argmax,
  });
}

const iouThreshold = 0.5; // Ajuste el umbral según sea necesario
const filteredResults = removeDuplicates(results, iouThreshold);
console.log(filteredResults);

function removeDuplicates(detections, iouThreshold) {
  const filteredDetections = [];

  for (const detection of detections) {
    let isDuplicate = false;
    let duplicateIndex = -1;
    let maxIoU = 0;

    for (let i = 0; i < filteredDetections.length; i++) {
      const filteredDetection = filteredDetections[i];
      const iou = calculateIoU(detection, filteredDetection);
      if (iou > iouThreshold) {
        isDuplicate = true;
        if (iou > maxIoU) {
          maxIoU = iou;
          duplicateIndex = i;
        }
      }
    }

    if (!isDuplicate) {
      filteredDetections.push(detection);
    } else if (duplicateIndex !== -1) {
      if (detection.score > filteredDetections[duplicateIndex].score) {
        filteredDetections[duplicateIndex] = detection;
      }
    }
  }

  return filteredDetections;
}

function calculateIoU(detection1, detection2) {
  const xOverlap = Math.max(0, Math.min(detection1.x2, detection2.x2) - Math.max(detection1.x1, detection2.x1));
  const yOverlap = Math.max(0, Math.min(detection1.y2, detection2.y2) - Math.max(detection1.y1, detection2.y1));
  const overlapArea = xOverlap * yOverlap;

  const area1 = (detection1.x2 - detection1.x1) * (detection1.y2 - detection1.y1);
  const area2 = (detection2.x2 - detection2.x1) * (detection2.y2 - detection2.y1);
  const unionArea = area1 + area2 - overlapArea;

  return overlapArea / unionArea;
}

Funcionalidades

Detección de objetos
Segmentación de layout de documentos
Compatibilidad con Transformers.js
Pesos en ONNX
11 parámetros para cada cuadro delimitador

Casos de uso

Detección y clasificación de layouts en documentos
Identificación de elementos como encabezados, pies de página, títulos, etc.
Mejora en la extracción de datos de documentos escaneados