我是一个简单的下载器,它从 CSV 中的 URL 下载图像,并按给定列命名它们(在确保其所有值都是唯一的之后)。我可以根据 CSV 中的任何列将您的图像组织到子文件夹中,并且如果父图像文件夹已存在,则会在覆盖之前向您发出警告。如果您需要方形图像进行建模,我将创建第二个目录(以相同格式组织),其中包含缩小的图像副本。耐心是一种美德,所以在重试列表中收到错误后,我会等待指定的时间再重新请求图像;如果所有重试都已用完或者我收到另一个错误,我会将其记录下来供您查看并继续。我还记录了所有成功的回复。下载后, sum-buddy
帮助我收集并记录所有下载图像的校验和。如果源 CSV 有校验和列,那么我可以进行伙伴检查以验证所有预期图像是否完整下载。至少,我会检查预期图像的数量是否与好友总数计数相匹配。
谨慎机器人标志是使用 Canva Magic Media 设计的。
Python 3.7+
pip install git+https://github.com/Imageomics/cautious-robot
Cautious-robot 将检查提供的 CSV 中的IMG_NAME
、 URL
和SUBFOLDERS
(如果提供),然后下载IMG_NAME
列中具有值的所有图像。请注意,图像文件名的选择应该是唯一的;如果所选的文件名列在数据集中不唯一,谨慎机器人将拒绝请求。它还会检查提供的OUTPUT
文件夹是否已存在,并在继续之前询问用户。有文件名但没有URL
图像会记录在错误日志中;在下载之前,系统会提示用户是否忽略或解决丢失的 URL。日志保存在与源 CSV 相同的目录中(日志记录是通过添加到现有 JSON 来完成的,因此在重新启动下载时不会覆盖同名的现有日志)。请注意,如果在完整下载图像之前流式响应被中断,则此错误可能不会记录在错误日志中,但验证程序会将它们注册为丢失。
如果需要,将创建辅助输出目录 ( OUTPUT_downsized
),其中包含缩小到指定大小(例如 256 x 256)的图像的方形副本。该辅助输出目录的文件夹结构将与未处理图像的文件夹结构相匹配。还可以传递下载失败重试之间等待的时间、重试下载图像的最大次数以及从 CSV 的哪个索引开始等参数。 Cautious-robot 在收到以下 HTTP 响应状态代码之一时将重试图像下载: 429, 500, 502, 503, 504
。
下载图像后,谨慎机器人调用sum-buddy
计算并记录OUTPUT
文件夹内容的校验和。它打印OUTPUT
文件夹中包含的图像数量以及预期数量(基于源文件中唯一的非空文件名的计数)。如果在源文件中提供了包含校验和的列,则它将进一步验证是否通过源文件的校验和和文件名列与校验和 CSV 的内部合并来下载所有预期图像(从而避免出现重复图像时出现混淆) 。
usage: cautious-robot [-h] -i [INPUT_FILE] -o [OUTPUT_DIR] [-s [SUBDIR_COL]] [-n [IMG_NAME_COL]] [-u [URL_COL]] [-w WAIT_TIME] [-r MAX_RETRIES] [-l SIDE_LENGTH] [-x STARTING_IDX] [-a CHECKSUM_ALGORITHM] [-v [VERIFIER_COL]] options: -h, --help show this help message and exit required arguments: -i [INPUT_FILE], --input-file [INPUT_FILE] path to CSV file with urls. -o [OUTPUT_DIR], --output-dir [OUTPUT_DIR] main directory to download images into. optional arguments: -s [SUBDIR_COL], --subdir-col [SUBDIR_COL] name of column to use for subfolders in image directory (defaults to flat directory if left blank) -n [IMG_NAME_COL], --img-name-col [IMG_NAME_COL] column to use for image filename (default: filename) -u [URL_COL], --url-col [URL_COL] column with URLs to download (default: file_url) -w WAIT_TIME, --wait-time WAIT_TIME seconds to wait between retries for an image (default: 3) -r MAX_RETRIES, --max-retries MAX_RETRIES max times to retry download on a single image (default: 5) -l SIDE_LENGTH, --side-length SIDE_LENGTH number of pixels per side for resized square images (default: no resized images created) -x STARTING_IDX, --starting-idx STARTING_IDX index of CSV at which to start download (default: 0) -a CHECKSUM_ALGORITHM, --checksum-algorithm CHECKSUM_ALGORITHM checksum algorithm to use on images (default: md5, available: sha256, sha384, md5-sha1, blake2b, sha512, sha1, sm3, sha3_256, sha512_256, sha224, sha3_224, ripemd160, sha3_384, shake_128, blake2s, md5, sha3_512, sha512_224, shake_256) -v [VERIFIER_COL], --verifier-col [VERIFIER_COL] name of column in source CSV with checksums (same hash as -a) to verify download
examples/
目录中提供了示例 CSV [1],用于测试 CLI。
默认值:
cautious-robot --input-file examples/HCGSD_testNA.csv --output-dir examples/test_images
输出:
100%|███████████████████████████████████████████████ ███████████████████| 8/8 [00:01<00:00, 4.18it/s]图像从examples/HCGSD_testNA.csv下载到examples/test_images。下载日志位于examples/HCGSD_testNA_log.jsonl和examples/HCGSD_testNA_error_log.jsonl中。计算md5校验和示例/测试图像:100%|███████████████████████████████████████████ | 16/16 [00:00<00:00, 3133.00it/s]写入示例/HCGSD_testNA_checksums.csv8 图像的示例/test_images 的 md5 校验和已下载到 8 个预期的示例/test_images。
head -n 9 examples/HCGSD_testNA_checksums.csv
输出:
filepath,fileName,md5examples/test_images/10429021_v_lowres.jpg,10429021_v_lowres.jpg,c6aeb9d2f6db412ff5be0eb0bbe0eb0b5beb5435b835b83b83 ex_implame/test_mages/104285.d_dpp y OWRES.JPG,55882A0F3FDF8A68579C07254395653BEXAMPLES/TEST_IMAGES/10428972_V_LOWRES.JPG,10428972_LOWRES.JPG 10428803_d_lowres.jpg,10428803_d_lowres。 jpg,d8bfb73f2d3556390de04aa98822b815examples/test_images/10428169_V_lowres.jpg,10428169_V_lowres.jpg,042c9dc294d589ce3f140f14ddab0166examples/test_images/10428321_D_ lowres.jpg,10428321_D_lowres.jpg,fbeeed30274e424831b06360b587ceb3examples/test_images/10428140_V_lowres.jpg,10428140_V_lowres.jpg,c11538f2de5a5e2d6013fc800848d43 aexamples/test_images/10428250_V_lowres.jpg,10428250_V_lowres.jpg, 14ac99b1a9913a9d420f21b94d6136d6
根据列值将图像下载到子文件夹:
cautious-robot -i examples/HCGSD_testNA.csv -o examples/test_images_subdirs --subdir-col Species
输出:
100%|███████████████████████████████████████████████ ███████████████████████████████████████████████████ █| 8/8 [00:02<00:00, 3.47it/s]图像从examples/HCGSD_testNA.csv下载到examples/test_images_subdirs。下载日志位于examples/HCGSD_testNA_log.jsonl和examples/HCGSD_testNA_error_log.jsonl中。计算md5校验和示例/test_images_subdirs:100%|███████████████████████████████████████████ ██| 8/8 [00:00<00:00, 3106.60it/s]写入示例/HCGSD_testNA_checksums.csv8 图像的示例/test_images_subdirs 的 md5 校验和已下载到 8 个预期的示例/test_images_subdirs。
ls examples/test_images
输出:
埃拉托·梅尔波梅内
head -n 9 examples/HCGSD_testNA_checksums.csv
输出:
文件路径,文件名,md5examples/test_images_subdirs/erato/10429021_V_lowres.jpg,10429021_V_lowres.jpg,c6aeb9d2f6db412ff5be0eb0b5435b83examples/test_images_subdirs/erato/10428595_D_lowres.jpg,10428595 _D_lowres.jpg,55882a0f3fdf8a68579c07254395653bexamples/test_images_subdirs/erato/10428972_ V_lowres.jpg,10428972_V_lowres.jpg,0047e7454ce444f67fee1c90cc3ba9cbexamples/test_images_sub目录/ erato/10428803_D_lowres.jpg,10428803_D_lowres.jpg,d8bfb73f2d3556390de04aa98822b815examples/test_images_subdirs/melpomene/10428169_V_lowres.jpg,10428169_V_lowres.jpg,042c9dc2 94d589ce3f140f14ddab0166examples/test_images_subdirs/melpomene/10428321_D_lowres.jpg,10428321_D_lowres.jpg,fbeeed30274e424831b06360b587ceb3examples/test_images_subdirs/melpomene/10428 140_V_lowres.jpg,10428140_V_lowres. jpg,c11538f2de5a5e2d6013fc800848d43aexamples/test_images_subdirs/melpomene/10428250_V_lowres.jpg,10428250_V_lowres.jpg,14ac99b1a9913a9d420f21b94d6136d6
图像校验和不匹配:源 CSV 中的一个值被故意更改
cautious-robot -i examples/HCGSD_test_MD5_mismatch.csv -o examples/test_images_md5_mismatch --subdir-col Species -v "md5"
输出:
100%|███████████████████████████████████████████████ ███████████████████████████████████████████████████ █| 8/8 [00:01<00:00, 4.23it/s]图像从examples/HCGSD_test_MD5_mismatch.csv下载到examples/test_images_md5_mismatch。下载日志位于examples/HCGSD_test_MD5_mismatch_log.jsonl和examples/HCGSD_test_MD5_mismatch_error_log.jsonl。计算md5校验和示例/test_images_md5_mismatch:100%|████████████████████████████████| 8/8 [00:00<00:00, 4159.98it/s]示例/test_images_md5_mismatch 的 md5 校验和写入示例/HCGSD_test_MD5_mismatch_checksums.csv8 个图像已下载到 8 个预期图像的示例/test_images_md5_mismatch。图像不匹配:1 个图像未对齐,请参阅示例/HCGSD_test_MD5_mismatch_missing.csv 以获取丢失的图像信息和检查日志。
# Check on that mis-aligned image head -n 2 examples/HCGSD_test_MD5_mismatch_missing.csv
输出:
nhm_specimen,物种,亚种,性别,file_url,文件名,md510428972,erato,petiverana,男性,https://github.com/Imageomics/dashboard-prototype/raw/main/test_data/images/ventral_images/10428972_V_lowres.png,10428972_V_lowres。 jpg,不匹配
[1] 测试图像来自 Cuthill Gold Standard 数据集,该数据集由 Cuthill 等人处理。等人。 (原始数据集可在 doi:10.5061/dryad.2hp1978 获取)。