点群圧縮の一般的な方法には、サンプリング、幾何学的形状フィッティング、Octree メソッドなどがあります。このトピックでは、Octree メソッドを使用して点群データを圧縮する方法について説明します。
概要
点群は多数の点の集合です。点群を保存すると大量のメモリが消費され、伝送には理想的ではありません。利用可能な帯域幅では、ネットワークレイヤーで非圧縮の点群を直接伝送するには不十分なことがよくあります。そのため、点群を圧縮する必要があります。Intelligent Media Management (IMM) の点群圧縮機能は、点群データの時空間情報を分析および処理します。これにより、データ量とストレージコストが大幅に削減され、点群データのための高品質でリアルタイムなエンコーディングおよびデコーディングソリューションが提供されます。
シナリオ
点群の圧縮は、次のシナリオで使用できます。
シナリオ | 説明 |
自動運転 | 自動運転シナリオでレーダースキャンによって生成された点群データを圧縮します。 |
デジタル文化遺産 | デジタル遺産シナリオにおける文化財の点群情報に圧縮ソリューションを提供します。 |
スマートシティ | 3D 都市再構築からの点群情報を効果的に圧縮し、スムーズなデータレンダリングと表示を可能にします。 |
複合現実 | 複合現実シナリオで点群データのリアルタイムエンコーディングおよびデコーディング機能を提供します。 |
前提条件
AccessKey ペアが作成され、取得されていること。詳細については、「AccessKey ペアの作成」をご参照ください。
OSS が有効化され、バケットが作成され、オブジェクトがバケットにアップロードされていること。詳細については、「オブジェクトのアップロード」をご参照ください。
IMM が有効化されていること。詳細については、「IMM の有効化」をご参照ください。
IMM コンソールでプロジェクトが作成されていること。IMM コンソールを使用してプロジェクトを作成する方法の詳細については、「プロジェクトの作成」をご参照ください。
説明CreateProject 操作を呼び出してプロジェクトを作成することもできます。詳細については、「CreateProject」をご参照ください。
ListProjects 操作を呼び出して、特定のリージョン内の既存のプロジェクトをクエリできます。詳細については、「ListProjects」をご参照ください。
手順
CreateCompressPointCloudTask 操作を呼び出して、点群データを圧縮します。
タスク情報は、タスク開始後 7 日間保持されます。7 日間の期間が終了すると、タスク情報を取得できなくなります。次のいずれかの方法を使用して、タスク情報をクエリできます。
IMM プロジェクトが配置されているリージョンで、Simple Message Queue (SMQ) サブスクリプションを設定して、タスク情報通知を受信します。詳細については、「非同期メッセージの例」をご参照ください。MNS SDK の詳細については、「ステップ 4: メッセージの受信と削除」をご参照ください。
IMM プロジェクトが配置されているリージョンで、ApsaraMQ for RocketMQ 4.0 インスタンス、Topic、およびグループを作成して、タスク通知を受信します。詳細については、「非同期メッセージの例」をご参照ください。ApsaraMQ for RocketMQ の使用方法の詳細については、「HTTP クライアント SDK を使用して通常のメッセージを送受信する」をご参照ください。
IMM プロジェクトが配置されているリージョンで、EventBridge を使用してタスク情報通知を受信します。詳細については、「IMM イベント」をご参照ください。
圧縮情報
プロジェクト名: test-project
点群ファイルの OSS URI: oss://test-bucket/test-object.pcd
圧縮アルゴリズム: Octree
出力ファイルの OSS URI: oss://test-bucket/test-target-object
圧縮アルゴリズムの概要
Octree は、主に 3D データの圧縮と表現に使用される一般的な圧縮アルゴリズムです。3D 空間を一連の同じサイズの立方体に分割します。各立方体は 8 つのサブ立方体に分割され、さらに小さなサブ立方体に分割できます。
有効なデータを含むノードのみを保存することで、Octree メソッドはストレージスペースを大幅に削減できます。点群データや体積データなどの 3D データの圧縮と表現によく使用されます。適切な分割およびマージ戦略を選択することで、データの精度を維持しながら、ストレージと伝送のオーバーヘッドを削減できます。
リクエストの例
{
"ProjectName": "test-project",
"SourceURI": "oss://test-bucket/test-object.pcd",
"UserData": "{\"ID\":\"testuid\",\"Name\": \"test-user\",\"Avatar\": \"http://test.com/testuid\"}",
"TargetURI": "oss://test-bucket/test-target-object",
"PointCloudFileFormat": "pcd",
"CompressMethod": "octree",
"PointCloudFields": "[\"xyz\"]",
"OctreeOption": "{\"PointResolution\": 0.001, \"OctreeResolution\": 0.01, \"DoVoxelGridDownDownSampling\": false, \"LibraryName\": \"pcl\"}",
"KdtreeOption": "{\"CompressionLevel\": 8, \"QuantizationBits\": 10, \"LibraryName\": \"draco\"}"
}レスポンスの例
{
"TaskId": "PointCloudCompress-091d9b4a-8726-47bf-b699-d24c7daff63c",
"RequestId": "8B0EEA2E-35FE-500F-BCDB-E2E7CA11DF7A",
"EventId": "180-1S7Q8gHbVXJf2lekgesKvlNM1VR"
}サンプルコード
次のサンプルコードは、Python SDK を使用して点群を圧縮する方法を示しています。
# -*- coding: utf-8 -*-
# このファイルは自動生成されます。編集しないでください。ありがとうございます。
import os
import sys
from typing import List
from alibabacloud_imm20200930.client import Client as imm20200930Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_imm20200930 import models as imm_20200930_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient
class Sample:
def __init__(self):
pass
@staticmethod
def create_client(
access_key_id: str,
access_key_secret: str,
) -> imm20200930Client:
"""
AccessKey ID と AccessKey Secret を使用してクライアントを初期化します。
@param access_key_id:
@param access_key_secret:
@return: クライアント
@throws Exception
"""
config = open_api_models.Config(
access_key_id=access_key_id,
access_key_secret=access_key_secret
)
# IMM のエンドポイントを指定します。
config.endpoint = f'imm.cn-beijing.aliyuncs.com'
return imm20200930Client(config)
@staticmethod
def main(
args: List[str],
) -> None:
# Alibaba Cloud アカウントの AccessKey は、すべての API 操作を呼び出す権限を持っています。Resource Access Management (RAM) ユーザーを使用して API 操作を呼び出すか、日常の O&M を実行することをお勧めします。
# プロジェクトコードに AccessKey ID と AccessKey Secret を保存しないことを強くお勧めします。これにより、AccessKey が漏洩し、アカウント内のすべてのリソースのセキュリティが脅かされる可能性があります。
# この例では、API 操作を呼び出すときに ID 検証のために環境変数から AccessKey を取得する方法を示します。
imm_access_key_id = os.getenv("AccessKeyId")
imm_access_key_secret = os.getenv("AccessKeySecret")
client = Sample.create_client(imm_access_key_id, imm_access_key_secret)
octree_option = imm_20200930_models.OctreeOption(
point_resolution=0.001,
octree_resolution=0.01,
do_voxel_grid_down_down_sampling=False,
library_name='pcl'
)
create_compress_point_cloud_task_request = imm_20200930_models.CreateCompressPointCloudTaskRequest(
source_uri='oss://test-bucket/test-object.pcd',
target_uri='oss://test-bucket/test-target-object',
point_cloud_file_format='pcd',
compress_method='octree',
point_cloud_fields=[
'[\"xyz\"]'
],
project_name='test-project',
octree_option=octree_option
)
runtime = util_models.RuntimeOptions()
try:
# コードをコピーして実行する場合は、API 操作の戻り値を出力します。
client.create_compress_point_cloud_task_with_options(create_compress_point_cloud_task_request, runtime)
except Exception as error:
# エラーが発生した場合は、エラーメッセージを出力します。
UtilClient.assert_as_string(error.message)
@staticmethod
async def main_async(
args: List[str],
) -> None:
# Alibaba Cloud アカウントの AccessKey は、すべての API 操作を呼び出す権限を持っています。Resource Access Management (RAM) ユーザーを使用して API 操作を呼び出すか、日常の O&M を実行することをお勧めします。
# プロジェクトコードに AccessKey ID と AccessKey Secret を保存しないことを強くお勧めします。これにより、AccessKey が漏洩し、アカウント内のすべてのリソースのセキュリティが脅かされる可能性があります。
# この例では、API 操作を呼び出すときに ID 検証のために環境変数から AccessKey を取得する方法を示します。
imm_access_key_id = os.getenv("AccessKeyId")
imm_access_key_secret = os.getenv("AccessKeySecret")
client = Sample.create_client(imm_access_key_id, imm_access_key_secret)
octree_option = imm_20200930_models.OctreeOption(
point_resolution=0.001,
octree_resolution=0.01,
do_voxel_grid_down_down_sampling=False,
library_name='pcl'
)
create_compress_point_cloud_task_request = imm_20200930_models.CreateCompressPointCloudTaskRequest(
source_uri='oss://test-bucket/test-object.pcd',
target_uri='oss://test-bucket/test-target-object',
point_cloud_file_format='pcd',
compress_method='octree',
point_cloud_fields=[
'[\"xyz\"]'
],
project_name='test-project',
octree_option=octree_option
)
runtime = util_models.RuntimeOptions()
try:
# コードをコピーして実行する場合は、API 操作の戻り値を出力します。
await client.create_compress_point_cloud_task_with_options_async(create_compress_point_cloud_task_request, runtime)
except Exception as error:
# エラーが発生した場合は、エラーメッセージを出力します。
UtilClient.assert_as_string(error.message)
if __name__ == '__main__':
Sample.main(sys.argv[1:])
課金
点群の圧縮中に、OSS と IMM に対して次の課金項目が生成されます。
OSS の場合: 詳細な料金については、「OSS の料金」をご参照ください。
API
課金項目
説明
GetObject
GET リクエスト
料金は、成功したリクエストの数に基づいて計算されます。
インターネット経由のアウトバウンドトラフィック
パブリックエンドポイント (例: oss-cn-hangzhou.aliyuncs.com) またはアクセラレーションエンドポイント (例: oss-accelerate.aliyuncs.com) を使用して GetObject 操作を呼び出すと、インターネット経由のアウトバウンドトラフィックに対して料金が課金されます。これらの料金はデータ量に基づきます。
取得された低頻度アクセスデータの量
取得されたデータが低頻度アクセスデータの場合、取得された低頻度アクセスデータの量に対して料金が課金されます。これらの料金は、取得されたデータ量に基づきます。
アーカイブオブジェクトのリアルタイムアクセスを使用して取得されたデータ量
アーカイブオブジェクトのリアルタイムアクセスが有効になっているバケットからアーカイブオブジェクトを読み取ると、取得されたデータ量に対して料金が課金されます。これらの料金は、取得されたデータ量に基づきます。
転送アクセラレーション
転送アクセラレーションを有効にし、アクセラレーションエンドポイントを使用してバケットにアクセスすると、転送アクセラレーションに対して料金が課金されます。これらの料金はデータ量に基づきます。
IMM の場合: 詳細な料金については、「IMM の課金項目」をご参照ください。
重要2025 年 7 月 28 日 11:00 (UTC + 08:00) から、IMM の点群圧縮機能は有料サービスになります。詳細については、「IMM 課金調整のお知らせ」をご参照ください。
API
課金項目
説明
CreateCompressPointCloudTask
PointCloudCompress
料金は、成功したリクエストの数に基づいて計算されます。