Thử nghiệm về việc vectơ hóa hình ảnh - chơi trò chơi bắn cá
Trước đây, tôi đã rất ấn tượng với khả năng tìm kiếm hình ảnh bằng hình ảnh của Google. Hiện tại, con đường để thực hiện điều này có vẻ rõ ràng hơn nhiều. Trước tiên, cần phải có một thư viện hình ảnh, sau đó biến các hình ảnh này thành các vectơ và lưu trữ chúng. Sau đó, đối với hình ảnh mục tiêu, chúng ta cũng sẽ tiến hành quá trình vectơ hóa và thực hiện tìm kiếm tương tự.
Chúng ta hãy bắt đầu với bước quan trọng nhất - việc vectơ hóa hình ảnh. Khi đã được vectơ hóa, dữ liệu sẽ không còn liên quan trực tiếp đến hình ảnh nữa, mà chỉ đơn thuần là các vectơ. Điều này cho phép sử dụng phương pháp tìm kiếm gần đúng trên vectơ để đạt được kết quả "tìm kiếm hình ảnh qua hình ảnh". Trong trường hợp này, chúng ta sẽ sử dụng công cụ Towhee.
Towhee là một công cụ pipeline học máy có thể xử lý các nguồn dữ liệu (tệp tin, hình ảnh, phương tiện truyền thông, văn bản) -> mô hình -> vectơ.
Đầu tiên, chúng ta cần cài đặt Towhee:
1pip install towhee towhee.models
Tuy nhiên, ở đây có một trở ngại đầu tiên: vì Towhee phụ thuộc vào Torch, mà Torch chỉ hỗ trợ Python phiên bản cao nhất là 3.9. Vì vậy, chúng ta cần tạo một môi trường Python 3.9 trước khi tiến hành.
1conda create -n py9 python=3.9
Sau đó, bạn sẽ gặp một vấn đề khác liên quan đến client của Milvus:
1pip install pymilvus==2.3.0
Các phiên bản client cũ hơn có thể không tương thích, trong khi các phiên bản mới hơn lại không thể kết nối được.
Tiếp theo, chúng ta cần tạo một Collection trong Milvus:
1CreateCollectionReq.CollectionSchema collectionSchema = clientV2.createSchema();
2// thêm hai trường, id và vector
3Integer dim = 2048;
4collectionSchema.addField(AddFieldReq.builder().fieldName("url").dataType(DataType.VarChar).build());
5collectionSchema.addField(AddFieldReq.builder().fieldName("embedding").dataType(DataType.FloatVector).dimension(dim).build());
6collectionSchema.addField(AddFieldReq.builder().fieldName("id").dataType(DataType.Int64).isPrimaryKey(Boolean.TRUE).autoID(Boolean.TRUE).description("id").build());
7CreateCollectionReq req = CreateCollectionReq
8 .builder()
9 .collectionSchema(collectionSchema)
10 .collectionName("text_image_search")
11 .dimension(dim).build();
12clientV2.createCollection(req);
Lưu ý rằng thứ tự của các trường không được thay đổi, vì thứ tự này trong demo của Towhee không thể chỉnh sửa trực tiếp. Bạn có thể tham khảo demo của Towhee tại địa chỉ này:
1from towhee import AutoPipes, AutoConfig
2
3# Cấu hình MilvusInsertConfig cho pipeline chèn mặc định
4insert_conf = AutoConfig.load_config('insert_milvus')
5insert_conf.collection_name = 'text_image_search'
6insert_pipe = AutoPipes.pipeline('insert_milvus', insert_conf)
7
8# Tạo embedding
9embedding = image_embedding('./test1.png').get()[0]
10
11# Chèn văn bản và embedding vào Milvus
12insert_pipe(['./test1.png', embedding])
Tuy nhiên, đoạn mã trên sẽ không chạy được do lỗi sau:
1AttributeError: 'RuntimePipeline' object has no attribute 'image_embedding'
Nguyên nhân là vì không tìm thấy image_embedding
. Có khả năng tên gói đã bị thay đổi nhưng không có tài liệu nào cập nhật. Tôi đã phải nhờ đến Claude để tìm ra cách giải quyết:
1from towhee import AutoPipes, AutoConfig, ops
2
3# Cấu hình MilvusInsertConfig cho pipeline chèn mặc định
4insert_conf = AutoConfig.load_config('insert_milvus')
5insert_conf.collection_name = 'text_image_search'
6insert_pipe = AutoPipes.pipeline('insert_milvus', insert_conf)
7
8# Tạo pipeline nhúng hình ảnh [888bets](/post/ffad3a1d095ed7c7.html)
9image_embedding_pipe = AutoPipes.pipeline('image-embedding')
10
11# Tạo embedding
12embedding = image_embedding_pipe('./test.jpg').get()[0]
13
14# Chèn văn bản và embedding vào Milvus [chơi trò chơi bắn cá](/post/dfe8d399eee39896.html)
15insert_pipe(['./test.jpg', embedding])
Bạn cần lấy pipeline image-embedding
từ AutoPipes. Ngoài ra, cần lưu ý rằng vấn đề ánh xạ trường mặc định là url trước, sau đó mới là trường embedding. Trường khóa chính phải là autoId, nếu không sẽ thiếu giá trị mặc định.
Cuối cùng, tôi muốn nhấn mạnh rằng, dù trí tuệ nhân tạo đang rất hot, nhưng các phần mềm cơ bản vẫn cần được phát triển một cách ổn định và chắc chắn. Việc thay đổi mà không có tài liệu hoặc hướng dẫn rõ ràng khiến công việc của kỹ sư trở nên khó khăn hơn. Và đừng quên, những đứa trẻ thật đáng yêu, nhưng chăm sóc chúng thật mệt mỏi!