Uma introdução a nova plataforma de internet das coisas do Google, o Android Things, e como fazer dispositivos mais inteligentes e poderosos com ela, aliado de ferramentas de Machine Learning. O objetivo é cobrir o básico de como começar com a plataforma, passar alguns conceitos de Machine Learning e apresentar alguns projetos que podem ser feito com isso. Em especial será mostrado um projeto de máquina de doces inteligente, que utiliza o poder do Android Things, aliado com APIs de Machine Learning do Google, como a Cloud Vision API e o Tensorflow, para reconhecer imagens e que dar aos usuários doces se eles mostrarem os objetos corretos para a máquina.
24. Machine Learning
Aprendizado de máquina
Reconhecer padrões
em dados de
treinamento
Aplica padrões
reconhecidos em
dados desconhecidos
Regressão ou
classificação dos
dados
Ajuste do modelo
24
26. • Usar a Cloud já pronta (Visão, linguagem
natural, tradução, etc.)
• Usar um arquitetura existente e re-treinar ela
ou fazer um ajuste fino para o seu conjunto
de dados
• Desenvolver o seu próprio modelo para
resolver novos problemas
Mais
flexível,
mas
requer
maior
esforço
Como você pode iniciar com Machine Learning?
Três caminhos, com diferentes complexidades:
26
27. Cloud
Natural Language
Cloud
Speech
Cloud
Vision
Cloud Machine Learning APIs
Veja, Ouça e Entenda o mundo
Cloud
Video Intelligence
Cloud
Translation
27
28. Faces
Faces, marcações faciais, emoções
OCR
Ler e extrair texto, com suporte
para > 10 linguagens
Classificação
Detectar entidades de mobília a
meios de transporte
Logos
Identificar logos de produtos
Marcos e Propriedades da
imagem
Busca Segura
Detectar conteúdo explícito - adulto,
violência, médicas e fraudes
Cloud Vision API
Reconhecimento de imagens
28
29. • Funções especificas para Deep
Learning
• +67k ⭐ no Github
• Para pesquisa e produção
• O Google fez até hardware
dedicado para ele
• Licença Apache 2.0
TensorFlow
Biblioteca de machine learning Open source
29
31. Reconhecimento de Imagens
Modelo Inception V3 - Modelo desenvolvido pelo Google
https://research.googleblog.com/2016/03/train-your-own-image-classifier-with.html
Fire Salamander
Golden Retriever
Dalmatian
31
32. Transferência de conhecimento
Utilizar modelos já prontas e/ou re-treinar com novos dados
Inception V3 - Classifica imagens
Modelo desenvolvido pelo Google
32
33. MobileNets
Modelos de visão computacional mais enxutas
Tradeoff de acurácia vs Tamanho e Tempo de execução
https://research.googleblog.com/2017/06/mobilenets-open-source-models-for.html
33
34. Tensorflow Object Detection API
Treine com seus dados e aproveite um modelo já treinado para detectar objetos e classificar
https://cloud.google.com/blog/big-data/2017/06/training-an-object-detector-using-cloud-machine-learning-engine
34
https://medium.com/towards-data-science/is-google-tensorflow-object-detection-api-the-easiest-way-to-implement-image-recognition-
a8bd1f500ea0
36. Classificação de Pepinos
Tensorflow rodando local no dispositivo embarcado
https://cloud.google.com/blog/big-data/2016/08/how-a-japanese-cucumber-farmer-is-using-deep-
learning-and-tensorflow
36
37. Reconhecimento de objetos + classificação
Exemplo de uso de OpenCV + Tensorflow
37
https://medium.com/towards-data-science/how-to-train-your-own-object-detector-with-tensorflows-
object-detector-api-bec72ecfe1d9
38. Só por diversão - App “Not Hotdog” Silicon Valley
Classificação de imagens
38
https://medium.com/@timanglade/how-hbos-silicon-valley-built-not-hotdog-with-mobile-tensorflow-
keras-react-native-ef03260747f3
46. class CandyMachine(gpio: String): AutoCloseable{
private val CANDY_TIMEOUT = 3*1000L
private var mCandyPin: Gpio? = null
private var mCandiesTimer: CountDownTimer? = null
init{
val service = PeripheralManagerService()
mCandyPin = service.openGpio(gpio)
mCandyPin?.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW)
mCandyPin?.setActiveType(Gpio.ACTIVE_HIGH)
}
}
Peripheral I/O - GPIO
Comunicação mais baixo nível
46
47. fun giveCandies() {
mCandyPin?.value = true
mCandiesTimer?.cancel()
mCandiesTimer = object: CountDownTimer(
CANDY_TIMEOUT, CANDY_TIMEOUT) {
override fun onTick(remainingMillis: Long) {}
override fun onFinish() {
mCandyPin?.value = false
}
)
mCandiesTimer?.start()
}
Peripheral I/O - GPIO
Comunicação mais baixo nível
47
53. dependencies {
compile ’com.google.api-client:google-api-client-android:...'
compile ’com.google.apis:google-api-services-vision:...'
fun annotateImage(imageBytes: ByteArray): Map<String, Float>{
// Construct the Vision API instance
val httpTransport = AndroidHttp.newCompatibleTransport()
val jsonFactory = GsonFactory.getDefaultInstance()
val initializer = VisionRequestInitializer(CLOUD_VISION_API_KEY)
val vision = Vision.Builder(httpTransport, jsonFactory, null)
.setApplicationName("AI Candy Dispenser")
.setVisionRequestInitializer(initializer)
.build()
Vision API
API bastante simplificada
53
54. // Create the image request
val imageRequest = AnnotateImageRequest()
val image = Image()
image.encodeContent(imageBytes)
imageRequest.image = image
// Add the features we want
val labelDetection = Feature()
labelDetection.type = "LABEL_DETECTION"
labelDetection.maxResults = 10
imageRequest.features = listOf(labelDetection)
// Batch and execute the request
val requestBatch = BatchAnnotateImagesRequest()
requestBatch.requests = listOf(imageRequest)
val response = vision.images()
.annotate(requestBatch)
.setDisableGZipContent(true)
.execute()
Vision API
54
55. val IMAGE_SIZE = 224
private val IMAGE_MEAN = 117
private val LABELS_FILE = “imagenet_comp_graph_label_strings.txt"
val MODEL_FILE = "file:///android_asset/tensorflow_inception_graph.pb"
val NUM_CLASSES = 1008
private val mInferenceInterface: TensorFlowInferenceInterface
private val mLabels: List<String>
init {
mInferenceInterface = TensorFlowInferenceInterface(ctx.assets,
MODEL_FILE)
mLabels = readLabels(ctx)
mInvertedIndex = readInvertedIndex(ctx)
mCroppedBitmap = Bitmap.createBitmap(IMAGE_SIZE, IMAGE_SIZE,
Bitmap.Config.ARGB_8888)
}
TensorFlow
InceptionV3 rodando no Android
dependencies {
compile 'org.tensorflow:tensorflow-android:1.2.0-preview'
}
55
56. fun annotateImage(imageBytes: ByteArray): Map<String, Float> {
val image = BitmapFactory.decodeByteArray(imageBytes,0,imageBytes.size)
this.cropAndRescaleBitmap(image, mCroppedBitmap)
val pixels = this.getPixels(mCroppedBitmap)
// Feed the pixels of the image into the TensorFlow Neural Network
mInferenceInterface.feed(INPUT_NAME, pixels, *NETWORK_STRUCTURE)
// Run the TensorFlow Neural Network with the provided input
mInferenceInterface.run(OUTPUT_NAMES)
// Extract the output from the neural network back into an array of confidence
per category
val outputs = FloatArray(NUM_CLASSES)
mInferenceInterface.fetch(OUTPUT_NAME, outputs)
// Get the results with the highest confidence and map them to their labels
return this.getBestResults(outputs, this.mLabels)
}
TensorFlow
InceptionV3 rodando no Android
56
57. Open Source - Máquina de Doces Inteligente
https://github.com/alvarowolfx/ai-candy-dispenser
https://www.hackster.io/alvarowolfx/android-things-a-i-candy-dispenser-a47e74
57
62. Codelab - Android Things Image Classifier
https://codelabs.developers.google.com/codelabs/androidthings-classifier
62
63. Reconhecimento de lábios
Cruza reconhecimento de áudio e video para entender o que está sendo falado
63
https://github.com/astorfi/lip-reading-deeplearning
64. Codelab - Cloud Function + Cloud Vision API
https://codelabs.developers.google.com/codelabs/firebase-cloud-functions
64
65. Projetos - Monitor Energia AndroidThings
https://github.com/riggaroo/android-things-electricity-monitor
65