Google Cloud Storage 图像上传至 Roboflow

在处理和管理工作中的图像数据时,通常有两种选择:使用签名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

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485