Neste post vou abordar um assunto com o qual os leitores podem facilmente se identificar, pois o que vamos discutir está firmemente arraigado em nossa vida diária. Faça um esforço para ler até o fim. Você pode se surpreender e até gostar.

Como já informei, aqui em nosso lab temos usado o incrível Jupyter Notebook, nas tarefas rotineiras de análise de dados, e também em pesquisas relacionadas à visão de computador e processamento de linguagem natural. Isso nos permite colaborar (trabalhar em rede), consolidar dados que serão usados em outras fases do trabalho e gerar as mais diversas visualizações, que são necessárias nas relações com clientes e o público geral.
Nas últimas semanas estive absorvido na tarefa de desenvolver nossa própria aplicação de reconhecimento facial, usando tecnologias populares na área, como Tensorflow, Computer Vision 2, Matplotlib e Pandas. Tudo orquestrado pela excelente biblioteca DeepFace, que disponibiliza oito modelos pré-treinados.
Os resultados que tivemos foram impressionantes. Animado com os experimentos, preparei este Notebook para demonstrar aos leitores como somos vistos pelos olhos digitais que pululam ao nosso redor (sempre em detrimento de nossa privacidade) e quais as tecnologias empregadas.
Os aeroportos resumem a experiência. Todos sabem que ao entrar nesse tipo de ambiente nós somos enquadrados de todos os ângulos imagináveis, por sensores cada vez mais sofisticados, entre os quais se destacam os onipresentes sensores óticos. Já discutimos neste blog – e vamos continuar – algumas questões éticas e legais a respeito do assunto, mas hoje quero demonstrar sucintamente como a análise facial é feita materialmente e quais as informações que os sistemas de vigilância podem obter bastando apenas voltar seu olhar em nossa direção.
A Tecnologia
Vou ter que usar um pouco de código, e algum jargão, mas você pode pular até o resultado da análise da imagem e discussão, mais abaixo.
Seguindo a tendência de grande parte da indústria, nossa aplicação – escrita em Python – é desenvolvida e executada dentro de um ambiente virtual Conda. O núcleo do ambiente é a versátil biblioteca DeepFace, desenvolvida pela Alphabet (Google), aqui instalada através do repositório pip. (*)ressalto que não é recomendado misturar os canais dos repositórios Conda e pip em um mesmo ambiente, mas neste experimento se torna necessário usar pip pelo fato de DeepFace ainda não estar disponível no repositório Conda.
Depois de ter instalado a DeepFace e suas dependências no ambiente virtual, iniciamos o script importando a DeepFace e outras bibliotecas das quais ela depende, como TensorFlow, CV2 e Matplotilb. TensorFlow é o motor da aplicação. CV2 é responsável pela visão de computador, neste caso digitalizando apropriadamente as imagens. Matplotlib é a responsável pela renderização das imagens (plotagem). Vou comentar o código com as explicações.
#Importando as bibliotecas
from deepface import DeepFace
import cv2
import matplotlib.pyplot as plt
#definição da variável que aponta para o caminho do arquivo de
#imagem a ser carregado
img1_path = "/home/admin/Pictures/bmarques.jpg"
valid_images = [".jpg", ".jpeg", ".png"]
#
img1 = DeepFace.detectFace(img1_path)
#img1 = cv2.imread(img1_path)
#img2 = cv2.imread(img2_path)
#plotar a imagem usando a função imshow()da matplotlib
plt.imshow(img1)
plt.show()

#usando o modelo pré-treinado Facenet para a análise facial.
#DeepFace tem oito modelos pré-treinados; Facenet mostrou um ótimo
#comportamento em nossos testes
model_name = "Facenet"
model = DeepFace.build_model(model_name)
#criando um objeto para conter a análise da imagem
- é neste estágio que tudo acontece
obj = DeepFace.analyze (img_path = img1_path)
Action: race: 100%|███████████████████████████████| 4/4 [00:00<00:00, 4.45it/s]
#resultado da análise é impresso na celula imediatamente abaixo
- e esse é o grande apelo dos notebooks
obj
{'emotion': {'angry': 0.009395538654644042, 'disgust': 2.9171637327962685e-08, 'fear': 15.008127689361572, 'happy': 0.0012321185749897268, 'sad': 1.965186931192875, 'surprise': 0.0033978511055465788, 'neutral': 83.01266431808472}, 'dominant_emotion': 'neutral', 'region': {'x': 54, 'y': 44, 'w': 214, 'h': 214}, 'age': 37, 'gender': 'Man', 'race': {'asian': 8.714590080671769e-05, 'indian': 0.0005141027486388339, 'black': 4.573793077611299e-06, 'white': 96.95228934288025, 'middle eastern': 1.6606895253062248, 'latino hispanic': 1.3864132575690746}, 'dominant_race': 'white'}
Análise dos resultados
Et voilà! Depois de alguns segundos temos o resultado da análise. O algoritmo, mesmo nesta configuração básica, é sensível o bastante para detectar sete variações emocionais, além da idade aparente e do gênero. Ele também é capaz de diferenciar seis etnicidades, um tanto arbitrárias, devo dizer, espelhando a classificação dos países anglo-saxões.
Eu anoto neste ponto que usamos a biblioteca DeepFace em sua configuração original, assim como o modelo de aprendizado de máquina pré-treinado em bancos de imagens com milhões de amostras. Não tivemos ainda tempo hábil para introduzir grandes modificações no código e treinar nossos próprios modelos, o que já está sendo feito – e será mostrado oportunamente.
Esta é a análise que os sistemas fazem sobre mim [sobre nós] no momento em que saio do táxi na porta do aeroporto.
É uma análise aparentemente trivial de uma imagem trivial. Contexto real da foto: acabei de chegar a uma chácara para uma festa de aniversário – alguns anos atrás.
A Análise
O algoritmo me interpreta como um homem branco de aparentes 37 anos – sendo agradavelmente generoso na avaliação etária. É interessante que ele me atribui uma certa negritude, como alternativa, muito mais do que seria esperado de minha ascendência mediterrânea, que fica relegada a um baixíssimo patamar de probabilidade. Minha expressão é calma, que o algoritmo traduz como neutra. Como indicam os números na tabela em inglês, posso estar também um pouco triste, e com um certo nojinho.
Contudo, o resultado me atribui uma significativa aparência de medo, como o segundo resultado mais provável. Por que eu estaria com medo nesta foto? Acabei de chegar a uma festa e a tarde de sábado parece promissora – no aeroporto isso acenderia uma luz amarela no centro de comando da segurança. Interrompo o teste e começo a tentar entender esse resultado aparentemente divergente.
Depois de algumas horas eu tive um insight que realmente me encantou. Eu entendi que, de fato, o algoritmo havia conseguido ver através da minha máscara social. Ele captou uma verdade íntima e bastante sutil: eu realmente sou ansioso em situações sociais, e sempre demoro um pouco a me adaptar aos ambientes – valentemente, com um sorriso no rosto. Mas a ansiedade – uma forma de medo – deve sulcar nossa face de uma maneira óbvia a sistemas de precisão, que conhecem dezenas de milhões de rostos que respondem sempre da mesma maneira; da mesma maneira humana demais. Minúsculos espasmos musculares, resultantes de nossas emoções, não importa quão sutis, deixam sua marca em nossa face, e em imagens de alta resolução nos desnudam de qualquer abrigo.
Ver o sistema em ação elevou em vários graus minha confiança na tecnologia [além de uma óbiva inquietação]. Depois de muitas rodadas do sistema, com imagens diferentes, eu tenho razões para crer que esse tipo de algoritmo é consistente na detecção de sinais e marcadores de emoções bastante sutis.
Revelando emoções ocultas
Existe uma atividade humana em que ser capaz de detectar as emoções alheias seria de muita utilidade: a política, por exemplo. Seria do maior interesse público tentar sondar os reais sentimentos daqueles que se apresentam para gerir a coisa pública. Nessa atividade em que a manipulação das emoções é tão corriqueira, seria interessante tentar ver através das máscaras.
Acontece que em abril de 2022 nós temos essas fantásticas ferramentas e estamos aprendendo a dominá-las. Vamos tentar, então, fazer a mesma análise que fiz acima, de mim mesmo, em imagens casuais dos principais políticos que se apresentam para a disputa presidencial deste ano. Vamos usar fotos tiradas da internet e submetê-las ao mesmo algoritmo.
Com certeza os candidatos não vão se importar, pois todos eles, com palavras ou atos, já se manifestaram apoiadores da vigilância eletrônica na vida do cidadão. É uma ironia deliciosa poder usar contra os representantes do sistema a mesma tecnologia que o sistema usa para nos oprimir delicadamente. Vai ser, no mínimo, divertido.
Nota: as imagens abaixo foram buscadas no site da Wikimedia Commons. Foram escolhidas por serem adequadas a este projeto. São apresentadas na ordem alfabética dos sobrenomes dos retratados.
Este Notebook é melhor visualizado em um desktop.
Bolsonaro, Jair
{'emotion': {'angry': 24.8697891831398, 'disgust': 0.052097911247983575, 'fear': 22.590911388397217, 'happy': 1.137563120573759, 'sad': 20.940209925174713, 'surprise': 0.10565962875261903, 'neutral': 30.303767323493958}, 'dominant_emotion': 'neutral', 'region': {'x': 47, 'y': 105, 'w': 310, 'h': 310}, 'age': 45, 'gender': 'Man', 'race': {'asian': 0.049119803588837385, 'indian': 0.15536767896264791, 'black': 0.004185177385807037, 'white': 77.87047028541565, 'middle eastern': 13.789814710617065, 'latino hispanic': 8.131042122840881}, 'dominant_race': 'white'}
O perfil de Bolsonaro revela uma grande carga de emotividade. Uma mistura de raiva, medo e tristeza, indicando um rosto que quer esconder o que sente. O modelo também é generoso na atribuição da idade, desvio que foi notado em todas as imagens analisadas [creio que sei a razão para isso, que comento na conclusão do artigo].
Dória, João
{'emotion': {'angry': 6.36752073290836e-07, 'disgust': 1.2269752832914434e-15, 'fear': 2.9539995449745504e-09, 'happy': 99.9131977558136, 'sad': 2.336939496083712e-09, 'surprise': 2.453982676786648e-09, 'neutral': 0.08680152823217213}, 'dominant_emotion': 'happy', 'region': {'x': 181, 'y': 74, 'w': 169, 'h': 169}, 'age': 34, 'gender': 'Man', 'race': {'asian': 4.986955150184342, 'indian': 6.949743297680813, 'black': 6.64302373784922, 'white': 28.46213450802174, 'middle eastern': 23.69859657875279, 'latino hispanic': 29.25954635498204}, 'dominant_race': 'latino hispanic'}
Vamos concordar que a imagem não precisa de análise por AI. Embora o modelo opte pela etnicidade Latina, na verdade ele se mostra indeciso. Isso implica em um certo viés colorista. Comento na conclusão.
Gomes, Ciro
{'emotion': {'angry': 4.334507137537003, 'disgust': 0.06524330237880349, 'fear': 1.5229621902108192, 'happy': 0.1706118229776621, 'sad': 29.3074369430542, 'surprise': 0.040569755947217345, 'neutral': 64.55867290496826}, 'dominant_emotion': 'neutral', 'region': {'x': 103, 'y': 54, 'w': 130, 'h': 130}, 'age': 31, 'gender': 'Man', 'race': {'asian': 0.2601263811811805, 'indian': 0.46529844403266907, 'black': 0.04476793110370636, 'white': 75.72914958000183, 'middle eastern': 13.789145648479462, 'latino hispanic': 9.711512178182602}, 'dominant_race': 'white'}
Uma expressão neutra com um forte sinal – isolado – de tristeza. Minha avaliação humana concorda.
Lula da Silva, Luiz Inácio
{'emotion': {'angry': 2.9951875951997993, 'disgust': 9.82732389642797e-06, 'fear': 0.8051269236282661, 'happy': 3.7936406608605777, 'sad': 71.7078549687776, 'surprise': 0.00015608603483019976, 'neutral': 20.69802556622181}, 'dominant_emotion': 'sad', 'region': {'x': 64, 'y': 69, 'w': 126, 'h': 126}, 'age': 62, 'gender': 'Man', 'race': {'asian': 1.1023572646081448, 'indian': 0.02768653503153473, 'black': 0.0009337248229712714, 'white': 96.74169421195984, 'middle eastern': 1.3163313269615173, 'latino hispanic': 0.810993742197752}, 'dominant_race': 'white'}
Tristeza generalizada, com um sinal de nojo/desconforto [talvez pela situação]. A idade também é grandemente descontada.
Moro, Sérgio
{'emotion': {'angry': 54.783302545547485, 'disgust': 0.0037657428038073704, 'fear': 6.096110492944717, 'happy': 0.000208696701520239, 'sad': 34.34595167636871, 'surprise': 0.0025614488549763337, 'neutral': 4.768103361129761}, 'dominant_emotion': 'angry', 'region': {'x': 24, 'y': 110, 'w': 258, 'h': 258}, 'age': 34, 'gender': 'Man', 'race': {'asian': 24.810318648815155, 'indian': 6.969119608402252, 'black': 1.0620453394949436, 'white': 14.171145856380463, 'middle eastern': 4.196535050868988, 'latino hispanic': 48.79083335399628}, 'dominant_race': 'latino hispanic'}
A raiva e a tristeza predominam. O desvio etário se mostra menor. Um autêntico Latino Hispânico.
Tebet, Simone
{'emotion': {'angry': 0.0005528260771825444, 'disgust': 2.871954052352521e-06, 'fear': 0.11566495522856712, 'happy': 99.70596432685852, 'sad': 0.003129921606159769, 'surprise': 0.13286388712003827, 'neutral': 0.041823950596153736}, 'dominant_emotion': 'happy', 'region': {'x': 153, 'y': 100, 'w': 237, 'h': 237}, 'age': 32, 'gender': 'Woman', 'race': {'asian': 1.6850119456648827, 'indian': 1.3061274774372578, 'black': 0.14641183661296964, 'white': 55.86613416671753, 'middle eastern': 14.023500680923462, 'latino hispanic': 26.97281539440155}, 'dominant_race': 'white'}
Embora não esteja exibindo um sorriso exuberante [como Dória], o modelo atribuiu à imagem um sinal de alegria muito sólido. Não há emoções conflitantes, indicando sinceridade e abertura. A discrepância etária também é menor aqui. Surpreendentemente o modelo não atribui um peso muito forte à herança árabe da senadora.
Conclusão e notas
Como eu disse anteriormente, o modelo Facenet, um dos oito implementados na biblioteca DeepFace, se comporta de forma muito satisfatória. É preciso lembrar que o modelo reflete a amostra com a qual foi treinado. A medida que mais iterações do processo de treinamento venham a incorporar mais e mais segmentos populacionais, a precisão deverá aumentar.
Deixo uma crítica à classificação étnica empregada pelo modelo. Ela reflete a abordagem do censo americano, mas claramente não é mais adequada. Uma revisão se impõe. Os desvios notados com relação à idade das pessoas analisadas, se devem, provavelmente, à baixa resolução das imagens, que nivela os valores dos pixels dando margem a um enganoso efeito de filtro. A discrepância parece ser diretamente proporcional à idade do analisado [quanto mais idoso, maior a discrepância]. Esse desvio é responsável também pelo ‘colorismo’ do software, que dá grande peso à palidez aparente da imagem na classificação étnica.
Vamos continuar experimentando e trabalhando para tornar o modelo mais fiel às nossas características.
Referências
Jupyter Notebook – https://jupyter.org/
Anaconda – https://anaconda.org/
DeepFace – https://github.com/serengil/deepface
TensorFlow – https://www.tensorflow.org/
Pingback: Tirando a Adivinhação do Cuidado Bucal com Inteligência Artificial – Vox Leone