Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Transforms #6

Open
3 of 4 tasks
GabrielBG0 opened this issue Jan 18, 2024 · 2 comments
Open
3 of 4 tasks

Transforms #6

GabrielBG0 opened this issue Jan 18, 2024 · 2 comments
Labels
In development It is being worked on

Comments

@GabrielBG0
Copy link
Collaborator

GabrielBG0 commented Jan 18, 2024

Responsible for creating data augmentations

  • Single Augmentations -> flip, crop, mirror, etc...
  • Transform Pipeline -> create pipeline composed of single augmentations
  • Pre-defined Pipelines -> Pre-made pipelines for ease of use

Features to be implemented

  • Flip #39
  • Crop
  • Transform Pipeline
  • Def Pipeline (TBD)
@GabrielBG0 GabrielBG0 added the Arq Not Final Pending Architecture Details label Jan 18, 2024
@otavioon
Copy link
Collaborator

Sugestão de API para Transformações

Ao criar uma API para transformações, é essencial considerar a utilização de padrões estabelecidos e bem-documentados.
Neste caso, fiz uma busca sobre como implemetar transformações em alguns projetos do campo de visão computational, incluindo: MONAI, lightly, ClassyVision, MMCV (alicerce utilizdo pelo MMSegmentation e MMDetection) e nas recomendações do Pytorch.

Um ponto importante que vale ressaltar, visto em todos os projetos, é que as transformações são aplicadas a nível de amostra e não a nível de batch. Isso significa que a transformação é aplicada a cada amostra individualmente, e não a um batch de amostras ou no conjunto de dados como um todo.

Motivações para Utilizar APIs Conhecidas:

  1. Interoperabilidade: Ao aderir aos padrões sugeridos por projetos populares, como PyTorch, MONAI, lightly, ClassyVision e MMCV, garantimos que as transformações possam ser facilmente integradas em diferentes ecossistemas e frameworks.

  2. Documentação Abundante: Projetos amplamente utilizados tendem a oferecer documentação abrangente, o que simplifica o entendimento e a utilização das transformações por parte dos desenvolvedores.

  3. Comunidade Ativa: Ao alinhar-se com APIs conhecidas, beneficiamo-nos de uma comunidade ativa e engajada, facilitando a obtenção de suporte e contribuições externas.

Estrutura Comum de APIs de Transformações:

A estrutura básica da API de transformações pode seguir o padrão estabelecido pelo projeto PyTorch. Nela utiliza-se uma classe base abstrata que implementa o método __call__. Essa é mostrada abaixo:

class BaseTransform:
    def __call__(self, sample):
        raise NotImplementedError

Aqui, sample representa a entrada da transformação.
Entretanto, o pytorch não especifica o tipo de entrada e saída, e isso pode levar a ambiguidades e dificuldades na utilização.
sample pode ser um simples tensor, uma imagem, um dicionário ou qualquer outra estrutura de dados.

De fato, implementações em diferentes projetos podem variar em relação à estrutura e funcionalidade:

Assim, vale ressaltar que a estrutura da API de transformações pode variar de acordo com o projeto, mas é importante que ela seja clara e consistente em seu uso e na definição de seus subpacotes, para que os desenvolvedores possam utilizá-la de forma intuitiva, mas também para que seja fácil de integrar em diferentes ecossistemas e frameworks.

Desta forma, sugiro que a estrutura da API de transformações siga o padrão estabelecido pelo PyTorch, mas que os tipos de entrada e saída sejam especificados e que transformações as sejam aplicadas a nível de amostra e não a nível de batch. Desta forma, as transformações devem ser implementadas como classes, e não como funções, para que possam ser facilmente integradas em pipelines de transformações. Além disso, as transformações podem ser agrupaadas em subpacotes, de acordo com o tipo de entrada e saída/nicho, como, por exemplo, transforms.signal_1d, .transforms.spatial.

Definição Clara de Tipos

Para abordar esse problema, é fundamental fornecer uma definição clara dos tipos esperados na entrada e saída da transformação. O uso de anotações de tipo (Type Hints) na assinatura do método __call__ torna explícito o que a transformação espera e retorna.

from PIL import Image

def __call__(self, sample: Dict[str, Union[np.ndarray, Image.Image]]) -> Dict[str, Union[np.ndarray, np.ndarray]]:
    # ...

Aqui, Dict[str, Union[np.ndarray, np.ndarray]] indica que a entrada sample é um dicionário com chaves de string, contendo valores que podem ser np.ndarray ou qualquer subtipo compatível.

Considerações sobre Tipos Mistos

Em casos em que tipos mistos são comuns, como dicionários contendo diferentes tipos de dados, é essencial documentar claramente a estrutura esperada. Além disso, posteriormente, a API pode incluir verificações ou tratamentos condicionais para lidar com diferentes tipos de entrada.

@GabrielBG0 GabrielBG0 changed the title Augs Transforms Jan 19, 2024
@GabrielBG0 GabrielBG0 added In Consideration Accepting API proposals and removed Arq Not Final Pending Architecture Details labels Jan 19, 2024
@GabrielBG0
Copy link
Collaborator Author

Nossa achei super legal, por mim é isso aí.
A menos que o @fernandoGubiMarques tenha algo a complementar acho que a gente pode fechar esse estilo mesmo.
Acho importante a gente ter uma definição de tipos pra todo o código, tipagem dinâmica é a receita pra problema mais pra frente.

@GabrielBG0 GabrielBG0 added Ready For Development Issue is ready to be developed and removed In Consideration Accepting API proposals labels Jan 31, 2024
@GabrielBG0 GabrielBG0 added In development It is being worked on and removed Ready For Development Issue is ready to be developed labels Feb 10, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
In development It is being worked on
Projects
None yet
Development

No branches or pull requests

2 participants