Nano Hash - криптовалюты, майнинг, программирование

Javascript - найти самую темную область изображения

Я пытаюсь использовать Javascript, чтобы найти самую темную область изображения. Пока это то, что у меня есть: https://jsfiddle.net/brampower/bv78rmz8/

function rgbToHsl(r, g, b) {
r /= 255, g /= 255, b /= 255;
var max = Math.max(r, g, b),
    min = Math.min(r, g, b);
var h, s, l = (max + min) / 2;

if (max == min) {
    h = s = 0; // achromatic
} else {
    var d = max - min;
    s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
    switch (max) {
        case r:
            h = (g - b) / d + (g < b ? 6 : 0);
            break;
        case g:
            h = (b - r) / d + 2;
            break;
        case b:
            h = (r - g) / d + 4;
            break;
    }
    h /= 6;
}

return ({
    h: h,
    s: s,
    l: l,
})
}

function solve_darkest(url, callback) {
var image = new Image();
image.src = url;

image.onload = function(){
    var canvas = document.createElement('canvas');
    canvas.width  = 300;
    canvas.height = 300;

    var context = canvas.getContext("2d");
    context.drawImage(image, 0, 0);

    var imgData = context.getImageData(0, 0, 300, 300);

    var pixel = 0;
    var darkest_pixel_lightness = 100;
    var darkest_pixel_location = 0;
    for (var i = 0; i < imgData.data.length; i += 4) {
        red = imgData.data[i + 0];
        green = imgData.data[i + 1];
        blue = imgData.data[i + 2];
        alpha = imgData.data[i + 3];

        var hsl = rgbToHsl(red, green, blue);
        var lightness = hsl.l;

        if (lightness < darkest_pixel_lightness) {
            darkest_pixel_lightness = lightness;
            darkest_pixel_location = pixel;
        }

        pixel++;
    }

    var y = Math.floor(darkest_pixel_location/200);
    var x = darkest_pixel_location-(y*200);

    callback(x,y);
};
}

image_url = 'http://i.imgur.com/j6oJO8s.png'; 
solve_darkest(image_url, function(x, y) {
alert('x: '+x+' y: '+y);
});

Это не будет работать в JSFiddle из-за испорченного холста, но, надеюсь, это даст вам представление. Для примера изображения мой JS в настоящее время возвращает следующие координаты: x: 140 y: 117

Это не правильные координаты. Самый темный пиксель этого изображения должен иметь следующие координаты: x: 95 y: 204

Я просто не могу понять, почему координаты такие неправильные. Кто-нибудь здесь, кто хотел бы пролить свет на то, что я делаю неправильно?


  • Возможный дубликат Нужно щелкнуть самое темное место на изображении 29.08.2017
  • Спасибо, но код в этом вопросе, к сожалению, не помог. Я начал с нуля, отсюда и новый вопрос. Я чувствую, что нахожусь очень близко, но не могу понять, почему возвращенные мне координаты не те, которые я ищу. 29.08.2017

Ответы:


1

Хорошо, я только что проверил ваш jsfiddle.

Для испорченного холста просто измените свойство crossOrigin:

var image = new Image();
image.crossOrigin = "Anonymous";

Для неправильного пикселя есть несколько проблем.

  1. Неправильный размер холста. Если изображение меньше размера холста, алгоритм проверяет пиксели, которых нет на изображении, но которые есть на холсте. Поскольку вы не отбрасываете прозрачные пиксели, вы также проверяете пиксель 0, 0, 0 (RGB), который должен быть черным #000000.

  2. Неправильное преобразование одномерного массива в двумерное. Формула, которую вы используете, неверна, потому что вы установили ширину и высоту на 300, но используете в формуле 200. Я предлагаю создать переменную и использовать ее в качестве ссылки.

Если вы сомневаетесь, что пиксель именно там, создайте маленькую картинку, например размером 5x5 пикселей, и проверьте, возвращает ли алгоритм то, что вы ожидаете.

Я обновил jsfiddle, теперь я думаю, что это правильно. Кроме того, удален элемент img в HTML и просто добавлен холст к телу: https://jsfiddle.net/Draznel/597u5h0c/1/

29.08.2017
  • Это круто. У меня есть обновленный JSF, где вы могли видеть, что я еще не совсем получаю результат, который ищу; конечная цель — найти координаты темного прямоугольника на изображении или самой темной области, если хотите: jsfiddle .net/brampower/tw08fdhf Текущий результат: x = 290, y = 138. Этот конкретный пиксель не попадает в область темного квадрата. Возможно, было бы проще сэмплировать область с помощью getImageData() и усреднять яркость пикселей в области, хотя, по общему признанию, у меня нет опыта в этом. Как вы думаете, это было бы лучшим решением? 29.08.2017
  • Думаю проблема может заключаться в функции rgbToHsl. Попробуйте с разными функциями. Я думаю, проблема в том, что самый темный пиксель находится в 290:138. Видите ли, даже если вы закрасите более темный прямоугольник, если один пиксель в любом месте изображения имеет более низкую яркость, он будет темнее. Например, у вас есть прямоугольник, где яркость равна 0,1 или около того, но если где-то на изображении есть полностью черный пиксель (#000000), то это будет самый темный пиксель изображения. 31.08.2017
  • Я думаю, что это тот случай здесь. Я добавил эту строку console.log(red, green, blue); при обнаружении нового более темного пикселя. Самый темный найденный пиксель — #060206, и он темнее любого предшествующего пикселя. Так что я думаю, что функция работает правильно. Попробуйте это с разными изображениями, найдите в Интернете небольшое светлое изображение, например, изображение голубого неба, отредактируйте его, добавьте темный пиксель и посмотрите, найдет ли его этот алгоритм. 31.08.2017
  • Кроме того, вызовите эту функцию после вычисления x и y, чтобы увидеть, где находится самый темный пиксель на холсте. var ctx = canvas.getContext('2d'); ctx.beginPath(); ctx.lineWidth="6"; ctx.fillStyle="white"; ctx.rect(x-5,y-5,10,10); ctx.fill(); Пожалуйста, проголосуйте за этот ответ, если он был здесь наиболее полезным. 31.08.2017
  • Ранее я проголосовал за ваш ответ, но, к сожалению, он не отражен на сайте, потому что у меня еще нет репутации 15. Пожалуйста, знайте, что ваша помощь очень ценится. Вы правы, в настоящее время функция работает правильно; Я провел несколько тестов на белом изображении с одним черным пикселем, и мне удалось последовательно найти темный пиксель. Для того, что я пытаюсь сделать, мне нужно найти самую темную область. Я предполагаю, что мне нужно взять образец размером 10x10 пикселей и получить их среднюю яркость при циклическом просмотре изображения. У вас есть опыт в этом? 31.08.2017
  • У меня 0 опыта в том, что вы пытаетесь выполнить. Тем не менее, у меня есть опыт разработки игр, поэтому применить к этому то, что я знаю, не так уж сложно. Итак, вы пытаетесь найти самый темный блок, а не самый темный символ. Есть много способов сделать это. Прежде всего, вы должны преобразовать изображение в массив 2d с плавающей запятой, который состоит из значений яркости пикселей. Тогда вы можете сделать много вещей с этим. 01.09.2017
  • Первое, что вы можете сделать, это искать не самый низкий балл в пикселях, а в блоках. Итак, вы можете разбить массив на блоки 10x10 (100 пикселей) и вычислить сумму светлоты. Затем сравните его с другими блоками. Вы найдете самый темный блок. Это будет близко к тому, чего вы пытаетесь достичь, но он найдет жестко закодированный блок сетки (в основном, он всегда будет иметь позицию x, которая делится на 10, и позицию y, которая делится на 10. Трудно объяснить, будем надеяться, что вы понимаете, что . 01.09.2017
  • Другим способом, который занял бы много времени для вычислений, было бы иметь функцию, которая вычисляет яркость пикселей вокруг него (например, диапазон 5-8 пикселей/или прямоугольник с пикселем в качестве центра), а затем поместить результат в другом массиве. Тогда вы найдете пиксель, находящийся в самой темной области изображения. Однако имейте в виду, что для больших изображений потребуется много времени для вычисления. Вы можете попробовать пропустить пиксели (для первого шага, а не для расчета затемнения области), которые имеют значение яркости > 0,5 или около того. Idk, попробуйте и дайте мне знать, как это идет для вас. 01.09.2017

  • 2

    Без работы JSFiddle я бы предположил, что логика в

    var y = Math.floor(darkest_pixel_location/200);
    var x = darkest_pixel_location-(y*200);
    

    неверно по двум причинам.

    1) Изображение имеет ширину/высоту 300 пикселей, а не 200.

    2) Данные изображения упорядочены по x первым и y вторым

    Чтобы получить правильные координаты x и y, я думаю, что следующий код будет работать:

    var x = Math.floor(darkest_pixel_location / imageWidth);
    var y = darkest_pixel_location % imageWidth;
    
    29.08.2017
  • Вы правы; жесткое кодирование их до 200x200 было ошибкой, которая осталась после того, как я провел некоторое тестирование с другим изображением. С помощью Emestas выше я пришел к этому обновленному JSFiddle jsfiddle.net/brampower/tw08fdhf К сожалению, это все еще не тот результат, на который я надеялся. Я пытаюсь получить координаты x и y более темного поля изображения; Я полагал, что самый темный пиксель будет внутри этого поля, но, похоже, это не так. Возможно, мне придется изучить область тестирования и усреднить яркость пикселей в этой области, хотя, по общему признанию, у меня нет опыта в этом. 29.08.2017

  • 3

    Хорошее время, чтобы осознать неприятные последствия жестко запрограммированных переменных...

    Вы создаете холст размером 300x300 и рисуете на нем png того же размера. К сожалению, вы затем используете 200 для определения позиции x,y с учетом индекса выбранного пикселя. Подсказка: сделайте изображение размером 300x300 белого цвета. Задайте черный цвет для одного пикселя в точке (95 204). Запустите свой немодифицированный код, и вы получите 95 306. Измените размер на размер изображения, и вы получите (95 204) в качестве ответа.

    Таким образом, вы вряд ли можете пожаловаться на то, что индекс в изображении 300x300 возвращает неправильную позицию при манипулировании таким образом, который подходит для индекса в изображении 200x200.

    Лично я бы заменил:

    var y = Math.floor(darkest_pixel_location/200);
    var x = darkest_pixel_location-(y*200);
    

    с

    var y = Math.floor(darkest_pixel_location/this.width);
    var x = darkest_pixel_location-(y*this.width);
    

    Это затем преобразует индекс обратно в правильные координаты x,y.

    Тем не менее, изображение, которое вы предоставили, на самом деле не имеет самого темного пятна в указанном месте. Пиксель с номером 95 204 имеет значение #37614e или rgb(55,97,78).

    Таким образом, я надеюсь, что теперь вы можете понять цель моего предложения одного темного пикселя на светлом изображении. Вы можете уменьшить количество проблем, которые вы пытаетесь отладить, до одной за раз. В этом случае - «могу ли я преобразовать индекс обратно в 2d-координаты?». После этого «у меня есть темное пятно там, где я думаю?»

    В вашем случае ответ на оба эти вопроса был нет! Не самое выгодное место для начала отладки...


    были сделаны некоторые комментарии и достигнуто лучшее понимание проблемы.


    Хорошо, согласно обсуждению в комментариях - задача состоит в том, чтобы найти левый верхний угол затемненной области на изображении - такой поиск должен усреднить результаты по (пока) неизвестной области, чтобы локальные минимумы или максимумы (темные или светлые пиксели) не окажут неблагоприятного воздействия на идентифицированную интересующую область.

    В идеале код можно запускать итеративно — попробуйте с размером блока 1, затем с размером блока 2 и т. д. и т. д., увеличивая размер блока до тех пор, пока результаты двух прогонов не станут одинаковыми или в пределах определенного предела.

    То есть, если я ищу с размером блока 9 и получаю местоположение 93 211, а затем получаю то же самое с размером блока 10 (тогда как все предыдущие значения размера блока возвращали другой результат), то я, вероятно, чувствовал бы себя достаточно уверенно, я 'd правильно определил область интереса.

    Вот код, над которым можно поразмыслить. Вы заметите, что я оставил вашу функцию и создал другую, очень похожую. Я надеюсь, что вы найдете его подходящим. :)

    "use strict";
    function newEl(tag){return document.createElement(tag)}
    function newTxt(txt){return document.createTextNode(txt)}
    function byId(id){return document.getElementById(id)}
    function allByClass(clss,parent){return (parent==undefined?document:parent).getElementsByClassName(clss)}
    function allByTag(tag,parent){return (parent==undefined?document:parent).getElementsByTagName(tag)}
    function toggleClass(elem,clss){elem.classList.toggle(clss)}
    function addClass(elem,clss){elem.classList.add(clss)}
    function removeClass(elem,clss){elem.classList.remove(clss)}
    function hasClass(elem,clss){elem.classList.contains(clss)}
    
    // useful for HtmlCollection, NodeList, String types
    function forEach(array, callback, scope){for (var i=0,n=array.length; i<n; i++)callback.call(scope, array[i], i, array);} // passes back stuff we need
    
    // callback gets data via the .target.result field of the param passed to it.
    function loadFileObject(fileObj, loadedCallback){var a = new FileReader();a.onload = loadedCallback;a.readAsDataURL( fileObj );}
    
    function ajaxGet(url, onLoad, onError)
    {
    	var ajax = new XMLHttpRequest();
    	ajax.onload = function(){onLoad(this);}
    	ajax.onerror = function(){console.log("ajax request failed to: "+url);onError(this);}
    	ajax.open("GET",url,true);
    	ajax.send();
    }
    
    function ajaxPost(url, phpPostVarName, data, onSucess, onError)
    {
    	var ajax = new XMLHttpRequest();
    	ajax.onload = function(){ onSucess(this);}
    	ajax.onerror = function() {console.log("ajax request failed to: "+url);onError(this);}
    	ajax.open("POST", url, true);
    	ajax.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    	ajax.send(phpPostVarName+"=" + encodeURI(data) );
    }
    
    function ajaxPostForm(url, formElem, onSuccess, onError)
    {
    	var formData = new FormData(formElem);
    	ajaxPostFormData(url, formData, onSuccess, onError)
    }
    
    function ajaxPostFormData(url, formData, onSuccess, onError)
    {
    	var ajax = new XMLHttpRequest();
    	ajax.onload = function(){onSuccess(this);}
    	ajax.onerror = function(){onError(this);}
    	ajax.open("POST",url,true);
    	ajax.send(formData);
    }
    
    function getTheStyle(tgtElement)
    {
    	var result = {}, properties = window.getComputedStyle(tgtElement, null);
    	forEach(properties, function(prop){result[prop] = properties.getPropertyValue(prop);});
    	return result;
    }
    
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    window.addEventListener('load', onDocLoaded, false);
    
    function onDocLoaded(evt)
    {
    //	var image_url = 'http://i.imgur.com/j6oJO8s.png'; 
    //	var image_url = 'onePixel.png';
    	var image_url = 'j6oJO8s.png';
    	
    	byId('theImage').src = image_url;
    	solve_darkest(image_url, function(x,y){alert('x: '+x+' y: '+y);} );
    	solve_darkest_2(image_url, function(x,y){alert('x: '+x+' y: '+y);} );
    }
    
    function rgbToHsl(r, g, b) 
    {
    r /= 255, g /= 255, b /= 255;
    var max = Math.max(r, g, b),
        min = Math.min(r, g, b);
    var h, s, l = (max + min) / 2;
    
    if (max == min) {
        h = s = 0; // achromatic
    } else {
        var d = max - min;
        s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
        switch (max) {
            case r:
                h = (g - b) / d + (g < b ? 6 : 0);
                break;
            case g:
                h = (b - r) / d + 2;
                break;
            case b:
                h = (r - g) / d + 4;
                break;
        }
        h /= 6;
    }
    
    return ({
        h: h,
        s: s,
        l: l,
    })
    }
    
    function solve_darkest(url, callback) 
    {
    	var image = new Image();
    	image.src = url;
    
    	image.onload = function()
    	{
    		var canvas = document.createElement('canvas');
    		canvas.width  = 300;
    		canvas.height = 300;
    
    		var context = canvas.getContext("2d");
    		context.drawImage(image, 0, 0);
    
    		var imgData = context.getImageData(0, 0, 300, 300);
    
    		var pixel = 0;
    		var darkest_pixel_lightness = 100;
    		var darkest_pixel_location = 0;
    		for (var i = 0; i < imgData.data.length; i += 4) 
    		{
    			var red = imgData.data[i + 0];
    			var green = imgData.data[i + 1];
    			var blue = imgData.data[i + 2];
    			var alpha = imgData.data[i + 3];
    
    			var hsl = rgbToHsl(red, green, blue);
    			var lightness = hsl.l;
    
    			if (lightness < darkest_pixel_lightness) 
    			{
    				darkest_pixel_lightness = lightness;
    				darkest_pixel_location = pixel;
    				console.log("Darkest found at index: " + pixel);
    			}
    
    			pixel++;
    		}
    
    	//    var y = Math.floor(darkest_pixel_location/200);
    	//    var x = darkest_pixel_location-(y*200);
    		var y = Math.floor(darkest_pixel_location/this.width);
    		var x = darkest_pixel_location-(y*this.width);
    		callback(x,y);
    	};
    }
    
    
    
    function solve_darkest_2(url, callback) 
    {
    	var image = new Image();
    	image.src = url;
    
    	image.onload = function()
    	{
    		var canvas = document.createElement('canvas');
    		canvas.width  = 300;
    		canvas.height = 300;
    		var context = canvas.getContext("2d");
    		context.drawImage(image, 0, 0);
    		var imgData = context.getImageData(0,0, canvas.width, canvas.height);
    
    		var darkest_pixel_luminance = 100;
    		var darkest_pixel_xPos = 0;
    		var darkest_pixel_yPos = 0;
    		for (var y=0; y<canvas.height; y++)
    		{
    			for (var x=0; x<canvas.width; x++)
    			{
    				var luminance = averagePixels(imgData, x, y, 10);
    				if (luminance < darkest_pixel_luminance)
    				{
    					darkest_pixel_luminance = luminance;
    					darkest_pixel_xPos = x;
    					darkest_pixel_yPos = y;
    				}
    			}
    		}
    		callback(darkest_pixel_xPos,darkest_pixel_yPos);
    	};
    }
    
    function averagePixels(imgData, xPos, yPos, averagingBlockSize)
    {
    //	var ctx = canvas.getContext("2d");
    //	var imgData = ctx.getImageData( 0, 0, canvas.width, canvas.height );
    //	imgData
    	
    	// we average pixels found in a square region, we need to know how many pixels
    	// are in the region to divide the accumalated totals by the number of samples (pixels) in the
    	// averaging square
    	var numPixelsMax = averagingBlockSize * averagingBlockSize;
    	var numPixelsActual = 0;
    	
    	var red, green, blue;
    	red = green = blue = 0;
    	
    	var rowStride = imgData.width * 4;		// add this to an index into the canvas's data to get the pixel
    										// immediatelly below it.
    	var x, y;
    	var initialIndex = ((yPos * imgData.width) + xPos) * 4;
    	var index = initialIndex;
    	
    	var pixel = 0;
    	var darkest_pixel_lightness = 100;
    	var darkest_pixel_location = 0;
    	
    	for (y=0; y<averagingBlockSize; y++)
    	{
    		index = initialIndex + y * rowStride;
    		
    		for (x=0; x<averagingBlockSize; x++)
    		{
    			if ((x+xPos < imgData.width) && (y+yPos < imgData.height))
    			{
    				red += imgData.data[index+0];
    				green += imgData.data[index+1];
    				blue += imgData.data[index+2];
    				numPixelsActual++;
    			}
    			index += 4;
    		}
    	}
    	red /= numPixelsActual;
    	green /= numPixelsActual;
    	blue /= numPixelsActual;
    	
    	var hsl = rgbToHsl(red, green, blue);
    	var luminance = hsl.l;
    	return luminance;
    }
    img
    {
    	border: solid 1px red;
    }
     <h1>300px</h1>
     <img id='theImage'/>

    29.08.2017
  • Вы правы; жесткое кодирование их до 200x200 было ошибкой, которая осталась после того, как я провел некоторое тестирование с другим изображением. С помощью Emestas выше я пришел к этому обновленному JSFiddle jsfiddle.net/brampower/tw08fdhf К сожалению, это все еще не тот результат, на который я надеялся. Я пытаюсь получить координаты x и y более темного поля изображения; Я полагал, что самый темный пиксель будет внутри этого поля, но, похоже, это не так. Возможно, мне придется изучить область тестирования и усреднить яркость пикселей в этой области. Не могли бы вы направить меня в правильном направлении, чтобы сделать это? 30.08.2017
  • Конечно. Ну, вы можете взять среднее значение, скажем, 3x3 пикселя. Я бы использовал x, x+1, x+2 и y, y+1, y+2. Я бы добавил все значения r, все значения g и затем все значения b. Затем я разделил бы накопленные значения на количество пикселей в области (3x3 = 9), а затем преобразовал бы эту единственную тройку rgb в hsl и проверил бы самый темный образец на данный момент. Вам придется либо (0) иметь дело со случаями, которые имеют менее 9 допустимых пикселей для выборки, или (1) выполнять итерации img_side_len - region_side_len через цикл вместо итераций img_side_len. :) 30.08.2017
  • Вау, это пролетело мимо моей головы. Похоже, мне нужно много возиться, когда дело доходит до Javascript. Не могли бы вы написать JSFiddle? Я понимаю, что прошу многого, поэтому, если у вас нет на это времени, пожалуйста, не чувствуйте давления. Я полностью понимаю :) 30.08.2017
  • :смеется: То же самое сделал для меня, когда я впервые попытался запрограммировать концепцию. Я взял ваш исходный код и внес в него как можно меньше изменений. Сейчас около 2 часов ночи, так что теперь, когда я не сплю 24 часа, я не могу представить свою лучшую работу. Вы более чем приветствуете возмещение, если решение будет неприятным! Я просто добавлю код в ответ. (мой уже существующий) 30.08.2017
  • Вау, это невероятно! Очень признателен. Я попытался запустить код, и он выдал мне массу ошибок, поэтому я попытался немного привести его в порядок: jsfiddle.net/brampower/adw4bvmg Пожалуйста, дайте мне знать, если я что-то напутал (конечно, после того, как вы отдохнете!) Теперь все хорошо. При запуске с Tampermonkey я получаю сообщение об ошибке в строке 86, от которой не могу избавиться :( Это следующая строка: byId('theImage').src = image_url; - image_url определен правильно, поэтому я не совсем уверен, почему он хочет зависнуть здесь. 30.08.2017
  • Без проблем. Только что поиграл с твоей скрипкой. Я думаю, проблема в том, что вы завернули весь мой код в замыкание. Кроме того, вы установили скрипку для дальнейшего переноса кода. Как скрипка, javascript должен быть установлен без переноса в голове. Я закинул весь рабочий исходный код в pastebin, и с изменением пути к изображению у вас будет рабочая демонстрация. Вот ссылка: pastebin.com/pV8PLa9k 30.08.2017
  • Вместо того, чтобы пытаться возиться с этим самому (в конце концов, я пытаюсь научиться), я просто взял ваш код, закинул его в html-файл и запустил на своем локальном хосте. Я не получаю никаких ошибок, однако в предупреждении всегда указано x = 299 и y = 299, независимо от того, какое изображение я использую :( Вот изображение вывода: i.imgur.com/PtLea2g.png 30.08.2017
  • Вы видите то же самое на своей стороне, или мой html-файл как-то испорчен? 03.09.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..