Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions configs/experiment/im2im/diffae.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,5 @@ callbacks:
num_pcs: 4
n_steps: 3
every_n_epoch: ${model.save_images_every_n_epochs}
model_checkpoint:
monitor: null
2 changes: 1 addition & 1 deletion configs/logger/mlflow.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
mlflow:
_target_: cyto_dl.loggers.MLFlowLogger
tracking_uri: https://mlflow.a100.int.allencell.org/
tracking_uri:
experiment_name: ${experiment_name}
run_name: ${run_name}
5 changes: 2 additions & 3 deletions configs/model/im2im/diffae.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,10 @@ loss:
reduction: none

semantic_encoder:
_target_: cyto_dl.nn.resnet.ResNet
out_dim: 8
_target_: cyto_dl.nn.TorchVisionWrapper
base_encoder:
_partial_: True
_target_: torchvision.models.resnet18
num_classes: 8

# 3D
# _target_: monai.networks.nets.Regressor
Expand Down
54 changes: 0 additions & 54 deletions cyto_dl/dataframe/readers.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,47 +9,9 @@
import modin.pandas as pd
except ModuleNotFoundError:
import pandas as pd

import anndata
import pyarrow.parquet


def read_h5ad(path, include_columns=None, backed=None):
"""Read an annData object stored in a .h5ad file.

Parameters
----------

path: Union[Path, str]
Path to the .h5ad file

include_columns: Optional[Sequence[str]] = None
List of column names and/or regex expressions, used to only include the
desired columns in the resulting dataframe.

backed: Optional[str] = None
Can be (either "r" or "r+").
See anndata's docs for details:
https://anndata.readthedocs.io/en/latest/generated/anndata.read_h5ad.html#anndata.read_h5ad

Returns
-------
annData
"""

if backed:
assert backed in ("r", "r+")
dataframe = anndata.read_hda5(path, backed=backed)

if include_columns is not None:
columns = []
for filter_ in include_columns:
columns += filter_columns(dataframe.obs.columns.tolist(), regex=filter_)

dataframe.obs = dataframe.obs[columns]
return dataframe


def read_parquet(path, include_columns=None):
"""Read a dataframe stored in a .parquet file, and optionally include only the columns given by
`include_columns`
Expand Down Expand Up @@ -178,28 +140,12 @@ def read_dataframe(
columns += filter_columns(dataframe.columns, regex=filter_)

dataframe = dataframe[columns]
elif isinstance(dataframe, anndata.AnnData):
if include_columns is not None:
columns = []
for filter_ in include_columns:
columns += filter_columns(dataframe.obs.columns, regex=filter_)

dataframe.obs = dataframe.obs[columns]
else:
raise TypeError(
f"`dataframe` must be either a pd.DataFrame or a path to "
f"a file to load one. You passed {type(dataframe)}"
)

if isinstance(dataframe, anndata.AnnData):
# Make dataframe out of anndata object
X = dataframe.X.toarray()
X = pd.DataFrame(X, columns=[f"X_{i}" for i in range(X.shape[1])]).reset_index(drop=True)
index = pd.DataFrame(dataframe.obs_names)
dataframe = dataframe.obs.reset_index(drop=True)
dataframe = pd.concat([X, dataframe], axis=1)
dataframe = pd.concat([index, dataframe], axis=1)

if required_columns is not None:
missing_columns = set(required_columns) - set(dataframe.columns)
if missing_columns:
Expand Down
2 changes: 1 addition & 1 deletion cyto_dl/image/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from .io import MonaiBioReader, OmeZarrReader
from .io import MonaiBioReader
from .transforms import (
BrightSampler,
RandomMultiScaleCropd,
Expand Down
1 change: 0 additions & 1 deletion cyto_dl/image/io/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from .bioio_loader import BioIOImageLoaderd
from .monai_bio_reader import MonaiBioReader
from .numpy_reader import ReadNumpyFile
from .ome_zarr_reader import OmeZarrReader
from .polygon_loader import PolygonLoaderd
from .skimage_reader import SkimageReader
1 change: 1 addition & 0 deletions cyto_dl/image/io/bioio_loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ def __call__(self, data):
if self.resolution_key in data:
img.set_resolution_level(data[self.resolution_key])
kwargs = {k: self.split_args(data[k]) for k in self.kwargs_keys if k in data}

if self.dask_load:
img = img.get_image_dask_data(**kwargs).compute()
else:
Expand Down
56 changes: 0 additions & 56 deletions cyto_dl/image/io/ome_zarr_reader.py

This file was deleted.

2 changes: 1 addition & 1 deletion cyto_dl/image/transforms/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from .multiscale_cropper import RandomMultiScaleCropd
from .pad import PadZd
from .project import Projectd # codespell:ignore
from .save import Save, Saved
# from .save import Save, Saved

try:
from .rotation_mask_transform import RotationMask, RotationMaskd
Expand Down
120 changes: 60 additions & 60 deletions cyto_dl/image/transforms/save.py
Original file line number Diff line number Diff line change
@@ -1,68 +1,68 @@
from pathlib import Path
from typing import Sequence, Union
# from pathlib import Path
# from typing import Sequence, Union

import numpy as np
import torch
from bioio.writers import OmeTiffWriter
from monai.data.meta_tensor import MetaTensor
from monai.transforms import Transform
from omegaconf import ListConfig
# import numpy as np
# import torch
# from bioio.writers import OmeTiffWriter
# from monai.data.meta_tensor import MetaTensor
# from monai.transforms import Transform
# from omegaconf import ListConfig


class Save(Transform):
def __init__(
self,
save_path: str = "./",
):
"""
Parameters
----------
keys: Sequence[str]
keys to save
save_path: str
path to save images
"""
super().__init__()
self.save_path = Path(save_path)
self.count = 0
# class Save(Transform):
# def __init__(
# self,
# save_path: str = "./",
# ):
# """
# Parameters
# ----------
# keys: Sequence[str]
# keys to save
# save_path: str
# path to save images
# """
# super().__init__()
# self.save_path = Path(save_path)
# self.count = 0

def __call__(self, img, name="img"):
OmeTiffWriter.save(
uri=self.save_path / f"{name}_{self.count}.tif",
data=img if not isinstance(img, (torch.Tensor, MetaTensor)) else img.numpy(),
)
self.count += 1
return img
# def __call__(self, img, name="img"):
# OmeTiffWriter.save(
# uri=self.save_path / f"{name}_{self.count}.tif",
# data=img if not isinstance(img, (torch.Tensor, MetaTensor)) else img.numpy(),
# )
# self.count += 1
# return img


class Saved(Transform):
"""Save a batch of images to disk for debugging."""
# class Saved(Transform):
# """Save a batch of images to disk for debugging."""

def __init__(
self,
keys: Sequence[str],
save_path: str = "./",
allow_missing_keys: bool = False,
):
"""
Parameters
----------
keys: Sequence[str]
keys to save
save_path: str
path to save images
allow_missing_keys: bool
allow missing keys in batch
"""
super().__init__()
self.keys = keys if isinstance(keys, (list, ListConfig)) else [keys]
self.allow_missing_keys = allow_missing_keys
self.saver = Save(save_path)
# def __init__(
# self,
# keys: Sequence[str],
# save_path: str = "./",
# allow_missing_keys: bool = False,
# ):
# """
# Parameters
# ----------
# keys: Sequence[str]
# keys to save
# save_path: str
# path to save images
# allow_missing_keys: bool
# allow missing keys in batch
# """
# super().__init__()
# self.keys = keys if isinstance(keys, (list, ListConfig)) else [keys]
# self.allow_missing_keys = allow_missing_keys
# self.saver = Save(save_path)

def __call__(self, img_dict):
for key in self.keys:
if key in img_dict:
self.saver(img_dict[key], key)
elif not self.allow_missing_keys:
raise ValueError(f"key {key} found in data. Available keys are {img_dict.keys()}")
return img_dict
# def __call__(self, img_dict):
# for key in self.keys:
# if key in img_dict:
# self.saver(img_dict[key], key)
# elif not self.allow_missing_keys:
# raise ValueError(f"key {key} found in data. Available keys are {img_dict.keys()}")
# return img_dict
Loading