Quero criar um classificador de imagens, mas não conheço python. O Tensorflow.js trabalha com javascript, com o qual estou familiarizado. Os modelos podem ser treinados com ele e quais seriam as etapas para fazer isso? Sinceramente, não tenho idéia por onde começar.
A única coisa que descobri é como carregar o "mobilenet", que aparentemente é um conjunto de modelos pré-treinados, e classificar imagens com ele:
const tf = require('@tensorflow/tfjs'),
mobilenet = require('@tensorflow-models/mobilenet'),
tfnode = require('@tensorflow/tfjs-node'),
fs = require('fs-extra');
const imageBuffer = await fs.readFile(......),
tfimage = tfnode.node.decodeImage(imageBuffer),
mobilenetModel = await mobilenet.load();
const results = await mobilenetModel.classify(tfimage);
que funciona, mas não adianta para mim, porque quero treinar meu próprio modelo usando minhas imagens com rótulos criados por mim.
=======================
Digamos que eu tenha várias imagens e rótulos. Como os uso para treinar um modelo?
const myData = JSON.parse(await fs.readFile('files.json'));
for(const data of myData){
const image = await fs.readFile(data.imagePath),
labels = data.labels;
// how to train, where to pass image and labels ?
}
fit
método ou no conjunto de dados passados parafitDataset
, como mostrado nos exemplos.Respostas:
Antes de tudo, as imagens precisam ser convertidas em tensores. A primeira abordagem seria criar um tensor contendo todos os recursos (respectivamente um tensor contendo todos os rótulos). Este deve ser o caminho a seguir somente se o conjunto de dados contiver poucas imagens.
Os rótulos seriam uma matriz indicando o tipo de cada imagem
É preciso agora criar uma codificação quente das etiquetas
Uma vez que existem os tensores, seria necessário criar o modelo para o treinamento. Aqui está um modelo simples.
Então o modelo pode ser treinado
Se o conjunto de dados contiver muitas imagens, será necessário criar um tfDataset. Esta resposta discute o porquê.
E use
model.fitDataset(ds)
para treinar o modeloO acima é para treinamento em nodejs. Para fazer esse processamento no navegador,
genFeatureTensor
pode ser escrito da seguinte maneira:Uma palavra de cautela é que o processamento pesado pode bloquear o encadeamento principal no navegador. É aqui que os trabalhadores da web entram em cena.
fonte
tf.image.resizeBilinear
Considere o exemplo https://codelabs.developers.google.com/codelabs/tfjs-training-classfication/#0
O que eles fazem é:
então treine
A construção do conjunto de dados é a seguinte:
A imagem grande é dividida em n pedaços verticais. (n sendo chunkSize)
Considere um pedaço de tamanho 2.
Dada a matriz de pixels da imagem 1:
Dada a matriz de pixels da imagem 2 é
A matriz resultante seria
1 2 3 4 5 6 7 8 9 1 2 3
(de alguma forma a concatenação 1D)Então, basicamente, no final do processamento, você tem um grande buffer representando
[...Buffer(image1), ...Buffer(image2), ...Buffer(image3)]
Esse tipo de formatação é feito muito para problemas de classificação. Em vez de classificar com um número, eles usam uma matriz booleana. Para prever 7 de 10 aulas, consideraríamos
[0,0,0,0,0,0,0,1,0,0] // 1 in 7e position, array 0-indexed
O que você pode fazer para começar
Abaixo, eu subclasse
MNistData::load
(o restante pode ser deixado como está (exceto em script.js, onde você precisa instanciar sua própria classe)Ainda gero imagens 28x28, escrevo um dígito e obtenho uma precisão perfeita, pois não incluo ruídos ou etiquetas voluntariamente erradas.
fonte
Eu encontrei um tutorial [1] sobre como usar o modelo existente para treinar novas classes. Principais partes do código aqui:
index.html head:
index.html body:
index.js:
A idéia principal é usar a rede existente para fazer sua previsão e, em seguida, substituir o rótulo encontrado pelo seu.
O código completo está no tutorial. Outro promissor, mais avançado em [2]. Ele precisa de pré-processamento rigoroso, então deixo apenas aqui, quero dizer que é muito mais avançado.
Fontes:
[1] https://codelabs.developers.google.com/codelabs/tensorflowjs-teachablemachine-codelab/index.html#6
[2] https://towardsdatascience.com/training-custom-image-classification-model-on-the-browser-with-tensorflow-js-and-angular-f1796ed24934
fonte
TL; DR
MNIST é o reconhecimento de imagem Hello World. Depois de aprender de cor, essas perguntas são fáceis de resolver.
Configuração da pergunta:
Sua principal pergunta escrita é
dentro do seu bloco de código. Para aqueles que encontrei a resposta perfeita dos exemplos da seção de exemplos do Tensorflow.js: Exemplo do MNIST. Meus links abaixo têm versões javascript e node.js puras e explicação da Wikipedia. Vou examiná-los no nível necessário para responder à pergunta principal em sua mente e acrescentarei também perspectivas de como suas próprias imagens e rótulos têm alguma coisa a ver com o conjunto de imagens MNIST e os exemplos usando-os.
Primeiras coisas primeiro:
Partes de codigo.
onde transmitir imagens (amostra do Node.js.)
Notas:
O conjunto de dados MNIST é uma imagem enorme, onde em um arquivo existem várias imagens como blocos no quebra-cabeça, todas com o mesmo tamanho, lado a lado, como caixas na tabela de coordenação xey. Cada caixa tem uma amostra e x e y correspondentes na matriz de rótulos têm o rótulo. Neste exemplo, não é grande coisa transformá-lo em vários formatos de arquivo, de modo que, na verdade, apenas uma foto de cada vez seja dada ao loop while para lidar.
Marcadores:
Notas:
Aqui, os rótulos também são dados de bytes em um arquivo. No mundo Javascript, e com a abordagem que você tem no seu ponto de partida, os rótulos também podem ser uma matriz json.
treinar o modelo:
Notas:
Aqui
model.fit
está a linha de código real que faz a coisa: treina o modelo.Resultados da coisa toda:
Nota:
Em Data Science, também desta vez aqui, a parte mais fascinante é saber até que ponto o modelo sobrevive ao teste de novos dados e sem rótulos, pode rotulá-los ou não? Pois essa é a parte da avaliação que agora nos imprime alguns números.
Perda e precisão: [4]
..
Mais Informações:
Nas páginas do github, no arquivo README.md, há um link para o tutorial, onde tudo no exemplo do github é explicado em mais detalhes.
[1] https://github.com/tensorflow/tfjs-examples/tree/master/mnist
[2] https://github.com/tensorflow/tfjs-examples/tree/master/mnist-node
[3] https://en.wikipedia.org/wiki/MNIST_database
[4] Como interpretar "perda" e "precisão" para um modelo de aprendizado de máquina
fonte