def build_tile_cache(self): self.tiles = [] for files in tqdm(self.index, desc='Building/Checking Tile Cache'): file = files[0] cache_dir = self.cache_dir / file.stem lockfile = cache_dir / 'lock.file' if not cache_dir.is_dir() or lockfile.exists(): if lockfile.exists(): shutil.rmtree(cache_dir) cache_dir.mkdir(exist_ok=False) lockfile.touch() data_out = {} for file in files: with rio.open(file) as raster: data = raster.read() _, H, W = data.shape if file.parent.name == 'gt': assert len(np.unique(data)) <= 2, f'{file}: {np.unique(data)}' data = data > 0 data_out[file.parent.name] = data for y in range(0, H-TILESIZE, TILESIZE//2): for x in range(0, W-TILESIZE, TILESIZE//2): tile = {p: data_out[p][:, y:y+TILESIZE, x:x+TILESIZE] for p in self.parts} np.savez(cache_dir / f'{y:04d}_{x:04d}.npz', **tile) lockfile.unlink() self.tiles += list(sorted(cache_dir.glob('*.npz')))是什么意思
时间: 2024-02-10 18:25:00 浏览: 76
deepzoom_tile.zip_deepzoom_tile_deep切图_切图脚本
这段代码在构建缓存目录时,同时还将数据存储到缓存目录中的 `.npz` 文件中。以下是对代码的解释:
- `data_out = {}` 创建一个空字典,用于存储不同文件的数据。
- 对于 `files` 中的每个文件:
- 使用 `rio.open(file)` 打开文件并读取数据。
- 使用 `file.parent.name` 获取文件的父目录名称。
- 如果父目录名称为 `'gt'`,则检查数据的唯一值是否不超过 2,如果超过则引发异常,并将数据转换为布尔类型(大于 0 的值被视为 True)。
- 将数据存储到 `data_out` 字典中的对应父目录名称的键下。
- 使用嵌套循环遍历 `y` 和 `x`,以 TILESIZE//2 的步幅划分图像的子块。
- 对于每个子块,从 `data_out` 字典中选择相应的部分数据,存储到以 `(y:04d)_(x:04d).npz` 命名的 `.npz` 文件中。
- 在处理完所有子块后,使用 `lockfile.unlink()` 删除锁文件。
- 将缓存目录中所有 `.npz` 文件的路径添加到 `self.tiles` 列表中,并按照文件名进行排序。
这段代码的作用是构建缓存目录,并将数据按照指定的规则划分为子块,并保存到 `.npz` 文件中,最后将所有 `.npz` 文件的路径存储在 `self.tiles` 列表中。
阅读全文