Shapeworks: Empaquetado de shapworkspy y reestructuración de casos de uso

Creado en 14 dic. 2020  ·  13Comentarios  ·  Fuente: SCIInstitute/ShapeWorks

Comentario más útil

Pasos para la reestructuración:

  1. Incluya todas las funciones auxiliares utilizadas en los cuadernos de Jupyter en el módulo Python de ShapeWorks.
  2. Actualice los cuadernos para usar las funciones auxiliares del módulo de Python.
  3. Reescriba los casos de uso de Python con el módulo de Python y los comandos de la API de Python sin usar GroomUtils.

Todos 13 comentarios

Desde # 818

Rediseñe las utilidades de preparación para que se puedan ejecutar de forma interactiva en lugar de por lotes.
Esto hará que los archivos de preparación intermedios no tengan que guardarse (problema # 598) y los pasos se pueden omitir (problema # 507)

Usemos este problema como el problema principal / de conducción para el empaquetado de Python de Shapeworks y el diseño de casos de uso asociado. Podemos agregar problemas más específicos más adelante y relacionarlos con este. He cerrado los problemas relacionados en consecuencia.

@ jadie1 @ iyerkrithika21 por favor únase a GC slot para discutir esto como parte de las API de Python. Movió esto en la agenda para permitirle irse antes si es necesario.

Estoy investigando el empaquetado del módulo Python ahora. Por favor, escríbame si tiene sugerencias o pensamientos.

Algunas instrucciones que encontré:

Hasta ahora estoy más interesado en conda para una especificación de dependencia supuestamente mejor, pero estaría feliz de tener algo.
La razón de conda es que deberíamos poder instalar todo con este paquete: línea de comandos, módulo de Python y estudio. Pero comenzaremos con nuestro módulo de Python.

Mi mayor temor son los problemas multiplataforma que nos quitan la vida, así que intentaré que OSX funcione primero y partir de ahí.

Los casos de uso no funcionaron para mí en Ubuntu 18.04, tuve que:

  1. en RunUseCase.py, agregué en la parte superior sys.path.append('../../build/cmake-build-release/bin/')
  2. establezca la variable de entorno LD_LIBRARY_PATH=../../dependencies/install/lib/ (de lo contrario, se queja de la falta de "libvcl.so")

Para tener la opción de guardar salidas intermedias, ¿podemos incluir la opción de escritura dentro de cada operación en lugar de una función de escritura / guardado separada?
Lo que estoy imaginando es:

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

En lugar de

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

Esto probablemente necesitará un nombre de archivo como argumento de entrada.
por ejemplo, img.binarize (write = True, filename = 'blabla')

@archanasri @cchriste pensamientos?

Para tener la opción de guardar salidas intermedias, ¿podemos incluir la opción de escritura dentro de cada operación en lugar de una función de escritura / guardado separada?
Lo que estoy imaginando es:

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

En lugar de

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

Image.write es encadenable como todo lo demás. Solo ponlo en la cadena si
lo quieres.

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

El martes 19 de enero de 2021 a las 4:58 p.m. Shireen Elhabian [email protected]
escribió:

Esto probablemente necesitará un nombre de archivo como argumento de entrada.
por ejemplo, img.binarize (write = True, filename = 'blabla')

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

Para tener la opción de guardar salidas intermedias, ¿podemos incluir el
opción de escritura dentro de cada operación en lugar de escribir / guardar por separado
¿función?
Lo que estoy imaginando es:

img.binarize (escribir = falso)
img.resample (escribir = Verdadero) .binarizar (escribir = Verdadero)

En lugar de

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

-
Recibes esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/SCIInstitute/ShapeWorks/issues/865#issuecomment-763221837 ,
o darse de baja
https://github.com/notifications/unsubscribe-auth/AAJT3EP3HDOHQGC54NMWSJDS2YMA7ANCNFSM4U3KV45Q
.

Image.write es encadenable como todo lo demás. Simplemente colóquelo en la cadena si lo desea. img.binarize().write(<path>) img.resample().write(<path>).binarize()
...

Entiendo que la función de escritura también es encadenable; mi objetivo al sugerir una opción de escritura dentro de cada operación era tener solo una función y pasar la bandera si queremos guardar las imágenes intermedias o no y simplificar los casos de uso.
Ejemplo 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)

De esta forma, podemos evitar repetir el mismo código. Solo quiero saber la viabilidad de esta idea.

Una de las razones por las que intentamos desmantelar el conjunto de GroomUtils.py
Las funciones de "ayuda" son hacer que nuestras operaciones de aseo sean más transparentes.
Sin empaquetar estas operaciones en funciones monolíticas, flexible
solo mediante el paso de parámetros, es mucho más fácil crear
demostraciones de casos de uso comprensibles. Si no usamos (mucho) encadenamiento en
nuestros ejemplos, será muy sencillo transmitir la capacidad de escribir
resultados intermedios cuando se considere necesario. Ahora mismo todos parecen
necesario porque tenemos casos de uso que requieren estos resultados ya que
una función GroomUtils realiza algún conjunto (quizás arbitrario) de
operaciones, guarda su resultado, luego la siguiente función lee esos resultados
y continúa procesando.

Sugiero aplanar todo para empezar, y para todos los casos de uso, no
solo los elipsoides. Creo que lo que veremos es relativamente
conjunto sencillo de operaciones que difiere notablemente para ciertos casos
(p. ej., cuando las imágenes originales están "acompañadas de un viaje"). Lo que harán los usuarios
obtener de nuestros ejemplos es una comprensión mucho más clara de lo que puede y / o
debe hacerse para sus propios conjuntos de datos.

Aquí hay un ejemplo de lo que me gustaría emular si fuera un usuario:

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 proporcionar ejemplos de encadenamiento de escritura a cualquiera de estas operaciones, como
como agregando .write(<path> después de uno de ellos. Lo que no queremos es algo
función que "simplemente lo hace", ya que "eso" no es el mismo para todos
conjunto de datos. En lugar de,
empoderaremos a los usuarios mostrándoles que lo que se está haciendo no es todo
así de complicado y muy fácil de cambiar. En lugar de darles una
interfaz de caja negra con un trillón de parámetros, dales las claves y deja
ellos conducen. Espero que esto ayude a aclarar toda la idea detrás de deshacerse
de GroomUtils.

El lunes 25 de enero de 2021 a las 9:49 a.m. Krithika Iyer [email protected]
escribió:

Image.write es encadenable como todo lo demás. Solo ponlo en la cadena si
lo quieres. img.binarize (). write ()
img.resample (). write () .binarize ()
… <# M_-7433729883366947300_>

Entiendo que la función de escritura también es encadenable; mi punto con
sugerir una opción de escritura dentro de cada operación era tener solo una
función y pasar la bandera si queremos guardar las imágenes intermedias
o no y simplificar los casos de uso.
Ejemplo de código sudo:

función novio (write_flag):

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

novio (write_flag = True)

novio (write_flag = False)

De esta forma, podemos evitar repetir el mismo código.

-
Recibes esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/SCIInstitute/ShapeWorks/issues/865#issuecomment-766952032 ,
o darse de baja
https://github.com/notifications/unsubscribe-auth/AAJT3EJND2F3EDVU75NB6ITS3WOIPANCNFSM4U3KV45Q
.

@ iyerkrithika21 @ jadie1

Estoy de acuerdo con @cchriste. No usemos el encadenamiento a menos que sea semánticamente razonable (por ejemplo, remuestrear imágenes binarias), incluso en estos casos no tenemos que escribir cada salida intermedia de este paso de remuestreo (combo). Hagamos que los casos de uso sean fáciles de seguir, auto documentados y fáciles de adaptar y personalizar para los usuarios.

Escribir (especialmente temporalmente para depurar) imágenes es un gran ejemplo de
cuando el encadenamiento es razonable.

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

Considerando que, cuando es un paso importante, sería mejor ponerlo en su
propia línea con un comentario.

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

El lunes 25 de enero de 2021 a las 10:34 a.m. Shireen Elhabian [email protected]
escribió:

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

Estoy de acuerdo con @cchriste https://github.com/cchriste . No usemos
encadenamiento a menos que sea semánticamente razonable (por ejemplo, remuestreo
imágenes binarias), incluso para estos casos no tenemos que escribir todos
salida intermedia de este paso de remuestreo (combo). Hagamos casos de uso
fácil de seguir, auto-documentado y fácil de adaptar y personalizar para los usuarios.

-
Recibes esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/SCIInstitute/ShapeWorks/issues/865#issuecomment-766983878 ,
o darse de baja
https://github.com/notifications/unsubscribe-auth/AAJT3EKKARLKY4VKBRPHJWLS3WTSNANCNFSM4U3KV45Q
.

Pasos para la reestructuración:

  1. Incluya todas las funciones auxiliares utilizadas en los cuadernos de Jupyter en el módulo Python de ShapeWorks.
  2. Actualice los cuadernos para usar las funciones auxiliares del módulo de Python.
  3. Reescriba los casos de uso de Python con el módulo de Python y los comandos de la API de Python sin usar GroomUtils.

Recuerde, tenemos la rama python_module en la que esto ya se inició. No se ha fusionado por un minuto, pero manténganos informados si alguien aborda esto. Es una de mis prioridades.

¿Fue útil esta página
0 / 5 - 0 calificaciones