解压从Google Drive下载的分文件zip

下载 [1] 提供的数据 [2],其中 FFHQ 下载时会 Google Drive 会自动分成 4 分下载:

  • ffhq-00i.zip,其中 i = {1, 2, 3, 4}

每份上限 2G 左右。按以前解压 multipart 的方法 [3] 解压之后,跑它的 preprocess 过程会出错,而且有一次解压时还少了里面的两个 .csv 文件,怀疑解压有问题。

这次从 Google Drive 下下来的这几个文件跟之前 [1] 中处理的也不太一样:[1] 中的是正经 multipart zip,有几个是 .z0* 的,还有一个单独的 .zip 文件,其中可能装着一些元信息?比如顺序、共几 parts 之类的;但这次的没有这么一个 .zip 文件。

检测发现,有些图片居然出现在不同的 parts 中!首先用:

for i in `seq 1 4`; do
	unzip -Z1 ffhq-00$i.zip > $i.txt
done

将各分 zip 文件中的文件列表打出来,然后查重:

import collections
import cv2
import numpy as np
import os.path as osp

cnt = collections.defaultdict(list)
for i in range(1, 5):
    # print(i)
    with open("{}.txt".format(i), "r") as f:
        for line in f:
            line = line.strip()
            # print(line)
            if ".png" == line[-4:]:
                k = int(line.split('/')[-1].split(".png")[0])
                # print(k)
                cnt[k].append(i)
print("#images:", len(cnt))  # 69080

print("check seperated images")
n_seperated = 0
for k in cnt:
    if len(cnt[k]) > 1:
        n_seperated += 1
        # print(k, "in:", cnt[k], ',', len(cnt[k]))
print("#seperated images:", n_seperated)  # 914

发现一共有 914 幅图存在两 part 中!不过本地 windows 肉眼对比,似乎重复的图像大小都一样、也能正确打开,可能是重复了,而不是一张裂开两张再分存在两部分。验证:

先几 part 分别解压、合并解压(参照 [2]):

# 分别解压
for i in `seq 1 4`; do
	unzip ffhq-00$i.zip  # 解压得 `ffhq/`
	mv ffhq ffhq-00$i
done

# 合并解压
# `-n` 重复的文件不替换
unzip -n 'ffhq-00*.zip'  # 解压得 `ffhq/`

然后对拍:

  • 两个 .csv 文件的一致性
diff ffhq/angle.csv ffhq-001/angle.csv  # 无输出,一致
diff ffhq/attr_gender.csv ffhq-001/attr_gender.csv  # 无输出,一致
  • 同一幅图「在不同 part 的分身」和「合并解压所得之图」之间的一致性
import collections
import cv2
import numpy as np
import os.path as osp

cnt = collections.defaultdict(list)
for i in range(1, 5):
    # print(i)
    with open("{}.txt".format(i), "r") as f:
        for line in f:
            line = line.strip()
            # print(line)
            if ".png" == line[-4:]:
                k = int(line.split('/')[-1].split(".png")[0])
                # print(k)
                cnt[k].append(i)
print("#images:", len(cnt))  # 69080

print("check consistency")
for k in cnt:
    im_p = osp.join("ffhq", "images_256", "{:05d}.png".format(k))
    im = cv2.imread(im_p, cv2.IMREAD_UNCHANGED)
    assert im is not None, im_p
    for pid in cnt[k]:
        im2_p = osp.join("ffhq-00{}".format(pid), "images_256", "{:05d}.png".format(k))
        im2 = cv2.imread(im2_p, cv2.IMREAD_UNCHANGED)
        assert im2 is not None, im2_p
        assert im.shape == im2.shape and im.dtype == im.dtype and (im != im2).sum() == 0, \
            "inconsistent: {}, {}".format(k, pid)
print("DONE")
  • 结论:完全一致

Conclusion

所以从 Google Drive 下载的文件(夹),如果被分成多份,而又发现不同份之间有重复文件,那这些重复文件之间应该是一致的,留其中一份就行。当然还是对拍一遍比较稳。

References

  1. XuyangGuo/CtrlHair
  2. dataset_info_ctrlhair
  3. linux解压分文件(multipart)的 .zip 文件
  4. How to unzip multiple zip files into a single directory structure (e.g. Google Drive folder export
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值