Treinando um Serviço de Reconhecimento de Imagem com SAP Leonardo Machine Learning
Treine seu próprio modelo e o consuma como um serviço integrado através de uma aplicação SAPUI5 no SCP
E aweeee meu povo!!!!!
No último post nós criamos uma aplicação utilizando um serviço que o SAP Leonardo nos disponibiliza. Dessa vez, vamos criar uma aplicação onde a ideia é o reconhecimento dos logos do SAPUI5, OpenUI5 e NodeJS.
Em resumo, após este post você será capaz não apenas de criar uma aplicação com integração com os serviços do SAP Leonardo, como também será capaz de customizar um serviço já existente com o recurso de treinamento. Dessa forma será possível reconhecer imagens mais específicas (como é o caso dos logos do NodeJS ou do SAPUI5).
E a melhor parte é: tudo isso sem que você precise ser um cientista de dados ou expert no assunto. Caso você seja novo por aqui, recomendo que você leia primeiro os seguintes posts:
Introdução
No post anterior nós criamos uma aplicação integrada com um serviço pronto para consumo onde, naquele cenário, fomos capazes de identificar rostos. Entretanto, não éramos capazes de identificar de quem eram os rostos de forma precisa.
Para o nosso caso de uso, hoje vamos treinar um classificador para predizer exatamente se uma imagem é o logo do NodeJS ou SAPUI5/OpenUI5. Para isso, vamos antes entender uma técnica através da qual seremos capazes de treinar um modelo onde, caso seja necessário, além de reconhecer o que é um rosto (retomando o exemplo do post passado), identifique de quem é o rosto.
Isso que estamos prestes a fazer é o que se chama de Transferência de Aprendizagem (Transfer Learning), que consiste na reutilização de um modelo pré-treinado em um novo problema. Esta técnica é muito popular no campo do Deep Learning pois permite treinar Redes Neurais com dados relativamente pequenos. Com o Transfer Learning, o conhecimento de um modelo de Aprendizado de Máquina já treinado é aplicado a um problema diferente, mas relacionado.
O Transfer Learning é muito utilizado — e a SAP faz uso disso. Existem alguns modelos pré-treinados para aprendizado de máquina que se tornaram bastante populares. A SAP, por exemplo, utiliza um deles que é o modelo Inception-v3, que foi treinado pelo ImageNet. Esse tipo de prática é muito útil quando não há dados suficientes para treinar uma rede neural. Neste caso, uma maneira de contornar esse problema seria encontrar alguém que tenha treinado uma rede neural suficientemente para que sirva de ponto de partida para você utilizar como base, e então resolver o problema da sua rede neural.
Em resumo, com o aprendizado por transferência, basicamente tentamos explorar o que foi aprendido em uma tarefa para melhorar a generalização em outra. Transferimos os pesos que uma rede aprendeu na tarefa A para uma nova tarefa B.
Treinando um serviço
O treinamento de um serviço é um processo que não é complexo, entretanto envolve alguns passos.
Passo 1 — Efetue login no SCP, e então acesse o ambiente Cloud Foundry.
Passo 2 — Acesse a sua subconta.
Passo 3 — Acesse a opção Spaces e, então, acesse o espaço disponibilizado para a sua conta.
Passo 4 —Aqui, vamos iniciar o processo de criação de uma instância do serviço SAP Leonardo Machine Learning. Para tal, vá até o Service Marketplace e busque por: ml-foundation.
Passo 5 — Nesta área é possível ter acesso ao suporte e documentação deste serviço, mas o que queremos neste momento é criar nossa instância. Desta forma, clique em: Instances.
Passo 6 — Clique em New Instance e preencha as informações como descrito abaixo.
Passo 7 — Podemos ver que a instância foi criada com sucesso, podendo fazê-lo, também, acessando pelo terminal. Efetue o Login no SCP utilizando o CLI. — Caso não saiba ou não se lembre como fazer isso é possível verificar aqui).
cf login -a <ENDPOINT> -u <USUARIO LOGIN>
ou apenas cf login
cf services
Passo 8 — De volta ao SCP, vamos agora criar uma chave para que seja possível acessar essa instância que acabamos de criar de fora do ambiente do SCP.
Esta chave é extremamente importante, pois ela é a referência para a criação do token que utilizaremos para ter acesso externo a nossa instância. Além disso, ela nos fornece os endereços das APIs que utilizaremos daqui para frente.
Passo 9 — Essa chave também é possível acessar via CLI com o seguinte comando:
cf service-key <NOME DA INSTANCIA> <NOME DA CHAVE DO SERVIÇO>
Passo 10 — Com a nossa instância com serviços de machine learning funcionando, o que necessitamos é iniciar o treinamento do nosso modelo. Para o inicio dessa atividade, vamos precisar de: dados.
Para iniciar o carregamento de dados na nossa instância, necessitamos entrar no mesmo site onde baixamos a ferramenta CLI, mas dessa vez será para baixarmos um plugin que nos possibilitará ter maior controle sobre a instância de machine learning que acabamos de criar — tudo isso via terminal.
Apenas esclarecendo: o CLI que utilizamos consegue gerir recursos relacionados ao Cloud Foundry, e o que necessitamos agora é ir até uma camada mais abaixo, daí a necessidade deste plugin.
Vamos clicar em ML Foundation e escolher o nosso sistema operacional de preferência.
Após o download da aplicação, descompacte-a. Utilizando o terminal, navegue até a pasta descompactada e, então:
- Linux/Mac
cf install-plugin -f sapmlcli
- Windows
cf install-plugin -f sapmlcli.exe
[OFF-Topic]
Este plugin do CLI é uma extensão do plugin CF padrão. A SAP cuidou por inserir um comando chamado sapml
para interagir facilmente com nossas instâncias e APIs do Machine Learning Foundation (MLF).
Caso você encontre algum problema com essa ferramenta, você pode utilizar uma outra:
[/OFF-Topic]
Passo 11— Com o plugin instalado, agora somos capazes de controlar a instância que criamos de machine learning a nível de sistema de arquivos. Assim, passaremos a utilizar, juntamente com o comando CF, o comando SAPML e, com isso, teremos acesso a recursos como:
cf sapml
Porém, antes de qualquer coisa, vamos realizar algumas configurações.
Comecemos então com:
cf sapml config get
Você perceberá uma série de propriedades sem valores. Vamos trabalhar para configurá-las. Caso você já tenha usado antes, verifique se os valores apontam para os mesmo endereços previamente indicados na chave que geramos.
Passo 12 — Vamos iniciar o Cloud File System. Execute o seguinte comando:
cf sapml fs init
Passo 13 — Podemos listar os diretórios disponíveis executando:
cf sapml fs list
Após este comando você poderá ter certeza se o plugin SAPML realmente está funcionando. Caso você obtenha sucesso, você não terá nenhum retorno ( já que ainda não carregamos nenhum arquivo na nossa instância).
Entretanto, caso você tenha o retorno abaixo:
Isso significa que você necessitará utilizar o Minio. — Vou passar maiores detalhes do uso do Minio quando realmente formos realizar o upload de dados para a instância do ML no SCP.
Passo 14 — Para realizar o upload do nosso Dataset em nossa instância, eu agilizei o trabalho e já criei um dataset pequeno. Apenas será necessário realizar o download do arquivo Logos.zip para, posteriormente, realizarmos upload em nossa instância. Segue o link:
Mas o que seria um Dataset mesmo? Esta nova palavra deverá fazer parte cada dia mais do nosso cotidiano. Dataset nada mais é do que uma coleção de dados que exige uma organização especial e que, no nosso caso, deve ser estruturado da seguinte forma — para quando o SCP iniciar o treinamento, conseguir realizar o passo a passo das validações do modelo:
Nessa estrutura temos os seguintes diretórios:
- Training: Dentro desta pasta devem ficar as imagens que disponibilizaremos para o algoritmo de ML aprender qual é o logo do NodeJS e qual é o logo do SAPUI5/OpenUI5 para, então, ser capaz de gerar o modelo. A proporção das imagens que devem ser separadas para treino é muito importante. Eu costumo distribuir meu dataset com pelo menos 75% — 80% de todo dataset apenas para o treinamento. E o restante divididos nos demais diretórios Validation e Test (ex da distribuição nos diretórios: 80%–10%–10%);
- Validation: Após o treinamento, o algoritmo utiliza as imagens disponibilizadas na pasta validation para fornecer uma avaliação imparcial de um ajuste de modelo no conjunto de dados de treinamento enquanto ajusta os hiperparâmetros do modelo. Assim, o modelo ocasionalmente tem acesso a esses dados, sendo importante salientar que, neste momento, não há aprendizado, durante a validação a ideia é que sejam redefinidos os hiperparâmetros.;
- Test: Aqui encontramos um conjunto de exemplos usados apenas para avaliar o desempenho de um classificador totalmente treinado. No caso do MLP, usaríamos o teste para estimar a taxa de erro depois de escolhermos o modelo final.
Um ponto muito importante que quero ressaltar é: este dataset que estou disponibilizando é muito pequeno, e ele seria inviável em um teste no mundo real. Optei por fazer algo menor, pois o meu foco é passar por todo o processo durante o treinamento de um serviço. Então, cuidado antes de sair dizendo por ai que entende de machine learning, pois só o processo de criar um dataset já é bastante complexo e exigiria diversos posts apenas sobre este tema.
Passo 15 —Agora que entendemos melhor o que é o dataset que acabamos de realizar o download, é hora de fazer seu upload na instância que criamos.
Para realizar o upload, navegue até o local onde está localizada a pasta descompactada Logos e, então, execute o seguinte comando (caso você não tenha tido problema com o SAPML):
cf sapml fs put <PASTA LOCAL> <PASTA DE DESTINO>
Caso você não tenha tido problema com o comandos acima, poderá ir direto para o Passo 16. Caso contrário, pode seguir a leitura pois irei mostrar como seguir o upload utilizando o Minio.
Neste caso, você deverá utilizar o Minio. A configuração do Minio é dada pelo seguinte:
Primeiro, vá até o terminal vamos consultar novamente a service-key:
cf service-key <NOME DA INSTANCIA> <NOME DA CHAVE DO SERVIÇO>
Copie a propriedade URL
No Postman, vamos colar a URL copiada no passo anterior, complementando com os valores:
Consumindo o serviço pelo Postman, você deverá ter acesso a um access-token, como na imagem abaixo:
Ainda no Postman, vamos agora consumir o seguinte serviço:
Este serviço irá nos retornar o <accessKey>, <secretKey> e <endpoint> para que sejamos capazes de configurar o Minio.
Utilizando o terminal, navegue até a pasta onde está o executável do Minio e execute o seguinte comando:
mc config host add saps3 https://<ENDPOINT> <ACCESSKEY> <SECRETKEY>
Após configurado, os comandos do Minio são:
- Para listar todos os diretórios:
mc ls saps3
- Para realizar upload:
mc cf --recursive <PASTA_LOCAL> <PASTA_DE_DESTINO>
Como um apoio extra deste post, o Lars Gregori utiliza o Minio para realizar upload.
Após o upload vamos iniciar três importantes passos: execução do Job que inicia o processamento de treinamento e irá gerar o nosso modelo; o Deploy do nosso modelo e o Consumo do nosso serviço.
Passo 16 — A partir desse passo é possível realizar todo o procedimento de treinamento pelo próprio CLI através do comando jobs e job_submit. Entretanto, estou optando por fazer pelo modo que é levemente mais demorado apenas porque, com ele, vamos conhecer mais aspectos relacionados ao SCP e suas ferramentas. Além disso acredito que, para nós desenvolvedores, a utilização das APIs nos dará uma base melhor para entender todo o processo.
Como disse, este modo que vamos fazer é utilizando as APIs, e essas APIs nos foram informadas assim que conseguimos ter acesso à chave de acesso do serviço da nossa instância.
Como estamos prestes a iniciar o treinamento de um serviço relacionado a processamento em imagens, vamos acessar o link da propriedade:
IMAGE_RETRAIN_API_URL
Pegue o link que é informado junto da opção IMAGE_RETRAIN_API_URL e abra-o no seu navegador. Após acessar a página, você terá acesso a uma ferramenta chamada swagger.
Esta ferramenta é capaz de nos auxiliar no desenvolvimento em todo o ciclo de vida de uma API, desde o design e a documentação até o teste e a implantação. Hoje, iremos utilizá-la para alguns testes, mas principalmente para entender a documentação dos serviços que estamos prestes a consumir.
Perceba que, ao acessar o link, a descrição é que estamos em uma API para treinar modelos que outras duas APIs são capazes de tomar como base, sendo elas: Image Classification e Feature Extraction.
Lembrando que a ideia aqui é criarmos um modelo customizado para reconhecer os logos do NodeJS e SAPUI5/OpenUI5, pois hoje não existe um serviço que seja capaz de realizar essa distinção. Então, após termos um modelo treinado, utilizaremos o serviço de Image Classification com o nosso modelo treinado como base.
Para o treinamento, é possível ver os serviços que utilizaremos:
Passo 17 — Antes de iniciarmos o processo de treinamento, vamos executar um passo que servirá para todos os demais, que é a geração do token para Autenticação nas APIs. Caso você tenha utilizado o Minio para upload do dataset , já terá feito boa parte desse processo.
Vamos novamente voltar a nossa Service-Key, e então copiar as propriedades:
clientid
clientsecret
url
Vamos ao Postman consumir o serviço de autenticação da seguinte maneira:
Após a execução, deveremos ter um retorno 200 como a seguir:
Passo 18 — Vamos agora iniciar o treinamento do nosso modelo utilizando o serviço de Jobs. Como vocês já puderam perceber, essa ferramenta é muito similar a que utilizamos em posts passados para o consumo de serviço. Sendo assim, saiba que podemos utilizar, também, o Postman.
Após o clique, você poderá editar os valores da chave body, tendo acesso assim aos seguintes valores:
Estas opções nada mais são do que elementos que compõem a configuração do Job que estamos prestes a criar. Neste momento, vamos apenas nos preocupar com as propriedades:
- jobName: Identificação que daremos ao nosso job;
- dataset: Indicação de qual o nome do dataset que fizemos upload, o que no nosso caso será o Logos;
- modelName: Identificação que daremos ao nosso modelo treinado.
Ficando assim:
Feito isso, preencha a chave Authorization conforme imagem abaixo:
Teremos o resultado a seguir:
Para acompanhar o status do Job (que inicialmente é Pendente), podemos utilizar no serviço Jobs o método GET para acompanhar o status do Job.
Confesso que não sou o maior apreciador da utilização do swagger, simplesmente por ser uma ferramenta que depende do navegador, o que nos deixa (ocasionalmente) sujeitos a problemas relacionado a sessão. Por isso, vou seguir os próximos exemplos utilizando o Postman.
Uma curiosidade: vá ao seu terminal e acesse o diretório da sua instância como no exemplo abaixo:
Passo 19 — Com nosso modelo treinado com sucesso, é chegado o momento de colocá-lo no ar. Para esta tarefa, iremos utilizar o serviço de deployment:
Da mesma forma que no serviço de jobs, é possível consultar todos os deployments realizados (ou buscar por algum específico para poder analisar o status).
Passo 20 — Modelo treinado e no ar, agora é a hora de o testarmos. Como dito no início do post, treinamos um modelo para ser utilizado com os serviços de Image Classification ou Feature Extraction.
Vamos pegar o endereço do serviço de classificação na nossa Service Key como a seguir:
Acessando a URL do Image Classification temos o seguinte:
Integrando com uma aplicação SAPUI5
Ufa, sei que chegar aqui não foi nada simples! Mas agora falta pouquinho, então vamos lá.
A primeira coisa que vamos fazer é o clone do projeto que está no GitHub. Então, para isso, vamos abrir o terminal e clonar o projeto:
git clone https://github.com/erickcarvalho/bar8-cf-exemplo04.git
Após clonar o projeto, acesse o diretório onde está a aplicação e então execute o comando do node para baixar as dependências:
npm install
node index
Antes de testarmos nossa aplicação, vamos realizar um único ajuste. Vamos abrir o projeto e navegar até o arquivo: settings.json
Uma observação muito importante aqui é que quando você precisar desenvolver sua aplicação para valer, o valor informado aqui no Authorization expira a cada 12 horas, pois isto é um token de autorização. Sendo assim, é necessário desenvolver uma rotina na sua aplicação que seja capaz de se autenticar no serviço da SAP, obtendo um token para o consumo de serviços.
Entretanto, vimos hoje qual o serviço que realiza a geração desse token. Logo, um Ajax bobo resolve esse problema.
Nesse momento um ponto muito importante: quando escolhemos a imagem, a aplicação irá realizar uma chamada Ajax para a instância que subimos do nosso serviço. Como estamos realizando esta chamada de um domínio http://localhost:3000, teremos um problema de CORS. Isso é facilmente contornado utilizando uma extensão no seu navegador como a seguinte:
Não conhece sobre o assunto? Você pode entender muito melhor aqui:
Conclusão
Hoje vimos que não é necessário ser um expert para conseguir utilizar o treinamento de um algoritmo. Em apenas alguns passos, fomos capazes de realizar:
- MLF;
- Preparação e armazenamento do dataset para o treinamento;
- Treinamento do modelo;
- Deploy do modelo;
- Executar o serviço de classificação.
Tudo isso seguindo os seguintes passos:
- Login no SAP CF usando o CF CLI;
- Deploy da aplicação usando o SAP Cloud Foundry;
- Criação de uma Instância de Serviço e uma Chave de Serviço no Cockpit do SCP;
- Carga do dataset para treinamento;
- Treinamento do modelo;
- Deploy do modelo treinado usando APIs;
- Teste do modelo treinado usando o Postman;
- Uso do modelo treinado para inferência (com o aplicativo SAPUI5 preparado).
Então, para que realmente todo este passo a passo fixe (e para que você entenda tudo o que aconteceu), aconselho que você melhore o modelo, aumentando, assim, a precisão do algoritmo.
A aplicação de técnicas como a que vimos aqui hoje são muito interessantes para cenários como:
- Reconhecimento de produtos — Imagine a possibilidade de acelerar o processo junto ao consumidor ou no seu time com o reconhecimento de produtos baseado em fotos. Seja para a abertura de uma ordem de compra ou uma ordem de reparo sem a necessidade de preenchimento de documentos pelos colaboradores ou o cliente, isso pois uma vez identificado a peça ou o produto, uma aplicação é capaz de providenciar o preenchimento da ordem de forma automática;
- Reconhecimento de equipamentos de segurança — Com uma imagem é possível indicar se um colaborador está (ou não) utilizando algum item obrigatório de segurança;
- Varejo — Aqui as possibilidades são incríveis, pois imagine acompanhar em tempo real prateleiras — seja para organização ou para traçar perfis das pessoas que estão consumindo um produto e, até mesmo, identificação de filas;
- Leitura de textos — OCR sem dúvida é um uso certo para diversos cenários, seja para extração de textos de documentos, etiquetas, traduções e etc…
É muito bom poder ser capaz de soltar um post desse tipo por semana, mas melhor ainda é ter amigos que te dão apoio e te ajudam. Nesta semana a aplicação foi feita pelo Victor Kawabata, que é a pessoa que mais trabalha nos bastidores aqui do Bar8 revisando todos os meus textos. Então, quero agradecer não apenas por esse post, mas por todos os outros em que ele me deu apoio, muito obrigado pela força Pacato!
Então é isso, espero que o artigo tenha sido útil para você. Não deixe de conferir as referências abaixo, e se curtiu o post não deixe de participar comentando, compartilhando ou simplesmente segurando esse botão de aplausos para mostrar que é esse tipo de conteúdo que você deseja ter por aqui. Muito obrigado e até mais!