{"id":477286,"date":"2026-04-24T13:45:45","date_gmt":"2026-04-24T13:45:45","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=477286"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=477286","title":{"rendered":"\u0420\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435 \u043b\u0438\u0446 \u0441 \u043f\u043e\u0442\u043e\u043a\u0430 \u043a\u0430\u043c\u0435\u0440\u044b \u0432 .NET MAUI"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/6d0\/801\/5c1\/6d08015c12d12a54c1d0cf4061118b70.jpg\" height=\"350\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/6d0\/801\/5c1\/6d08015c12d12a54c1d0cf4061118b70.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/6d0\/801\/5c1\/6d08015c12d12a54c1d0cf4061118b70.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h2>\u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 SkiaCamera \u0434\u043b\u044f AI\/ML \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0438 \u0441 API<\/h2>\n<h3>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/h3>\n<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0438 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0443\u043c\u0435\u044e\u0442 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 \u043f\u043e\u0447\u0442\u0438 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e, &#8212; \u043e\u0442 QR-\u043a\u043e\u0434\u043e\u0432 \u0434\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043a\u0430\u043b\u043e\u0440\u0438\u0439 \u0432 \u0435\u0434\u0435 \u043d\u0430 \u043d\u0430 \u0444\u043e\u0442\u043e. \u041d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 <strong>.NET MAUI<\/strong>, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b, \u043a\u0430\u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 ML-\u0434\u0432\u0438\u0436\u043a\u0438 \u0432\u0440\u043e\u0434\u0435 <strong>TensorFlow Lite<\/strong>, \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 SDK \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u0442\u0438\u043f\u0430 <strong>ARKit<\/strong> \u043d\u0430 iOS, \u0442\u0430\u043a \u0438 \u0440\u0430\u0437\u043d\u044b\u0435 Vision API. \u0414\u0430\u043b\u0435\u0435 \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0443\u0436\u0435 \u043e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.<\/p>\n<p>\u0418 \u0432\u043e\u0442, \u043a\u043e\u0433\u0434\u0430 \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043e\u0442 \u043a\u0430\u043c\u0435\u0440\u044b, \u043d\u0430\u0448 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 &#8212; \u043f\u0430\u043a\u0435\u0442 <code>DrawnUi.Maui.Camera<\/code>. \u0412 <a href=\"https:\/\/..\/VideoRecording\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u044f \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>SkiaCamera<\/code> \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0430\u0443\u0434\u0438\u043e \u0441 AI \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0437\u0430\u0439\u043c\u0435\u043c\u0441\u044f \u0432\u0438\u0434\u0435\u043e: \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 <strong>\u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u043b\u0438\u0446<\/strong>.<\/p>\n<p><a href=\"https:\/\/github.com\/taublast\/DetectFaces\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435-\u043f\u0440\u0438\u043c\u0435\u0440<\/a>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438\u0434\u0435\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435 \u043b\u0438\u0446\u0435\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <strong>MediaPipe Tasks<\/strong>. \u042f \u0432\u044b\u0431\u0440\u0430\u043b \u044d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0440\u0430\u0434\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0435\u0434\u0438\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043d\u0430 \u0432\u0441\u0435\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445: \u043d\u0430 <strong>iOS, Android \u0438 Windows<\/strong>.<\/p>\n<p>\u0410 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0438\u0441\u0443\u0435\u0442 \u043e\u0432\u0435\u0440\u043b\u0435\u0438 \u0438 \u043f\u0440\u0438\u043a\u043b\u0435\u0438\u0432\u0430\u0435\u0442 \u043c\u0430\u0441\u043a\u0438 \u043a \u0434\u0432\u0438\u0436\u0443\u0449\u0438\u043c\u0441\u044f \u043b\u0438\u0446\u0430\u043c.<\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/69eb740907a5a002303d114e\" data-style=\"\" id=\"69eb740907a5a002303d114e\" width=\"\" data-habr-games=\"\"><\/div>\n<p>\u0412\u0430\u0436\u043d\u043e: \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0430\u0448\u0430 \u0446\u0435\u043b\u044c &#8212; \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c <strong>\u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0436\u0438\u0432\u044b\u0435 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0434\u0440\u044b \u0438\u0437 <\/strong><code><strong>SkiaCamera<\/strong><\/code><strong> \u0434\u043b\u044f AI\/ML \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0438 \u0447\u0435\u0440\u0435\u0437 API<\/strong> \u0432 \u0446\u0435\u043b\u043e\u043c, \u043d\u0435 \u0443\u0445\u043e\u0434\u044f \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0432 \u0434\u0435\u0442\u0430\u043b\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430<\/h3>\n<p>\u041e \u0442\u043e\u043c, \u043a\u0430\u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c <code>SkiaCamera<\/code>, \u044f \u043f\u0438\u0441\u0430\u043b \u0432 <a href=\"https:\/\/..\/VideoRecording\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c XAML \u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u043c \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u043b\u0435\u0439\u0430\u0443\u0442\u0430 .NET MAUI.<\/p>\n<p>\u0414\u043b\u044f \u0437\u0430\u0434\u0430\u0447 AI\/ML \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0435\u043e-\u043f\u043e\u0442\u043e\u043a\u0430:<\/p>\n<pre><code>UseRealtimeVideoProcessing = true;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0422\u043e\u0447\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/h3>\n<p>\u041a\u043e\u0433\u0434\u0430 <code>SkiaCamera<\/code> \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0435\u0432\u044c\u044e, \u043a\u0430\u0434\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435, \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 GPU-\u043f\u0430\u043c\u044f\u0442\u0438. \u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u043a\u0430\u0434\u0440 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0432 \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c. \u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434: <code>OnRawFrameAvailable(RawCameraFrame frame)<\/code>.<\/p>\n<p>\u041f\u0440\u0438\u0445\u043e\u0434\u044f\u0449\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>RawCameraFrame<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 <code>SKImage<\/code>, \u0436\u0438\u0432\u0443\u0449\u0438\u0439 \u0432 GPU, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435. \u041e\u0431\u044b\u0447\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0435\u0433\u043e \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0435\u0449\u0435 \u0447\u0443\u0442\u043e\u043a \u043a\u0440\u043e\u043f\u043d\u0443\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0440\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0435 \u043f\u043e\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f. \u0418 \u0432\u0441\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u043f\u0430\u043a\u0435\u0442\u0435 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c.<\/p>\n<h3>\u0414\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 ML \u043c\u043e\u0434\u0435\u043b\u0438<\/h3>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>RawCameraFrame<\/code> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <code>TryGetRgba(width, height, buffer, orientation, cropRatio)<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0432\u0430\u043c\u0438 <code>byte[]<\/code> RGBA-\u043f\u0438\u043a\u0441\u0435\u043b\u044f\u043c\u0438 \u0432 \u0442\u043e\u043c \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u0435\u043d \u0432\u0430\u0448\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<p>\u0415\u0441\u043b\u0438, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0443\u043a\u0430\u0436\u0435\u0442\u0435 \u043d\u043e\u0432\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440, \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445, &#8212; \u043f\u043e\u0441\u043b\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0432\u043e\u0438 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438 (\u0430\u0441\u043f\u0435\u043a\u0442), \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0441 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443.<\/p>\n<p>\u0412 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438-\u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>cropRatio<\/code> \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0442\u043e \u0435\u0441\u0442\u044c <code>1<\/code> \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u0443\u043c\u0430 (\u0447\u0438\u0442\u0430\u0439, \u043e\u0431\u0440\u0435\u0437\u043a\u0438 \u043f\u043e\u043b\u0435\u0439), \u0438 <code>orientation<\/code> \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e <code>OutputOrientation.Display<\/code> &#8212; \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043d\u0430\u043c \u043d\u0435 \u0431\u044b\u043b\u043e \u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0431\u044b\u043b\u0430 \u0441\u0442\u0440\u043e\u0433\u043e \u201c\u0433\u043e\u043b\u043e\u0432\u043e\u0439 \u0432\u0432\u0435\u0440\u0445\u201d; \u043d\u0430\u043c \u0431\u044b\u043b\u043e \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u043e\u0432\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u0438\u0434\u0438\u0442 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u043e \u0432 \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u0430\u0436\u043d\u0430 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u201c\u0433\u043e\u043b\u043e\u0432\u043e\u0439 \u0432\u0432\u0435\u0440\u0445\u201d, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>OutputOrientation.Portrait<\/code>. \u0418, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u0430\u043c \u0435\u0449\u0435 \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0440\u0435\u0437\u0430\u0442\u044c \u043a\u0430\u0434\u0440, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u0431\u0440\u0430\u0442\u044c \u043a\u0440\u0430\u044f, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e\u0447\u0442\u0438 \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0431\u043b\u0438\u0436\u0435 \u043a \u0446\u0435\u043d\u0442\u0440\u0443. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c <code>cropRatio<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: <code>0.9<\/code> \u0431\u0443\u0434\u0435\u0442 \u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u044b \u043e\u0431\u0440\u0435\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u044e <code>0.1<\/code> \u043f\u043e \u043a\u0440\u0430\u044f\u043c \u043a\u0430\u0434\u0440\u0430.<\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u043e\u0431\u0449\u0435 \u0441 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0431\u0435\u0437 \u044f\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 <code>orientation, cropRatio)<\/code>:<\/p>\n<pre><code>if (!frame.TryGetRgba(targetWidth, targetHeight, _mlFrameBuffers[writeBufferIndex]))return;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0430\u0436\u0435 \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0435\u043b\u0438 \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u0430\u0434\u0440\u044b \u0438\u0437 \u0432\u0438\u0434\u0435\u043e-\u043f\u043e\u0442\u043e\u043a\u0430, \u043f\u043e\u043a\u0430 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0435\u0449\u0435 \u0437\u0430\u043d\u044f\u0442. \u042d\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u0438\u0446, \u043d\u043e \u0438 QR-\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, OCR, \u0440\u0430\u0437\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0432 \u043e\u0431\u0449\u0435\u043c \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f, \u0433\u0434\u0435 \u043c\u043e\u0434\u0435\u043b\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u043e\u043d-\u0441\u0442\u043e\u043f. \u041b\u0443\u0447\u0448\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0447\u0430\u0441\u0442\u044c \u043a\u0430\u0434\u0440\u043e\u0432, \u0447\u0435\u043c \u043f\u0440\u0435\u0432\u044c\u044e \u043a\u0430\u043c\u0435\u0440\u044b \u043d\u0430\u0447\u043d\u0435\u0442 \u043b\u0430\u0433\u0430\u0442\u044c.<\/p>\n<p>\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e ML-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f: \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0442\u043e\u043a \u043a\u0430\u043c\u0435\u0440\u044b, \u0441 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043e\u043c \u043a\u0430\u0434\u0440\u043e\u0432, \u043f\u043e\u043a\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435 \u0435\u0449\u0435 \u0438\u0434\u0435\u0442 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435:<\/p>\n<pre><code>private readonly byte[] _rgbaBuffer = new byte[targetWidth * targetHeight * 4];private readonly SemaphoreSlim _detectorBusy = new(1, 1);protected override void OnRawFrameAvailable(RawCameraFrame frame){if (!_detectorBusy.Wait(0))return;if (!frame.TryGetRgba(targetWidth, targetHeight, _rgbaBuffer, OutputOrientation.Portrait, 0.8f)){_detectorBusy.Release();return;}var snapshot = _rgbaBuffer.ToArray();_ = Task.Run(async () =&gt;{try{await detector.EnqueueDetectionAsync(snapshot, request);}finally{_detectorBusy.Release();}});}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d: \u0432\u043c\u0435\u0441\u0442\u043e <code>ToArray()<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043f\u0443\u043b \u0431\u0443\u0444\u0435\u0440\u043e\u0432, \u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0443\u0445\u043e\u0434\u0438\u0442 \u0438\u0434\u0435\u0442 \u0432 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0430\u0448 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440, \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0435\u0433\u043e \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0432 <code>Task.Run<\/code>:<\/p>\n<pre><code>private readonly byte[][] _mlBuffers =[new byte[targetWidth * targetHeight * 4],new byte[targetWidth * targetHeight * 4]];private const float MlCropRatio = 1f;private readonly object _detectionSync = new();private int _activeBufferIndex = -1;private DetectionWorkItem? _queuedDetectionWorkItem;protected override void OnRawFrameAvailable(RawCameraFrame frame){DetectionWorkItem? workItemToSubmit = null;lock (_detectionSync){int writeBufferIndex = _activeBufferIndex == 0 ? 1 : 0;if (!frame.TryGetRgba(targetWidth, targetHeight, _mlBuffers[writeBufferIndex], OutputOrientation.Portrait, MlCropRatio))return;var workItem = new DetectionWorkItem(writeBufferIndex,targetWidth,targetHeight,0);if (_activeBufferIndex &gt;= 0){_queuedDetectionWorkItem = workItem;return;}_activeBufferIndex = workItem.BufferIndex;workItemToSubmit = workItem;}detectionPipeline.Submit(workItemToSubmit);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0441\u0430\u043c\u043e\u043c\u0443 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0443. <code>OnRawFrameAvailable(...)<\/code> \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043a\u0430\u0434\u0440, \u0440\u0435\u0448\u0430\u0435\u0442, \u043d\u0430\u0434\u043e \u043b\u0438 \u0435\u0433\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u043b\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0438 \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0434\u0430\u043b\u044c\u0448\u0435. \u0412 \u043a\u043e\u043b\u043b\u0431\u044d\u043a\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0436\u0435 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0438, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u0439 \u0441\u0432\u0435\u0436\u0438\u0439 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u0434\u0440. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>OutputOrientation.Display<\/code>, \u0431\u0443\u0444\u0435\u0440 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430 \u0443\u0436\u0435 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0438\u0432\u043e\u0433\u043e \u043f\u0440\u0435\u0432\u044c\u044e, \u0438 \u043f\u043e\u0442\u043e\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u043c\u043f\u0435\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430.<\/p>\n<h3>\u0414\u043b\u044f AI API<\/h3>\n<p>\u0412 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 ML \u0434\u0432\u0438\u0436\u043e\u043a, \u043d\u043e \u0442\u0430 \u0436\u0435 \u0442\u043e\u0447\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 API.<\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e, \u043f\u043e \u0441\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0439 \u043a\u0430\u0434\u0440 \u043f\u0440\u0435\u0432\u044c\u044e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0440\u0430\u0437 \u0432 300 \u043c\u0441 \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u0441\u043b\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043a\u0430\u0434\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 LLM vision API \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442 <code>JPEG<\/code> \u0438\u043b\u0438 <code>PNG<\/code>. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>cropRatio<\/code> \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0438 \u0437\u0434\u0435\u0441\u044c:<\/p>\n<pre><code>private const int RemoteUploadIntervalMs = 300;private long _lastUploadStartedAtMs;private readonly SemaphoreSlim _uploadGate = new(1, 1);protected override void OnRawFrameAvailable(RawCameraFrame frame){if (!_uploadGate.Wait(0))return;long nowMs = Environment.TickCount64;if (nowMs - _lastUploadStartedAtMs &lt; RemoteUploadIntervalMs){_uploadGate.Release();return;}if (!frame.TryGetJpeg(targetWidth, targetHeight, out var payload, 100, OutputOrientation.Portrait, 1f)){_uploadGate.Release();return;}_lastUploadStartedAtMs = nowMs;_ = Task.Run(async () =&gt;{try{await apiClient.UploadImageAsync(payload, \"image\/jpeg\");}finally{_uploadGate.Release();}});}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 <code>SemaphoreSlim.Wait(0)<\/code>: \u043e\u043d \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043b\u043b\u0431\u044d\u043a \u043a\u0430\u043c\u0435\u0440\u044b, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432 \u043f\u043e\u043b\u0435\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430. \u0423\u0436\u0435 \u0434\u0430\u043b\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u0443\u0437\u0443 \u0432 300 \u043c\u0441 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c <code>_lastUploadStartedAtMs<\/code>. \u0415\u0441\u043b\u0438 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0432\u044b\u0437\u043e\u0432 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u043e\u043b\u044c\u0448\u0435 300 \u043c\u0441, \u0442\u043e \u043d\u043e\u0432\u044b\u0435 \u043a\u0430\u0434\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p><code>TryGetJpeg(...)<\/code> \u0438 <code>TryGetPng(...)<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u0442\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u0435 \u0438 \u0441 \u0442\u043e\u0439 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u043b\u0438.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u0448 \u0435\u043d\u0434\u043f\u043e\u0439\u043d\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u044b\u0440\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 <code>RGBA8888<\/code>, \u043c\u043e\u0436\u043d\u043e \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>TryGetRgbaBytes(...)<\/code>.<\/p>\n<h3>\u041e\u0442\u043b\u0430\u0434\u043a\u0430<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u044b \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0435 \u0432 AI\/ML, \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u043a\u0430\u0434\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0433\u0430\u043b\u0435\u0440\u0435\u044e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0433\u043b\u0430\u0437\u0430\u043c\u0438. \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0441 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439, \u043e\u0431\u0440\u0435\u0437\u043a\u043e\u0439 \u0432\u0441\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0430\u043a, \u043a\u0430\u043a \u0432\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0435. \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0434\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0433\u0430\u043b\u0435\u0440\u0435\u0435, \u0441\u043c. <a href=\"https:\/\/github.com\/taublast\/DrawnUi.Maui.Camera\" rel=\"noopener noreferrer nofollow\">README<\/a> <code>SkiaCamera<\/code>, \u0442\u0430\u043c \u0432\u0441\u0451 \u043e\u043f\u0438\u0441\u0430\u043d\u043e.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <code>TryGetJpeg(...)<\/code>, \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u043e\u0432\u043d\u043e \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 <code>JPEG<\/code>:<\/p>\n<pre><code>private bool _saveNextDebugFrame; \/\/\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0432 true \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0434\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043a\u0430\u0434\u0440 \u0432 \u0433\u0430\u043b\u0435\u0440\u0435\u044eprotected override void OnRawFrameAvailable(RawCameraFrame frame){if (_saveNextDebugFrame &amp;&amp;frame.TryGetJpeg(targetWidth, targetHeight, out var payload, 100, OutputOrientation.Portrait, 1f)){_saveNextDebugFrame = false;_ = Task.Run(async () =&gt;{using var stream = new MemoryStream(payload);await NativeControl.SaveJpgStreamToGallery(stream,$\"ml_debug_{DateTime.Now:yyyyMMdd_HHmmss}.jpg\",new Metadata(),\"DebugAlbum\");});}\/\/ ...}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0436\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <code>TryGetRgbaBytes(...)<\/code>, \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 RGBA-\u0431\u0443\u0444\u0435\u0440 \u0432 <code>JPEG<\/code> \u0438 \u0443\u0436\u0435 \u043f\u043e\u0442\u043e\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0433\u0430\u043b\u0435\u0440\u0435\u044e:<\/p>\n<pre><code>private bool _saveNextDebugFrame;protected override void OnRawFrameAvailable(RawCameraFrame frame){if (_saveNextDebugFrame &amp;&amp;frame.TryGetRgbaBytes(targetWidth, targetHeight, out var rgbaBytes, OutputOrientation.Portrait, 1f)){_saveNextDebugFrame = false;_ = Task.Run(async () =&gt;{var imageInfo = new SKImageInfo(targetWidth,targetHeight,SKColorType.Rgba8888,SKAlphaType.Unpremul);using var image = SKImage.FromPixelCopy(imageInfo, rgbaBytes, imageInfo.RowBytes);using var data = image.Encode(SKEncodedImageFormat.Jpeg, 100);using var stream = data.AsStream();await NativeControl.SaveJpgStreamToGallery(stream,$\"ml_debug_rgba_{DateTime.Now:yyyyMMdd_HHmmss}.jpg\",new Metadata(),\"DebugAlbum\");});}\/\/ ...}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0427\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0440\u0430\u0437\u043c\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0435, \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f <code>GPU \u043a\u0430\u0434\u0440 -&gt; CPU \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440\u0430<\/code>.<\/p>\n<h3>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435-\u043f\u0440\u0438\u043c\u0435\u0440<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f AI\/ML, \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0449\u0435. \u042f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e (\u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c): <a href=\"https:\/\/github.com\/taublast\/DetectFaces\/blob\/main\/src\/Implementation.md\" rel=\"noopener noreferrer nofollow\">Implementation.md<\/a>, \u0433\u0434\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u0430 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430, \u0438 <a href=\"https:\/\/github.com\/taublast\/DetectFaces\/blob\/main\/src\/Includes.md\" rel=\"noopener noreferrer nofollow\">Includes.md<\/a>, \u0433\u0434\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f, \u043a\u0430\u043a ML-\u043c\u043e\u0434\u0435\u043b\u0438 \u0437\u0430\u0448\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u0418\u0431\u043e \u0432\u0441\u044e \u043d\u0430\u0448\u0443 \u0441\u0445\u0435\u043c\u0443 \u043b\u0435\u0433\u043a\u043e \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u0435 <code>MediaPipe Tasks<\/code>: \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0435\u043d\u044f\u0435\u0442\u0435 \u043c\u043e\u0434\u0435\u043b\u044c \u0438 \u043f\u0430\u0440\u0441\u0438\u0442\u0435 \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u041e \u0442\u043e\u043c \u043a\u0430\u043a\u0438\u0435 \u0435\u0449\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c, &#8212; \u0447\u0443\u0442\u044c \u043d\u0438\u0436\u0435.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/923\/259\/d49\/923259d49a19a185425338abe2754a38.jpg\" alt=\"\u041c\u0430\u0441\u043a\u0430, \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u043d\u0430\u044f \u043d\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u043b\u0438\u0446\u0435\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438\" height=\"350\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/923\/259\/d49\/923259d49a19a185425338abe2754a38.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/923\/259\/d49\/923259d49a19a185425338abe2754a38.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041c\u0430\u0441\u043a\u0430, \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u043d\u0430\u044f \u043d\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u043b\u0438\u0446\u0435\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u0427\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u043a\u0438-\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u0430\u0441\u043a\u0443 \u0427\u0435\u043b\u043e\u0432\u0435\u043a\u0430-\u043f\u0430\u0443\u043a\u0430 \u0438\u043b\u0438 \u0421\u043c\u0435\u0448\u043d\u0443\u044e \u0448\u043b\u044f\u043f\u0443, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0434\u0430\u044e\u0442 \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043b\u0438\u0446\u0430:<\/p>\n<pre><code>config = ModePicker.SelectedIndex switch{3 =&gt; new MaskConfiguration{Filename = \"hat_cake.png\",Position = MaskPosition.Top,WidthMultiplier = 1.6f,YOffsetRatio = 0.05f},_ =&gt; new MaskConfiguration{Filename = \"mask_spiderman.png\",Position = MaskPosition.Inside,WidthMultiplier = 1.25f,YOffsetRatio = -0.2f}};await CameraControl.SetupMaskAsync(config);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u043c\u0430\u0441\u043a\u0443, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u043f\u043e\u0432\u0435\u0440\u0445 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0444\u043f\u0441, \u043c\u044b \u0434\u0435\u0440\u0436\u0438\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0440\u0430\u0441\u0442\u0440 \u043c\u0430\u0441\u043a\u0438 \u0432 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0435 \u043d\u0430 GPU:<\/p>\n<pre><code>   \/\/\u0433\u0440\u0443\u0437\u0438\u043c \u0438\u0437 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432   using var stream = await FileSystem.OpenAppPackageFileAsync(config.Filename);   using var managed = new MemoryStream();   await stream.CopyToAsync(managed);   managed.Position = 0;   MaskBitmap = SKBitmap.Decode(managed);      \/\/\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0432 GPU \u043f\u043e\u0442\u043e\u043a\u0435: \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432 GPU \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443   SafeAction(() =&gt; \/\/\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0445\u043e\u043b\u0441\u0442\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e SkiaSharp   {   using var gpu = this.CreateSurface(MaskBitmap.Width, MaskBitmap.Height, isGpu: true);   gpu.Canvas.Clear(SKColors.Transparent);   gpu.Canvas.DrawBitmap(MaskBitmap, 0, 0);   gpu.Canvas.Flush();   MaskImage = gpu.Snapshot();   });<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c <code>MaskImage<\/code> \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u043b\u043b\u0431\u044d\u043a\u0435 <code>ProcessFrame<\/code> \u0443 <code>SkiaCamera<\/code>, \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0435\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438.<\/p>\n<p>\u0422\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0432\u0435\u0440\u043b\u0435\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432 <code>ProcessFrame<\/code>, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443 \u043d\u0430\u0441 \u0438 \u043f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0441\u043d\u044f\u0442\u044b\u0445 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439. \u0424\u043e\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>4000x3000<\/code>, \u0438 \u0435\u0441\u043b\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 landmark-\u0442\u043e\u0447\u043a\u0438 \u0438\u043b\u0438 \u043c\u0430\u0441\u043a\u0438 \u0441\u043e \u0442\u043e\u043b\u0449\u0438\u043d\u043e\u0439 <code>stroke<\/code>, \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0439 \u0434\u043b\u044f \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0433\u043e \u043f\u0440\u0435\u0432\u044c\u044e, \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b SkiaSharp \u043d\u0430 \u0442\u0430\u043a\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0432\u0438\u0434\u043d\u044b. \u041c\u044b \u0440\u0435\u0448\u0430\u0435\u043c \u044d\u0442\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u043e\u043b\u0449\u0438\u043d\u044b \u043b\u0438\u043d\u0438\u0438 \u043e\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0439 \u0431\u0430\u0437\u044b \u0432 300 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439:<\/p>\n<pre><code>var density = Math.Min(frame.Width, frame.Height) \/ 300f; _paintDetectionDotsStroke.StrokeWidth = Math.Max(2f, 2f * density); \/\/\u0440\u0438\u0441\u0443\u0435\u043c \u043b\u0435\u043d\u0434\u043c\u0430\u0440\u043a\u0438 - \u043b\u0438\u0446\u0435\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438frame.Canvas.DrawPoints(SKPointMode.Points, pts, _paintDetectionDotsStroke);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0430\u043a \u043c\u0430\u0441\u043a\u0438 \u0438 \u0442\u043e\u0447\u043a\u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u0438 \u0432 \u0436\u0438\u0432\u043e\u043c \u043f\u0440\u0435\u0432\u044c\u044e, \u0438 \u043d\u0430 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0439 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u043a\u0438 \u0432 \u043a\u0430\u0434\u0440\u0435 \u043f\u0440\u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 \u0433\u043e\u043b\u043e\u0432\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u043f\u043b\u0430\u0432\u043d\u0435\u0435, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c One Euro \u0444\u0438\u043b\u044c\u0442\u0440. \u041e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 landmark-\u0442\u043e\u0447\u043a\u0438, \u043f\u043e X \u0438 Y, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u043e\u043c \u043b\u0438\u0446\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u0434\u0440\u043e\u0436\u0430\u043d\u0438\u0435, \u0430 \u043d\u0430 \u0434\u0432\u0438\u0436\u0443\u0449\u0435\u043c\u0441\u044f \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u0448\u0430\u0433\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439, \u0448\u0430\u0433 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 <code>prediction step<\/code> (\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435) \u044d\u043a\u0441\u0442\u0440\u0430\u043f\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u0434\u0432\u0443\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f\u043c \u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u0435\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430, \u043a\u043e\u0433\u0434\u0430 \u0433\u043e\u043b\u043e\u0432\u0430 \u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u043e.<\/p>\n<h4>\u0427\u0442\u043e \u0435\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u044c<\/h4>\n<p>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 &#8212; <code>MediaPipeTasksVision<\/code> \u043d\u0430 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445 \u0438 <code>MediaPipe.Net<\/code> TFLite graphs \u043d\u0430 Windows &#8212; \u0442\u0430\u043a \u0436\u0435 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438: \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u0430\u0439\u043b \u043c\u043e\u0434\u0435\u043b\u0438:<\/p>\n<ul>\n<li>\n<p><strong>Hand landmarks<\/strong> (<code>hand_landmarker.task<\/code>) &#8212; 21 3D-\u0442\u043e\u0447\u043a\u0430 \u0441\u0443\u0441\u0442\u0430\u0432\u043e\u0432 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0440\u0443\u043a\u0443, \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0436\u0435\u0441\u0442\u043e\u0432<\/p>\n<\/li>\n<li>\n<p><strong>Pose landmarks<\/strong> (<code>pose_landmarker.task<\/code>) &#8212; 33 \u0441\u0443\u0441\u0442\u0430\u0432\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0442\u0435\u043b\u0430, \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0439 (\u0444\u0438\u0442\u043d\u0435\u0441, 3D\u2026)<\/p>\n<\/li>\n<li>\n<p><strong>Object detection<\/strong> (<code>efficientdet.task<\/code>) &#8212; \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/p>\n<\/li>\n<li>\n<p><strong>Image segmentation<\/strong> (<code>image_segmenter.task<\/code>) &#8212; \u043f\u043e\u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0444\u043e\u043d\/\u0431\u044d\u043a\u0433\u0440\u0430\u0443\u043d\u0434 (\u0442\u043e\u0442 \u0436\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043b\u0435\u0436\u0438\u0442 \u0432 \u043e\u0441\u043d\u043e\u0432\u0435 \u0440\u0430\u0437\u043c\u044b\u0442\u0438\u044f \u0444\u043e\u043d\u0430 \u0432 Zoom)<\/p>\n<\/li>\n<li>\n<p><strong>Image classification<\/strong> &#8212; \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438-\u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0443\u0436\u0435 \u0440\u0435\u0448\u0438\u043b\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0441\u043c\u0435\u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0441\u0432\u043e\u0434\u0435\u0442\u0441\u044f \u043a \u0440\u0430\u0437\u0431\u043e\u0440\u0443 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430.<\/p>\n<h4>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b<\/h4>\n<ul>\n<li>\n<p>Windows: <code>Mediapipe.Net<\/code> \u0438 <code>Mediapipe.Net.Runtime.CPU<\/code>.<\/p>\n<\/li>\n<li>\n<p>iOS: <code>MediaPipeTasksVision.iOS<\/code> \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 <a href=\"https:\/\/github.com\/v-hogood\/MediaPipeTasks\" rel=\"noopener noreferrer nofollow\">MediaPipeTasks<\/a>.<\/p>\n<\/li>\n<li>\n<p>Android: <code>AppoMobi.Preview.MediaPipeTasksVision.Android<\/code>, \u043c\u043e\u0439 \u0444\u043e\u0440\u043a <code>MediaPipeTasksVision.Android<\/code> <a href=\"https:\/\/github.com\/taublast\/MediaPipeTasks\/tree\/bulkpts\" rel=\"noopener noreferrer nofollow\">\u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438<\/a> \u0434\u043b\u044f \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f landmark-\u0442\u043e\u0447\u0435\u043a, \u0447\u0442\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u0430\u0434\u0440\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 3 \u0440\u0430\u0437\u0430. PR \u0443\u0436\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u043e\u0437\u0436\u0435, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c\u0443 NuGet-\u043f\u0430\u043a\u0435\u0442\u0443 \u0438\u0437 <a href=\"https:\/\/github.com\/v-hogood\/MediaPipeTasks\" rel=\"noopener noreferrer nofollow\">MediaPipeTasks<\/a>.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u0430\u0434\u0440\u044b \u0438\u0437 \u0436\u0438\u0432\u043e\u0433\u043e \u043f\u0440\u0435\u0432\u044c\u044e \u043a\u0430\u043c\u0435\u0440\u044b \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e ML-\u043c\u043e\u0434\u0435\u043b\u044c \u0438\u043b\u0438 \u043d\u0430 API <strong>\u0432 .NET MAUI<\/strong> \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u043e. \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438-\u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0432\u0430\u043c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435.<\/p>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0441\u0442\u0430\u0442\u044c\u044f \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u0430\u0441 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439. \u0415\u0441\u043b\u0438 \u043e\u043d\u0430 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435. \u0412\u043e\u043f\u0440\u043e\u0441\u044b \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u0435\u043b\u043e \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445!<\/p>\n<h3>\u0421\u0441\u044b\u043b\u043a\u0438 \u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u044b<\/h3>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/taublast\/DetectFaces\" rel=\"noopener noreferrer nofollow\">DetectFaces<\/a> &#8212; \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435-\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/taublast\/DrawnUi.Maui.Camera\" rel=\"noopener noreferrer nofollow\">DrawnUi.Maui.Camera<\/a> &#8212; \u044d\u043b\u0435\u043c\u0435\u043d\u0442 <code>SkiaCamera<\/code><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/..\/VideoRecording\/\" rel=\"noopener noreferrer nofollow\">AI Captions and Live Video Processing in .NET MAUI<\/a> &#8212; \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u044d\u0442\u043e\u0439 \u0441\u0435\u0440\u0438\u0438<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/ai.google.dev\/edge\/mediapipe\/solutions\/vision\/face_landmarker\/android\" rel=\"noopener noreferrer nofollow\">MediaPipe Tasks Vision &#8212; Android<\/a> &#8212; \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f MediaPipe \u0434\u043b\u044f Android<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/ai.google.dev\/edge\/mediapipe\/solutions\/vision\/face_landmarker\/ios\" rel=\"noopener noreferrer nofollow\">MediaPipe Tasks Vision &#8212; iOS<\/a> &#8212; \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f MediaPipe \u0434\u043b\u044f iOS<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/gery.casiez.net\/1euro\/\" rel=\"noopener noreferrer nofollow\">One Euro Filter<\/a> &#8212; \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0430\u0441\u043a\u0438<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/taublast\/DrawnUi\" rel=\"noopener noreferrer nofollow\">DrawnUI for .NET MAUI<\/a> &#8212; \u0434\u0432\u0438\u0436\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442 \u043d\u0430\u0448\u0443 SkiaCamera<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/mono\/SkiaSharp\" rel=\"noopener noreferrer nofollow\">SkiaSharp<\/a> &#8212; 2D-\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u0432 \u043e\u0441\u043d\u043e\u0432\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u043b\u0430<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<p><em>\u0410\u0432\u0442\u043e\u0440 \u043e\u0442\u043a\u0440\u044b\u0442 \u0434\u043b\u044f \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 .NET MAUI, \u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0445 UI \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.<\/em><\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1027582\/\">https:\/\/habr.com\/ru\/articles\/1027582\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 SkiaCamera \u0434\u043b\u044f AI\/ML \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0438 \u0441 API\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0421\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0438 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0443\u043c\u0435\u044e\u0442 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 \u043f\u043e\u0447\u0442\u0438 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e, &#8212; \u043e\u0442 QR-\u043a\u043e\u0434\u043e\u0432 \u0434\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043a\u0430\u043b\u043e\u0440\u0438\u0439 \u0432 \u0435\u0434\u0435 \u043d\u0430 \u043d\u0430 \u0444\u043e\u0442\u043e. \u041d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 .NET MAUI, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b, \u043a\u0430\u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 ML-\u0434\u0432\u0438\u0436\u043a\u0438 \u0432\u0440\u043e\u0434\u0435 TensorFlow Lite, \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 SDK \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u0442\u0438\u043f\u0430 ARKit \u043d\u0430 iOS, \u0442\u0430\u043a \u0438 \u0440\u0430\u0437\u043d\u044b\u0435 Vision API. \u0414\u0430\u043b\u0435\u0435 \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0443\u0436\u0435 \u043e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.\u0418 \u0432\u043e\u0442, \u043a\u043e\u0433\u0434\u0430 \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043e\u0442 \u043a\u0430\u043c\u0435\u0440\u044b, \u043d\u0430\u0448 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 &#8212; \u043f\u0430\u043a\u0435\u0442 DrawnUi.Maui.Camera. \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c SkiaCamera \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0430\u0443\u0434\u0438\u043e \u0441 AI \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0437\u0430\u0439\u043c\u0435\u043c\u0441\u044f \u0432\u0438\u0434\u0435\u043e: \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u043b\u0438\u0446.\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435-\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438\u0434\u0435\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435 \u043b\u0438\u0446\u0435\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e MediaPipe Tasks. \u042f \u0432\u044b\u0431\u0440\u0430\u043b \u044d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0440\u0430\u0434\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0435\u0434\u0438\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043d\u0430 \u0432\u0441\u0435\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445: \u043d\u0430 iOS, Android \u0438 Windows.\u0410 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0438\u0441\u0443\u0435\u0442 \u043e\u0432\u0435\u0440\u043b\u0435\u0438 \u0438 \u043f\u0440\u0438\u043a\u043b\u0435\u0438\u0432\u0430\u0435\u0442 \u043c\u0430\u0441\u043a\u0438 \u043a \u0434\u0432\u0438\u0436\u0443\u0449\u0438\u043c\u0441\u044f \u043b\u0438\u0446\u0430\u043c.\u0412\u0430\u0436\u043d\u043e: \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0430\u0448\u0430 \u0446\u0435\u043b\u044c &#8212; \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0436\u0438\u0432\u044b\u0435 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0434\u0440\u044b \u0438\u0437 SkiaCamera \u0434\u043b\u044f AI\/ML \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0438 \u0447\u0435\u0440\u0435\u0437 API \u0432 \u0446\u0435\u043b\u043e\u043c, \u043d\u0435 \u0443\u0445\u043e\u0434\u044f \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0432 \u0434\u0435\u0442\u0430\u043b\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u041e \u0442\u043e\u043c, \u043a\u0430\u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c SkiaCamera, \u044f \u043f\u0438\u0441\u0430\u043b \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c XAML \u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u043c \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u043b\u0435\u0439\u0430\u0443\u0442\u0430 .NET MAUI.\u0414\u043b\u044f \u0437\u0430\u0434\u0430\u0447 AI\/ML \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0435\u043e-\u043f\u043e\u0442\u043e\u043a\u0430:UseRealtimeVideoProcessing = true;\u0422\u043e\u0447\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u041a\u043e\u0433\u0434\u0430 SkiaCamera \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0435\u0432\u044c\u044e, \u043a\u0430\u0434\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435, \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 GPU-\u043f\u0430\u043c\u044f\u0442\u0438. \u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u043a\u0430\u0434\u0440 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0432 \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c. \u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434: OnRawFrameAvailable(RawCameraFrame frame).\u041f\u0440\u0438\u0445\u043e\u0434\u044f\u0449\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 RawCameraFrame \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 SKImage, \u0436\u0438\u0432\u0443\u0449\u0438\u0439 \u0432 GPU, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435. \u041e\u0431\u044b\u0447\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0435\u0433\u043e \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0435\u0449\u0435 \u0447\u0443\u0442\u043e\u043a \u043a\u0440\u043e\u043f\u043d\u0443\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0440\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0435 \u043f\u043e\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f. \u0418 \u0432\u0441\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u043f\u0430\u043a\u0435\u0442\u0435 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c.\u0414\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 ML \u043c\u043e\u0434\u0435\u043b\u0438\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 RawCameraFrame \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 TryGetRgba(width, height, buffer, orientation, cropRatio), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0432\u0430\u043c\u0438 byte[] RGBA-\u043f\u0438\u043a\u0441\u0435\u043b\u044f\u043c\u0438 \u0432 \u0442\u043e\u043c \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u0435\u043d \u0432\u0430\u0448\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438.\u0415\u0441\u043b\u0438, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0443\u043a\u0430\u0436\u0435\u0442\u0435 \u043d\u043e\u0432\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440, \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445, &#8212; \u043f\u043e\u0441\u043b\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0432\u043e\u0438 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438 (\u0430\u0441\u043f\u0435\u043a\u0442), \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0441 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443.\u0412 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438-\u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f cropRatio \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0442\u043e \u0435\u0441\u0442\u044c 1 \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u0443\u043c\u0430 (\u0447\u0438\u0442\u0430\u0439, \u043e\u0431\u0440\u0435\u0437\u043a\u0438 \u043f\u043e\u043b\u0435\u0439), \u0438 orientation \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e OutputOrientation.Display &#8212; \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043d\u0430\u043c \u043d\u0435 \u0431\u044b\u043b\u043e \u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0431\u044b\u043b\u0430 \u0441\u0442\u0440\u043e\u0433\u043e \u201c\u0433\u043e\u043b\u043e\u0432\u043e\u0439 \u0432\u0432\u0435\u0440\u0445\u201d; \u043d\u0430\u043c \u0431\u044b\u043b\u043e \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u043e\u0432\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u0438\u0434\u0438\u0442 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u043e \u0432 \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442.\u0415\u0441\u043b\u0438 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u0430\u0436\u043d\u0430 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u201c\u0433\u043e\u043b\u043e\u0432\u043e\u0439 \u0432\u0432\u0435\u0440\u0445\u201d, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c OutputOrientation.Portrait. \u0418, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u0430\u043c \u0435\u0449\u0435 \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0440\u0435\u0437\u0430\u0442\u044c \u043a\u0430\u0434\u0440, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u0431\u0440\u0430\u0442\u044c \u043a\u0440\u0430\u044f, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e\u0447\u0442\u0438 \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0431\u043b\u0438\u0436\u0435 \u043a \u0446\u0435\u043d\u0442\u0440\u0443. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c cropRatio. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: 0.9 \u0431\u0443\u0434\u0435\u0442 \u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u044b \u043e\u0431\u0440\u0435\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u044e 0.1 \u043f\u043e \u043a\u0440\u0430\u044f\u043c \u043a\u0430\u0434\u0440\u0430.\u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u043e\u0431\u0449\u0435 \u0441 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0431\u0435\u0437 \u044f\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 orientation, cropRatio):if (!frame.TryGetRgba(targetWidth, targetHeight, _mlFrameBuffers[writeBufferIndex]))return;\u0414\u0430\u0436\u0435 \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0435\u043b\u0438 \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u0430\u0434\u0440\u044b \u0438\u0437 \u0432\u0438\u0434\u0435\u043e-\u043f\u043e\u0442\u043e\u043a\u0430, \u043f\u043e\u043a\u0430 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0435\u0449\u0435 \u0437\u0430\u043d\u044f\u0442. \u042d\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u0438\u0446, \u043d\u043e \u0438 QR-\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, OCR, \u0440\u0430\u0437\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0432 \u043e\u0431\u0449\u0435\u043c \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f, \u0433\u0434\u0435 \u043c\u043e\u0434\u0435\u043b\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u043e\u043d-\u0441\u0442\u043e\u043f. \u041b\u0443\u0447\u0448\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0447\u0430\u0441\u0442\u044c \u043a\u0430\u0434\u0440\u043e\u0432, \u0447\u0435\u043c \u043f\u0440\u0435\u0432\u044c\u044e \u043a\u0430\u043c\u0435\u0440\u044b \u043d\u0430\u0447\u043d\u0435\u0442 \u043b\u0430\u0433\u0430\u0442\u044c.\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e ML-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f: \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0442\u043e\u043a \u043a\u0430\u043c\u0435\u0440\u044b, \u0441 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043e\u043c \u043a\u0430\u0434\u0440\u043e\u0432, \u043f\u043e\u043a\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435 \u0435\u0449\u0435 \u0438\u0434\u0435\u0442 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435:private readonly byte[] _rgbaBuffer = new byte[targetWidth * targetHeight * 4];private readonly SemaphoreSlim _detectorBusy = new(1, 1);protected override void OnRawFrameAvailable(RawCameraFrame frame){if (!_detectorBusy.Wait(0))return;if (!frame.TryGetRgba(targetWidth, targetHeight, _rgbaBuffer, OutputOrientation.Portrait, 0.8f)){_detectorBusy.Release();return;}var snapshot = _rgbaBuffer.ToArray();_ = Task.Run(async () =&gt;{try{await detector.EnqueueDetectionAsync(snapshot, request);}finally{_detectorBusy.Release();}});}\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d: \u0432\u043c\u0435\u0441\u0442\u043e ToArray() \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043f\u0443\u043b \u0431\u0443\u0444\u0435\u0440\u043e\u0432, \u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0443\u0445\u043e\u0434\u0438\u0442 \u0438\u0434\u0435\u0442 \u0432 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0430\u0448 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440, \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0435\u0433\u043e \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0432 Task.Run:private readonly byte[][] _mlBuffers =[new byte[targetWidth * targetHeight * 4],new byte[targetWidth * targetHeight * 4]];private const float MlCropRatio = 1f;private readonly object _detectionSync = new();private int _activeBufferIndex = -1;private DetectionWorkItem? _queuedDetectionWorkItem;protected override void OnRawFrameAvailable(RawCameraFrame frame){DetectionWorkItem? workItemToSubmit = null;lock (_detectionSync){int writeBufferIndex = _activeBufferIndex == 0 ? 1 : 0;if (!frame.TryGetRgba(targetWidth, targetHeight, _mlBuffers[writeBufferIndex], OutputOrientation.Portrait, MlCropRatio))return;var workItem = new DetectionWorkItem(writeBufferIndex,targetWidth,targetHeight,0);if (_activeBufferIndex &gt;= 0){_queuedDetectionWorkItem = workItem;return;}_activeBufferIndex = workItem.BufferIndex;workItemToSubmit = workItem;}detectionPipeline.Submit(workItemToSubmit);}\u0417\u0434\u0435\u0441\u044c \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0441\u0430\u043c\u043e\u043c\u0443 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0443. OnRawFrameAvailable(&#8230;) \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043a\u0430\u0434\u0440, \u0440\u0435\u0448\u0430\u0435\u0442, \u043d\u0430\u0434\u043e \u043b\u0438 \u0435\u0433\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u043b\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0438 \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0434\u0430\u043b\u044c\u0448\u0435. \u0412 \u043a\u043e\u043b\u043b\u0431\u044d\u043a\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0436\u0435 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0438, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u0439 \u0441\u0432\u0435\u0436\u0438\u0439 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u0434\u0440. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f OutputOrientation.Display, \u0431\u0443\u0444\u0435\u0440 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430 \u0443\u0436\u0435 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0438\u0432\u043e\u0433\u043e \u043f\u0440\u0435\u0432\u044c\u044e, \u0438 \u043f\u043e\u0442\u043e\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u043c\u043f\u0435\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430.\u0414\u043b\u044f AI API\u0412 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 ML \u0434\u0432\u0438\u0436\u043e\u043a, \u043d\u043e \u0442\u0430 \u0436\u0435 \u0442\u043e\u0447\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 API.\u041e\u0431\u044b\u0447\u043d\u043e, \u043f\u043e \u0441\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0439 \u043a\u0430\u0434\u0440 \u043f\u0440\u0435\u0432\u044c\u044e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0440\u0430\u0437 \u0432 300 \u043c\u0441 \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u0441\u043b\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043a\u0430\u0434\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441.\u0414\u043b\u044f \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 LLM vision API \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442 JPEG \u0438\u043b\u0438 PNG. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 cropRatio \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0438 \u0437\u0434\u0435\u0441\u044c:private const int RemoteUploadIntervalMs = 300;private long _lastUploadStartedAtMs;private readonly SemaphoreSlim _uploadGate = new(1, 1);protected override void OnRawFrameAvailable(RawCameraFrame frame){if (!_uploadGate.Wait(0))return;long nowMs = Environment.TickCount64;if (nowMs &#8212; _lastUploadStartedAtMs &lt; RemoteUploadIntervalMs){_uploadGate.Release();return;}if (!frame.TryGetJpeg(targetWidth, targetHeight, out var payload, 100, OutputOrientation.Portrait, 1f)){_uploadGate.Release();return;}_lastUploadStartedAtMs = nowMs;_ = Task.Run(async () =&gt;{try{await apiClient.UploadImageAsync(payload, &#171;image\/jpeg&#187;);}finally{_uploadGate.Release();}});}\u0417\u0434\u0435\u0441\u044c \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 SemaphoreSlim.Wait(0): \u043e\u043d \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043b\u043b\u0431\u044d\u043a \u043a\u0430\u043c\u0435\u0440\u044b, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432 \u043f\u043e\u043b\u0435\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430. \u0423\u0436\u0435 \u0434\u0430\u043b\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u0443\u0437\u0443 \u0432 300 \u043c\u0441 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c _lastUploadStartedAtMs. \u0415\u0441\u043b\u0438 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0432\u044b\u0437\u043e\u0432 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u043e\u043b\u044c\u0448\u0435 300 \u043c\u0441, \u0442\u043e \u043d\u043e\u0432\u044b\u0435 \u043a\u0430\u0434\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f.TryGetJpeg(&#8230;) \u0438 TryGetPng(&#8230;) \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u0442\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u0435 \u0438 \u0441 \u0442\u043e\u0439 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u043b\u0438.\u0415\u0441\u043b\u0438 \u0432\u0430\u0448 \u0435\u043d\u0434\u043f\u043e\u0439\u043d\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u044b\u0440\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 RGBA8888, \u043c\u043e\u0436\u043d\u043e \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c TryGetRgbaBytes(&#8230;).\u041e\u0442\u043b\u0430\u0434\u043a\u0430\u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u044b \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0435 \u0432 AI\/ML, \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u043a\u0430\u0434\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0433\u0430\u043b\u0435\u0440\u0435\u044e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0433\u043b\u0430\u0437\u0430\u043c\u0438. \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0441 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439, \u043e\u0431\u0440\u0435\u0437\u043a\u043e\u0439 \u0432\u0441\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0430\u043a, \u043a\u0430\u043a \u0432\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0435. \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0434\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0433\u0430\u043b\u0435\u0440\u0435\u0435, \u0441\u043c. README SkiaCamera, \u0442\u0430\u043c \u0432\u0441\u0451 \u043e\u043f\u0438\u0441\u0430\u043d\u043e.\u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 TryGetJpeg(&#8230;), \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u043e\u0432\u043d\u043e \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 JPEG:private bool _saveNextDebugFrame; \/\/\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0432 true \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0434\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043a\u0430\u0434\u0440 \u0432 \u0433\u0430\u043b\u0435\u0440\u0435\u044eprotected override void OnRawFrameAvailable(RawCameraFrame frame){if (_saveNextDebugFrame &amp;&amp;frame.TryGetJpeg(targetWidth, targetHeight, out var payload, 100, OutputOrientation.Portrait, 1f)){_saveNextDebugFrame = false;_ = Task.Run(async () =&gt;{using var stream = new MemoryStream(payload);await NativeControl.SaveJpgStreamToGallery(stream,$&#187;ml_debug_{DateTime.Now:yyyyMMdd_HHmmss}.jpg&#187;,new Metadata(),&#187;DebugAlbum&#187;);});}\/\/ &#8230;}\u0415\u0441\u043b\u0438 \u0436\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 TryGetRgbaBytes(&#8230;), \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 RGBA-\u0431\u0443\u0444\u0435\u0440 \u0432 JPEG \u0438 \u0443\u0436\u0435 \u043f\u043e\u0442\u043e\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0433\u0430\u043b\u0435\u0440\u0435\u044e:private bool _saveNextDebugFrame;protected override void OnRawFrameAvailable(RawCameraFrame frame){if (_saveNextDebugFrame &amp;&amp;frame.TryGetRgbaBytes(targetWidth, targetHeight, out var rgbaBytes, OutputOrientation.Portrait, 1f)){_saveNextDebugFrame = false;_ = Task.Run(async () =&gt;{var imageInfo = new SKImageInfo(targetWidth,targetHeight,SKColorType.Rgba8888,SKAlphaType.Unpremul);using var image = SKImage.FromPixelCopy(imageInfo, rgbaBytes, imageInfo.RowBytes);using var data = image.Encode(SKEncodedImageFormat.Jpeg, 100);using var stream = data.AsStream();await NativeControl.SaveJpgStreamToGallery(stream,$&#187;ml_debug_rgba_{DateTime.Now:yyyyMMdd_HHmmss}.jpg&#187;,new Metadata(),&#187;DebugAlbum&#187;);});}\/\/ &#8230;}\u0427\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0440\u0430\u0437\u043c\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0435, \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f GPU \u043a\u0430\u0434\u0440 -&gt; CPU \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440\u0430.\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435-\u043f\u0440\u0438\u043c\u0435\u0440\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f AI\/ML, \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0449\u0435. \u042f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e (\u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c): Implementation.md, \u0433\u0434\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u0430 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430, \u0438 Includes.md, \u0433\u0434\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f, \u043a\u0430\u043a ML-\u043c\u043e\u0434\u0435\u043b\u0438&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-477286","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/477286","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=477286"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/477286\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=477286"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=477286"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=477286"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}