;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

App


Em alta, Voilà transforma selfies em desenhos; mas é seguro? Veja os riscos

Voilà AI Artist - Reprodução
Voilà AI Artist Imagem: Reprodução

Marcos Bonfim

Colaboração para Tilt

10/06/2021 04h00

Há uma nova febre nas redes sociais: o Voilà AI Artist. O aplicativo, já disponível para Android e iOS, usa inteligência artificial para transformar suas selfies em desenhos 3D. Depois, a criação pode ser compartilhada com os amigos e seguidores, semelhante ao popular ToonMe, que faz caricaturas a partir de fotos.

Fazendo o uso das imagens dos usuários, o Voilà AI Artist coloca em evidência questões semelhantes às trazidas pelo FaceApp, que bombou ao envelhecer pessoas com filtros de rosto há alguns anos, mas que causou muita polêmica em termos de privacidade.

O novo app informa, por exemplo, na sua política de privacidade, que as imagens enviadas para a transformação am a ser de propriedade da Wemagine.AI, responsável pela ferramenta. A empresa não deixa claro o que pode fazer com esses arquivos.

No mundo online é comum que companhias usem bancos de imagens coletadas de pessoas reais para treinar tecnologias de inteligências artificiais e de reconhecimento facial. Mas é importante que as organizações sejam transparentes sobre o processo.

Segundo a empresa de segurança online Kaspersky, questões de segurança e privacidade devem ser levadas em consideração, como a responsabilidade no processamento e armazenamento das informações pessoais.

Onde estão os riscos?

Com o avanço do uso do reconhecimento facial para o desbloqueio de celulares e apps bancários, em detrimento das senhas numéricas, a coleta de imagens dos rostos dos usuários demanda cada vez mais cuidado.

Nesse caso, o risco é de que, por meio de um ataque hacker, criminosos tenham o a bancos de dados de fotos e usem as selfies encontradas ali para práticas ilícitas, como o roubo de identidade com pessoas se ando por você.

Vale sempre levar em conta que esses dados estão armazenados em servidores de terceiros e são processados na nuvem. O Voilà AI Artist, por exemplo, usa o sistema do Google (Cloud Platform) para hospedar seus dados.

Ao analisar as políticas do aplicativo, a Kaspersky acredita que, considerando o modelo de negócio do app, com propagandas e ofertas pagas dentro da aplicação, não há indício de que a venda das fotos coletadas seja seu objetivo principal.

Outras informações coletadas

Além das selfies que você entrega ao aplicativo, ele pode coletar diversas outras informações, de acordo com a política de privacidade da Wemagine.AI, que conta com termos muito similares aos de grandes companhias de tecnologia, como o Google.

Entre os dados coletados estão:

  • as fotos que são escolhidas pelo usuário;
  • o histórico de compras no app (caso de plano de );
  • o modelo do celular;
  • a resolução da tela;
  • o sistema operacional;
  • sua localização;
  • e dados de sua navegação online, como sites que foram visitados.

A Wemagine.AI afirma que essas informações são usadas para melhorar o aplicativo, direcionar anúncios e prevenir fraudes. A empresa também diz que não vende ou aluga as informações a terceiros para qualquer finalidade.