Адрес онлайн-опыта:HK сайт. Технологии талантов / приготовления пищи / Христос ...
Адрес источника:GitHub.com/soon 029/Крис…
напишите в начале
Динь-динь-дон, динь-динь-дон, висит, приближается ежегодное Рождество, я не могу не вспомнить страх перед тем, что за последние два года в билетном кругу доминируют рождественские шляпы. Круг открытых билетов полон шляп @official:
Аватар кружка с билетами моментально захватил рождественскую шапку:
Мне так жаль, что в то время у тебя не было рождественской шапки Invoice Circle
Также появились все виды программного обеспечения для ношения шапки.Будь то небольшая программа или программное обеспечение Meitu, без исключения была добавлена функция ношения новогодней шапки. Но для меня, ленивой, поправить новогоднюю шапку самостоятельно все равно слишком сложно. Поэтому я подумал, есть ли способ заставить мой аватар автоматически носить рождественскую шапку?
Дайте мне действительно думать, что это тема сегодняшнего дня, с чистым способом перед вами, чтобы сделать автоматические сайты носить рождественские шляпы.
С помощью этого веб-сайта вы можете успешно добавить 13 в круг билетов, и не только это, вы также можете столкнуться с идеальной любовью из-за этого! Только представьте, когда вы разместите этот веб-сайт в кружке билетов, богиня будет впечатлена вашей технологией, когда она ее увидит, а затем проявит инициативу, чтобы дать вам фотографию, позволить вам помочь ей надеть рождественскую шапку на аватар и тогда у вас все получится гладко, у меня была возможность пообщаться с богиней, а затем выиграть Бай Фумей и отправиться на вершину своей жизни, думать об этом немного волнующе.
Чтобы надеть шапку Санты на аватарку, нужно сделать несколько шагов.
Сколько шагов нужно, чтобы надеть шапку Санты на аватарку? Это очень просто, как засунуть слона в холодильник, всего три шага:
- открыть аватар
- надень шапку Санты
- скачать изображение
Первый и последний шаги кажутся не сложными, а вот второй момент, как поставить новогоднюю шапку на аватарку?
Прежде всего, вы должны понять, о чем я говорю, когда говорю: надень шапку Санты? Позвольте мне перевести следующее:
Нарисуйте материал для изображения новогодней шапки на картинке аватара.подходящее место, превращая его вкартинка
Итак, наша цель сегодня:Как определить положение новогодней шапки и совместить ее с аватаркой в картинку.
Сначала поговорим о том, как определить положение шапки Санты.
Определите положение новогодней шапки
Вручную мы можем легко определить, где должна быть размещена новогодняя шапка, но как машина может это определить? Некоторые люди могли подумать, что это не технология распознавания лиц? Да, это технология, которая нам нужна сегодня.
Еще в 2017 году чистый фронтенд говорил, что реализовать распознавание лиц пока что из области фантастики, ноTensorflow.jsПоявление , сделало это возможным:
Это первыйTensorFlowинтерфейс глубокого обучения. это позволяет вамбраузердля обучения модели или запуска предварительно обученной модели в режиме вывода. TensorFlow.js может предоставлять не только низкоуровневые строительные блоки машинного обучения, но и высокоуровневые API-интерфейсы, подобные Keras, для построения нейронных сетей.
Tensorflow.js — это первая библиотека, о которой я думаю, которую можно применить, но когда я открываю официальный документ, я вижу, например, Tensors (тензор), Layers (слои), Optimizers (оптимизаторы)… всевозможные незнакомые понятия ударь меня по лицу Да ладно, это ранит мою жизнь, и мне кажется, что уже слишком поздно учиться, так что я могу сделать, чтобы быстро начать работу с распознаванием лиц, не понимая различных концепций?
Ответ, конечно, таков:face-api.js
.
face-api.js
face-api.js
Это последние силы Великого Бога Винсента Мюлера, и он знает проекты с открытым исходным кодом, известные людям.opencv4nodejs,face-recognize(Пакет распознавания лиц для NodeJs, но теперьface-api.js
Сторона Node уже поддерживается, он рекомендует использовать face-api напрямую)
face-api.js
— это модуль Javascript, построенный на ядре Tensorflow.js, который реализует три архитектуры сверточной нейронной сети (CNN) для задач обнаружения, распознавания и обнаружения характерных точек. Короче говоря, с ним фронтенд также может легко завершить работу по распознаванию лиц.
Принципиальный анализ
Если вы хотите увидеть реализованную детскую обувь, пропустите этот абзац и сразу приступайте к работе.
Мы знаем, что машинное обучение состоит из нескольких основных элементов: данных, моделей, алгоритмов. Отношения между ними следующие:
- данные тренировки:Обучающие данные — это серия помеченных данных, например серия лиц и данных изображений, которые не являются лицами.
- Модель (здесь мы в основном имеем в виду модели обучения с учителем):Вы можете просто понимать модель как функцию прогнозирования (f (x) = y), что просто означает, что она может давать результаты на основе входных данных.
- алгоритм:Алгоритмы предназначены для обучения машин тому, как получить оптимальную модель (с минимальными потерями). Например, когда машина распознает тренировочное изображение как лицо через текущую модель, но метка «не лицо», то модель необходимо настроить в соответствии с алгоритмом. Общие алгоритмы включают в себя: градиентный спуск, сопряженный градиент, ньютоновский и квазиньютоновский алгоритмы, имитация отжига...
Следовательно, мы можем сказать, что пока у нас есть обученная модель прогнозирования, мы можем анализировать и прогнозировать неизвестные данные.
Принцип фейс-апи
Прежде всего, чтобы распознать лицо на изображении, нам нужно сообщить машине, какое лицо является человеческим лицом, поэтому нам нужно большое количество фотографий лица и пометить на них различные данные о чертах лица, поэтому что машина может узнать:
face-api.js
Для работы по обнаружению лиц реализован алгоритм SSD (Single Shot Multibox Detector), который по сути является сверточной нейронной сетью (CNN) на основе MobileNetV1, а некоторые слои предсказания кадра лица добавляются к верхнему слою сети.
потомface-api.js
С помощью этого алгоритма машина будет продолжать учиться и оптимизировать, чтобы обучить модель, с помощью которой можно будет идентифицировать все ограничивающие рамки лица.
Недостаточно распознать лицо, многим нашим приложениям нужно найти характерные точки лица (брови, нос, рот и т.д.). следовательноface-api.js
Изображение с центром на лице в каждой ограничивающей рамке извлекается из изображения, которое затем снова передается в качестве входных данных в сеть распознавания лиц для обучения.
Чтобы достичь цели распознавания характерных точек,face-api.js
Реализована еще одна простая сверточная нейронная сеть, которая возвращает 68 ориентиров лица для заданного изображения:
С помощью этого алгоритмаface-api.js
Обучается ряд моделей, и, используя эти обученные модели, мы можем быстро реализовать нужные нам функции.
face-api.js
как использовать
метод введения
Если вы не используете инструменты упаковки, вы можете импортировать напрямуюface-api.js
сценарий:dist/face-api.jsПолучите последнюю версию илиdist/face-api.min.jsПолучите сокращенную версию и импортируйте скрипт:
<script src="face-api.js"></script>
Если вы используете инструмент управления пакетами npm, вы можете ввести следующую команду:
npm i face-api.js
инициализация
Мы сказали раньше,face-api
Он реализует серию сверточных нейронных сетей и оптимизирован для Интернета и мобильных устройств. Все экземпляры нейронной сети находятся вfaceapi.nets
получено в
var nets = {
ssdMobilenetv1: new SsdMobilenetv1(), // ssdMobilenetv1 目标检测
tinyFaceDetector: new TinyFaceDetector(), // 人脸识别(精简版)
tinyYolov2: new TinyYolov2(), // Yolov2 目标检测(精简版)
mtcnn: new Mtcnn(), // MTCNN
faceLandmark68Net: new FaceLandmark68Net(), // 面部 68 点特征识别
faceLandmark68TinyNet: new FaceLandmark68TinyNet(), // 面部 68 点特征识别(精简版)
faceRecognitionNet: new FaceRecognitionNet(), // 面部识别
faceExpressionNet: new FaceExpressionNet(), // 表情识别
ageGenderNet: new AgeGenderNet() // 年龄识别
};
вMobileNetsа такжеyolov2Это относительно известный алгоритм обнаружения целей в отрасли.Если вам интересно, вы можете щелкнуть ссылку, чтобы увидеть документ (я его не понимаю),эта статьяЭти алгоритмы представлены кратко, что, вероятно, означает, что их скорость обнаружения и эффективность обнаружения хорошие. Здесь вы можете выбрать разные алгоритмы и загрузить разные модели в соответствии с вашими потребностями.
Официально рекомендуетсяssdMobilenetv1
, Поскольку точность распознавания относительно высока, но скорость поиска относительно низкая, если это сцена обнаружения в реальном времени, скорость поиска может стать проблемой, поэтому автор возьмет автора во второй половине этого года.MTCNN
Алгоритм также представлен.Если вы хотите использовать сцену распознавания лиц в реальном времени, вы можете попробоватьMTCNN
. (см. автораэта статья)
загрузка модели
Из предыдущего введения мы также можем знать, что модель является главным приоритетом.С обученной моделью мы можем пропустить этап обучения и использовать ее непосредственно для распознавания лиц.
Именно здесь Дэн Шиффман, иностранный проповедник машинного обучения,видеоЧжун всегда подчеркивал: не все начальные этапы машинного обучения должны начинаться с алгоритмов обучения. В конце концов, в отрасли есть специализации. В настоящее время многие люди создали множество зрелых моделей (обнаружение графики, распознавание текста, классификация изображений...) , Мы можем стоять на плечах гигантов и делать более интересные вещи.
Сам face-api также предоставляет ряд данных модели (/weights), который можно использовать «из коробки»:
await faceapi.nets.ssdMobilenetv1.load('/weights')
Среди них /weights — это каталог, в котором размещаются файлы manifest.json и shard.Рекомендуется напрямую скопировать официальный каталог весов, потому что часто вам нужно использовать несколько моделей одновременно.
Идентифицировать
face-api предоставляет множество продвинутых методов, наиболее удобным из которых являетсяdetectAllFaces / detectSingleFace(input, options)
, примечание: по умолчанию используетсяSSD Mobilenet V1
, если вы хотите использоватьTiny FaceDetector
, необходимо вручную указать:
const detections1 = await faceapi.detectAllFaces(input, new faceapi.SsdMobilenetv1Options())
const detections2 = await faceapi.detectAllFaces(input, new faceapi.TinyFaceDetectorOptions())
Метод обнаружения поддерживает связанные вызовы, поэтому вы можете использовать его следующим образом:
await faceapi.detectAllFaces(input)
await faceapi.detectAllFaces(input).withFaceExpressions()
await faceapi.detectAllFaces(input).withFaceLandmarks()
await faceapi.detectAllFaces(input).withFaceLandmarks().withFaceExpressions()
Получить идентификационные данные
Каковы возвращаемые данные после операции идентификации?
Если вы выполняете полное распознавание лиц, то данные представляют собой массив, в которомdetection
Это атрибут по умолчанию, который предоставляет информацию о лице человека.
[{detection:{
box: {
x: 156.22306283064717
y: 76.60605907440186
width: 163.41096172182577
height: 182.21931457519534
left: 156.22306283064717
top: 76.60605907440186
right: 319.63402455247297
bottom: 258.82537364959717
area: 29776.633439024576
topLeft: Point
topRight: Point
bottomLeft: Point
bottomRight: Point
}
……
}]
Если у вас есть связанные операции, такие какwithFaceLandmarks()
Затем этот объект добавитlandmarks
свойства и так далее.
[{detection, landmarks, ……}]
вlandmarks
Предоставляет методы получения различных характерных точек лица:
const landmarkPositions = landmarks.positions // 获取全部 68 个点
const jawOutline = landmarks.getJawOutline() // 下巴轮廓
const nose = landmarks.getNose() // 鼻子
const mouth = landmarks.getMouth() // 嘴巴
const leftEye = landmarks.getLeftEye() // 左眼
const rightEye = landmarks.getRightEye() // 右眼
const leftEyeBbrow = landmarks.getLeftEyeBrow() // 左眉毛
const rightEyeBrow = landmarks.getRightEyeBrow() // 右眉毛
Обработка идентификационных данных
Вы должны знать, что данные, которые вы получаете, обрабатываются в соответствии с реальными данными изображения, но изображения, которые мы показываем на веб-сайте, обычно не являются реальными изображениями 1: 1, то есть изображения будут масштабироваться/расширяться. Например, картинка размером 1000x1000, а лицо и рот на картинке могут быть в позиции (600 500), но на самом деле мы показываем картинку 600 x 600. Если рисовать по координатам (600 500), будет вне холста.
Поэтому, если я хочу что-то сделать с изображением, нам нужно преобразовать текущие данные, чтобы они соответствовали определенному размеру Здесь мы можем использовать предоставленные данныеmatchDimensions(canvas, displaySize)
а такжеresizeResults(result, displaySize)
метод:
// 把 canvas 固定到 displaySize 的大小
faceapi.matchDimensions(canvas, displaySize)
// 把数据根据 displaySize 做转换
const resizedResults = faceapi.resizeResults(detectionsWithLandmarks, displaySize)
где displaySize — это свойство, которое имеет{ width, height }
объект, поэтому вы также можете напрямую передать элемент DOM с шириной и высотой, например<canvas />
,<img />
.
Рисование графиков по данным
Просто получать данные бесполезно.Наша основная цель-рисовать графику.При рисовании этого куска face-api он также предоставляет ряд продвинутых методов,таких как:
faceapi.draw.drawDetections(canvas, resizedDetections) // 直接在识别区域画个框
faceapi.draw.drawFaceLandmarks(canvas, resizedResults) // 直接画出识别的的特征点
(Все следующие тестовые фотографии взяты у девушки из поиска Baidu «Аватар для девочек», если есть какие-либо нарушения, сообщите об этом)
Конечно, вы также можете нарисовать рамку или текст в определенном месте.DrawBox,DrawTextField
const drawOptions = {
label: 'Hello I am a box!',
lineWidth: 2
}
const drawBox = new faceapi.draw.DrawBox(resizedResults[0].detection.box, drawOptions)
drawBox.draw(canvas)
рисунок новогодней шапки
Наговорив так много, я вдруг обнаружил, что мы еще не дошли до нашей темы, покраски новогодней шапки! Поспешим обратно.
Определите положение новогодней шапки
Теперь, если у меня есть все данные о лице, как мне определить правильное положение шапки Санты? Прежде всего, мы должны прояснить, что новогоднюю шапку следует носить на макушке, никто не должен носить новогоднюю шапку на бровях? (Хорошо, когда я этого не говорил)
Но данные распознавания лиц вообще не включают макушку головы, что делать? К счастью, я полсеместра изучал скетчинг в первом классе начальной школы.В скетчинге есть очень важная концепция под названием «Три двора и пять глаз».
Это также означает, что расстояние от линии роста волос до надбровной кости у нормального человека составляет половину расстояния от надбровной кости до нижней челюсти (как программист я сказал, что это правило может больше не применяться).
Таким образом, мы можем вычислить положение макушки, получив координаты бровей и координаты челюсти:
/**
* 获取头顶的坐标
* @param {*} midPos 眉心点坐标
* @param {*} jawPos 下巴底点坐标
*/
const getHeadPos = (midPos, jawPos) => {
// 获取线的 k 值
const k = getK(midPos, jawPos);
// 获取眉心到下颌的距离
const distanceOfEye2Jaw = getDistance(midPos, jawPos);
return getPos(k, distanceOfEye2Jaw / 2, midPos);
};
Здесь давайте рассмотрим несколько формулировок аналитической геометрии:
- Формула расстояния между двумя точками:
-
Определите наклон по двум точкам:
-
Формула расстояния от точки до прямой:
- Линии, перпендикулярные друг другу, произведение наклонов равно -1
Следует отметить, что, поскольку структура системы координат Canvas по умолчанию отличается от той, которую мы изучили на предыдущем уроке математики, мы можем повернуть ее на 90 градусов против часовой стрелки, чтобы обнаружить, что ее оси x и y противоположны тому, что мы знаем. , т. е. для удобства мы обычно меняем x и y при подстановке в формулу для расчета.
/**
* 获取 K 值
* @param {*} a
* @param {*} b
*/
const getK = (a, b) => (a.x - b.x) / (a.y - b.y)
/**
* 获取两点之间距离
* @param {*} a
* @param {*} b
*/
const getDistance = (a, b) => Math.sqrt(Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2));
Поэтому координаты центра бровей и координаты нижней челюсти на данный момент известны, и можно вычислить наклон этой линии, а затем по расстоянию между центром бровей и макушкой (половина центра бровей к подбородку) можно рассчитать координаты макушки:
/**
* 已知 K,d, 点,求另一个点
* @param {*} k 值
* @param {*} d 距离
* @param {*} point 一个基础点
*/
const getPos = (k, d, point) => {
// 取 y 变小的那一边
let y = -Math.sqrt((d * d) / (1 + k * k)) + point.y;
let x = k * (y - point.y) + point.x;
return { x, y };
};
синтез изображений
Когда мы уже знаем положение новогодней шапки, следующая проблема - как синтезировать новогоднюю шапку на аватарку. Здесь мы используем Canvas для достижения этого. Принцип очень прост: сначала рисуем аватарку на Canvas, а потом продолжаем нарисовать Рождественская шапка подойдет.
Поскольку на картинке может быть несколько данных о лицах, может потребоваться отрисовка нескольких шляп:
/**
* 获取图片
* @param {*} src 图片地址
* @param {*} callback
*/
function getImg(src, callback) {
const img = new Image();
img.setAttribute('crossOrigin', 'anonymous');
img.src = src;
img.onload = () => callback(img);
}
/**
* 绘制主流程
* @param {*} canvas
* @param {*} options
*/
function drawing(canvas, options) {
const { info, width = 200, height = 200, imgSrc = 'images/default.jpg' } = options;
const ctx = canvas.getContext('2d');
// 重置
ctx.clearRect(0, 0, width, height);
// 先把图片绘制上去
getImg(imgSrc, img => ctx.drawImage(img, 0, 0, width, height));
// 循环把帽子画到对应的点上(由于图片中可能不止一个面部数据,可能需要绘制多个帽子)
for(let i = 0, len=info.length;i < len;i++) {
const { headPos } = info[i];
getImg('images/hat.png', img => ctx.drawImage(img, headPos.x, headPos.y, 200, 120));
}
}
Мы видим, что шляпа нарисована, но в странном положении:
Это связано с тем, что изображение рисуется на основе верхнего левого угла изображения в качестве источника, поэтому нам нужно сместить координаты при рисовании шляпы:
/**
* 根据我当前的圣诞帽元素进行一些偏移(我的图片大小是 200*130), 圣诞帽可佩戴部分的中心 (60,60)
* @param {*} x
* @param {*} y
*/
const translateHat = (x, y) => {
return {
x: x - 60,
y: y - 60,
};
};
function drawing(canvas, options) {
……
const {x, y} = translateHat(headPos.x, headPos.y);
getImg('images/hat.png', img => ctx.drawImage(img, x, y, 200, 120));
……
}
Выглядит намного лучше и чувствует себя прекрасно!
оптимизация
Но некоторые друзья могут обнаружить, что этот результат все еще немного проблематичен:
- Размер шапки фиксированный, но лицо на аватарке может быть большим или маленьким, и надевать маленькую шапку на большое лицо явно неуместно.
- Шляпа к фиксированной, если чья-то голова смещена с этим, шляпа не предвзято и должна прийти?
Поэтому нам еще нужно продолжить оптимизацию:
размер шапки Санты
Размер новогодней шапки можно определить по размеру распознанного лица.Вообще говоря, шапкапригодный для носкиШирина равна ширине лица (учитывая, что эффект отображения может быть немного больше), здесь я подчеркиваю ширину, пригодную для носки, потому что только часть изображения рождественской шапки является пригодной для носки областью.
// 0.7 为可戴区域占总区域的比重(为了让帽子更大一点,选择 0.6),0.65 是图片的宽高比
const picSize = { width: faceWidth / 0.6, height: (faceWidth * 0.65) / 0.6 };
а размер лица можно определить поjawOutlinePoints
расстояние от начальной точки для расчета
/**
* 获取脸的宽度(即帽子宽度)
* @param {*} outlinePoints
*/
const getFaceWith = outlinePoints => getDistance(outlinePoints[0], outlinePoints[outlinePoints.length - 1])
угол шляпы санта
Как рассчитать угол новогодней шапки? На самом деле это тоже очень просто, достаточно знать угол отклонения головы, а угол отклонения головы может напрямую использовать угол между средней линией лица (между бровями и челюстью) и уг -ось (дополнительный угол, рассчитанный непосредственно с помощью atan2, должен составлять 180 градусов минус), здесь рассматривается радиан, который удобен для последующего использования и непосредственно используется.
/**
* 获取脸的倾斜弧度
* @param {*} jawPos
* @param {*} midPointOfEyebrows
*/
const getFaceRadian = (jawPos, midPointOfEyebrows) =>
Math.PI - Math.atan2(jawPos.x - midPointOfEyebrows.x, jawPos.y - midPointOfEyebrows.y); //弧度 0.9272952180016122
Поворот изображения в Canvas
Обратите внимание, что в Canvas нельзя напрямую повернуть изображение, можно вращать только холст, а сам холстПовернуть по происхождениюДа, это будет особенно жалко.
Здесь мы просто хотим позволить картине в соответствии с центром вращения, как это сделать? Мы можем позволить упущению холста ввести в положение шляпы, а затем через внутреннюю смещенную шляпу делает шляпу только в центре начала происхождения, на этот раз повернуть холст, чтобы нарисовать его, только влияет на эту шляпу.
/**
* 绘制帽子
* @param {*} ctx 画布实例
* @param {{}} config 配置
*/
function drawHat(ctx, config) {
const { headPos, angle, faceWidth } = config;
getImg('images/hat.png?imageView&thumbnail=400x400', img => {
// 保存画布
ctx.save();
// 画布原点移动到画帽子的地方
ctx.translate(headPos.x, headPos.y);
// 旋转画布到特定角度
ctx.rotate(angle);
// 偏移图片,使帽子中心刚好在原点
const { x, y, width, height } = translateHat(faceWidth, 0, 0);
// 我的圣诞帽子实际佩戴部分长度只有 0.75 倍整个图片长度
ctx.drawImage(img, x, y, width, height);
// 还原画布
ctx.restore();
});
}
Таким образом, основной процесс всего рисунка, вероятно, выглядит так:
function drawing(canvas, options) {
const { info, width = 200, height = 200, imgSrc = 'images/default.jpg'} = options;
const ctx = canvas.getContext('2d');
// 重置
ctx.clearRect(0, 0, width, height);
// 先把图片绘制上去
getImg(imgSrc, img => ctx.drawImage(img, 0, 0, width, height));
// 循环把帽子画到对应的点上
for (let i = 0, len = info.length; i < len; i++) {
drawHat(ctx, info[i]);
}
}
Дисплей готовой продукции
Вы чувствуете себя идеально? В настоящее время появилась возможность адаптироваться к лицам разных размеров и лицам с разной ориентацией. Даже аватар собаки можно распознать, что выгодноface-api.js
Предоставленная модель также имеет данные для обучения собачьей морде.
Конечно, этот пример на самом деле довольно несовершенен, потому что, когда вы протестируете множество изображений, вы обнаружите, что проблема с распознаванием изображения профиля все еще существует:
Это связано с тем, что размер лица, рассчитанный предыдущим методом, на самом деле неточен.На самом деле необходимо знать, смотрит ли пользователь в настоящее время сбоку или спереди в соответствии с соотношением двусторонних глаз, чтобы продолжить настройку. размер и положение шляпы. Однако мы не будем продолжать оптимизировать его здесь, заинтересованные друзья могут подумать о том, как изменить его самостоятельно.
напиши в конце
На приведенном выше небольшом примере мы можем обнаружить, что внешний интерфейс также может достигать многих невероятных и интересных вещей с помощью машинного обучения.VR
,AR
,webRTC
, мы можем даже сделать интерактивную игру на чистом интерфейсе.
Конечно, даже в этом примере можно сделать расширения, например, нарисовать новогоднюю бороду, макияж...
Если вы хотите продолжать узнавать больше о машинном обучении, вы можете перейти на CourseaВводный курс по машинному обучению, если вы хотите узнать больше о Tensorflow, вы можете перейти на Tensorflow.jsофициальная документация.
Хотя я уже жаловался на слишком много знаний в Tensorflow.js, я должен сказать, что документация Google по-прежнему хорошо написана, она предоставляет много примеров и учит, как реализовать некоторые простые функции: распознавание рукописных цифр, прогнозирование, классификацию изображений Tensorflow. .js... Так что детская обувь, заинтересованная в Tensorflow.js, может захотеть перейти к его официальной документации.
Но в конце концов, Tensorflow.js — это все еще очень низкоуровневая библиотека, и если вы просто хотите сделать что-то интересное с машинным обучением, вы можете попробовать ее.ml5.js, вот наборобучающее видео.
Наконец, я желаю вам счастливого Рождества!
Ссылаться на
GitHub.com/ Культура, которую он, как говорят, читает…
face-api.js — JavaScript API для распознавания лиц в браузере с помощью tensorflow.js.
тензорный поток.Google.can/is/tutorial…
woohoo.YouTube.com/watch?V=показать группу…
Блог Woohoo.cn на.com/Su Yuanli/Afraid/…
Эта статья была опубликована сКоманда внешнего интерфейса NetEase Cloud Music, Любое несанкционированное воспроизведение статьи запрещено. Мы всегда нанимаем, если вы готовы сменить работу и вам нравится облачная музыка, тоПрисоединяйтесь к нам!