Sou um downloader simples que baixa imagens de URLs em um CSV e as nomeia de acordo com a coluna fornecida (depois de garantir que todos os seus valores sejam exclusivos). Posso organizar suas imagens em subpastas com base em qualquer coluna do seu CSV e avisarei se a pasta de imagens pai já existir antes de substituí-la. Se você precisar de imagens quadradas para modelagem, criarei um segundo diretório (organizado no mesmo formato) com cópias reduzidas de suas imagens. Paciência é uma virtude, então esperarei um tempo determinado antes de solicitar novamente uma imagem após receber um erro em minha lista de novas tentativas; se todas as tentativas forem esgotadas ou eu receber outro erro, registro isso para sua revisão e sigo em frente. Também mantenho um registro de todas as respostas bem-sucedidas. Após o download, sum-buddy
me ajuda a coletar e registrar somas de verificação para todas as imagens baixadas. Se o CSV de origem tiver uma coluna de soma de verificação, posso fazer uma verificação de amizade para verificar se todas as imagens esperadas foram baixadas intactas. No mínimo, verifico se o número de imagens esperadas corresponde ao número de contagens de amigos.
O logotipo do robô cauteloso foi projetado usando Canva Magic Media.
Python 3.7+
pip instalar git + https://github.com/Imageomics/cautious-robot
Cautious-robot verificará o CSV fornecido para IMG_NAME
, URL
e SUBFOLDERS
(se fornecido) e, em seguida, fará o download de todas as imagens que possuem um valor na coluna IMG_NAME
. Observe que a escolha do nome do arquivo da imagem deve ser única; cauteloso-robot recusará a solicitação se a coluna de nome de arquivo selecionada não for exclusiva no conjunto de dados. Também verificará se a pasta OUTPUT
fornecida já existe, perguntando ao usuário antes de continuar. Imagens que possuem nome de arquivo, mas não possuem URL
, são registradas no log de erros; o usuário é questionado se deseja ignorar ou resolver os URLs ausentes antes de fazer o download. Os logs são salvos no mesmo diretório do CSV de origem (o log é feito adicionando-o a um JSON existente, para que não substitua os logs existentes com o mesmo nome no caso de um download reiniciado). Observe que se a resposta transmitida for interrompida antes do download completo da imagem, esse erro pode não ser registrado no log de erros, mas o verificador os registrará como ausentes.
Se desejado, um diretório de saída secundário ( OUTPUT_downsized
) será criado com cópias quadradas das imagens reduzidas para o tamanho especificado (por exemplo, 256 x 256). A estrutura de pastas deste diretório de saída secundário corresponderá à das imagens não processadas. Parâmetros como tempo de espera entre novas tentativas em um download com falha, o número máximo de vezes para tentar novamente o download de uma imagem e qual índice do CSV iniciar também podem ser passados. O Cautious-robot tentará novamente o download de imagens ao receber um dos seguintes códigos de status de resposta HTTP: 429, 500, 502, 503, 504
.
Depois de baixar as imagens, o robô cauteloso chama sum-buddy
para calcular e registrar somas de verificação do conteúdo da pasta OUTPUT
. Ele imprime o número de imagens contidas na pasta OUTPUT
junto com o número esperado (com base em uma contagem de nomes de arquivos exclusivos e não nulos no arquivo de origem). Se for fornecida uma coluna com somas de verificação no arquivo de origem, ele verificará ainda mais se todas as imagens esperadas foram baixadas por meio de uma mesclagem interna nas colunas de soma de verificação e nome do arquivo do arquivo de origem com a soma de verificação CSV (evitando assim confusão em caso de imagens duplicadas) .
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
CSVs de amostra [1] são fornecidos no diretório examples/
para testar a CLI.
Padrões:
cautious-robot --input-file examples/HCGSD_testNA.csv --output-dir examples/test_images
Saída:
100% | ███████████████████████████████████| 8/8 [00:01<00:00, 4.18it/s]Imagens baixadas de exemplos/HCGSD_testNA.csv para exemplos/test_images. Os registros de download estão em exemplos/HCGSD_testNA_log.jsonl e exemplos/HCGSD_testNA_error_log.jsonl.Calculando somas de verificação md5 em exemplos/test_images: 100%|███████████████████ ████████████████████████| 16/16 [00:00<00:00, 3133.00it/s]md5 checksums para exemplos/test_images gravados em exemplos/HCGSD_testNA_checksums.csv8 imagens foram baixadas para exemplos/test_images dos 8 esperados.
head -n 9 examples/HCGSD_testNA_checksums.csv
Saída:
caminho do arquivo, nome do arquivo, md5examples/test_images/10429021_V_lowres.jpg,10429021_V_lowres.jpg,c6aeb9d2f6db4 12ff5be0eb0b5435b83examples/test_images/10428595_D_lowres.jpg,10428595_D_lowres.jpg,55882a0f3fdf8a68 579c07254395653bexamples/test_images/10428972_V_lowres.jpg,10428972_V_lowres.jpg,0047e7454ce444f67f ee1c90cc3ba9cbexemples/test_images/10428803_D_lowres.jpg,10428803_D_lowres.jpg,d8bfb73f2d3556390de04 aa98822b815examples/test_images/10428169_V_lowres.jpg,10428169_V_lowres.jpg,042c9dc294d589ce3f140f1 4ddab0166examples/test_images/10428321_D_lowres.jpg,10428321_D_lowres.jpg,fbeeed30274e424831b06360b5 87ceb3examples/test_images/10428140_V_lowres.jpg,10428140_V_lowres.jpg,c11538f2de5a5e2d6013fc800848d 43aexamples/test_images/10428250_V_lowres.jpg,10428250_V_lowres.jpg,14ac99b1a9913a9d420f21b94d6136d6
Baixe imagens para subpastas com base no valor da coluna:
cautious-robot -i examples/HCGSD_testNA.csv -o examples/test_images_subdirs --subdir-col Species
Saída:
100%|█████████████████████ ██████████████████████████ ██████████████████████████ █████████████████████████| 8/8 [00:02<00:00, 3,47it/s]Imagens baixadas de exemplos/HCGSD_testNA.csv para exemplos/test_images_subdirs. Os registros de download estão em exemplos/HCGSD_testNA_log.jsonl e exemplos/HCGSD_testNA_error_log.jsonl.Calculando somas de verificação md5 em exemplos/test_images_subdirs: 100%|████████████████████ █████████████████████████| 8/8 [00:00<00:00, 3106.60it/s]md5 somas de verificação para exemplos/test_images_subdirs gravados em exemplos/HCGSD_testNA_checksums.csv8 imagens foram baixadas em exemplos/test_images_subdirs dos 8 esperados.
ls examples/test_images
Saída:
erato melpômene
head -n 9 examples/HCGSD_testNA_checksums.csv
Saída:
caminho do arquivo, nome do arquivo, md5examples/test_images_subdirs/erato/10429021_V_lowres.jpg,10429021_V_lowres.jpg,c6aeb9d2f6db412 ff5be0eb0b5435b83examples/test_images_subdirs/erato/10428595_D_lowres.jpg,10428595_D_lowres.jpg,55882a0f3fdf8a68579c 07254395653bexamples/test_images_subdirs/erato/10428972_V_lowres.jpg,10428972_V_lowres.jpg,0047e7454ce444f67fee1c90 cc3ba9cbexamples/test_images_subdirs/erato/10428803_D_lowres.jpg,10428803_D_lowres.jpg,d8bfb73f2d3556390de04aa98822b 815examples/test_images_subdirs/melpomene/10428169_V_lowres.jpg,10428169_V_lowres.jpg,042c9dc294d589ce3f140f14ddab0 166exemplos/test_images_subdirs/melpomene/10428321_D_lowres.jpg,10428321_D_lowres.jpg,fbeeed30274e424831b06360b587ce b3examples/test_images_subdirs/melpomene/10428140_V_lowres.jpg,10428140_V_lowres.jpg,c11538f2de5a5e2d6013fc800848d43 aexamples/test_images_subdirs/melpomene/10428250_V_lowres.jpg,10428250_V_lowres.jpg,14ac99b1a9913a9d420f21b94d6136d6
Incompatibilidade de soma de verificação de imagem: um valor é alterado intencionalmente no CSV de origem
cautious-robot -i examples/HCGSD_test_MD5_mismatch.csv -o examples/test_images_md5_mismatch --subdir-col Species -v "md5"
Saída:
100%|█████████████████████ ██████████████████████████ ██████████████████████████ █████████████████████████| 8/8 [00:01<00:00, 4,23it/s]Imagens baixadas de exemplos/HCGSD_test_MD5_mismatch.csv para exemplos/test_images_md5_mismatch. Os registros de download estão em exemplos/HCGSD_test_MD5_mismatch_log.jsonl e exemplos/HCGSD_test_MD5_mismatch_error_log.jsonl.Calculating Somas de verificação md5 em exemplos/test_images_md5_mismatch: 100% | 8/8 [00:00<00:00, 4159.98it/s]somas de verificação md5 para exemplos/test_images_md5_mismatch escritas em exemplos/HCGSD_test_MD5_mismatch_checksums.csv8 imagens foram baixadas para exemplos/test_images_md5_mismatch das 8 esperadas.Incompatibilidade de imagem: 1 imagem(s) não alinhado, veja exemplos/HCGSD_test_MD5_mismatch_missing.csv para informações de imagem ausentes e registros de verificação.
# Check on that mis-aligned image head -n 2 examples/HCGSD_test_MD5_mismatch_missing.csv
Saída:
nhm_specimen,espécie,subespécie,sexo,file_url,nome do arquivo,md510428972,erato,petiverana,masculino,https://github.com/Imageomi cs/dashboard-prototype/raw/main/test_data/images/ventral_images/10428972_V_lowres.png,10428972_V_lowres.jpg,incompatibilidade
[1] As imagens de teste são do Cuthill Gold Standard Dataset, que foi processado por Cuthill, et. al. (conjunto de dados original disponível em doi:10.5061/dryad.2hp1978).