Shapeworks: Forma de embalagem e reestruturação de caso de uso

Criado em 14 dez. 2020  ·  13Comentários  ·  Fonte: SCIInstitute/ShapeWorks

Comentários muito úteis

Passos para reestruturação:

  1. Inclui todas as funções auxiliares usadas nos blocos de notas Jupyter para o módulo python do ShapeWorks.
  2. Atualize os blocos de notas para usar as funções auxiliares do módulo python.
  3. Reescreva os casos de uso de python usando o módulo python e os comandos da API python sem usar GroomUtils.

Todos 13 comentários

De # 818

Recrie os utilitários do groom para que possam ser executados interativamente em vez de em lote.
Isso fará com que os arquivos de preparação intermediários não precisem ser salvos (problema # 598) e as etapas possam ser ignoradas (problema # 507)

Vamos usar esse problema como o problema principal / direcionador para o pacote shapeworks python e design de caso de uso associado. Podemos adicionar questões mais específicas posteriormente e relacioná-las a esta. Eu fechei os problemas relacionados de acordo.

@ jadie1 @ iyerkrithika21 junte-se ao slot GC para discutir isso como parte das APIs python. Movemos isso na agenda para permitir que você saia mais cedo, se necessário.

Estou olhando para o empacotamento do módulo Python agora. Por favor, me envie um ping se você tiver sugestões ou pensamentos.

Algumas instruções que encontrei:

Até agora, estou mais interessado em conda para especificações de dependência supostamente melhores, mas ficaria feliz em ter qualquer coisa.
O motivo do conda é que devemos ser capazes de instalar tudo com este pacote: linha de comando, módulo python e studio. Mas começaremos com nosso módulo python.

Meu maior medo é que problemas de multiplataforma estejam sugando nossas vidas, então tentarei fazer o OSX funcionar primeiro e partir daí.

Os casos de uso não funcionaram para mim no Ubuntu 18.04, eu tive que:

  1. em RunUseCase.py, adicionei no topo sys.path.append('../../build/cmake-build-release/bin/')
  2. definir a variável de ambiente LD_LIBRARY_PATH=../../dependencies/install/lib/ (caso contrário, reclamará da falta de "libvcl.so")

Para ter a opção de salvar saídas intermediárias, podemos incluir a opção de gravação em cada operação, em vez de uma função de gravação / gravação separada?
O que estou imaginando é:

img.binarize(write=False)
img.resample(write=True).binarize(write=True)

Ao invés de

img.binarize()
img.write()
img.resample()
img.write()

Provavelmente, será necessário um nome de arquivo como argumento de entrada
por exemplo, img.binarize (write = True, filename = 'blabla')

pensamentos @archanasri @cchriste ?

Para ter a opção de salvar saídas intermediárias, podemos incluir a opção de gravação em cada operação, em vez de uma função de gravação / gravação separada?
O que estou imaginando é:

img.binarize(write=False)
img.resample(write=True).binarize(write=True)

Ao invés de

img.binarize()
img.write()
img.resample()
img.write()

Image.write pode ser encadeado como tudo o mais. Basta colocá-lo na corrente se
você quer isso.

img.binarize().write(<path>)
img.resample().write(<path>).binarize()

Na terça - feira, 19 de janeiro de 2021 às 4:58 PM Shireen Elhabian
escreveu:

Provavelmente, será necessário um nome de arquivo como argumento de entrada
por exemplo, img.binarize (write = True, filename = 'blabla')

@archanasri https://github.com/archanasri @cchriste
https://github.com/cchriste pensamentos?

Para ter a opção de salvar resultados intermediários, podemos incluir o
opção de gravação dentro de cada operação, em vez de uma opção de gravação / gravação separada
função?
O que estou imaginando é:

img.binarize (write = False)
img.resample (write = True) .binarize (write = True)

Ao invés de

img.binarize ()
img.write ()
img.resample ()
img.write ()

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/SCIInstitute/ShapeWorks/issues/865#issuecomment-763221837 ,
ou cancelar
https://github.com/notifications/unsubscribe-auth/AAJT3EP3HDOHQGC54NMWSJDS2YMA7ANCNFSM4U3KV45Q
.

Image.write pode ser encadeado como tudo o mais. Basta colocá-lo na corrente se quiser. img.binarize().write(<path>) img.resample().write(<path>).binarize()

Eu entendo que a função de gravação também pode ser encadeada; meu ponto ao sugerir uma opção de gravação dentro de cada operação era ter apenas uma função e passar o sinalizador se queremos salvar as imagens intermediárias ou não e simplificar os casos de uso.
Exemplo de código sudo:

function groom(write_flag):
    img.binarize(write = write_flag).resize(write = write_flag).crop(write=write_flag)
groom(write_flag = True)
groom(write_flag = False)

Dessa forma, podemos evitar a repetição do mesmo trecho de código. Só quero saber a viabilidade dessa ideia.

Uma das razões pelas quais estamos tentando desmontar o conjunto GroomUtils.py de
As funções de "ajudante" são tornar nossas operações de preparação mais transparentes.
Sem empacotar essas operações em funções monolíticas, tornadas flexíveis
apenas pela passagem de parâmetro, é muito mais fácil criar de forma direta,
demonstrações compreensíveis de casos de uso. Se não usarmos (muito) encadeamento
nossos exemplos, será muito simples transmitir a capacidade de escrever
resultados intermediários quando considerado necessário. Agora todos eles parecem
necessário porque temos casos de uso que exigem esses resultados desde
uma função GroomUtils executa algum conjunto (talvez arbitrário) de
operações, salva seu resultado, então a próxima função lê esses resultados
e continua o processamento.

Eu sugiro nivelar tudo para começar, e para todos os casos de uso, não
apenas os elipsóides. Eu acredito que o que veremos é relativamente
conjunto simples de operações que difere notavelmente em certos casos
(ex: quando as imagens originais estão "prontas para o passeio"). O que os usuários farão
obter de nossos exemplos é uma compreensão muito mais clara do que pode e / ou
deve ser feito para seus próprios conjuntos de dados.

Aqui está um exemplo do que eu gostaria de emular se fosse um usuário:

for img in images:

# since we're starting with fuzzy data, we first need to ensure it's a
binary (black and white) image in order to <explain>
img.binarize()

# next, we must ensure images all have the same logical dimensions since
<explain>
img.resize()

# now we'll crop these images using the bounds we computed earlier so they
all encompass the data without leftover space (since it can be costly and
pointless to compute)
img.crop(bounds)

Podemos fornecer exemplos de encadeamento de gravação para qualquer uma dessas operações, como
adicionando .write(<path> após um deles. O que não queremos é algum
função que "simplesmente faz", já que "isso" não é o mesmo para todos
conjunto de dados. Em vez de,
vamos capacitar os usuários, mostrando-lhes que o que está sendo feito não é tudo
tão complicado e muito fácil de mudar. Em vez de dar-lhes um
interface de caixa preta com um zilhão de parâmetros, dê a eles as chaves e deixe
eles dirigem. Espero que isso ajude a esclarecer toda a ideia por trás da eliminação
de GroomUtils.

Na segunda-feira, 25 de janeiro de 2021 às 9h49 Krithika Iyer [email protected]
escreveu:

Image.write pode ser encadeado como tudo o mais. Basta colocá-lo na corrente se
você quer isso. img.binarize (). write ()
img.resample (). write () .binarize ()
… <# M_-7433729883366947300_>

Eu entendo que a função de gravação também pode ser encadeada; meu ponto com
sugerir uma opção de gravação dentro de cada operação era ter apenas um
função e passar a bandeira se queremos salvar as imagens intermediárias
ou não e simplificar os casos de uso.
Exemplo de código sudo:

função groom (write_flag):

img.binarize(write = write_flag).resize(write = write_flag).crop(write=write_flag)

noivo (write_flag = True)

noivo (write_flag = False)

Dessa forma, podemos evitar a repetição do mesmo trecho de código.

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/SCIInstitute/ShapeWorks/issues/865#issuecomment-766952032 ,
ou cancelar
https://github.com/notifications/unsubscribe-auth/AAJT3EJND2F3EDVU75NB6ITS3WOIPANCNFSM4U3KV45Q
.

@ iyerkrithika21 @ jadie1

Eu concordo com @cchriste. Não vamos usar o encadeamento, a menos que seja semanticamente razoável (por exemplo, reamostragem de imagens binárias), mesmo para esses casos, não temos que escrever todas as saídas intermediárias dessa etapa de reamostragem (combinação). Vamos tornar os casos de uso fáceis de seguir, autodocumentados e fáceis para os usuários adaptarem e personalizarem.

Escrever (especialmente temporariamente para depuração) imagens é um ótimo exemplo de
quando o encadeamento é razoável.

# let's see what happened
img.operation(...) -> img.operation(...).write(<path>)

Considerando que, quando é uma etapa importante, pode ser melhor colocá-lo em seu
própria linha com um comentário.

...
# now let's write the results
img.write(<path>)

Na segunda-feira, 25 de janeiro de 2021 às 10:34 Shireen Elhabian [email protected]
escreveu:

@ iyerkrithika21 https://github.com/iyerkrithika21 @ jadie1
https://github.com/jadie1

Eu concordo com @cchriste https://github.com/cchriste . Não vamos usar
encadeamento, a menos que seja semanticamente razoável (por exemplo, reamostragem
imagens binárias), mesmo para esses casos, não temos que escrever todos os
saída intermediária desta etapa de reamostragem (combinação). Vamos fazer casos de uso
fácil de seguir, autodocumentado e fácil para os usuários adaptarem e personalizarem.

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/SCIInstitute/ShapeWorks/issues/865#issuecomment-766983878 ,
ou cancelar
https://github.com/notifications/unsubscribe-auth/AAJT3EKKARLKY4VKBRPHJWLS3WTSNANCNFSM4U3KV45Q
.

Passos para reestruturação:

  1. Inclui todas as funções auxiliares usadas nos blocos de notas Jupyter para o módulo python do ShapeWorks.
  2. Atualize os blocos de notas para usar as funções auxiliares do módulo python.
  3. Reescreva os casos de uso de python usando o módulo python e os comandos da API python sem usar GroomUtils.

Lembre-se, temos o branch python_module no qual ele já foi iniciado. Não foi mesclado por um minuto, mas mantenha-nos informados se alguém resolver isso. Está no topo da minha lista de prioridades.

Esta página foi útil?
0 / 5 - 0 avaliações