;(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

Print de soldados russos e reconhecimento facial: como site ajuda na guerra

iStock
Imagem: iStock

Barbara Mannara

Colaboração para Tilt, do Rio de Janeiro

11/03/2022 16h53

O reconhecimento facial por meio de fotos tem virado uma arma na "guerra virtual" entre Rússia e Ucrânia. Grupos online de "detetives amadores" estão usando a tecnologia para identificar e rastrear soldados russos.

O presidente-executivo de uma empresa chamada Tactical Systems, identificado apenas pelas iniciais YC, afirmou em uma reportagem do site Wired que é um deles.

Ao tirar um print de tela com o rosto de um soldado russo barbudo, que apareceu em um vídeo publicado pelo líder da Chechênia, Ramzan Kadyrov, ele iniciou a investigação online utilizando o site FindClone.

Essa plataforma permite fazer reconhecimento facial gratuitamente, basta fazer o de uma imagem.

Segundo o site Wired, em cerca de uma hora, ele chegou ao resultado.

O FindClone identificou supostamente o mesmo soldado em uma foto apertando a mão de Kadyrov. O homem barbudo da investigação seria Hussein Mezhidov, um comandante checheno envolvido em um dos ataques da Rússia à Ucrânia. Até a conta no Instagram do soldado foi possível encontrar.

Em uma tentativa de confirmar a identidade de Mezhidov, foi utilizado ainda um serviço de comparação facial da Microsoft, abertamente ível. O software indicou que as fotos seriam da mesma pessoa.

"Quanto mais esses indivíduos são identificados publicamente e sabem que a comunidade está seguindo seus movimentos, menor a chance de cometer crimes de guerra", contou o YC à Wired.

E ele não está sozinho. Recentemente, o grupo jornalismo investigativo independente Bellingcat recorreu ao serviço de verificação de rostos da Microsoft. Foi possível observar que a foto do rosto enfaixado de um suposto piloto russo que teria sido abatido na Ucrânia recentemente era, na verdade, o de um piloto que tirou uma foto com Vladimir Putin em 2017 na Síria.

Os algoritmos da Microsoft obtiveram uma pontuação baixa e disseram que os rostos não eram os mesmos.

Um grupo de inteligência ucraniano chamado InformNapalm entrou em contato com a Wired e confirmou também ter usado plataformas de reconhecimento facial para identificar soldados em fotos.

Testando o FindClone

A Wired fez um teste na plataforma com a foto de um homem que um conselheiro do governo ucraniano alegou ser um soldado russo capturado. O resultado chegou em menos de cinco minutos, trazendo até o perfil do sujeito nas redes sociais.

Tilt também testou a plataforma FindClone. Para começar, o site pede um número de telefone celular para fazer o cadastro —pode ser aqui do Brasil mesmo.

A pessoa recebe uma ligação de um número russo e precisa adicionar os cinco últimos dígitos como código de confirmação de cadastro. Por fim, é preciso criar uma senha de o.

FindClone - Reprodução - Reprodução
Imagem: Reprodução

Depois, basta fazer o da foto com o rosto da pessoa que deseja descobrir mais informações. É possível fazer a pesquisa em seis tentativas gratuitamente.

Os resultados mostram o cruzamento da identificação facial em fotos publicadas e de perfis no VKontakte — uma popular rede social russa.

FindClone - Reprodução - Reprodução
Imagem: Reprodução

Usamos fotos divulgadas na conta oficial do Ministério da Defesa da Ucrânia no Twitter, num post que mostra soldados russos capturados pelo 93.º Batalhão Mecanizado da Ucrânia.

FindClone - Reprodução - Reprodução
Imagem: Reprodução

Demorou menos de dez segundos para o FindClone exibir o resultado com o nome da pessoa — que coincide com o nome publicado pelo Ministério de Defesa — e o link do perfil da rede social no VKontakte, que estava com status bloqueado.

FindClone - Reprodução - Reprodução
Imagem: Reprodução

Porém, tecnologias erram

O que acontece quando ocorre uma identificação errada? Famílias e amigos podem ser expostos por um erro de algoritmo. E, segundo a Wired, essas falhas são mais comuns em fotos sem uma visão clara do rosto da pessoa, que acontece muito nos registros de conflitos.

As preocupações de Jameson Spivack, um associado do Centro de Privacidade e Tecnologia de Georgetown, são voltadas para o uso da tecnologia pelo governo, principalmente em momentos de conflitos.

Spivack aponta que o reconhecimento facial não funciona de forma confiável em imagens que não capturam as pessoas de frente, com o rosto exibido de forma não nítida. E isso traz uma limitação para os investigadores da polícia, principalmente em imagens capturadas em câmeras ou registros de guerra.

Além disso, não se sabe como o banco de dados do FindClone foi feito. Se a base de rostos usados para a comparação do algoritmo tiver mais informações de pessoas brancas, por exemplo, a tecnologia será ainda mais imprecisa com rostos diferentes do que ela conhece.