下载 [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 下载的文件(夹),如果被分成多份,而又发现不同份之间有重复文件,那这些重复文件之间应该是一致的,留其中一份就行。当然还是对拍一遍比较稳。