Meu local de trabalho está enfrentando um desafio de código de duas semanas que envolve a produção de um algoritmo para reproduzir 100 amostras de pinturas de Bob Ross o mais próximo possível, dadas algumas restrições:
- As "pinturas" são enviadas como um arquivo JSON contendo uma cor de fundo e uma série de "pinceladas".
- As pinceladas têm um ponto inicial, ponto final, raio e cor.
- Há um limite de 500 traços por pintura.
- Todas as 100 pinturas de referência têm exatamente o mesmo tamanho e proporção: 450x337.
O servidor "pinta" cada envio e faz uma diferença por pixel com a pintura de referência. Cada pixel na pintura enviada é pontuado em um intervalo escalar de 0 a 1, com base em como é semelhante ao valor do pixel de origem e a pontuação da pintura é uma média de todas as pontuações de pixels. O pessoal da competição lançou bibliotecas para imagens de pintura e pontuação que podem ser executadas na linha de comando no MacOS / Linux.
Eu sinto que esse problema deve ser favorável ao ML, já que temos um mecanismo de pontuação detalhada de cada tentativa que o algoritmo tenta. Gerar e marcar uma pintura leva apenas cerca de 200ms. Infelizmente, sou principalmente um fanboy da ML (ouço muitos podcasts) e não sei como devo modelar o problema.
Deixar o algoritmo fazer 500 golpes completamente aleatórios e depois classificar a saída levaria uma eternidade para convergir em algo útil. Pensei em limitar o espaço de cores dos traçados a um conjunto das 64 cores mais frequentes em cada pintura (executando um histograma antes de começar a pintar) e também em limitar a seleção do tamanho do pincel do algoritmo.
Para o registro, simplesmente enviar uma imagem que é um campo sólido da cor mais comum me deu uma pontuação de 65%. Os algoritmos atualmente vencedores estão apenas convertendo as pinturas em grades e colocando um ponto da cor média em cada setor em cima de cada um.