Descobrindo Core Image

Rodrigo Makoto Takumi
Academy@EldoradoCPS
5 min readJul 10, 2020

O WWDC 2020 trouxe muitas novidades, entre elas o Core Image, que apesar de não ser novo, foi a primeira vez que estudei este framework. Assim decidi escrever esse artigo para mostrar um pouco as possíveis aplicações do Core Image, conhecer um pouco melhor esta tecnologia e compartilhar o que o WWDC 2020 nos trouxe de novidades..

Aplicações

Usando as próprias palavras da Apple, podemos definir Core Image como sendo uma tecnologia de processamento e análise de imagens, que fornece processamento de alto desempenho para imagens estáticas e de vídeo.

Além disso, o Core Image é uma ótima ferramenta para aprimorar o treinamento de aprendizado de máquina e desenvolver novos efeitos criativos, como foi demonstrado na sessão do WWDC 2018 Core Image: Performance, Prototyping, and Python.

Core Image: Desempenho, Prototipagem e Python. Fonte: Apple

Também pode ser implementado para melhorar os algoritmos de visão computacional, como visto na sessão do WWDC 2020 Explore Computer Vision APIs, onde é possível ter uma compreensão mais profunda sobre imagens e vídeos, além de conhecer as novas APIs do Core Image e Vision.

Explorar APIs de Visão Computacional. Fonte: Apple

Por fim, para ter uma melhor compreensão do Core Image, recomendo assistir Advances in Core Image: Filters, Metal, Vision, and More.

Avanços no Core Image: Filtros, Metal, VIsion, muito mais. Fonte: Apple

Conhecendo Algumas Classes do Core Image

CIDetector

É uma classe usada para processar imagens e detectar rostos, códigos de barras, formas ou textos em imagens estáticas ou vídeos.
A documentação da Apple alerta para reutilizar as instâncias do CIDetector ao invés de criar novas, pois está classe pode manter muitas variáveis de estado, assim afetando o desempenho.

CIImage

Podemos considerar o CIImage como uma receita de bolo, contendo todas as informações de uma imagem, mas ele não pode substituir uma imagem. Os objetos CIContext e CIImage são imutáveis, o que significa que cada um pode ser compartilhado com segurança entre as threads.

CIContext

A classe CIContext é onde o processamento e a análise de imagens ocorrem. Usando esta classe em conjunto com outras, como CIFilter, CIImage e CIColor podemos processar imagens usando filtros do Core Image. Já com o auxílio do CIDetector é possível, por exemplo, detectar rostos ou códigos de barras.

CIFilter

O CIFilter é responsável pela criação do objeto CIImage de saída.
Usando o CIFilter em conjunto com outras classes, como CIImage, CIContext e CIColor, podemos utilizar os filtros internos do Core Image, criar um filtro a partir de uma sequência de filtros já existentes, ou criar o próprio filtro personalizado usando CIKernel.

CIKernel

O CIKernel tem como objetivo informar ao filtro como ele deve transformar cada pixel da imagem, assim gerando a imagem de saída. Com ele, é possível criar filtros personalizado, escrevendo-os em Metal Shading Langue, com isso suas aplicações terão efeitos únicos.

O que o WWDC 2020 nos trouxe?

Build Metal-based Core Image kernels with Xcode

Esta apresentação mostra os 5 passos para adicionar kernels do Core Image em Metal. A motivação para isso, segundo o David Hayward (apresentador desta sessão), é “by writing them in Metal, you will reduce runtime compile times by shifting that work to when your app is built”, ou seja, escrevendo o CIKernels em Metal shader language, a compilação, que nesse caso acontece na GPU e não na CPU, ocorre durante o built do seu app, assim disponibiliza aos kernels recursos de alta performance.

Caso ainda esteja confuso, acredito que a apresentação Build GPU binaries with Metal consegue esclarecer as dúvidas sobre como ocorre a compilação do Metal.

Optimize the Core Image pipeline for your video app

Esta sessão tem como objetivo ensinar a obter um melhor desempenho ao aplicar efeitos nos seus vídeos utilizando Core Image. E para isso, ela ensinará a melhor forma de criar CIContext para reduzir o consumo de memória, como escrever kernels personalizados em Metal Shading Langue, obtendo efeitos único, e como renderizar sua view da melhor forma utilizando as classes AVPlayView e MTKView.

Filtro CIToneCurve. Fonte: Apple

Discover Core Image debugging techniques

Com essa apresentação, podemos entender algumas técnicas de debugging do Core Image, com isso conseguimos obter mais informações sobre como o Core Image funciona em nossa aplicação. E para isso, é utilizado o recurso de debugging chamado CI_PRINT_TREE, que é uma ferramenta que permite aos desenvolvedores visualizarem imediatamente os gráficos do Core Image, e como eles, descobrir problemas de memória, cor e desempenho, assim melhorando o pipeline do Core Image.

Descubra as técnicas de depuração do Core Image. Fonte: Apple

Explore Computer Vision APIs

Está sessão mostra como utilizar o Core Image, para processar imagens, juntamente com o Vision, para a análise de imagens.
A motivação para pré-processar a imagem com Core Image e usá-la como entrada do Vision é para tornar seus algoritmos mais rápidos e robustos.

Conclusão

Podemos dizer que o WWDC 2020 nos mostrou a versatilidade do Core Image para lidar com uma variedade de casos, além de esclarecer como criar nossos próprios CIKernels personalizados e técnicas práticas de debugging.

Assim, espero que, com este artigo, você tenha encontrado o caminho para obter o conhecimento necessário para utilizar o Core Image em suas aplicações.

--

--