# TensorflowJS
O TensorFlow.js é uma biblioteca JavaScript acelerada por hardware de código aberto para treinamento e implantação de modelos de aprendizado de máquina.
# O projeto
O projeto consiste num site em que é possível enviar uma imagem e obter como resultado qual a possibilidade de determinados elementos estarem nelas. A ideia é que toda a rede neural seja carregada client side, ou seja, no próprio navegador do usuário. Isso é possível graças ao TensorflowJS e abre possibilidades interssantes, como o uso do hardware do usuário, possibilidade de se usar um celular, além de trazer maior privacidade (opens new window)
Os modelos utilizados, VGG16 e MobileNet, foram importados do Keras e convertidos para um modelo tfjs usando um script python (opens new window). Vale salientar que é recomendado o uso do MobileNet, visto que ele já é adpatado para uso mobile (o que pode ser visto pelo seu próprio tamanho, 16mb vs 500mb do VGG16).
# Breve explicação sobre os modelos utilizados
# VGG16
VGG16 é um rede neural convolucional para reconhecimento de objetos desenvolvido e treinando pelo grupo de Oxford, Visual Geometry Group (VGG). Ele venceu a competição ILSVR (Imagenet) (opens new window) em 2014, e é considerada uma das excelentes arquiteturas de modelos de visão até hoje.
# MobileNet
As MobileNets são modelos pequenos, de baixa latência e baixa potência, parametrizados para atender às restrições de recursos de vários casos de uso. Eles podem ser construídos para classificação, detecção, incorporação e segmentação semelhantes à forma como outros modelos populares de larga escala, como o Inception, são usados.
As MobileNets trocam entre latência, tamanho e precisão, comparando favoravelmente com modelos populares da literatura.
# Algumas funções utilizadas
fromPixels => Cria um tensor a partir de uma imagem.
resizeNearestNeighbor => Redimensiona um lote de imagens 3D para uma nova forma (224x224).
loadLayersModel => Carregar um modelo composto por Layers, incluindo sua topologia e pesos opcionais.
toFloat => Converte o tipo para float32.
expandDims => Expande a dimensão do tensor.
reverse => Inverte um tensor ao longo de um eixo especificado.
tensor1d => Cria um tensor unidimensional (Rank-1) com os valores, tamanho e dtype fornecidos.
scalar => Cria Tensor rank-0 (escalar)
sub => Subtrai dois Tensores elemento a elemento, A - B.
div => Divide dois Tensores elemento a elemento, A/B.
# Referências
TensorFlowJS (opens new window)
Step by step VGG16 implementation in Keras for beginners (opens new window)
What is the VGG neural network? (opens new window)
MobileNet Github (opens new window)
Olga Russakovsky*, Jia Deng*, Hao Su, Jonathan Krause, Sanjeev Satheesh, Sean Ma, Zhiheng Huang, Andrej Karpathy, Aditya Khosla, Michael Bernstein, Alexander C. Berg and Li Fei-Fei. ImageNet Large Scale Visual Recognition Challenge (opens new window). IJCV, 2015