在许多情况下,高质量的生产图像数据已经存在于内部系统或数据库中,只待解锁计算机视觉用例。今天,将介绍如何将Databricks SQL仓库中的图像数据上传到Roboflow项目中,以启用自定义计算机视觉模型的训练。为了跟随本教程,假设已经配置了Databricks工作区,并将图像数据作为二进制存储在表中。还假设有访问Databricks的个人访问令牌,并具有正确的读取权限。最后,假设已经拥有Roboflow账户,创建了项目,并可以访问Roboflow API密钥。有了这些假设,让开始吧。
在本文中,将使用Databricks SQL Connector for Python连接到Databricks,并使用Roboflow Python Package将图像和标签上传到Roboflow项目中。最后,将安装tqdm来显示上传过程中的加载条。可以通过运行以下命令使用pip安装这些依赖。
pip install -q roboflow databricks-sql-connector tqdm
为了使用sql连接器连接到Databricks SQL仓库,需要三件数据。首先,需要一些连接到Databricks计算资源的连接细节;具体来说,是服务器主机名和http路径。这些信息可以通过遵循Databricks文档找到。还需要一个个人访问令牌来认证资源,可以通过遵循这些步骤创建。一旦有了这些凭据,让连接到Databricks。
已经拥有了开始查询数据库所需的所有数据。让使用DESCRIBE查询表,以获取有关表内容的更多信息。这应该返回包括列名和数据类型在内的信息。
from databricks import sql
sql_statement = """
DESCRIBE nicks_test_workspace.default.images;
"""
with sql.connect(server_hostname=server_hostname, http_path=http_path, access_token=access_token) as connection:
with connection.cursor() as cursor:
cursor.execute(sql_statement)
results = cursor.fetchall()
print(results)
注意正在使用sql连接和环境变量来连接到表。可以看到这张表有四个列:“ID”是int类型,“bytes”是二进制类型,“raccoon_name”是varchar(255)类型,“weight”是float类型。现在已经连接到了数据库,并且有能力运行sql查询,让确保拥有上传图像数据到Roboflow项目所需的所有环境变量。
为了上传图像数据到Roboflow,需要工作区ID,项目ID和一个API密钥。首先,让通过遵循这些指示获取Roboflow私有API密钥。还需要“工作区ID”和“项目ID”,这些可以在此处找到。这些信息也可以在项目页面的URL中找到,如下所示:https://app.roboflow.com/{workspace_id}/{project_id}/annotate。
现在已经收集了Roboflow信息,让上传图像到项目中。首先,将更改sql语句,以从表中提取“raccoon_name”和“weight”,并使用一个函数将响应解析为对图像有用的标签。还将保存字节到一个python临时文件,以便利用Roboflow python包进行上传。注意还在获取返回的图像总数,以帮助进度条获得反馈。
from databricks import sql
from roboflow import Roboflow
from tqdm import tqdm
import tempfile
from pathlib import Path
def parse_tags(data_dict):
# Remove 'bytes' key from the dictionary
if 'bytes' in data_dict:
del data_dict['bytes']
# Create a list with concatenated key-value pairs
tags = [f'{key}: {value}' for key, value in data_dict.items()]
return tags
# Initialize roboflow python client
rf = Roboflow(api_key=api_key)
project = rf.workspace(workspace).project(project)
sql_statement = """
SELECT
img.bytes,
img.weight,
img.raccoon_name
FROM
nicks_test_workspace.default.images as img
LIMIT
2
"""
with sql.connect(server_hostname=server_hostname, http_path=http_path, access_token=access_token) as connection:
with connection.cursor() as cursor:
cursor.execute(sql_statement)
results = cursor.fetchall()
total_length = len(results)
for row in tqdm(results, total=total_length):
tags = parse_tags(row.asDict())
with tempfile.NamedTemporaryFile(suffix=".jpeg") as tmp_file:
tmp_file.write(row.bytes)
path = Path(tmp_file.name)
project.upload(
str(path),
tag_names=tags,
batch_name="data-bricks-upload",
)