Repository navigation
Releases: Sansanto2000/GASP
Release list
0.11.0 - RecortesDelgados
Receta documentada, con figuras, para generar recortes tan delgados y alargados como los de mu Cen, y un control al construir el generador para que la ciencia no quede sin altura.
Recortes delgados de mu Cen (#46). Los recortes reales de mu Cen miden entre 20 y 44 de ancho/alto (la pila de componentes llega a 53) y la ciencia queda en ~3 px con el recorte a 640 de ancho. Con los valores por defecto ObservationCropSequence genera relaciones de 5.7 a 16.3 y una ciencia de 23 px de mediana. CLAUDE.md documenta una receta con parametros que ya existen (aspect_ratio_range=(20, 55), placas de 6000 a 14000 px de ancho, lamparas mas gruesas, margenes menores) que da 84 % de recortes con relacion >= 20 y una ciencia de 4.4 px a 640, con dos figuras: recortes reales de mu Cen y recortes generados con la receta. Cuesta 1.8x por recorte. No cambia ningun valor por defecto.
Control de la fraccion de ciencia (#46). SpectrumLabeledSequence y ObservationCropSequence rechazan al construirse los rangos que pueden dejar la ciencia por debajo de 0.05 del alto de la observacion (1 - 2*apertura - 2*distancia, con los maximos de opening_lamp_range y distance_between_components_range). Antes, opening_lamp_range=(0.30, 0.47) con la distancia por defecto dejaba una caja de ciencia de altura negativa (-0.14) que se dibujaba y se etiquetaba sin avisar.
Cambios incompatibles
- Las configuraciones que dejan la ciencia por debajo de 0.05 del alto de la observacion ahora levantan
ValueErroral construirse, con la alternativa. Antes se aceptaban y producian cajas de ciencia sin altura o con altura negativa. Los valores por defecto (0.10) no se ven afectados. - La salida con los valores por defecto es identica a la de 0.10.0: el control no consume sorteos del rng (verificado con una huella sha256 de imagenes y etiquetas, con la misma seed).
0.10.0 - OBBYDatasetsYOLO
Etiquetas OBB utilizables de punta a punta, redimensionado final que conserva la geometria, volcado de datasets YOLO a disco con una sola llamada, y un fondo de placa con mas grano y estrias.
Etiquetas OBB (#31, #33, #38). Las esquinas OBB ya no salen de [0, 1] (reserva el alto de la caja inclinada al apilar observaciones), asi que Ultralytics no descarta placas. Nuevo modulo resize con ResizeMode: SpectrumLabeledSequence lleva cada placa a resize_shape segun resize_mode (STRETCH, el default, LETTERBOX o NONE, sin redimensionar), y las etiquetas se re-normalizan al lienzo final. La salida DICT ya soporta OBB: boxes sale (lote, None, 8), tambien en un lote sin cajas.
Dataset YOLO en disco (#32). gsssp.save_yolo_dataset vuelca images/, labels/ y un data.yaml con formato de etiquetas (AABB u OBB), clases, semilla, resize_mode y el resto del generador por parametro. generator_save_images_example.py pasa a ser una CLI de argparse sobre esa funcion (--help lista las opciones). El data.yaml declara siempre las tres clases, porque Ultralytics rechaza un dataset cuyos indices de etiqueta no sean menores que la cantidad de nombres. El script usa por defecto resize_mode=NONE y placas de 500 a 1400 px por lado; la libreria conserva sus defaults. Nuevo LabelClass.yolo_name.
Fondo y componentes mas parecidos a una placa real. Desenfoque final acotado a [1, 3] para conservar el grano de la emulsion (#26). Estrias horizontales en la banda de ciencia, con stripe_amplitude_range (#27). El alto de la observacion se deriva de su ancho con aspect_ratio_range (6 a 15), en vez de sortearse aparte (#28). Lineas de la lampara mas finas: peak_spread se acota a (0.0004, 0.015) en draw_observation y el default de spectral_function pasa de 1.0 a 0.0077 (#29).
Cambios incompatibles
- Los datasets generados no son bit-identicos a los de 0.9.0, aun con la misma seed: cambian los sorteos del rng (se quita la llamada sin uso a
define_observations_limits, que solo consumia sorteos), el posicionamiento de las observaciones y los valores por defecto. Para reproducir un dataset anterior hay que usar 0.9.0. - OBB no se admite con un redimensionado que deforme.
SpectrumLabeledSequenceconSTRETCHyLabelFormat.OBB, yObservationCropSequencecon OBB ycrop_resize_shapefijo, levantanValueErroral construirse, con la alternativa. Unresize_modeque no sea unResizeModetambien se rechaza. - Se quitan
ComponentLimitydefine_observation_components_limitsde la API publica: eran stubs sin uso. - El script de ejemplo ya no lee variables de entorno (
GASP_OUTPUT_DIR, etc.): la carpeta de salida es su primer argumento. Se elimina.env.exampley la dependenciapython-dotenv.
0.9.0 - BordesCurvosYLAMOST
Espectro de ciencia a partir de datos reales de LAMOST, bordes de placa curvos con brillo, y valores por defecto del generador mas cercanos a placas reales.
Espectro de ciencia real (#24). lamost_spectral_function toma un tramo contiguo (de 3000 a 6000 A de ancho, window_range) de un espectro estelar real de LAMOST DR12 LRS en lugar de gaussianas ad hoc: se suaviza, se desvanece hacia los dos extremos (Fading.PLANCK_BOTH_ENDS), lleva ruido del 1 %, una subexposicion sorteada entre 0.5 y 1 y se invierte con probabilidad 0.2. La lampara no cambia. Los datos (99.998 espectros, 240 MB) se descargan la primera vez desde Hugging Face (Sansanto/gasp-lamost-dr12-lrs, fijado al tag 100k-1 y verificado por sha256) a ~/.keras/datasets/gasp_lamost/; en entornos sin internet hay que precargarlos (comando en el README). Todo trabajo publicado que use estos datos tiene que incluir el agradecimiento a LAMOST que figura en el README.
Bordes de placa curvos (#21). add_plate_edge arma el borde como una curva (recta base + arcos gaussianos de amplitud acotada) y, con prob_glow_edge, suma un brillo que decae hacia el interior de la placa. Devuelve ademas la mascara del lado valido, para que las rayas de manipulacion no sigan de largo por la zona de corte. Tambien baja el tope de cantidad, intensidad y largo de las rayas (#17).
Valores por defecto mas cercanos a placas reales. Placas apaisadas (height_range 900-2000, width_range 2800-4500), fondo mas oscuro (gray_value_range 0-0.24), angulos menores (angle_range -2 a 2), lamparas mas angostas (opening_lamp_range 0.1-0.35) y menos ruido (gaussian_std_range 3-8, grain_std_range 0-8).
Cambios incompatibles
Los datasets generados con esta version no son bit-identicos a los de 0.8.0, aun con la misma seed: cambian los sorteos del rng y los valores por defecto (en la comparacion del PR #30, ~99 % de los pixeles). Para reproducir un dataset anterior hay que usar 0.8.0.
0.8.0 - MarcasDePelo
Marca curva aislada tipo pelo o fibra en el fondo, con raiz gruesa que se afina hacia la punta.
Marca tipo pelo o fibra. add_realistic_noise suma hair_line_count/hair_intensity/hair_length_range: una polilinea corta de pocos segmentos con el angulo variando levemente entre ellos, a diferencia del eje recto de las rayas de manipulacion (#17) y del eje recto de las manchas "violin". El grosor arranca ancho y redondeado en la raiz (cv2.circle) y se afina hacia una punta de 1px, consistente con un pelo o fibra real sobre el negativo o el vidrio del escaner. SpectrumLabeledSequence lo expone con el mismo patron de sorteo por pesos que violin_line_count/scratch_line_count (hair_line_include, hair_intensity_range, hair_length_range), casi siempre 0 marcas por placa, para que se mantenga aislada.
Cambios incompatibles
Los datasets generados con esta version no son bit-identicos a los de 0.7.0, aun con la misma seed: el sorteo de hair_line_count/hair_intensity agrega pasos aleatorios nuevos por placa, que desplazan el resto del sorteo de ruido (posicion de manchas "violin", rayas de manipulacion, ruido gaussiano). hair_line_include=False explicito tampoco preserva la reproducibilidad exacta, porque hair_intensity se sortea igual aunque no se dibuje ninguna marca.
0.7.0 - RayasDeManipulacion
Rayas diagonales finas de manipulacion en el fondo, y manchas "violin" mas sutiles.
Rayas de manipulacion. add_realistic_noise suma scratch_line_count/scratch_intensity/scratch_length_range: rayones diagonales nitidos (cv2.line, grosor 1) que se cruzan entre si sobre el fondo, a diferencia de las manchas "violin" existentes que son difusas. El angulo se sortea lejos tanto de la horizontal como de la vertical, para no confundirse con el borde de una observacion ni con una linea espectral. SpectrumLabeledSequence los expone con el mismo patron de sorteo por pesos que violin_line_count (scratch_line_include, scratch_intensity_range, scratch_length_range).
Manchas "violin" mas finas y translucidas. violin_sigma (6.0 -> 3.0) y el default de violin_intensity_range (0.1-1.0 -> 0.05-0.35): el valor anterior las dejaba como un bloque opaco en vez de un defecto sutil sobre el fondo.
Cambios incompatibles
Los datasets generados con esta version no son bit-identicos a los de 0.6.0, aun con la misma seed: el sorteo de scratch_line_count/scratch_intensity agrega pasos aleatorios nuevos por placa. scratch_line_include=False explicito tampoco preserva la reproducibilidad exacta, porque scratch_intensity se sortea igual aunque no se dibuje ninguna raya. El cambio de violin_intensity_range tambien altera el aspecto (no el sorteo en si) de cualquier placa que ya tuviera manchas "violin".
0.6.0 - FondoYManuscritas
Estructura de gran escala en el fondo de las placas y anotaciones manuscritas junto a las observaciones.
Fondo con estructura de gran escala. El canvas ya no es un valor de gris constante: se le suma un campo de iluminacion de baja frecuencia (grilla chica interpolada con cv2.resize, field_amplitude_range) y grano de emulsion espacialmente correlacionado (grain_std_range), en vez de solo ruido blanco por pixel. El campo se aplica antes de dibujar las observaciones, asi que tambien las afecta a ellas, como pasa fisicamente con iluminacion despareja del escaner.
Anotaciones manuscritas. El generador puede agregar una letra de EMNIST Letters junto a cada observacion (prob_handwriting, default 0.10), como distractor sin etiqueta: no amplia el conjunto de clases, solo busca que el modelo no confunda escritura real con una observacion. Por placa comparten lado, tamaño y distancia base a la observacion, son consecutivas del alfabeto, y rotan con el mismo angulo que su observacion. Usa tensorflow-datasets, ya presente como dependencia transitiva de keras-cv: no se agrego ninguna dependencia nueva. El dataset EMNIST se descarga y cachea localmente la primera vez que se usa (documentado en el README).
Cambios incompatibles
Los datasets generados con esta version no son bit-identicos a los de 0.5.0, aun con la misma seed: field_amplitude_range y grain_std_range tienen default distinto de cero, asi que corren un paso adicional el sorteo aleatorio de cada placa. Con field_amplitude_range=(0,0) y grain_std_range=(0,0) explicitos tampoco da igual, por la misma razon. prob_handwriting=0 explicito si preserva la reproducibilidad exacta contra 0.5.0.
0.5.0 - OBBYComponentes
Etiquetas OBB, etiquetas a nivel de componente y un generador nuevo de recortes.
Etiquetas OBB. El generador puede emitir <class> <x1> <y1> ... <x4> <y4> ademas del formato AABB, eligiendolo con label_format. Las esquinas describen exactamente los pixeles dibujados: IoU de 0.964 a 0.971 contra la mascara real, con el angulo dentro de 0.014 grados.
Etiquetas de componente. Se pueden etiquetar el espectro de ciencia y las lamparas de comparacion ademas de la observacion completa, eligiendo las clases con label_classes. Los indices son fijos: observacion 0, science 1, lamp 2.
Generador de recortes. ObservationCropSequence produce recortes de observaciones individuales, etiquetados por componente, con un margen aleatorio independiente por lado. Alimenta a un modelo distinto del que detecta observaciones sobre la placa.
Cambios incompatibles
La convencion de rotacion se invirtio. Un angulo positivo ahora inclina la observacion hacia abajo a la derecha, igual que cv2.RotatedRect y cv2.minAreaRect. Yolo deriva el angulo de una etiqueta OBB con minAreaRect, asi que el angulo que se pide coincide en signo con el que el modelo aprende y predice. Las imagenes generadas quedan espejadas respecto de 0.4.0; con un rango de angulos simetrico la distribucion del dataset no cambia.
Los formateadores AABB se renombraron para que ninguno de los dos formatos parezca el caso por defecto: label_dict_to_yolov11_format pasa a label_dict_to_yolov11_aabb_format, y su equivalente para listas. No quedan alias.
La clase se emite como entero. Antes salia como 0.0 porque el tensor de salida es float32 y el valor se escribia tal cual. Afectaba tambien al formato AABB desde versiones anteriores.
0.4.0 - UnSoloCanal
El pipeline pasa a trabajar en escala de grises, con arreglos (alto, ancho), y expande a tres canales una sola vez al final. Los tres canales eran identicos por construccion desde que el ruido gaussiano se volvio monocromo en 0.2.0, asi que se arrastraban tres copias de la misma informacion durante todo el procesamiento.
Mejora de tiempos: el pipeline completo pasa de 75 ms a 45 ms por imagen, 1.68x mas rapido. Para un dataset de 96.000 imagenes son 2.01 h contra 1.19 h, unos 49 minutos menos. add_realistic_noise mejora 2.4x y draw_observation 1.5x. El canvas de trabajo a 1800x1800 baja de 37.1 MB a 12.4 MB.
La forma de salida no cambia: el generador sigue entregando lotes (n, alto, ancho, 3) uint8, que es lo que esperan los modelos de deteccion con backbone preentrenado.
Los datasets generados con esta version no son bit-identicos a los de 0.3.0. cv2.resize usa caminos de codigo distintos segun la cantidad de canales, asi que redimensionar en un canal y expandir despues difiere en exactamente 1 nivel de gris sobre 255, en entre el 6% y el 20% de los pixeles. Es visualmente indistinguible, pero la misma semilla ya no reproduce exactamente las imagenes anteriores.
0.3.0 - AdiosShim
Cambio incompatible: se elimina el modulo gsssp.observationArtist.
Desde el reparto en modulos ese archivo no contenia logica, solo reexportaba desde drawing, spectra, noise, labels, geometry y debug. Existia por compatibilidad, pero los nombres que justificaban mantenerlo (drawObservation, labelDictToYolov11Format, labelListToYolov11Format) ya se habian eliminado en 0.1.0.
Quien importe desde gsssp.observationArtist tiene que actualizar el import al modulo correspondiente, o directamente a gsssp. Los 18 nombres que el modulo reexportaba siguen disponibles por esas dos vias.
La API publica del paquete no cambia: gsssp.__all__ conserva los mismos 20 nombres.
0.2.0 - TiempoGen
Optimizacion de operaciones aleatorias en 3 canales de forma innecesaria. El ruido gaussiano se sorteaba por canal, generando tres muestras por pixel para una imagen que es monocroma. Ahora se sortea una y se broadcastea, con un tercio de las muestras.
Mejora en la calidad visual de las observaciones. Ese ruido por canal introducia un tinte de color en practicamente toda la placa: afectaba al 99% de los pixeles en memoria y sobrevivia en el 75% tras guardar el JPEG. Las placas generadas ahora son monocromas de verdad, como corresponde a un escaneo de placa fotografica.
Actualizacion de CLAUDE.md. Se documenta que las descripciones de PR van breves, apoyandose en el Issue y en los mensajes de commit, y que los tags de version se nombran sin prefijo v.
Los datasets generados con esta version no son comparables con los de 0.1.0: la misma semilla produce imagenes distintas.