自學(xué)做網(wǎng)站的書網(wǎng)絡(luò)營(yíng)銷七個(gè)步驟
目前b題已全部更新包含詳細(xì)的代碼模型和文章,本文也給出了結(jié)果展示和使用模型說明。
同時(shí)文章最下方包含詳細(xì)的視頻教學(xué)獲取方式,手把手保姆級(jí),模型高精度,結(jié)果有保障!
分析:
本題待解決問題
目標(biāo):利用提供的數(shù)據(jù)集,通過特征提取和多模態(tài)特征融合模型建立,實(shí)現(xiàn)圖像與文本間的互檢索。
具體任務(wù):
基于圖像檢索的文本:利用提供的文本信息,對(duì)圖像進(jìn)行檢索,輸出相似度較高的前五張圖像。
基于文本檢索的圖像:利用提供的圖像ID,對(duì)文本進(jìn)行檢索,輸出相似度較高的前五條文本。
數(shù)據(jù)集和任務(wù)要求
附件1:包含五萬(wàn)張圖像和對(duì)應(yīng)的文本信息。
附件2和附件3:分別提供了任務(wù)1和任務(wù)2的數(shù)據(jù)信息,包括測(cè)試集文本、圖像ID和圖像數(shù)據(jù)庫(kù)。
附件4:提供了任務(wù)結(jié)果的模板文件。
評(píng)價(jià)標(biāo)準(zhǔn)
使用**召回率Recall at K(R@K)**作為評(píng)價(jià)指標(biāo),即查詢結(jié)果中真實(shí)結(jié)果排序在前K的比率,本賽題設(shè)定K=5,即評(píng)價(jià)標(biāo)準(zhǔn)為R@5。
步驟一:構(gòu)建圖文檢索模型
采用圖文檢索領(lǐng)域已經(jīng)封裝好的模型:多模態(tài)圖文互檢模型
基于本題附件一所給的數(shù)據(jù)進(jìn)行調(diào)優(yōu)
可以給大家展示以下我們模型的效果,和那種一兩天做出來的效果完全不一樣,我們的模型效果和兩個(gè)任務(wù)的預(yù)測(cè)情況完整是準(zhǔn)確且符合邏輯的。
任務(wù)一結(jié)果展示:
任務(wù)二結(jié)果展示:
步驟二:基于圖像檢索文本
1.數(shù)據(jù)預(yù)處理和特征提取
文本數(shù)據(jù)預(yù)處理:
清洗文本:去除文本中的停用詞、標(biāo)點(diǎn)符號(hào)等無關(guān)信息。
文本向量化:利用NLP技術(shù)(如Word2Vec, GloVe, BERT等)將文本轉(zhuǎn)換為數(shù)值向量,以便進(jìn)行計(jì)算和比較。
import jieba
import pandas as pd
from collections import Counter
#讀取CSV文件
image_word_data = pd.read_csv('附件1/ImageWordData.csv')
#加載自定義的停用詞表(如果有的話),或使用jieba內(nèi)置的停用詞表
#例如: stop_words = set(open('path_to_stop_words.txt').read().strip().split('\n'))
stop_words = set() # 假設(shè)暫時(shí)沒有自定義的停用詞表
#文本預(yù)處理函數(shù)
def preprocess_text(captions):
preprocessed_captions = []
for caption in captions:
# 使用jieba進(jìn)行分詞
tokens = jieba.lcut(caption)
# 去除停用詞
tokens = [token for token in tokens if token not in stop_words and len(token) > 1]
# 將處理過的詞加入結(jié)果列表
preprocessed_captions.append(" ".join(tokens))
return preprocessed_captions
#對(duì)caption列進(jìn)行預(yù)處理
preprocessed_captions = preprocess_text(image_word_data['caption'])
#查看處理過的一些示例文本
for i in range(5):
print(preprocessed_captions[i])
#(可選)統(tǒng)計(jì)詞頻
word_counts = Counter(" ".join(preprocessed_captions).split())
print(word_counts.most_common(10))
?
圖像數(shù)據(jù)預(yù)處理:
圖像標(biāo)準(zhǔn)化:將所有圖像調(diào)整到相同的大小和色彩空間。
特征提取:使用深度學(xué)習(xí)模型(如CNN, ResNet, VGG等)從圖像中提取特征向量。
image_word_data = pd.read_csv('附件1/ImageWordData.csv')
#圖像預(yù)處理函數(shù)
def preprocess_images(image_folder, image_ids, target_size=(224, 224)):
processed_images = {}
for image_id in image_ids:
image_path = os.path.join(image_folder, image_id)
try:
# 打開圖像文件
with Image.open(image_path) as img:
# 調(diào)整圖像尺寸
img = img.resize(target_size)
# 將圖像轉(zhuǎn)換為數(shù)組
img_array = np.array(img)# 對(duì)圖像數(shù)組進(jìn)行歸一化
img_array = img_array / 255.0
processed_images[image_id] = img_array
except IOError as e:
print(f"無法打開或找到圖像 {image_path}。錯(cuò)誤信息: {e}")
processed_images[image_id] = None
return processed_images
#假設(shè)圖像位于"附件1/ImageData"文件夾中
image_folder_path = '附件1/ImageData'
processed_images = preprocess_images(image_folder_path, image_word_data['image_id'])
#檢查處理過的圖像數(shù)量和某個(gè)示例圖像數(shù)組的形狀
print(f"處理過的圖像數(shù)量: {len(processed_images)}")
if processed_images:
example_image = list(processed_images.values())[0]
if example_image is not None:
print(f"示例圖像數(shù)組形狀: {example_image.shape}")
?
2.多模態(tài)特征融合
由于文本和圖像特征位于不同的特征空間,我們需要采取方法將它們映射到同一個(gè)空間,以便進(jìn)行相似度比較。這可以通過以下方法之一實(shí)現(xiàn):
聯(lián)合嵌入空間:通過訓(xùn)練一個(gè)深度學(xué)習(xí)模型來同時(shí)學(xué)習(xí)文本和圖像的嵌入,使得相似的圖像和文本對(duì)靠近。
交叉模態(tài)匹配網(wǎng)絡(luò):設(shè)計(jì)一個(gè)網(wǎng)絡(luò),它可以接受一種模態(tài)的輸入,并預(yù)測(cè)另一種模態(tài)的特征表示。
文本特征提取:
from sklearn.feature_extraction.text import TfidfVectorizer
#初始化TF-IDF向量化器
vectorizer = TfidfVectorizer(max_features=1000) # 使用最多1000個(gè)詞語(yǔ)的詞匯量
#將文本數(shù)據(jù)轉(zhuǎn)換為TF-IDF特征矩陣
tfidf_matrix = vectorizer.fit_transform(preprocessed_captions)
#查看TF-IDF特征矩陣的形狀
print(tfidf_matrix.shape)
圖像特征提取:
import torch
from torchvision import models, transforms
from PIL import Image
import os
#圖像預(yù)處理函數(shù)
def preprocess_image(img_path):
# 讀取圖像,轉(zhuǎn)換為RGB(如果是灰度圖像)
img = Image.open(img_path).convert('RGB')
# 轉(zhuǎn)換圖像
img_t = preprocess(img)
batch_t = torch.unsqueeze(img_t, 0)
return batch_t
#定義預(yù)處理流程,確保模型接收三通道的圖像
preprocess = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
#你可以在這里選擇較小的模型來減少內(nèi)存使用
#比如使用 ResNet18
model = models.resnet18(pretrained=True)
model.eval() # 設(shè)置為評(píng)估模式
#修改圖像特征提取部分,使用上面定義的preprocess_image函數(shù)
def extract_image_features(image_folder, image_ids):
image_features = {}
for image_id in image_ids:
image_path = os.path.join(image_folder, image_id)
try:
batch_t = preprocess_image(image_path)
#batch_t = batch_t.to(device)
with torch.no_grad():
features = model(batch_t)
image_features[image_id] = features.cpu().numpy().flatten()
except Exception as e:
print(f"無法處理圖像 {image_path}: {e}")
image_features[image_id] = None
return image_features
#假設(shè)圖像位于"附件1/ImageData"文件夾中
image_folder_path = '附件1/ImageData'
#調(diào)用函數(shù)提取特征
image_features = extract_image_features(image_folder_path, image_word_data['image_id'])
特征融合:
#轉(zhuǎn)換圖像特征字典為矩陣
image_features_matrix = np.array([features for features in image_features.values() if features is not None])
#特征融合
#這里我們簡(jiǎn)單地將歸一化的圖像特征和TF-IDF特征進(jìn)行連接
#確保TF-IDF特征矩陣是稠密的
tfidf_features_dense = tfidf_matrix.todense()
multimodal_features = np.concatenate((image_features_matrix, tfidf_features_dense), axis=1)
#現(xiàn)在 multimodal_features 矩陣包含了每個(gè)樣本的融合特征
?
3.圖文檢索
根據(jù)訓(xùn)練好的模型進(jìn)行圖文檢索匹配
檢索和排序:根據(jù)計(jì)算出的相似度,對(duì)數(shù)據(jù)庫(kù)中的圖像進(jìn)行排序,選出相似度最高的前五張圖像。
結(jié)果展示:
步驟三:基于文本檢索圖像
與步驟三類似,這里直接展示結(jié)果。
下面內(nèi)容打開內(nèi)含詳細(xì)的視頻教學(xué),手把手保姆級(jí),模型高精度,結(jié)果有保障!
【騰訊文檔】2024泰迪杯數(shù)據(jù)挖掘助攻合集docs.qq.com/doc/DVVlhb2xmbUFEQUJL