精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用CLIP構建視頻搜索引擎

人工智能 機器學習
CLIP(Contrastive Language-Image Pre-training)是一種機器學習技術,它可以準確理解和分類圖像和自然語言文本,這對圖像和語言處理具有深遠的影響,并且已經被用作流行的擴散模型DALL-E的底層機制。在這篇文章中,我們將介紹如何調整CLIP來輔助視頻搜索。

CLIP(Contrastive Language-Image Pre-training)是一種機器學習技術,它可以準確理解和分類圖像和自然語言文本,這對圖像和語言處理具有深遠的影響,并且已經被用作流行的擴散模型DALL-E的底層機制。在這篇文章中,我們將介紹如何調整CLIP來輔助視頻搜索。

這篇文章將不深入研究CLIP模型的技術細節,而是展示CLIP的另外一個實際應用(除了擴散模型外)。

首先我們要知道:CLIP使用圖像解碼器和文本編碼器來預測數據集中哪些圖像與哪些文本是匹配的。

圖片

使用CLIP進行搜索

通過使用來自hugging face的預訓練CLIP模型,我們可以構建一個簡單而強大的視頻搜索引擎,并且具有自然語言能力,而且不需要進行特征工程的處理。

我們需要用到以下的軟件

Python≥= 3.8,ffmpeg,opencv

通過文本搜索視頻的技術有很多。我們可以將搜索引擎將由兩部分組成,索引和搜索。

索引

視頻索引通常涉及人工和機器過程的結合。人類通過在標題、標簽和描述中添加相關關鍵字來預處理視頻,而自動化過程則是提取視覺和聽覺特征,例如物體檢測和音頻轉錄。用戶交互指標等等,這樣可以記錄視頻的哪些部分是最相關的,以及它們保持相關性的時間。所有這些步驟都有助于創建視頻內容的可搜索索引。

索引過程的概述如下

  • 將視頻分割成多個場景
  • 為框架取樣場景
  • 幀處理后進行像素嵌入
  • 索引建立存儲

將視頻分成多個場景

為什么場景檢測很重要?視頻由場景組成,而場景由相似的幀組成。如果我們只對視頻中的任意場景進行采樣,可能會錯過整個視頻中的關鍵幀。

所以我們就需要準確地識別和定位視頻中的特定事件或動作。例如,如果我搜索“公園里的狗”,而我正在搜索的視頻包含多個場景,例如一個男人騎自行車的場景和一個公園里的狗的場景,場景檢測可以讓我識別出與搜索查詢最接近的場景。

可以使用“scene detect”python包來進行這個操作。

 mport scenedetect as sd

video_path = '' # path to video on machine

video = sd.open_video(video_path)
sm = sd.SceneManager()

sm.add_detector(sd.ContentDetector(threshold=27.0))
sm.detect_scenes(video)

scenes = sm.get_scene_list()

對場景的幀進行采樣

然后就需要使用cv2對視頻進行幀采樣。

 import cv2

cap = cv2.VideoCapture(video_path)

every_n = 2 # number of samples per scene

scenes_frame_samples = []
for scene_idx in range(len(scenes)):
scene_length = abs(scenes[scene_idx][0].frame_num - scenes[scene_idx][1].frame_num)
every_n = round(scene_length/no_of_samples)
local_samples = [(every_n * n) + scenes[scene_idx][0].frame_num for n in range(3)]

scenes_frame_samples.append(local_samples)

將幀轉換為像素嵌入

在收集樣本之后,我們需要將它們計算成CLIP模型可用的東西。

首先需要將每個樣本轉換為圖像張量嵌入。

 from transformers import CLIPProcessor
from PIL import Image

clip_processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")

def clip_embeddings(image):
inputs = clip_processor(images=image, return_tensors="pt", padding=True)
input_tokens = {
k: v for k, v in inputs.items()
}

return input_tokens['pixel_values']

# ...
scene_clip_embeddings = [] # to hold the scene embeddings in the next step

for scene_idx in range(len(scenes_frame_samples)):
scene_samples = scenes_frame_samples[scene_idx]

pixel_tensors = [] # holds all of the clip embeddings for each of the samples
for frame_sample in scene_samples:
cap.set(1, frame_sample)
ret, frame = cap.read()
if not ret:
print('failed to read', ret, frame_sample, scene_idx, frame)
break

pil_image = Image.fromarray(frame)

clip_pixel_values = clip_embeddings(pil_image)
pixel_tensors.append(clip_pixel_values)

下一步就是平均同一場景中的所有樣本,這樣可以降低樣本的維數,而且還可以解決單個樣本中存在噪聲的問題。

 import torch
import uuid

def save_tensor(t):
path = f'/tmp/{uuid.uuid4()}'
torch.save(t, path)

return path

# ..
avg_tensor = torch.mean(torch.stack(pixel_tensors), dim=0)
scene_clip_embeddings.append(save_tensor(avg_tensor))

這樣就獲得了一個CLIP嵌入的表示視頻內容的的張量列表。

存儲索引

對于底層索引存儲,我們使用LevelDB(LevelDB是由谷歌維護的鍵/值庫)。我們搜索引擎的架構將包括 3 個獨立的索引:

  • 視頻場景索引:哪些場景屬于特定視頻
  • 場景嵌入索引:保存特定的場景數據
  • 視頻元數據索引:保存視頻的元數據。

我們將首先將視頻中所有計算出的元數據以及視頻的唯一標識符,插入到元數據索引中,這一步都是現成的,非常簡單。

 import leveldb
import uuid

def insert_video_metadata(videoID, data):
b = json.dumps(data)

level_instance = leveldb.LevelDB('./dbs/videometadata_index')
level_instance.Put(videoID.encode('utf-8'), b.encode('utf-8'))

# ...
video_id = str(uuid.uuid4())
insert_video_metadata(video_id, {
'VideoURI': video_path,
})

然后在場景嵌入索引中創建一個新條目保存視頻中的每個像素嵌入,還需要一個唯一的標識符來識別每個場景。

import leveldb
import uuid

def insert_scene_embeddings(sceneID, data):
level_instance = leveldb.LevelDB('./dbs/scene_embedding_index')
level_instance.Put(sceneID.encode('utf-8'), data)

# ...
for f in scene_clip_embeddings:
scene_id = str(uuid.uuid4())

with open(f, mode='rb') as file:
content = file.read()

insert_scene_embeddings(scene_id, content)

最后,我們需要保存哪些場景屬于哪個視頻。

 import leveldb
import uuid

def insert_video_scene(videoID, sceneIds):
b = ",".join(sceneIds)

level_instance = leveldb.LevelDB('./dbs/scene_index')
level_instance.Put(videoID.encode('utf-8'), b.encode('utf-8'))

# ...
scene_ids = []
for f in scene_clip_embeddings:
# .. as shown in previous step
scene_ids.append(scene_id)
scene_embedding_index.insert(scene_id, content)

scene_index.insert(video_id, scene_ids)

搜索

現在我們有了一種將視頻的索引,下面就可以根據模型輸出對它們進行搜索和排序。

第一步需要遍歷場景索引中的所有記錄。然后,創建一個視頻中所有視頻和匹配場景id的列表。

 records = []

level_instance = leveldb.LevelDB('./dbs/scene_index')

for k, v in level_instance.RangeIter():
record = (k.decode('utf-8'), str(v.decode('utf-8')).split(','))
records.append(record)

下一步需要收集每個視頻中存在的所有場景嵌入張量。

import leveldb

def get_tensor_by_scene_id(id):
level_instance = leveldb.LevelDB('./dbs/scene_embedding_index')
b = level_instance.Get(bytes(id,'utf-8'))

return BytesIO(b)

for r in records:
tensors = [get_tensor_by_scene_id(id) for id in r[1]]

在我們有了組成視頻的所有張量之后,我們可以把它傳遞到模型中。該模型的輸入是“pixel_values”,表示視頻場景的張量。

import torch
from transformers import CLIPProcessor, CLIPModel

processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")

inputs = processor(text=text, return_tensors="pt", padding=True)

for tensor in tensors:
image_tensor = torch.load(tensor)
inputs['pixel_values'] = image_tensor
outputs = model(**inputs)

然后訪問模型輸出中的“logits_per_image”獲得模型的輸出。

Logits本質上是對網絡的原始非標準化預測。由于我們只提供一個文本字符串和一個表示視頻中的場景的張量,所以logit的結構將是一個單值預測。

logits_per_image = outputs.logits_per_image    
probs = logits_per_image.squeeze()

prob_for_tensor = probs.item()

將每次迭代的概率相加,并在運算結束時將其除以張量的總數來獲得視頻的平均概率。

def clip_scenes_avg(tensors, text):
avg_sum = 0.0

for tensor in tensors:
# ... previous code snippets
probs = probs.item()
avg_sum += probs.item()

return avg_sum / len(tensors)

最后在得到每個視頻的概率并對概率進行排序后,返回請求的搜索結果數目。

import leveldb
import json

top_n = 1 # number of search results we want back

def video_metadata_by_id(id):
level_instance = leveldb.LevelDB('./dbs/videometadata_index')
b = level_instance.Get(bytes(id,'utf-8'))
return json.loads(b.decode('utf-8'))

results = []
for r in records:
# .. collect scene tensors

# r[0]: video id
return (clip_scenes_avg, r[0])

sorted = list(results)
sorted.sort(key=lambda x: x[0], reverse=True)

results = []
for s in sorted[:top_n]:
data = video_metadata_by_id(s[1])

results.append({
'video_id': s[1],
'score': s[0],
'video_uri': data['VideoURI']
})

就是這樣!現在就可以輸入一些視頻并測試搜索結果。

總結

通過CLIP可以輕松地創建一個頻搜索引擎。使用預訓練的CLIP模型和谷歌的LevelDB,我們可以對視頻進行索引和處理,并使用自然語言輸入進行搜索。通過這個搜索引擎使用戶可以輕松地找到相關的視頻,最主要的是我們并不需要大量的預處理或特征工程。

那么我們還能有什么改進呢?

  • 使用場景的時間戳來確定最佳場景。
  • 修改預測讓他在計算集群上運行。
  • 使用向量搜索引擎,例如Milvus 替代LevelDB
  • 在索引的基礎上建立推薦系統
  • 等等
最后:

可以在這里找到本文的代碼:https://github.com/GuyARoss/CLIP-video-search/tree/article-01。

以及這個修改版本:https://github.com/GuyARoss/CLIP-video-search。

責任編輯:華軒 來源: DeepHub IMBA
相關推薦

2025-08-04 07:47:44

2016-08-18 00:54:59

Python圖片處理搜索引擎

2011-06-20 18:23:06

SEO

2020-02-24 08:52:08

開源索引YaCy

2012-08-15 10:02:50

搜索引擎

2017-08-07 08:15:31

搜索引擎倒排

2020-03-20 10:14:49

搜索引擎倒排索引

2022-10-08 09:13:18

搜索引擎?站

2012-09-07 13:22:21

搜索搜狗

2009-02-19 09:41:36

搜索引擎搜狐百度

2010-04-20 11:43:46

2009-09-22 16:23:52

搜索引擎

2017-08-21 11:14:36

2022-10-11 09:27:45

搜索引擎es索引

2009-07-30 10:40:56

搜索引擎優化網站

2010-06-13 16:27:28

搜索引擎

2023-02-08 10:45:23

2022-02-24 00:07:22

Shodan網絡搜索

2011-06-03 10:19:53

2016-12-26 13:41:19

大數據搜索引擎工作原理
點贊
收藏

51CTO技術棧公眾號

六月丁香久久丫| 免费男女羞羞的视频网站在线观看| 亚洲精品激情| 亚洲欧美成人精品| www.久久久精品| 欧洲精品二区| 久久久久久毛片| 亚洲精品欧美日韩专区| 国产精彩视频在线| 成人激情视频| 精品少妇一区二区三区免费观看| 日韩精品xxxx| 黄色一级片在线观看| av亚洲精华国产精华精华| 日韩美女免费视频| 五月天丁香激情| 国产免费av一区二区三区| 欧美精品日韩精品| 欧美精品一区免费| 成人在线观看亚洲| 久久只精品国产| 亚洲一区二区少妇| 天天操天天干天天摸| 欧美日韩一区二区国产| 亚洲天堂开心观看| 95视频在线观看| av在线亚洲一区| 色哟哟精品一区| 青青视频免费在线观看| 黄色在线播放| 成人app下载| 91在线高清免费观看| av中文在线播放| 欧美99在线视频观看| 国产香蕉97碰碰久久人人| 99久久久无码国产精品性波多| 成人在线观看免费视频| 福利二区91精品bt7086| 妺妺窝人体色www看人体| 免费a级人成a大片在线观看| 久久影视一区二区| 国产精品欧美久久| 国产成人精品a视频| 青青国产91久久久久久| 91精品国产高清久久久久久91| 欧美日韩一级在线观看| 欧美国产一级| 一区二区三区四区在线观看视频| 99久久人妻无码中文字幕系列| 网站一区二区| 91精品国产综合久久久久久久久久 | 超碰在线成人| 欧美大片一区二区| 五月六月丁香婷婷| 国产亚洲观看| 欧美一级日韩不卡播放免费| 五月激情五月婷婷| 久久天天久久| 欧美日韩在线播| 特级丰满少妇一级| 欧美free嫩15| 欧美日韩情趣电影| 在线能看的av网站| 在线高清欧美| 日韩亚洲欧美成人一区| 狠狠干狠狠操视频| 精品91福利视频| 91精品欧美久久久久久动漫| 91视频福利网| 91在线一区| 亚洲第一偷拍网| 一起草在线视频| 亚洲性视频大全| 亚洲人成电影网站| 中文字幕精品亚洲| 一区二区日韩欧美| 久久免费高清视频| 中文字幕亚洲精品一区| 日韩电影一区二区三区| 91精品国产综合久久香蕉922 | 久久爱另类一区二区小说| 成人字幕网zmw| 亚洲国产成人在线观看| 99免费精品在线| 免费99视频| 尤物网址在线观看| 亚洲精品第一国产综合野| 日韩在线视频在线| 日韩电影免费看| 欧美中文字幕久久| 免费不卡av网站| 欧美美女啪啪| 中文字幕日韩高清| 激情五月少妇a| 国产精品日韩| 国产日本欧美一区| 婷婷五月综合久久中文字幕| 国产欧美一区二区精品性色| 欧美与动交zoz0z| 国产在线观看www| 日本精品一级二级| 亚洲高清av一区二区三区| 图片婷婷一区| 欧美成人激情视频| 欧美在线观看不卡| 国产一区三区三区| 免费国产一区二区| www视频在线免费观看| 精品国产乱码久久久久久天美| 男女爽爽爽视频| 北条麻妃在线一区二区免费播放| 亚洲午夜色婷婷在线| 久久国产精品波多野结衣| 日韩成人一级大片| 国产伦精品一区二区三区视频孕妇| 国产三级视频在线| 亚洲妇女屁股眼交7| 欧美美女性视频| 日韩有码一区| 欧美日本亚洲视频| 一级黄色片在线播放| 久久蜜桃一区二区| 国产精品一线二线三线| 国产精品久久久久久妇女| 亚洲精品久久久久| 清纯粉嫩极品夜夜嗨av| 蜜臀a∨国产成人精品| 精品亚洲一区二区三区四区五区高| 日本三级视频在线播放| 色噜噜狠狠成人中文综合| 四虎永久免费观看| 亚洲精品久久| 国产日韩欧美在线看| 男女污视频在线观看| 亚洲午夜激情网页| 国产精品二区视频| 在线看片不卡| 91免费精品视频| 午夜视频在线看| 色婷婷国产精品久久包臀| 人妻 丝袜美腿 中文字幕| 99精品一区| 国产精品一区二区三区免费视频 | 最近2019中文字幕大全第二页| 日韩少妇高潮抽搐| 成人免费视频网站在线观看| 丰满女人性猛交| 91成人精品观看| 最近2019中文字幕大全第二页| 国产乡下妇女三片| 国产三级欧美三级| 在线免费观看视频黄| 精品国产午夜| 国产精品欧美激情| 国产福利电影在线| 欧美吞精做爰啪啪高潮| 五月婷六月丁香| 麻豆国产精品777777在线| 亚洲欧美综合一区| 欧美三级电影网址| 久久精品一区中文字幕| 国产视频一区二区三| 亚洲精品日日夜夜| 成人啪啪18免费游戏链接| 精品动漫3d一区二区三区免费| 成人免费视频网站| gogo久久| 亚洲视频在线视频| 亚洲一区二区激情| 亚洲乱码日产精品bd| 97人人模人人爽人人澡| 一区二区亚洲| 麻豆av一区二区| 91p九色成人| 久久久精品久久久久| 精品人妻aV中文字幕乱码色欲 | 天天干天天干天天| 国产亚洲视频系列| 亚洲欧美久久久久| 欧美激情综合| 久久精品国产美女| 久久夜夜久久| 久久久久久久电影一区| 亚洲色图欧美视频| 精品视频在线免费看| 久久99久久久| 久久久亚洲精品石原莉奈| 中文字幕成人在线视频| 欧美欧美天天天天操| 久久久人人爽| 亚洲精品伦理| 国内成人精品一区| av在线播放网站| 日韩女优av电影在线观看| 99精品在线播放| 国产精品久久久久9999吃药| 91porn在线| 美女免费视频一区二区| 精品少妇在线视频| 久久免费精品视频在这里| 国产精品一区二区三区不卡| 播放一区二区| 午夜精品一区二区三区视频免费看 | 电影一区中文字幕| 日韩av免费看网站| av在线麻豆| 亚洲欧美日韩中文在线| 国产精品无码在线播放| 精品成人乱色一区二区| av2014天堂网| 国产精品自产自拍| 99re在线视频免费观看| 亚洲五月综合| 视频一区二区三| 亚洲一区二区三区四区电影| 日本最新高清不卡中文字幕| 激情视频在线观看| 一本色道久久88亚洲综合88| 99久久免费国产精精品| 日韩欧美国产视频| 四虎884aa成人精品| 久久精品在这里| 在线播放国产视频| 免费在线看一区| 国产精品一区在线免费观看| av资源久久| 另类视频在线观看+1080p| 精品亚洲二区| 97超碰国产精品女人人人爽| 成人在线影视| 日韩一区二区三区在线播放| 深夜福利在线视频| 亚洲成年人影院在线| 97免费观看视频| 欧美性猛交xxxx富婆弯腰| 欧美日韩人妻精品一区二区三区| 中文字幕亚洲一区二区va在线| 一级性生活毛片| 国产成人精品午夜视频免费| 亚洲 中文字幕 日韩 无码| 国产一区二区三区久久久久久久久| 色爽爽爽爽爽爽爽爽| 欧美少妇xxxx| 日韩欧美一区二区三区四区| 香蕉久久99| 亚洲自拍小视频| 欧洲成人一区| 国产成人激情小视频| 国产极品在线观看| 91sa在线看| free性欧美| 久久久久久久一区二区| 久久五月精品| 久久伊人精品视频| 免费看a在线观看| 在线观看日韩av| 日本精品在线| 日韩一级黄色av| 日本视频在线观看| 一区二区三区国产视频| 色网站在线看| 色阁综合伊人av| 97电影在线看视频| 久久伊人免费视频| 成人福利网站| 蜜月aⅴ免费一区二区三区| av在线电影网| 欧美日本高清一区| 1234区中文字幕在线观看| 久久久女人电视剧免费播放下载| 成人av影院在线观看| 欧美精品一区二区免费| 三级福利片在线观看| 久久91亚洲精品中文字幕奶水 | 久久五月天综合| jizz性欧美10| 欧美极品第一页| 成人影音在线| 国产成人精品免高潮在线观看| 天堂久久午夜av| 亚洲一区二区三区成人在线视频精品 | 亚洲美女屁股眼交3| 国产一级特黄视频| 亚洲成va人在线观看| 神马久久久久久久| 欧美日本一道本| www.超碰在线.com| 亚洲女人被黑人巨大进入al| 98在线视频| 欧美人与性动交a欧美精品| 这里有精品可以观看| 国产精品久久色| 成人动漫视频在线观看| 亚洲aaaaaa| 免费精品国产| 中文字幕一区综合| 亚洲视频精品| 国产精品自拍视频在线| 国产传媒日韩欧美成人| 中文字幕在线观看网址| 亚洲人亚洲人成电影网站色| 日韩黄色一级大片| 欧美视频自拍偷拍| 天堂中文在线观看视频| 中文字幕日韩精品有码视频| 亚洲男同gay网站| 国产精品久久久久久久久久久久| 精品国产三区在线| 久中文字幕一区| 成人情趣视频网站| 老太脱裤子让老头玩xxxxx| 免播放器亚洲一区| 国产精品一区二区无码对白| 国产精品家庭影院| 国产精品久久久久久久妇| 在线电影欧美成精品| 免费动漫网站在线观看| 欧美精品日韩www.p站| 亚洲男人在线| 日韩理论片在线观看| 亚洲一区二区三区免费在线观看| 日韩精品视频网址| 中文字幕一区二区在线观看| 麻豆成人免费视频| 日韩免费看网站| av大片在线播放| 久久免费视频这里只有精品| 四虎影视成人精品国库在线观看| 久久av免费一区| 欧美激情aⅴ一区二区三区| 午夜免费看视频| 26uuu久久综合| 1024手机在线视频| 欧美日韩电影在线播放| 青春有你2免费观看完整版在线播放高清 | 一区二区三区在线影院| 91精品国自产| 国产亚洲欧美日韩美女| 成人免费网站观看| 精品国产乱码久久久久久88av| 最新国产精品| www.se五月| 国产精品久久久久久久久图文区 | 91国产视频在线| 粉嫩的18在线观看极品精品| 国产精品美女在线播放| 爽好久久久欧美精品| 精品人妻互换一区二区三区| 亚洲成人av中文| a级片免费视频| 欧美日韩xxx| 蜜桃在线一区| 久久久久久久久影视| 国产一区二区电影| 在线免费看av网站| 欧美www视频| 四虎影视成人| 亚洲综合av影视| 亚洲国产高清一区二区三区| 成人做爰69片免费| 亚洲一二三专区| 视频一区二区免费| 91高潮在线观看| 日韩精选在线| 男人天堂999| 久久色中文字幕| 中文字幕一区二区人妻痴汉电车| 在线播放日韩专区| 2019年精品视频自拍| 黄色www在线观看| 精品一区二区免费看| 婷婷社区五月天| 亚洲成色777777女色窝| 999福利在线视频| 久久av一区二区| 久久99精品久久久| 国产极品国产极品| 日韩av在线免费观看| 亚洲免费福利| 色99中文字幕| 懂色中文一区二区在线播放| 国产真实的和子乱拍在线观看| 欧美大片在线观看一区二区| sm久久捆绑调教精品一区| 久久久久se| 国产主播一区二区| 久久免费小视频| 日韩电视剧免费观看网站| 91福利精品在线观看| 日本三日本三级少妇三级66| 成人一区二区视频| 中文亚洲av片在线观看| www.久久色.com| 群体交乱之放荡娇妻一区二区| 北条麻妃av高潮尖叫在线观看| 国产精品色婷婷久久58| 天天射天天色天天干| 国产精品一区二区在线| 欧美.日韩.国产.一区.二区| 日本aaa视频|