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
EmbeddanChunk. Mengubah data tidak terstruktur menjadi data terstruktur untuk penyimpanan, memungkinkan penyematan data otomatis tanpa algoritma eksternal.Pengambilan dan analisis data: Menyediakan operator seperti
ai_gendanai_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:
Siapkan dataset.
Unggah data gambar ke OSS.
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.
Gunakan operator
ai_embeduntuk menyematkan pertanyaan bahasa alami. Kemudian, lakukan pencarian vektor untuk mengambil N hasil teratas.
Persiapan
Persiapan Data
Solusi ini menggunakan file
val.zipdari dataset gambar mengemudi otonom BDD100K, yang tersedia secara publik di ModelScope. Dataset ini mensimulasikan data mengemudi nyata dari beberapa kendaraan.Persiapan Lingkungan
Beli instans Hologres versi V4.0 atau lebih baru dan buat database.
Untuk contoh ini, kami menggunakan instans
large-96core-512GB-384GBdengan satu node sebagai contoh.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
CatatanSumber daya model menggunakan alokasi default.
Prosedur
Unduh data gambar dan impor ke OSS.
Unduh file
val.zipdari dataset gambar mengemudi otonom BDD100K.Masuk ke Konsol OSS. Buat bucket dan unggah file
val.zipyang telah diunduh ke bucket. Untuk detail tentang pengunggahan file, lihat Unggah Sederhana.CatatanGunakan huruf kecil untuk nama folder.
Berikan izin.
Masuk ke Konsol RAM, buat Peran RAM, dan berikan izin OSS yang diperlukan.
Kami merekomendasikan agar Anda memberikan izin AliyunOSSReadOnlyAccess.
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
Berikan izin kepada Pengguna RAM.
Pada halaman , 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>" } ] }Pada halaman , 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.
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" }
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_embeddigunakan 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' );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' );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-32untuk 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:

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.918008327Gambar yang ditemukan ada di OSS. Gambar kueri dan hasil teratas ditampilkan di bawah ini:

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;