FinalVision / _utils /load_track_data.py
phoebehxf
Merge branch 'main' of https://huggingface.co/spaces/phoebe777777/FinalVision
e429374
import os
from glob import glob
from pathlib import Path
from natsort import natsorted
from PIL import Image
import numpy as np
import tifffile
import skimage.io as io
import torchvision.transforms as T
import cv2
from tqdm import tqdm
from models.tra_post_model.trackastra.utils import normalize_01, normalize
IMG_SIZE = 512
def _load_tiffs(folder: Path, dtype=None):
"""Load a sequence of tiff files from a folder into a 3D numpy array."""
images = glob(str(folder / "*.tif"))
test_data = tifffile.imread(images[0])
if len(test_data.shape) == 3:
turn_gray = True
else:
turn_gray = False
end_frame = len(images)
if not turn_gray:
x = np.stack([
tifffile.imread(f).astype(dtype)
for f in tqdm(
sorted(folder.glob("*.tif"))[0 : end_frame : 1],
leave=False,
desc=f"Loading [0:{end_frame}]",
)
])
else:
x = []
for f in tqdm(
sorted(folder.glob("*.tif"))[0 : end_frame : 1],
leave=False,
desc=f"Loading [0:{end_frame}]",
):
img = tifffile.imread(f).astype(dtype)
if img.ndim == 3:
if img.shape[-1] > 3:
img = img[..., :3]
img = (0.299 * img[..., 0] + 0.587 * img[..., 1] + 0.114 * img[..., 2])
x.append(img)
x = np.stack(x)
return x
def load_track_images(file_dir):
# suffix_ = [".png", ".tif", ".tiff", ".jpg"]
def find_tif_dir(root_dir):
"""递归查找.tif 文件"""
tif_files = []
for dirpath, _, filenames in os.walk(root_dir):
if '__MACOSX' in dirpath:
continue
for f in filenames:
if f.lower().endswith('.tif'):
tif_files.append(os.path.join(dirpath, f))
return tif_files
tif_dir = find_tif_dir(file_dir)
print(f"Found {len(tif_dir)} tif images in {file_dir}")
print(f"First 5 tif images: {tif_dir[:5]}")
assert len(tif_dir) > 0, f"No tif images found in {file_dir}"
images = natsorted(tif_dir)
imgs = []
imgs_raw = []
images_stable = []
# load images for seg and track
for img_path in tqdm(images, desc="Loading images"):
img = tifffile.imread(img_path)
img_raw = io.imread(img_path)
if img.dtype == 'uint16':
img = ((img - img.min()) / (img.max() - img.min() + 1e-6) * 255).astype(np.uint8)
img = np.stack([img] * 3, axis=-1)
w, h = img.shape[1], img.shape[0]
else:
img = Image.open(img_path).convert("RGB")
w, h = img.size
img = T.Compose([
T.ToTensor(),
T.Resize((IMG_SIZE, IMG_SIZE)),
])(img)
image_stable = img - 0.5
img = T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])(img)
imgs.append(img)
imgs_raw.append(img_raw)
images_stable.append(image_stable)
height = h
width = w
imgs = np.stack(imgs, axis=0)
imgs_raw = np.stack(imgs_raw, axis=0)
images_stable = np.stack(images_stable, axis=0)
# track data
imgs_ = _load_tiffs(Path(file_dir), dtype=np.float32)
imgs_01 = np.stack([
normalize_01(_x) for _x in tqdm(imgs_, desc="Normalizing", leave=False)
])
imgs_ = np.stack([
normalize(_x) for _x in tqdm(imgs_, desc="Normalizing", leave=False)
])
return imgs, imgs_raw, images_stable, imgs_, imgs_01, height, width
if __name__ == "__main__":
file_dir = "data/2D+Time/DIC-C2DH-HeLa/train/DIC-C2DH-HeLa/02"
imgs, imgs_raw, images_stable, imgs_, imgs_01, height, width = load_track_images(file_dir)
print(imgs.shape, imgs_raw.shape, images_stable.shape, imgs_.shape, imgs_01.shape, height, width)