Module de tableaux multidimensionnels ML
MLMultiArray est le type de tenseur le plus courant dans CoreML.
Cette page décrit de manière unifiée les fonctions au niveau du module et les méthodes d’objet liées à MLMultiArray dans le module coreml, notamment :
- créer des tenseurs ;
- convertir des données Lua, image ou OpenCV en tenseurs ;
- convertir dans les deux sens entre
MLMultiArrayet les tenseurs ORT ; - effectuer les opérations mathématiques, réductions, tris et concaténations courants ;
- fournir des fonctions auxiliaires de post-traitement pour la détection, les OBB, les masques, les points clés, les trackers, etc.
Si vous encapsulez dans Lua un modèle CoreML générique de classification, d’embedding, de texte, de détection ou autre, les fonctionnalités de cette page constituent la base principale.
Ce module est disponible à partir des versions postérieures au 20260319
Création et conversion
coreml.new_multi_array(opts) / coreml.tensor(opts)
objet_multi_array, message_erreur = coreml.new_multi_array({
shape = tableau_forme,
data_type = type_donnees,
})
Crée un objet tableau multidimensionnel CoreML vide, destiné à être utilisé ensuite comme entrée de modèle ou tenseur intermédiaire.
shapeest la forme cible, par exemple{1, 3, 224, 224}data_typeaccepte éventuellement"int32","float32","float16"ou"double";"float64"peut servir d’alias à"double"coreml.tensor(opts)est un alias synonyme
coreml.multi_array_from_table(data, opts) / coreml.tensor_from_table(data, opts)
objet_multi_array, message_erreur = coreml.multi_array_from_table(tableau_donnees, {
shape = tableau_forme,
data_type = type_donnees,
})
Convertit explicitement les données d’une table Lua en MLMultiArray.
shapedoit correspondre à la quantité totale de données- les règles de
data_typesont les mêmes que pournew_multi_array() coreml.tensor_from_table(...)est un alias synonyme
coreml.tensor_from_image(image[, opts])
objet_multi_array, metadonnees = coreml.tensor_from_image(image, configuration)
Convertit un objet image en tenseur utilisable par CoreML selon une configuration explicite.
Champs de configuration courants :
width/heightlayout: prend uniquement en charge"nchw"et"nhwc"channel_order:"rgb","bgr","gray","grey"ou"grayscale"data_typescalemeanstdresize_mode:"stretch","letterbox"ou"center_crop"letterbox_mode: prend en charge"center"et"top_left";"topleft"est également traité comme"top_left"pad_colorinterpolation:"bilinear"ou"nearest"alpha_mode:"ignore","white","black"ou"premultiply"crop = {x, y, width, height}
Description :
- cette fonction ne fait que tensoriser l’image selon une configuration explicite ; elle n’associe implicitement aucune règle de prétraitement à un modèle particulier
- en cas de réussite, la deuxième valeur renvoyée est une table de métadonnées du prétraitement ; en cas d’échec, elle renvoie
nil, message_erreur - les champs courants des métadonnées comprennent :
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_y,letterbox_mode
coreml.tensor_from_images(images[, opts])
tenseur_batch, metadonnees_batch = coreml.tensor_from_images({img1, img2}, {
width = 640,
height = 640,
layout = "nchw",
})
Convertit un ensemble d’images en tenseur MLMultiArray par batch.
- les dimensions des images d’origine peuvent différer
- tant que la forme de sortie analysée et le
data_typesont identiques pour chaque image, elles peuvent être assemblées en batch - la deuxième valeur renvoyée est le tableau de métadonnées correspondant à l’ordre des entrées
coreml.image_from_tensor(tensor[, opts])
objet_image, message_erreur = coreml.image_from_tensor(tenseur, opts)
Restaure un objet image à partir d’un MLMultiArray 2D, 3D ou 4D, ce qui convient au débogage des entrées et sorties d’un modèle.
Champs de configuration courants :
layoutchannel_orderbatch_index: 1-based, le premier batch1par défautscalemeanstdclampvalue_range:"0_255"ou"0_1"
Description :
- seuls les tenseurs 2D, 3D et 4D sont pris en charge
- le nombre de canaux doit être
1ou3
coreml.image_to_multi_array(image[, opts])
Il s’agit de l’ancien nom d’interface ; il n’est actuellement qu’un alias de compatibilité de coreml.tensor_from_image(...). Dans le nouveau code, il est recommandé d’utiliser uniformément tensor_from_image().
coreml.tensor_from_cv_mat(mat[, opts]) / coreml.multi_array_from_cv_mat(mat[, opts])
Convertit un cv.mat en MLMultiArray.
- il faut d’abord exécuter
require("image.cv") - les deux noms sont des alias synonymes
coreml.tensor_from_quad(mat, quad[, opts]) / coreml.multi_array_from_quad(mat, quad[, opts])
objet_multi_array, message_erreur = 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",
})
Effectue un recadrage en perspective d’une zone quadrilatérale dans un cv.mat, puis produit directement un MLMultiArray.
- il faut d’abord exécuter
require("image.cv") quadpeut recevoir directement quatre points ou une table comportant un champpoints- les
optscourants sont globalement les mêmes que pourtensor_from_image(); les champs supplémentaires courants sontcontent_width,content_heightetborder_type - convient au redressement d’une seule boîte puis à sa tensorisation avant la reconnaissance OCR
coreml.tensor_from_quads(mat, quads[, opts]) / coreml.multi_array_from_quads(mat, quads[, opts])
tenseur_batch, message_erreur = 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",
})
Recadre plusieurs quadrilatères et les assemble automatiquement en tenseur batch.
- il faut d’abord exécuter
require("image.cv") quadsdoit être un tableau non vide ; chaque élément peut comporterpointscontent_widthetcontent_heightde chaque élément remplacent les champs homonymes deoptsglobal- la valeur renvoyée est assemblée en batch par
stack()ouconcat()selon le rang du résultat ; cela convient au traitement OCR de plusieurs boîtes
coreml.multi_array_from_ort_tensor(tensor[, data_type])
objet_multi_array, message_erreur = coreml.multi_array_from_ort_tensor(tenseur_ORT[, "float32"])
Copie nativement un onnxruntime.tensor en MLMultiArray.
- cette fonction n’existe pas par défaut ; elle est injectée dans le module
coremlintégré uniquement après l’exécution derequire("onnxruntime") - la conversion effectue une copie au niveau natif, sans passer par une table Lua
- un tenseur
stringne peut pas être converti enMLMultiArray
Détermination du type et alias
coreml.is_multi_array(value) / coreml.is_tensor(value)
est_multi_array = coreml.is_multi_array(valeur_a_tester)
Détermine si une valeur est un coreml_multi_array_object. is_tensor() est un alias synonyme.
Fonctions auxiliaires du module
Fonctions auxiliaires de base des tenseurs
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)
Description :
take()prélève les valeurs le long de la première dimension1par défautgather_rows()est un alias pratique detake(array, indices, 1)where()accepte un mélange de scalaires et deMLMultiArray, et produit le résultat selon les règles de broadcastingmatmul()prend actuellement en charge les combinaisons d’entrées de rang 1 et de rang 2
Fonctions auxiliaires géométriques et de détection
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])
Description :
boxesdenms()doit être[N, 4]etscoresdoit être[N]ou[N, C]boxesderotated_nms()doit être[N, 5]; actuellement,scoresutilise un tableau Lua de nombres- les deux fonctions renvoient un
MLMultiArraycontenant des indices 1-based
Fonctions auxiliaires de décodage et de records
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])
Description :
create_decoder()renvoie un objet decoder prenant en charge:decode(),:task()et:schema()decode_dense_detection()renvoie{ boxes, scores, labels }; lorsque l’entrée est un batch, elle renvoie un tableau de résultats par batchopts.stridesdedecode_dense_detection()est obligatoire et doit être un tableau non vide d’entiers positifsdecode_dense_detection()exige égalementdecode_widthetdecode_height, et ne prend actuellement en charge quebox_encoding = "grid_center_log_wh"records_from_boxes(),obb_records_from_rows()etpoints_to_records()organisent les résultats tensoriels en tables de records mieux adaptées à Lua
Fonctions auxiliaires des masques, points clés et suivis
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])
Description :
project_masks()est un alias deproto_masks()mask_iou()sert à calculer directement l’intersection sur union de deux masquesmask_iou()accepte également un troisième paramètreopts, auquel on peut transmettrecompare_size = trueou fournir explicitementwidth/heightcomme dimensions de comparaison après alignementdb_postprocess()convient au post-traitement de détection de texte de type DB / DBNet ; l’entrée accepte[H, W],[C, H, W]ou[N, C, H, W]db_postprocess()renvoie un tableau de détections, chaque élément contenantscore,pointsetbox;meta/image_metapeuvent réutiliser directement les métadonnées renvoyées par la tensorisation d’imagetracker()renvoie un objet de suivi prenant en charge:update(),:reset(),:state()et:close()- l’entrée de
ctc_greedy_decode()accepte[T, C]ou[N, T, C] ctc_greedy_decode()prend en chargeblank_index,merge_repeated,apply_softmax,return_probabilitiesetcharsetctc_greedy_decode()renvoie toujoursindices;textn’est présent que sicharsetest fourni ;confidencen’est présent que siapply_softmaxoureturn_probabilitiesest activé ;probabilitiesetprobability_confidencene sont ajoutés que sireturn_probabilitiesest activésample_logits()prend en chargeargmax,temperature,top_k,top_p,min_petseed- pour des logits 1D,
sample_logits()renvoie un indice 1-based unique ; pour des logits par batch, elle renvoie unMLMultiArrayd’indices
Méthodes de base des objets
Requêtes de base
array:shape()array:data_type()array:count()array:strides()array:to_table()array:to_cv_mat([opts])
Description :
data_type()renvoie"int32","float32","float16"ou"double"to_cv_mat()nécessite d’abord l’exécution derequire("image.cv")
Pont ORT
array:to_ort_tensor([data_type])
Cette méthode n’existe pas par défaut ; elle est injectée dans coreml_multi_array_object uniquement après l’exécution de require("onnxruntime").
Transformations de type et de forme
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]])
Description :
reshape(),transpose(),squeeze(),unsqueeze()etflatten()renvoient par défaut une vue sans copier les données sous-jacentesreshape()/flatten()échouent pour une disposition non contiguë ; dans ce cas, appelez d’abordclone()slice()etselect()renvoient de nouveaux tenseurs contigus, et non une vue- la sémantique des indices de
slice()/select()/gather()/take()est cohérente avec la page ONNX et reste 1-based
Méthodes numériques et d’indexation
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)
Description :
add/sub/mul/divprennent en charge les scalaires et un broadcasting limité- les résultats de
sigmoid(),exp()etmatmul()sont convertis en sortie flottante
Réduction, tri et sélection
array:sum([axis])array:mean([axis])array:softmax([axis])array:normalize([axis])array:argmax([axis])array:topk(k[, axis])array:sort([axis[, descending]])
Description :
- sans axe,
argmax()renvoie l’indice linéaire 1-based de la valeur maximale de tout le tableau argmax(axis)renvoie unMLMultiArraycontenant les indicestopk()renvoie{ values = tenseur, indices = tenseur }sort()renvoie un nouveauMLMultiArraytrié et ne renvoie pas de table d’indices supplémentaire
Méthodes d’objet géométriques et de post-traitement
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])
Ces méthodes et les fonctions de module du même nom partagent la même implémentation sous-jacente ; elles transmettent simplement le tableau courant comme premier paramètre.
Recommandations d’utilisation
- pour les nouvelles interfaces CoreML génériques,
MLMultiArrayest le type de données de première classe par défaut ; il n’est pas recommandé de le convertir trop tôt en table Lua - la plupart des opérations par batch doivent autant que possible être effectuées sur l’objet tenseur ; n’appelez
to_table()que pour le débogage, les petites sorties ou la compatibilité avec l’ancien code - les règles de prétraitement des images doivent être spécifiées explicitement via les paramètres de
tensor_from_image(), afin d’éviter de coder en dur le prétraitement d’un modèle dans un flux générique - si vous avez besoin d’une copie indépendante ou souhaitez rendre contiguë une disposition non contiguë, appelez explicitement
clone()
Exemple
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())