璠宝今天写代码了吗 2024-04-22 22:16 采纳率: 0%
浏览 19

关于图文检索模型(ResNet50权重到底怎么解决T T

刚接触相关的一个图文检索问题 真的解决不了ResNet权重T T请问有什么办法解决吗??
然后图像检索和文本检索也有好多问题 试图叫GPT改一下改的我自己看不明白了T T
用VS Code和Jupyter Notebook跑的
可以帮忙看一下嘛 可能后续也会有问题T T


import pandas as pd
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import os
import tensorflow as tf
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.applications.resnet50 import preprocess_input
from tensorflow.keras.preprocessing import image

# 读取word_test.csv文件
file_path = "此处我害怕报错写了绝对路径"
word_test = pd.read_csv(file_path, encoding='utf-8')

# 图像路径
image_path = "此处我害怕报错写了绝对路径"

# 图像特征提取
model = ResNet50(weights='imagenet', include_top=False)
def image_feature_extraction(image_path):
    img = image.load_img(image_path, target_size=(224, 224))
    img_array = image.img_to_array(img)
    img_array = np.expand_dims(img_array, axis=0)
    img_array = preprocess_input(img_array)

    features = model.predict(img_array)
    return features.flatten()

# 文本特征提取
tfidf = TfidfVectorizer()
word_embeddings = tfidf.fit_transform(word_test['caption'])

# 多模态特征融合
image_features = np.array([image_feature_extraction(os.path.join(image_path, img)) for img in os.listdir(image_path)])
combined_features = np.hstack((image_features, word_embeddings.toarray()))

# 图像检索
result1 = []
for text in word_test['caption']:
    text_embedding = tfidf.transform([text])
    similarities = []
    for i, feature in enumerate(combined_features):
        similarity = cosine_similarity([feature], text_embedding)
        similarities.append((i, similarity))

    similarities.sort(key=lambda x: x[1], reverse=True)
    top_five_images = [os.path.basename(os.listdir(image_path)[i]) for i, _ in similarities[:5]]
    result1.append(top_five_images)

result1_df = pd.DataFrame(result1, columns=['image1', 'image2', 'image3', 'image4', 'image5'])
result1_df.to_csv('result1.csv', index=False)

# 文本检索
result2 = []
for image_id in image_test['image_id']:
    image_text = image_data.loc[image_data['image_id'] == image_id, 'caption'].values[0]
    image_text_embedding = tfidf.transform([image_text])
    similarities = []
    for i, feature in enumerate(combined_features):
        similarity = cosine_similarity([feature], image_text_embedding)
        similarities.append((i, similarity))

    similarities.sort(key=lambda x: x[1], reverse=True)
    top_five_texts = [word_test['text_id'][i] for i, _ in similarities[:5]]
    result2.append(top_five_texts)


  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-22 22:16
    关注

    引自免费微信小程序:皆我百晓生

    看起来你在尝试构建一个简单的图文检索系统,其中包含两个主要部分:图像检索和文本检索。目前遇到的问题是关于ResNet50权重的处理以及整个代码的理解。我会为你提供详细的解释,并修复代码中的错误。

    首先,对于ResNet50权重,你已经正确地在导入时设置了weights='imagenet',这表示模型会加载预训练在ImageNet数据集上的权重。这意味着模型已经在大量图像上进行了训练,对图像有了一定的理解。不需要额外处理这些权重,它们会在模型运行时自动应用。

    接下来,让我们逐步检查和修复代码中的问题:

    1. 避免使用绝对路径,将文件路径替换为相对路径,这样代码更易于移植。
    2. 修复图像检索和文本检索的部分逻辑错误。
    3. 对于word_testimage_testimage_data变量,看起来你在代码中没有定义它们,确保你已正确加载了这些数据。
    4. 使用Pandas进行CSV文件的写入操作,简化代码。

    下面是修改后的代码:

    import os
    import pandas as pd
    import numpy as np
    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.metrics.pairwise import cosine_similarity
    import tensorflow as tf
    from tensorflow.keras.applications import ResNet50
    from tensorflow.keras.applications.resnet50 import preprocess_input
    from tensorflow.keras.preprocessing import image
    
    # 读取word_test.csv文件
    # 假设文件在同一目录下
    word_test = pd.read_csv("word_test.csv", encoding='utf-8')
    
    # 图像路径
    image_path = "images"  # 假设图像文件夹在同一目录下
    
    # 图像特征提取
    model = ResNet50(weights='imagenet', include_top=False)
    
    def image_feature_extraction(image_path):
        img = image.load_img(image_path, target_size=(224, 224))
        img_array = image.img_to_array(img)
        img_array = np.expand_dims(img_array, axis=0)
        img_array = preprocess_input(img_array)
    
        features = model.predict(img_array)
        return features.flatten()
    
    # 文本特征提取
    tfidf = TfidfVectorizer()
    word_embeddings = tfidf.fit_transform(word_test['caption'])
    
    # 多模态特征融合
    image_features = np.array([image_feature_extraction(os.path.join(image_path, img)) for img in os.listdir(image_path)])
    combined_features = np.hstack((image_features, word_embeddings.toarray()))
    
    # 图像检索
    result1 = []
    for i, text in enumerate(word_test['caption']):
        text_embedding = tfidf.transform([text])
        similarities = []
    
        for feature in combined_features:
            similarity = cosine_similarity([feature], text_embedding)
            similarities.append(similarity[0][0])
    
        result1.append(np.argsort(-similarities)[:5])
    
    result1_df = pd.DataFrame(result1, columns=['image1', 'image2', 'image3', 'image4', 'image5'])
    result1_df.to_csv('result1.csv', index=False)
    
    # 文本检索
    result2 = []
    for image_id in word_test['image_id']:
        image_text = word_test.loc[word_test['image_id'] == image_id, 'caption'].values[0]
        image_text_embedding = tfidf.transform([image_text])
        similarities = []
    
        for i, feature in enumerate(combined_features):
            similarity = cosine_similarity([feature], image_text_embedding)
            similarities.append(similarity[0][0])
    
        result2.append(np.argsort(-similarities)[:5])
    
    result2_df = pd.DataFrame(result2, columns=['text1', 'text2', 'text3', 'text4', 'text5'])
    result2_df.to_csv('result2.csv', index=False)
    

    这段代码应该能正常运行并输出结果到两个CSV文件中。如果你在运行过程中遇到任何其他问题,比如找不到文件路径或缺少数据,确保检查文件结构和数据是否正确加载。此外,根据实际情况调整路径和数据加载方式。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月22日