在处理和管理工作中的图像数据时,通常有两种选择:使用签名URL直接上传,或者先将图像下载到本地,然后上传。选择哪种方法取决于对数据处理和管理的具体需求,比如数据传输速度、是否需要预处理图像,或者是否需要手动检查图像。
签名URL方法
如果希望避免将图像下载到本地机器的额外步骤和时间消耗,签名URL是一个特别有利的方法。通过签名URL,可以直接将图像数据从Google Cloud Storage上传到Roboflow API,而无需将其存储在本地。这将导致更快的处理速度和减轻本地系统的负载。
在某些情况下,可能更倾向于先将图像下载到本地环境。例如,如果需要预处理图像或在上传到Roboflow之前手动检查它们,拥有本地副本将是有益的。
选择正确的方法
选择正确的方法将取决于特定用例需求,如数据传输速度、预处理需求或图像的手动检查。
Google Cloud JSON密钥
创建一个具有适当权限的服务帐户,并下载JSON密钥文件。此文件将包含用于验证应用程序的凭据。
选项1:通过签名URL上传
可以使用Python中的Google Cloud SDK为Google Cloud Storage桶中的图像生成签名URL。
def get_gcs_signed_url(bucket_name: str, blob_name: str) -> str:
"""为GCS对象生成签名URL。"""
storage_client = storage.Client.from_service_account_json(GOOGLE_APPLICATION_CREDENTIALS)
bucket = storage_client.get_bucket(bucket_name)
blob = bucket.get_blob(blob_name)
url = blob.generate_signed_url(version="v4", expiration=3600, method="GET")
return url
在上面的代码片段中,需要Google Cloud Storage桶的名称和blob名称。图像的签名URL被生成并返回。
基于此,可以构建一个完整的解决方案,该解决方案可以拉取桶中的所有可用对象,然后通过API将它们上传到Roboflow。这个解决方案的大纲如下:
from google.cloud import storage
import requests
import urllib.parse
# ************* 设置这些变量 *************
GCS_BUCKET_NAME = "YOUR_GCS_BUCKET_NAME"
ROBOFLOW_API_KEY = "YOUR_ROBOFLOW_API_KEY"
ROBOFLOW_PROJECT_NAME = "YOUR_ROBOFLOW_PROJECT_NAME"
GOOGLE_APPLICATION_CREDENTIALS = "path/to/your-service-account-file.json"
# ***********************************************
def get_gcs_signed_url(bucket_name: str, blob_name: str) -> str:
"""为GCS对象生成签名URL。"""
storage_client = storage.Client.from_service_account_json(GOOGLE_APPLICATION_CREDENTIALS)
bucket = storage_client.get_bucket(bucket_name)
blob = bucket.get_blob(blob_name)
url = blob.generate_signed_url(version="v4", expiration=3600, method="GET")
return url
def get_gcs_objects(bucket_name: str) -> list:
"""获取给定GCS桶中的对象键列表。"""
storage_client = storage.Client.from_service_account_json(GOOGLE_APPLICATION_CREDENTIALS)
bucket = storage_client.get_bucket(bucket_name)
blobs = bucket.list_blobs()
object_names = []
for blob in blobs:
object_names.append(blob.name)
return object_names
def upload_to_roboflow(api_key: str, project_name: str, presigned_url: str, img_name='', split='train'):
"""上传图像到Roboflow。"""
API_URL = "https://api.roboflow.com"
if img_name == '':
img_name = presigned_url.split("/")[-1]
upload_url = "".join([API_URL + "/dataset/" + project_name + "/upload", "?api_key=" + api_key, "&name=" + img_name, "&split=" + split, "ℑ=" + urllib.parse.quote_plus(presigned_url)])
response = requests.post(upload_url)
# 检查响应代码
if response.status_code == 200:
print(f"成功上传 {img_name} 到 {project_name}")
return True
else:
print(f"上传 {img_name} 失败。错误:{response.content.decode('utf-8')}")
return False
if __name__ == "__main__":
# 获取可用blob列表
available_blobs = get_gcs_objects(GCS_BUCKET_NAME)
# 可选:在这里过滤blob
# 例如,available_blobs = [blob for blob in available_blobs if "some_condition"]
# 将blob上传到Roboflow
for blob in available_blobs:
blob_url = get_gcs_signed_url(GCS_BUCKET_NAME, blob)
upload_to_roboflow(ROBOFLOW_API_KEY, ROBOFLOW_PROJECT_NAME, blob_url)
要从GCP下载数据,首先安装GCP CLI。然后,使用GCP用户帐户进行身份验证。
要下载图像或图像文件夹,使用以下命令:
gsutil cp -r gs://mybucket/folder .
将mybucket
替换为GCP存储桶的名称,将folder
替换为想要复制的文件或文件夹的目的地。此命令将目标文件或文件夹保存到当前工作目录(.)中。
上传数据到Roboflow
现在已经下载了数据,可以通过上传Web界面
或Roboflow CLI
将其上传到Roboflow。