全部产品
Search
文档中心

Hologres:Membangun Sistem Analisis Data Visual untuk Mengemudi Otonom

更新时间:Oct 14, 2025

Dalam sistem mengemudi otonom (AD), analisis gambar kendaraan merupakan komponen inti dari modul persepsi lingkungan. Proses ini mengurai informasi visual dari kamera kendaraan secara real-time untuk memungkinkan sistem memahami dengan akurat lingkungan sekitarnya dan membuat keputusan. Topik ini menggunakan dataset BDD untuk mendemonstrasikan skenario AD. Dataset ini mencakup 100.000 gambar yang meliputi berbagai skenario, termasuk area mengemudi, geografi, lingkungan, dan kondisi cuaca yang berbeda. Dengan menganalisis dan mencari gambar-gambar tersebut, topik ini menunjukkan solusi teknis full-stack. Solusi ini mencakup analisis lintasan mengemudi, optimalisasi persepsi lingkungan, serta peningkatan akurasi deteksi pejalan kaki dan kendaraan. Tujuannya adalah meningkatkan adaptabilitas, keamanan, dan pengalaman pengguna dalam skenario lalu lintas yang kompleks.

Kemampuan Inti

Topik ini berfokus pada pemrosesan gambar dan analisis pencarian multimodal, yang melibatkan kemampuan inti Hologres berikut:

  • Tabel Objek: Membaca data tidak terstruktur, seperti PDF, gambar, dan file PPT, langsung dari Object Storage Service (OSS) dalam format tabel.

  • Fungsi AI: Gunakan SQL standar di Hologres untuk memanggil fungsi yang secara otomatis memanggil LLM bawaan untuk layanan AI.

    • Transformasi data: Menyediakan operator Embed dan Chunk. Mengubah data tidak terstruktur menjadi data terstruktur untuk penyimpanan, memungkinkan penyematan data otomatis tanpa algoritma eksternal.

    • Pengambilan dan analisis data: Menyediakan operator seperti ai_gen dan ai_summarize. Gunakan SQL standar untuk inferensi LLM, ringkasan, dan terjemahan.

  • Tabel Dinamis: Mendukung mode pembaruan bertahap untuk memproses data tidak terstruktur secara otomatis. Mode ini hanya memproses data inkremental, mengurangi konsumsi sumber daya dan komputasi yang berlebihan.

  • Pencarian vektor: Mendukung pencarian vektor menggunakan SQL standar untuk pencarian kesamaan dan pengenalan adegan pada data tidak terstruktur. Kombinasikan pencarian vektor dan skalar secara bebas dalam satu kueri.

  • Pencarian teks penuh: Menggunakan indeks terbalik dan tokenisasi untuk mencari data tidak terstruktur secara efisien. Mendukung metode pencarian fleksibel, seperti pencocokan kata kunci dan pencarian frasa, untuk pengambilan data yang serbaguna.

Manfaat

Keuntungan utama menggunakan kemampuan ini untuk pencarian gambar di Hologres meliputi:

  • Menutupi seluruh siklus hidup pemrosesan data AI: Penyematan data, pemisahan, pemrosesan bertahap, pengambilan, dan analisis. Anda dapat membangun aplikasi AI semudah membangun sistem big data standar.

  • Memproses data gambar dengan SQL standar: Menghilangkan kebutuhan bahasa pemrograman khusus. Gunakan hanya SQL untuk mengekstraksi dan mentransformasi data gambar.

  • Satu platform untuk pencarian multimodal: Mendukung pencarian teks-ke-gambar dan gambar-ke-gambar. Pemahaman semantik melampaui pencocokan kata kunci sederhana. Anda dapat melakukan pencarian multimodal langsung di Hologres.

  • Pencarian lebih akurat, fleksibel, dan cerdas: Mudah membangun pipeline pencarian hibrida yang menggabungkan pencarian kata kunci, semantik, dan multimodal, mencakup semua skenario dari pencarian tepat hingga pengenalan maksud yang kompleks. Gunakan fungsi AI untuk pemahaman mendalam tentang maksud pengguna, asosiasi semantik, dan inferensi kontekstual.

  • Analitik aman di tempat: Data tetap berada di database, menghilangkan kebutuhan untuk mengekspornya ke sistem eksternal. Ini terintegrasi mulus dengan berbagai fitur keamanan Hologres untuk melindungi data Anda secara efisien.

Alur Kerja

Alur kerja untuk solusi ini adalah sebagai berikut:

  1. Siapkan dataset.

    Unggah data gambar ke OSS.

  2. Proses gambar.

    Gunakan Tabel Objek untuk membaca metadata gambar. Selanjutnya, buat Tabel Dinamis dengan pembaruan bertahap untuk menyematkan data. Terakhir, buat indeks vektor pada Tabel Dinamis untuk mengoptimalkan kinerja pencarian berikutnya.

  3. Gunakan operator ai_embed untuk menyematkan pertanyaan bahasa alami. Kemudian, lakukan pencarian vektor untuk mengambil N hasil teratas.

Persiapan

  • Persiapan Data

    Solusi ini menggunakan file val.zip dari dataset gambar mengemudi otonom BDD100K, yang tersedia secara publik di ModelScope. Dataset ini mensimulasikan data mengemudi nyata dari beberapa kendaraan.

  • Persiapan Lingkungan

    1. Beli instans Hologres versi V4.0 atau lebih baru dan buat database.

    2. Beli sumber daya AI.

      Untuk contoh ini, kami menggunakan instans large-96core-512GB-384GB dengan satu node sebagai contoh.

    3. Sebarkan model. Model dan sumber daya yang dialokasikan untuk solusi ini adalah sebagai berikut:

      Kategori

      Nilai contoh

      Nama model

      image_embed

      Kategori model

      clip-ViT-B-32

      Deskripsi model

      Penyematan gambar

      vCPU per replika

      7

      Memori per replika

      30 GB

      GPU per replika

      1 kartu (96 GB)

      Jumlah replika

      1

      Catatan

      Sumber daya model menggunakan alokasi default.

Prosedur

  1. Unduh data gambar dan impor ke OSS.

    1. Unduh file val.zip dari dataset gambar mengemudi otonom BDD100K.

    2. Masuk ke Konsol OSS. Buat bucket dan unggah file val.zip yang telah diunduh ke bucket. Untuk detail tentang pengunggahan file, lihat Unggah Sederhana.

      Catatan

      Gunakan huruf kecil untuk nama folder.

  2. Berikan izin.

    1. Masuk ke Konsol RAM, buat Peran RAM, dan berikan izin OSS yang diperlukan.

      Kami merekomendasikan agar Anda memberikan izin AliyunOSSReadOnlyAccess.

    2. Tambahkan izin masuk dan akses Hologres ke Peran RAM.

      • Akun Alibaba Cloud

        Ubah kebijakan kepercayaan Peran RAM. Perbarui parameter kunci berikut:

        • Action: Perbarui ke sts:AssumeRole.

        • Service: Perbarui ke hologres.aliyuncs.com.

        {
          "Statement": [
            {
              "Action": "sts:AssumeRole",
              "Effect": "Allow",
              "Principal": {
                "RAM": [
                  "acs:ram::1866xxxx:root"
                ],
                "Service": [
                  "hologres.aliyuncs.com"
                ]
              }
            }
          ],
          "Version": "1"
        }
      • Pengguna RAM

        1. Berikan izin kepada Pengguna RAM.

          1. Pada halaman Permission Management > Policies, klik Create Policy, dan pilih mode Script Editor untuk membuat kebijakan. Untuk informasi lebih lanjut, lihat Buat Kebijakan Kustom.

            Hologres menggunakan kebijakan ini untuk menentukan apakah Pengguna RAM saat ini memiliki izin untuk mengasumsikan Peran RAM tertentu. Isi kebijakan adalah sebagai berikut.

            {
              "Version": "1",
              "Statement": [
                {
                  "Effect": "Allow",
                  "Action": "hologram:GrantAssumeRole",
                  "Resource": "<arn_account>"
                }
              ]
            }
          2. Pada halaman Identity Management > Users, klik Add Permissions di kolom Actions dari Pengguna RAM target untuk memberikan kebijakan izin yang telah Anda buat. Untuk informasi lebih lanjut, lihat Berikan Izin kepada Pengguna RAM.

        2. Berikan izin kepada Peran RAM yang dibuat.

          Ubah kebijakan kepercayaan Peran RAM. Parameter kunci yang harus diperbarui adalah sebagai berikut:

          • Action: Perbarui ke sts:AssumeRole.

          • Service: Perbarui ke hologres.aliyuncs.com.

          {
            "Statement": [
              {
                "Action": "sts:AssumeRole",
                "Effect": "Allow",
                "Principal": {
                  "RAM": [
                    "acs:ram::1866xxxx:root"
                  ],
                  "Service": [
                    "hologres.aliyuncs.com"
                  ]
                }
              }
            ],
            "Version": "1"
          }
  3. Sematkan gambar.

    Buat Tabel Objek dan Tabel Dinamis untuk membaca metadata gambar dan menyematkan gambar. Untuk menyederhanakan proses ini, Hologres mengenkapsulasi logika ke dalam prosedur tersimpan. Untuk informasi lebih lanjut, lihat Lampiran: Definisi Prosedur Tersimpan. Prosedur tersimpan ini menyediakan kemampuan berikut:

    • Membuat Tabel Objek untuk membaca metadata gambar.

    • Membuat tabel sink, yaitu Tabel Dinamis dengan pembaruan bertahap, untuk menyimpan data yang diproses. Indeks vektor juga dibuat. Anda harus memperbarui Tabel Dinamis secara manual.

    • Selama pembaruan Tabel Dinamis, operator ai_embed digunakan untuk menyematkan gambar.

    Prosedur tersimpan digunakan sebagai berikut:

    -- Prosedur tersimpan untuk membuat Tabel Objek dan Tabel Dinamis, dan gunakan tabel dinamis untuk menyematkan gambar
    CALL create_image_table_from_oss(
        oss_path => 'oss://xxxx/bdd100k/val/images',
        oss_endpoint => 'oss-ap-southeast-1-internal.aliyuncs.com',
        oss_role_arn => 'acs:ram::1xxxx:role/xxxx',
        image_table => 'public.dt_image_bdd100k',
        embedding_model =>'image_embed'
    );
  4. Perbarui tabel sink.

    Tabel Objek dan Tabel Dinamis yang dibuat pada langkah sebelumnya harus diperbarui secara manual untuk menyelesaikan transformasi data. Langkah ini dienkapsulasi dalam prosedur tersimpan. Untuk informasi lebih lanjut, lihat Lampiran: Definisi Prosedur Tersimpan. Prosedur tersimpan ini menyediakan fitur berikut:

    • Perbarui Tabel Objek sekali untuk mendapatkan metadata gambar.

    • Perbarui Tabel Dinamis sekali untuk menyematkan gambar.

    Prosedur tersimpan digunakan sebagai berikut:

    -- Perbarui tabel dinamis untuk menyematkan gambar
    CALL refresh_image_table(
        image_table => 'public.dt_image_bdd100k'
    );
    
  5. Cari gambar.

    Setelah data gambar diproses, Anda dapat menggunakan pencarian vektor dan fungsi AI untuk mencari gambar.

    Pencarian teks-ke-gambar

    Jika Anda menggunakan model clip-ViT-B-32 untuk pencarian teks-ke-gambar, gunakan bahasa Inggris untuk kueri Anda. Jika kueri Anda dalam bahasa Cina, Anda harus beralih ke LLM. Pernyataan SQL berikut adalah contoh pencarian teks-ke-gambar:

    -- Pencarian teks-ke-gambar
    SELECT
        object_uri,
        approx_cosine_distance (embedding_vector, ai_embed ('image_embed', 'a red car in the rain')) AS score
    FROM
        public.dt_image_bdd100k
    ORDER BY
        score DESC
    LIMIT 1;
    
                                object_uri                         |  score   
    ---------------------------------------------------------------+-------
     oss://****/bd****k/val/images/b836b14a-fb13****.jpg| 0.322337151
    (5 rows)

    Hasil teratas yang ditemukan di OSS adalah sebagai berikut:

    image

    Pencarian gambar-ke-gambar

    Pernyataan SQL berikut adalah contoh pencarian berdasarkan gambar:

    -- Pencarian berdasarkan gambar
    SELECT
        object_uri,
        approx_cosine_distance (embedding_vector, ai_embed ('image_embed', to_file ('oss://xxxx/val/images/b9b53753-91a5d5f8.jpg', 'oss-cn-hangzhou-internal.aliyuncs.com', 'acs:ram::18xxx:role/xxx'))) AS score
    FROM
        public.dt_image_bdd100k
    WHERE
        object_uri <> 'oss://hm-**-hangzhou/bd****k/val/images/b9b53753-91a5****.jpg' -- Kecualikan gambar itu sendiri
    ORDER BY
        score DESC
    LIMIT 1;
    
                              object_uri                           |  score   
    ---------------------------------------------------------------+------
     oss://****/bd****k/val/images/c0e9b7c4-cd8b****.jpg | 0.918008327
    

    Gambar yang ditemukan ada di OSS. Gambar kueri dan hasil teratas ditampilkan di bawah ini:

    image

Lampiran: Definisi prosedur tersimpan

  • Buat Tabel Objek dan Tabel Dinamis

    -- Secara default, kueri mengembalikan maksimal 200 baris. Untuk mengembalikan lebih banyak data, ubah klausa LIMIT. Anda dapat menampilkan maksimal 10.000 baris atau 20 MB data.
    CREATE OR REPLACE PROCEDURE create_image_table_from_oss(
        oss_path TEXT,
        oss_endpoint TEXT,
        oss_role_arn TEXT,
        image_table TEXT,
        embedding_model TEXT DEFAULT NULL,
        overwrite BOOLEAN DEFAULT FALSE
    )
    AS $$
    DECLARE
        image_schema_name TEXT;
        image_table_name TEXT;
        obj_table_name TEXT;
        full_image_table_ident TEXT;
        full_obj_ident TEXT;
        embed_expr TEXT;
        create_sql TEXT;
        embedding_dims INT;
    BEGIN
        -- 1. Pisahkan nama skema dan nama tabel.
        IF position('.' in image_table) > 0 THEN
            image_schema_name := split_part(image_table, '.', 1);
            image_table_name  := split_part(image_table, '.', 2);
        ELSE
            image_schema_name := 'public';
            image_table_name  := image_table;
        END IF;
    
        obj_table_name := image_table_name || '_obj_table';
    
        full_image_table_ident := format('%I.%I', image_schema_name, image_table_name);
        full_obj_ident    := format('%I.%I', image_schema_name, obj_table_name);
        
        -- 2. Untuk menimpa, hapus tabel dan indeks terlebih dahulu.
        IF overwrite THEN
            DECLARE
                dyn_table_exists BOOLEAN;
                rec RECORD;
            BEGIN
                -- Periksa apakah tabel dinamis ada.
                SELECT EXISTS (
                    SELECT 1
                    FROM pg_class c
                    JOIN pg_namespace n ON n.oid = c.relnamespace
                    WHERE c.relname = image_table_name
                    AND n.nspname = image_schema_name
                )
                INTO dyn_table_exists;
    
                IF dyn_table_exists THEN
                    -- 2.1 Nonaktifkan pembaruan otomatis untuk tabel dinamis.
                    -- RAISE NOTICE 'Disabling auto refresh for %', full_image_table_ident;
                    -- EXECUTE format('ALTER TABLE IF EXISTS %s SET (auto_refresh_enable=false)', full_image_table_ident);
    
                    -- 2.2 Temukan dan batalkan tugas pembaruan yang sedang berjalan.
                    FOR rec IN
                        EXECUTE format(
                            $f$
                            SELECT query_job_id
                                FROM hologres.hg_dynamic_table_refresh_log(%L)
                                WHERE status = 'RUNNING';
                            $f$,
                            image_table
                        )
                    LOOP
                        RAISE NOTICE 'Found running refresh job: %', rec.query_job_id;
                        IF hologres.hg_internal_cancel_query_job(rec.query_job_id::bigint) THEN
                            RAISE NOTICE 'Cancel job % succeeded.', rec.query_job_id;
                        ELSE
                            RAISE WARNING 'Cancel job % failed.', rec.query_job_id;
                        END IF;
                    END LOOP;
    
                    -- 2.3 Hapus tabel dinamis.
                    EXECUTE format('DROP TABLE IF EXISTS %s;', full_image_table_ident);
                ELSE
                    RAISE NOTICE 'Dynamic table % does not exist, skip cancel job and drop.', full_image_table_ident;
                END IF;
    
                -- 2.4 Dalam hal apa pun, Tabel Objek harus dihapus.
                EXECUTE format('DROP OBJECT TABLE IF EXISTS %s;', full_obj_ident);
            END;
        END IF;
    
        -- 3. Buat Tabel Objek.
        RAISE NOTICE 'Create object table: %', obj_table_name;
        EXECUTE format(
            $f$
            CREATE OBJECT TABLE %s
            WITH (
                path = %L,
                oss_endpoint = %L,
                role_arn = %L
            );
            $f$,
            full_obj_ident,
            oss_path,
            oss_endpoint,
            oss_role_arn
        );
    
        COMMIT;
    
        -- 4. Perbarui Tabel Objek.
        RAISE NOTICE 'Refresh object table: %', obj_table_name;
        EXECUTE format('REFRESH OBJECT TABLE %s;', full_obj_ident);
    
        COMMIT;
    
        -- 5. Pilih model penyematan.
        IF embedding_model IS NULL OR length(trim(embedding_model)) = 0 THEN
            embed_expr := 'ai_embed(file)';
    
            EXECUTE 'SELECT array_length(ai_embed(''dummy''), 1)'
            INTO embedding_dims;
        ELSE
            embed_expr := format('ai_embed(%L, file)', embedding_model);
    
            EXECUTE format(
                'SELECT array_length(ai_embed(%L, ''dummy''), 1)',
                embedding_model
            )
            INTO embedding_dims;
        END IF;
    
        RAISE NOTICE 'embedding dimension is: %', embedding_dims;
    
        -- 6. Buat tabel dinamis untuk output RAG.
        RAISE NOTICE 'create dynamic table: %', image_table_name;
        EXECUTE format(
            $f$
            CREATE DYNAMIC TABLE %s(
                CHECK(array_ndims(embedding_vector) = 1 AND array_length(embedding_vector, 1) = %s)
            )
            WITH (
                vectors = '{
                    "embedding_vector": {
                        "algorithm": "HGraph",
                        "distance_method": "Cosine",
                        "builder_params": {
                        "base_quantization_type": "sq8_uniform",
                        "max_degree": 64,
                        "ef_construction": 400,
                        "precise_quantization_type": "fp32",
                        "use_reorder": true
                        }
                    }
                }',
                auto_refresh_mode = 'incremental',
                freshness = '5 minutes',
                auto_refresh_enable = 'false'
            ) AS
            SELECT
                object_uri,
                etag,
                %s AS embedding_vector
            FROM %s;
            $f        $f$,
            full_image_table_ident,
            embedding_dims,
            embed_expr,
            obj_table_name
        );
    
        COMMIT;
    
        RAISE NOTICE '';
        RAISE NOTICE 'Create image table success: %', image_table;
        RAISE NOTICE '    Vector index is: %.embedding_vector', image_table;
    END;
    $$ LANGUAGE plpgsql;
    
    
    
    
  • Tabel Objek dan Tabel Dinamis

    -- Perbarui Tabel Dinamis untuk menyematkan gambar
    CREATE OR REPLACE PROCEDURE refresh_image_table(
        image_table TEXT
    )
    AS $$
    DECLARE
        image_schema_name TEXT;
        image_table_name   TEXT;
        obj_table_name TEXT;
        full_image_table_ident TEXT;
        full_obj_ident    TEXT;
    BEGIN
        -- 1. Analisis nama skema dan tabel.
        IF position('.' in image_table) > 0 THEN
            image_schema_name := split_part(image_table, '.', 1);
            image_table_name  := split_part(image_table, '.', 2);
        ELSE
            image_schema_name := 'public';
            image_table_name  := image_table;
        END IF;
    
        obj_table_name := image_table_name || '_obj_table';
    
        full_image_table_ident := format('%I.%I', image_schema_name, image_table_name);
        full_obj_ident    := format('%I.%I', image_schema_name, obj_table_name);
    
        -- 2. Perbarui Tabel Objek.
        RAISE NOTICE 'Refreshing Object Table: %', obj_table_name;
        EXECUTE format('REFRESH OBJECT TABLE %s;', full_obj_ident);
    
        -- 3. Perbarui tabel dinamis.
        RAISE NOTICE 'Refreshing Dynamic Table: %', image_table_name;
        EXECUTE format('REFRESH TABLE %s;', full_image_table_ident);
    
        RAISE NOTICE 'Refresh image table complete: %', image_table;
    END;
    $$ LANGUAGE plpgsql;
  • Hapus Tabel Objek dan Tabel Dinamis

    CREATE OR REPLACE PROCEDURE drop_image_table(
        image_table TEXT
    )
    AS $$
    DECLARE
        image_schema_name TEXT;
        image_table_name   TEXT;
        obj_table_name TEXT;
        full_image_table_ident TEXT;
        full_obj_ident    TEXT;
        rec RECORD;
    BEGIN
        -- 1. Analisis nama skema dan tabel.
        IF position('.' in image_table) > 0 THEN
            image_schema_name := split_part(image_table, '.', 1);
            image_table_name   := split_part(image_table, '.', 2);
        ELSE
            image_schema_name := 'public';
            image_table_name   := image_table;
        END IF;
    
        obj_table_name := image_table_name || '_obj_table';
    
        full_image_table_ident := format('%I.%I', image_schema_name, image_table_name);
        full_obj_ident    := format('%I.%I', image_schema_name, obj_table_name);
    
        -- 2. Hapus tabel.
        -- 2.1 Nonaktifkan pembaruan otomatis untuk tabel dinamis.
        -- RAISE NOTICE 'Disabling auto refresh for %', full_image_table_ident;
        -- EXECUTE format('ALTER TABLE IF EXISTS %s SET (auto_refresh_enable=false)', full_image_table_ident);
    
        -- 2.2 Temukan dan batalkan tugas pembaruan yang sedang berjalan.
        FOR rec IN
            EXECUTE format(
                $f$
                SELECT query_job_id
                    FROM hologres.hg_dynamic_table_refresh_log(%L)
                    WHERE status = 'RUNNING';
                $f$,
                image_table
            )
        LOOP
            RAISE NOTICE 'Found running refresh job: %', rec.query_job_id;
            IF hologres.hg_internal_cancel_query_job(rec.query_job_id::bigint) THEN
                RAISE NOTICE 'Cancel job % succeeded.', rec.query_job_id;
            ELSE
                RAISE WARNING 'Cancel job % failed.', rec.query_job_id;
            END IF;
        END LOOP;
    
        -- 2.3 Hapus tabel dinamis.
        RAISE NOTICE 'Dropping Dynamic Table: %', image_table_name;
        EXECUTE format('DROP TABLE IF EXISTS %s;', full_image_table_ident);
    
        -- 2.4 Hapus Tabel Objek.
        RAISE NOTICE 'Dropping Object Table: %', obj_table_name;
        EXECUTE format('DROP OBJECT TABLE IF EXISTS %s;', full_obj_ident);
    
        RAISE NOTICE 'Drop image table complete: %', image_table;
    END;
    $$ LANGUAGE plpgsql;