Módulo de matrices multidimensionales ML
MLMultiArray es el tipo de tensor más común de CoreML. Esta página reúne las funciones del módulo coreml y los métodos de objeto relacionados con creación, conversión, operaciones matemáticas, detección, máscaras, puntos clave y seguimiento.
Esta página incluye:
- creación de tensores
- conversión de datos de Lua, imágenes y OpenCV a tensores
- conversión entre
MLMultiArrayy tensores ORT - operaciones matemáticas, reducciones, ordenación y concatenación habituales
- ayudas de posprocesamiento para detección, OBB, máscaras, puntos clave y seguimiento
Si quieres encapsular en Lua modelos de clasificación, embeddings, texto, detección u otros modelos CoreML generales, las capacidades de esta página son la base principal.
Disponible en versiones posteriores a 20260319
Creación y conversión
coreml.new_multi_array(opts) / coreml.tensor(opts)
matriz, información_del_error = coreml.new_multi_array({
shape = matriz_de_forma,
data_type = tipo_de_datos,
})
Crea una matriz multidimensional CoreML vacía para usarla como entrada del modelo o tensor intermedio.
shapees la forma objetivo, por ejemplo{1, 3, 224, 224}data_typepuede ser"int32","float32","float16"o"double";"float64"es un alias aceptado de"double"coreml.tensor(opts)es un alias equivalente
coreml.multi_array_from_table(data, opts) / coreml.tensor_from_table(data, opts)
matriz, información_del_error = coreml.multi_array_from_table(datos, {
shape = matriz_de_forma,
data_type = tipo_de_datos,
})
Convierte explícitamente los datos de una tabla Lua en MLMultiArray.
shapedebe coincidir con la cantidad total de elementosdata_typesigue las mismas reglas quenew_multi_array()coreml.tensor_from_table(...)es un alias equivalente
coreml.tensor_from_image(image[, opts])
matriz, metadatos = coreml.tensor_from_image(imagen, opciones)
Convierte un objeto de imagen en un tensor según una configuración explícita.
Opciones habituales:
width/heightlayout: solo admite"nchw"y"nhwc"channel_order:"rgb","bgr","gray","grey"o"grayscale"data_typescalemeanstdresize_mode:"stretch","letterbox"o"center_crop"letterbox_mode: admite"center"y"top_left";"topleft"se trata como"top_left"pad_colorinterpolation:"bilinear"o"nearest"alpha_mode:"ignore","white","black"o"premultiply"crop = {x, y, width, height}
Notas:
- Esta función solo realiza la tensorización de imágenes configurada explícitamente; no vincula silenciosamente reglas de preprocesamiento de un modelo concreto.
- Si tiene éxito, el segundo retorno es una tabla de metadatos de preprocesamiento; si falla, devuelve
nil, información_del_error. - Los metadatos suelen incluir
src_width,src_height,crop_x,crop_y,crop_width,crop_height,dst_width,dst_height,resized_width,resized_height,scale_x,scale_y,ratio,pad_left,pad_top,pad_right,pad_bottom,resize_mode,offset_x,offset_yyletterbox_mode.
coreml.tensor_from_images(images[, opts])
tensor_batch, metadatos_batch = coreml.tensor_from_images({img1, img2}, {
width = 640,
height = 640,
layout = "nchw",
})
Convierte varias imágenes en un tensor por lotes.
- Los tamaños de las imágenes originales pueden ser distintos
- El lote se puede formar siempre que cada imagen produzca la misma forma de salida y
data_type - El segundo retorno es una matriz de metadatos alineada con el orden de entrada
coreml.image_from_tensor(tensor[, opts])
objeto_de_imagen, información_del_error = coreml.image_from_tensor(tensor, opts)
Restaura un tensor 2D, 3D o 4D MLMultiArray como objeto de imagen.
Opciones habituales:
-
layout -
channel_order -
batch_index: basado en 1; el valor predeterminado es el primer lote1 -
scale -
mean -
std -
clamp -
value_range:"0_255"o"0_1" -
Solo admite tensores 2D, 3D o 4D.
-
El número de canales solo puede ser
1o3.
coreml.image_to_multi_array(image[, opts])
Es el nombre antiguo de coreml.tensor_from_image(...) y se conserva como alias compatible. El código nuevo debería usar tensor_from_image().
coreml.tensor_from_cv_mat(mat[, opts]) / coreml.multi_array_from_cv_mat(mat[, opts])
Convierte un cv.mat en MLMultiArray.
- Primero hay que ejecutar
require("image.cv") - Ambos nombres son alias equivalentes
coreml.tensor_from_quad(mat, quad[, opts]) / coreml.multi_array_from_quad(mat, quad[, opts])
matriz, información_del_error = coreml.tensor_from_quad(mat, {
{x = 0, y = 0},
{x = 100, y = 0},
{x = 100, y = 32},
{x = 0, y = 32},
}, {
width = 100,
height = 32,
layout = "hwc",
channel_order = "rgb",
data_type = "float32",
})
Recorta en perspectiva una región cuadrilateral de un cv.mat y la convierte directamente en MLMultiArray.
- Primero hay que ejecutar
require("image.cv") quadpuede ser una lista de cuatro puntos o una tabla que contengapoints- Las opciones habituales coinciden con
tensor_from_image(); también admitecontent_width,content_heightyborder_type - Es apropiado para rectificar un cuadro y tensorizarlo antes del OCR
coreml.tensor_from_quads(mat, quads[, opts]) / coreml.multi_array_from_quads(mat, quads[, opts])
batch, información_del_error = coreml.tensor_from_quads(mat, {
{points = quad1, content_width = 96, content_height = 32},
{points = quad2, content_width = 80, content_height = 32},
}, {
width = 96,
height = 32,
resize_mode = "top_left_letterbox",
border_type = "replicate",
})
Recorta varios cuadriláteros y los combina automáticamente en un tensor por lotes.
- Primero hay que ejecutar
require("image.cv") quadsdebe ser una matriz no vacía y cada elemento puede contenerpointscontent_widthycontent_heightde cada elemento sobrescriben los campos globales deopts- El retorno se combina mediante
stack()oconcat()según el rango; es apropiado para procesar varios cuadros de OCR
coreml.multi_array_from_ort_tensor(tensor[, data_type])
matriz, información_del_error = coreml.multi_array_from_ort_tensor(tensor_ORT[, "float32"])
Copia un tensor onnxruntime.tensor nativo en MLMultiArray.
- La función solo existe después de ejecutar
require("onnxruntime"), que la inyecta en el módulocoremlintegrado - La conversión copia los datos en la capa nativa y no pasa por una tabla Lua
- Los tensores de cadenas no se pueden convertir
Comprobación de tipos y alias
coreml.is_multi_array(value) / coreml.is_tensor(value)
es_matriz = coreml.is_multi_array(valor_a_comprobar)
es_matriz = coreml.is_tensor(valor_a_comprobar)
is_tensor() es un alias de is_multi_array() dentro de coreml.
Se utiliza para comprobar si un valor es un objeto coreml_multi_array_object.
Funciones auxiliares del módulo
Ayudas básicas de tensores
coreml.concat(arrays, axis)coreml.stack(arrays, axis)coreml.gather(array, dim, indices)coreml.take(array, indices[, dim])coreml.gather_rows(array, indices)coreml.clamp(array, min, max)coreml.sigmoid(array)coreml.exp(array)coreml.where(condition, x, y)coreml.matmul(lhs, rhs)
Notas:
take()toma valores a lo largo de la primera dimensión de forma predeterminadagather_rows()es un alias práctico detake(array, indices, 1)where()admite escalares yMLMultiArraycombinados, y genera el resultado según las reglas de difusiónmatmul()admite actualmente combinaciones de entradas de rango 1 y 2
Las ayudas geométricas y de detección son nms, box_points, xywh_to_xyxy, xyxy_to_xywh, rotated_iou y rotated_nms. nms usa cajas [N, 4]; rotated_nms, cajas [N, 5]; ambos devuelven índices basados en 1.
Ayudas geométricas y de detección
coreml.nms(boxes, scores[, opts])coreml.box_points(rotated_boxes)coreml.xywh_to_xyxy(boxes)coreml.xyxy_to_xywh(boxes)coreml.rotated_iou(lhs, rhs)coreml.rotated_nms(boxes, scores[, opts])nms()exigeboxescon forma[N, 4]yscorescon forma[N]o[N, C]rotated_nms()exigeboxescon forma[N, 5]; actualmentescoresusa una matriz de números Lua- Ambas funciones devuelven un
MLMultiArraycon índices basados en 1
Las ayudas de decodificación son create_decoder, decode_yolo, decode_yolo_obb, decode_matrix_candidates, decode_dense_detection, records_from_boxes, obb_records_from_rows y points_to_records. Las ayudas de máscaras, puntos clave y seguimiento incluyen threshold_masks, crop_masks_by_boxes, resize_masks, mask_iou, mask_to_polygon, proto_masks, project_masks, db_postprocess, tracker, reshape_keypoints, scale_boxes, clip_boxes, scale_points, scale_keypoints, clip_keypoints, ctc_greedy_decode y sample_logits.
Ayudas de decodificación y registros
coreml.create_decoder(schema)coreml.decode_yolo(output[, opts])coreml.decode_yolo_obb(output[, opts])coreml.decode_matrix_candidates(output, schema[, opts])coreml.decode_dense_detection(output, opts)coreml.records_from_boxes(boxes, scores, class_ids[, keep_indices])coreml.obb_records_from_rows(rows, scores, class_ids[, angles[, keep_indices[, opts]]])coreml.points_to_records(points[, opts])create_decoder()devuelve un objeto decoder con:decode(),:task()y:schema()decode_dense_detection()devuelve{ boxes, scores, labels }; con entrada por lotes devuelve una matriz de resultados por lote. La misma funcióndecode_dense_detection()puede procesar cada salida del lote.decode_dense_detection()exigeopts.strides, una matriz no vacía de enteros positivos- También exige
decode_width,decode_heighty actualmente solo admitebox_encoding = "grid_center_log_wh" records_from_boxes()yobb_records_from_rows()organizan los resultados tensoriales en tablas de registros más cómodas para Lua;points_to_records()hace lo mismo con puntos.
Ayudas de máscaras, puntos clave y seguimiento
-
coreml.threshold_masks(masks, threshold) -
coreml.crop_masks_by_boxes(masks, boxes) -
coreml.resize_masks(masks, width, height[, opts]) -
coreml.mask_iou(lhs_mask, rhs_mask) -
coreml.mask_to_polygon(mask[, opts]) -
coreml.proto_masks(proto, coeffs, boxes, image_width, image_height[, opts]) -
coreml.project_masks(proto, coeffs, boxes, image_width, image_height[, opts]) -
coreml.db_postprocess(score_map[, opts]) -
coreml.tracker([opts]) -
coreml.reshape_keypoints(points[, keypoint_count[, keypoint_dim|opts]]) -
coreml.scale_boxes(boxes, transform) -
coreml.clip_boxes(boxes, clip_width, clip_height) -
coreml.scale_points(points, transform[, opts]) -
coreml.scale_keypoints(points, transform[, opts]) -
coreml.clip_keypoints(points, clip_width, clip_height[, opts]) -
coreml.ctc_greedy_decode(logits[, opts]) -
coreml.sample_logits(logits[, opts]) -
project_masks()es un alias deproto_masks(). -
mask_iou()calcula directamente la intersección sobre unión de dos máscaras. -
mask_iou()admite un tercer argumentoopts, incluidocompare_size = trueo unwidth/heightexplícito. -
db_postprocess()es apropiado para el posprocesamiento de detección de texto DB / DBNet y acepta entradas con forma[H, W],[C, H, W]o[N, C, H, W]. -
db_postprocess()devuelve una matriz de detecciones conscore,pointsyboxen cada elemento; los metadatosmeta/image_metapueden reutilizar directamente los devueltos por la tensorización de imágenes. -
tracker()devuelve un objeto de seguimiento con:update(),:reset(),:state()y:close(). -
ctc_greedy_decode()acepta entradas con forma[T, C]o[N, T, C]. -
ctc_greedy_decode()admiteblank_index,merge_repeated,apply_softmax,return_probabilitiesycharset. -
ctc_greedy_decode()siempre devuelveindices; solo incluyetextsi se proporcionacharset,confidencesi se activaapply_softmaxoreturn_probabilities, yprobabilitiesyprobability_confidencesi se activareturn_probabilities. -
sample_logits()admiteargmax,temperature,top_k,top_p,min_pyseed. -
sample_logits()devuelve un índice único basado en 1 para logits 1D y unMLMultiArrayde índices para logits por lotes.
Métodos básicos del objeto
Consultas básicas
Los métodos básicos son shape(), data_type(), count(), strides(), to_table() y to_cv_mat([opts]); to_cv_mat requiere require("image.cv"). to_ort_tensor([data_type]) se inyecta después de cargar ONNX Runtime.
array:shape()array:data_type()array:count()array:strides()array:to_table()array:to_cv_mat([opts])data_type()devuelve"int32","float32","float16"o"double"to_cv_mat()requiere ejecutar antesrequire("image.cv")
Puente ORT
array:to_ort_tensor([data_type])
Este método solo existe después de ejecutar require("onnxruntime"), que lo inyecta en coreml_multi_array_object.
Transformaciones de tipo y forma
Las transformaciones son astype, clone, reshape, transpose, slice, select, squeeze, unsqueeze y flatten.
-
array:astype(data_type) -
array:clone() -
array:reshape(shape) -
array:transpose(axes) -
array:slice(dim, start, stop[, step]) -
array:select(dim, index) -
array:squeeze([dim]) -
array:unsqueeze(dim) -
array:flatten([start_dim[, end_dim]]) -
reshape(),transpose(),squeeze(),unsqueeze()yflatten()devuelven por defecto una vista sin copiar los datos subyacentes. -
reshape()yflatten()pueden fallar con una disposición no contigua; en ese caso usa antesclone(). -
slice()yselect()devuelven tensores nuevos y contiguos, no vistas. -
Los índices de
slice(),select(),gather()ytake()siguen la convención basada en 1 de la página de ONNX.
Métodos numéricos y de índices
Las operaciones numéricas son gather, take, l2_norm, dot, max, min, add, sub, mul, div, clamp, sigmoid, exp, matmul y scale.
-
array:gather(dim, indices) -
array:take(indices[, dim]) -
array:l2_norm() -
array:dot(other) -
array:max([axis]) -
array:min([axis]) -
array:add(other) -
array:sub(other) -
array:mul(other) -
array:div(other) -
array:clamp(min, max) -
array:sigmoid() -
array:exp() -
array:matmul(other) -
array:scale(number) -
add/sub/mul/divadmiten escalares y broadcasting limitado. -
Los resultados de
sigmoid(),exp()ymatmul()se promocionan a una salida de punto flotante.
Reducciones, ordenación y selección
Las reducciones y ordenaciones son sum, mean, softmax, normalize, argmax, topk y sort. argmax sin eje devuelve un índice lineal basado en 1; topk devuelve { values = tensor, indices = tensor } y sort no devuelve una tabla adicional de índices.
-
array:sum([axis]) -
array:mean([axis]) -
array:softmax([axis]) -
array:normalize([axis]) -
array:argmax([axis]) -
array:topk(k[, axis]) -
array:sort([axis[, descending]]) -
argmax()sin eje devuelve el índice lineal basado en 1 del máximo global. -
argmax(axis)devuelve unMLMultiArrayde índices. -
topk()devuelve{ values = tensor, indices = tensor }. -
sort()devuelve unMLMultiArraynuevo ordenado y no devuelve una tabla de índices adicional.
Métodos geométricos y de posprocesamiento
array:clip_boxes(clip_width, clip_height)array:xywh_to_xyxy()array:xyxy_to_xywh()array:reshape_keypoints([keypoint_count[, keypoint_dim|opts]])array:scale_points(transform[, opts])array:clip_keypoints(clip_width, clip_height[, opts])
Recomendaciones de uso
- Para un modelo CoreML general nuevo,
MLMultiArrayes el tipo de datos de primera clase predeterminado y no conviene convertirlo demasiado pronto en una tabla Lua. - Mantén las operaciones por lotes en objetos tensoriales siempre que sea posible y ejecuta
to_table()principalmente para depuración, datos pequeños o compatibilidad con scripts antiguos. - Especifica explícitamente las reglas de preprocesamiento mediante
tensor_from_image()para evitar codificar en el flujo general el preprocesamiento de un modelo concreto. - Usa
clone()cuando necesites una copia independiente o una disposición contigua.
Ejemplo
local arr = assert(coreml.tensor({
shape = {2, 3},
data_type = "float32",
}))
local filled = assert(coreml.tensor_from_table({
{1, 2, 3},
{4, 5, 6},
}, {
shape = {2, 3},
data_type = "float32",
}))
local merged = assert(coreml.concat({filled, filled}, 1))
print(coreml.is_tensor(merged))
print(merged:shape())