O processamento de imagens também está a tornar-se móvel, uma vez que cada vez mais pessoas enviam fotografias dos seus telemóveis diretamente para a internet, sem primeiro as transferir para um computador.

Ao mesmo tempo, os ficheiros de fotografias digitais estão a tornar-se tão grandes que, sem muita engenharia de software inteligente, processá-los levaria um tempo extremamente longo num computador pessoal, quanto mais num telemóvel. Infelizmente, os truques que os engenheiros utilizam para acelerar os seus algoritmos de processamento de imagem tornam o seu código quase ilegível e raramente reutilizável. Adicionar uma nova funcionalidade a um programa de processamento de imagem ou modificá-la para funcionar num dispositivo diferente geralmente exige estudá-la completamente e revê-la do início ao fim.

Investigadores do Laboratório de Ciência da Computação e Inteligência Artificial (CSAIL) do MIT estão a ajudar a mudar este cenário com uma nova linguagem de programação chamada Halide. Os programas em Halide não só são mais fáceis de ler, escrever e rever do que os programas de processamento de imagem escritos numa linguagem convencional, como também automatizam procedimentos de optimização de código que normalmente levariam horas a serem realizados manualmente, sendo significativamente mais rápidos.

Nos testes, os investigadores do MIT utilizaram o Halide para reescrever vários algoritmos comuns de processamento de imagem cujo desempenho já tinha sido otimizado por programadores experientes. As versões em Halide eram tipicamente mais de um terço mais compridas, mas ofereciam melhorias significativas de desempenho — duas, três ou até seis vezes mais rápidas. Num dos casos, o programa em Halide era, na realidade, mais longo do que o original, mas o aumento de velocidade foi 70 vezes maior.

Jonathan Ragan-Kelley, estudante de pós-graduação do Departamento de Engenharia Elétrica e Ciência da Computação (EECS), e Andrew Adams, pós-doutorando do CSAIL, lideraram o desenvolvimento do Halide e disponibilizaram o código online. Na Siggraph, a primeira conferência sobre computação gráfica, apresentou um artigo sobre o Halide, do qual foi coautor com os professores de ciência da computação do MIT, Saman Amarasinghe e Fredo Durand, e colegas da Adobe e da Universidade de Stanford.

Processamento Paralelo em Pipeline:
Uma das razões pelas quais o processamento de imagens exige tanto poder computacional é que normalmente requer uma série de operações discretas. Após a luz atingir o sensor da câmara de um telemóvel, o aparelho "analisa" os dados da imagem para encontrar valores que indiquem pixéis defeituosos no sensor e corrige-os. Em seguida, correlaciona as leituras dos pixéis sensíveis a diferentes cores para deduzir as cores reais das áreas da imagem. Uma pequena correção de cor e um ajuste adicional de contraste são então realizados para que as cores correspondam mais de perto ao que o olho humano vê. Nesta altura, o telemóvel já realizou um processamento tão extenso que é necessária outra etapa para limpar os dados.

E isto é só para exibir a imagem no ecrã do telemóvel. Os softwares que executam tarefas mais complexas, como a remoção de olhos vermelhos, a suavização de sombras, o aumento da saturação de cor ou a transformação da imagem para um aspeto de foto Polaroid antiga, introduzem ainda mais camadas de processamento. Além disso, as modificações de nível superior exigem que o software regresse a fases anteriores e recalcule o canal de processamento.

Nos chips multicore atuais, a distribuição de diferentes segmentos de imagem para núcleos que trabalham em paralelo pode tornar o processamento de imagens mais eficiente. No entanto, no cenário típico de processamento paralelo, após cada passo no pipeline de processamento de imagem, os núcleos podem enviar os resultados dos seus cálculos de volta para a memória principal. Como a transferência de dados é muito mais lenta do que a computação, isto pode anular todas as melhorias de desempenho oferecidas pela paralelização.

Assim, os engenheiros de software tentam manter todos os núcleos individuais ocupados o máximo de tempo possível antes de enviarem os seus resultados para a memória. Isto significa que os núcleos têm de executar várias etapas no pipeline de processamento nos seus respetivos conjuntos de dados, sem agregar os resultados. Acompanhar todas as dependências entre os pixéis processados ​​em núcleos separados é o que torna o código para o processamento eficiente de imagem tão complexo. Além disso, a relação entre o número de núcleos, o poder de processamento dos núcleos, a quantidade de memória local disponível para cada núcleo e o tempo necessário para transferir dados do núcleo varia de máquina para máquina; assim, um programa otimizado para um dispositivo pode não oferecer vantagens de velocidade noutro.

Dividir para conquistar:
o Halide não dispensa o programador de pensar como paralelizar eficientemente em determinadas máquinas; em vez disso, divide o problema fora da descrição dos algoritmos de processamento de imagem. Um programa Halide possui duas secções: uma para os algoritmos e outra para o "cronograma" de processamento. O cronograma pode especificar o tamanho e o formato das fatias da imagem que cada núcleo necessita de processar em cada parte do pipeline de processamento, e pode especificar dependências de dados — por exemplo, que os passos executados em determinados núcleos devem ter acesso aos resultados dos passos anteriores noutros núcleos. Uma vez elaborado o cronograma, o Halide trata de toda a "contabilidade" automaticamente.

Um programador que pretenda exportar um programa para outro computador altera apenas o horário, não a descrição do algoritmo. Um programador que pretenda adicionar uma nova fase de transformação ao workflow apenas necessita de fazer login com uma descrição do novo procedimento, sem ter de modificar os existentes. (Uma nova etapa no fluxo de trabalho exigirá uma especificação correspondente no cronograma.).

"Quando se tem a ideia de paralelizar algo de uma determinada forma, ou fases de utilização de uma determinada forma, escrever isso manualmente torna muito difícil expressar a ideia corretamente", diz Ragan-Kelley. "Se tiver uma nova ideia de otimização que pretende implementar, é provável que passe três dias a depurá-la porque a partiu no processo. Com isto, altera uma única linha que expressa essa ideia e sintetiza a versão correta."

Embora os programas Halide sejam mais fáceis de escrever e ler do que os programas de processamento de imagem padrão, uma vez que a programação é feita automaticamente, oferecem frequentemente melhorias de desempenho mesmo em comparação com o código escrito manualmente de forma mais meticulosa. Além disso, o código Halide é tão fácil de modificar que os programadores podem simplesmente experimentar ideias mal concebidas para verificar se melhoram o desempenho.

"Pode simplesmente experimentar e experimentar coisas diferentes aleatoriamente, e muitas vezes encontrará algo realmente bom", diz Adams. "Só muito mais tarde, depois de refletir bastante, é que descobrirá porque é que é bom.".

# # #

Escrito por Larry Hardesty, MIT Press Office

 

Mais informações