在当今的计算机视觉领域,数据的标注、存储、共享以及机器学习模型的训练和部署是至关重要的。本文将向展示如何利用AWS S3与Roboflow平台相结合,实现图像数据的自动化存储、共享以及推送到Roboflow项目中,从而构建一个高效的计算机视觉工作流程。
首先,需要创建一个AWS S3存储桶来存放图像数据。可以通过以下链接创建自己的S3存储桶。同时,在存储桶内创建了一个图像文件夹,用于存放将要上传的图像。此外,还将创建一个名为lambda-layers的文件夹,用于存储创建后的Lambda层。
Lambda层是一种方便的方式来打包库和其他依赖项,这些依赖项可以与Lambda函数一起使用。使用层可以减少上传部署存档的大小,并加快代码部署速度。将利用Lambda层来打包Roboflow库以及其他一些依赖项。requirements.txt文件中包含了以下包:roboflow、opencv-python-headless、Pillow和requests。
接下来,将创建一个Lambda函数。在Lambda控制台中点击“创建函数”,并为函数命名,选择Python 3.8作为运行时环境。这将为创建一个默认的Lambda角色,稍后将对其进行修改以允许S3访问权限。
import base64
import boto3
from roboflow import Roboflow
from io import BytesIO
from PIL import Image
import uuid
from urllib.parse import unquote_plus
import os
s3 = boto3.client('s3')
def lambda_handler(event, context):
for record in event['Records']:
bucket = record['s3']['bucket']['name']
key = unquote_plus(record['s3']['object']['key'])
tmpkey = key.replace('/', '')
download_path = '/tmp/{}{}'.format(uuid.uuid4(), tmpkey)
s3.download_file(bucket, key, download_path)
rf = Roboflow(api_key="YOUR_ROBOFLOW_API_KEY")
workspace = rf.workspace("YOUR_ROBOFLOW_WORKSPACE")
project = workspace.project("YOUR_ROBOFLOW_PROJECT")
project.upload(download_path)
上述代码的作用是读取S3存储桶中的对象,将其下载到Lambda的临时目录中,并使用唯一的ID,然后将其推送到Roboflow工作区/项目中。
为了使Lambda函数能够访问S3,需要更新Lambda函数的权限。首先,进入配置标签并点击编辑按钮,这将打开分配的Lambda角色。然后,在IAM控制台中搜索并添加S3的完整访问权限(在生产环境中,可能需要更严格的权限设置)。
在Lambda函数的主控制台中,点击层,然后进入层部分,点击“添加”。在Lambda层控制台中,选择之前创建的自定义Roboflow包层,然后点击“添加”。还需要添加上面提到的第二个层libgthread-2.0。通过点击指定该层的公共ARN,点击验证然后添加。
最后一步是创建S3触发器。回到Lambda函数控制台,点击添加触发器。这将带进入触发器配置。在这里,定义S3作为触发器源,之前创建的S3存储桶,事件类型为“所有对象创建事件”,前缀(在存储桶中创建了一个images子文件夹),然后点击“添加”。
现在,一切都设置好了。回到Lambda函数控制台,应该可以看到附加的两个层和新的S3触发器。现在,将图像放入S3存储桶的images文件夹中,Lambda函数将负责将图像复制到Roboflow项目中。
还可以通过进入函数控制台的监控标签并点击“在CloudWatch中查看日志”来监控和调试任何Lambda函数问题。最终结果应该是将图像作为未分配的图像推送到Roboflow项目中。