代码回滚:增加未知类别负样本之后,模型不收敛,训练效果特别差,现在进行回滚。回滚之后效果非常不错。

This commit is contained in:
2025-10-29 16:40:05 +08:00
parent 1c8ceef5b0
commit 07bae61a10
4 changed files with 43 additions and 30 deletions
+13 -8
View File
@@ -65,12 +65,14 @@ class EmbeddingFoodClassifierApp:
BASE_DIR = os.path.dirname(os.path.abspath(__file__)) BASE_DIR = os.path.dirname(os.path.abspath(__file__))
# model_path = "../model/embedding_20251011_133653/best_embedding_model.pth" # model_path = "../model/embedding_20251011_133653/best_embedding_model.pth"
# model_path = os.path.join(BASE_DIR, "../model/embedding_20251011_133653/best_embedding_model.pth") # model_path = os.path.join(BASE_DIR, "../model/embedding_20251011_133653/best_embedding_model.pth")
model_path = os.path.join(BASE_DIR, "../model/WholeIngredientRecognition/embedding_20251021_085915/best_embedding_model.pth") model_path = os.path.join(BASE_DIR, "../model/ProcessedIngredientRecognition/embedding_20251029_100204/best_embedding_model.pth")
# model_path = os.path.join(BASE_DIR, "../model/WholeIngredientRecognition/embedding_20251024_091151/best_embedding_model.pth")
# model_path = os.path.join(BASE_DIR, "../model/DishClassification/embedding_20251022_093635/best_embedding_model.pth") # model_path = os.path.join(BASE_DIR, "../model/DishClassification/embedding_20251022_093635/best_embedding_model.pth")
# FAISS索引目录 # FAISS索引目录
# index_dir = "../faiss_vector_db/faiss_index" # index_dir = "../faiss_vector_db/faiss_index"
# index_dir = os.path.join(BASE_DIR, "../faiss_vector_db/faiss_index") # index_dir = os.path.join(BASE_DIR, "../faiss_vector_db/faiss_index")
index_dir = os.path.join(BASE_DIR, "../faiss_vector_db/ProcessedIngredientRecognition/faiss_index")
index_dir = os.path.join(BASE_DIR, "../faiss_vector_db/WholeIngredientRecognition/faiss_index") index_dir = os.path.join(BASE_DIR, "../faiss_vector_db/WholeIngredientRecognition/faiss_index")
# index_dir = os.path.join(BASE_DIR, "../faiss_vector_db/DishClassification/faiss_index") # index_dir = os.path.join(BASE_DIR, "../faiss_vector_db/DishClassification/faiss_index")
@@ -1087,12 +1089,13 @@ class EmbeddingFoodClassifierApp:
"""识别所有图片""" """识别所有图片"""
try: try:
self.current_results.clear() self.current_results.clear()
score_list = []
for i, img_info in enumerate(self.uploaded_images): for i, img_info in enumerate(self.uploaded_images):
# 使用embedding相似度识别 # 使用embedding相似度识别
if self.model is not None and self.faiss_index is not None: if self.model is not None and self.faiss_index is not None:
# 使用真实的embedding模型和FAISS索引 # 使用真实的embedding模型和FAISS索引
predicted_class, confidence, similar_images = self.predict_with_embedding(img_info['image']) predicted_class, confidence, similar_images,score = self.predict_with_embedding(img_info['image'])
score_list.append(score)
else: else:
# 模拟预测结果 # 模拟预测结果
predicted_class = np.random.choice(self.class_names) predicted_class = np.random.choice(self.class_names)
@@ -1122,7 +1125,7 @@ class EmbeddingFoodClassifierApp:
# 更新UI(在主线程中) # 更新UI(在主线程中)
self.root.after(0, self.update_progress, i + 1, len(self.uploaded_images)) self.root.after(0, self.update_progress, i + 1, len(self.uploaded_images))
print('socre_list',score_list)
# 识别完成,更新UI # 识别完成,更新UI
self.root.after(0, self.recognition_completed) self.root.after(0, self.recognition_completed)
@@ -1144,8 +1147,10 @@ class EmbeddingFoodClassifierApp:
# 在FAISS索引中搜索最相似的k张图片 # 在FAISS索引中搜索最相似的k张图片
scores, indices = self.faiss_index.search(query_embedding, k) scores, indices = self.faiss_index.search(query_embedding, k)
print("最相似的图片索引:", indices) # print("最相似的图片索引:", indices)
print("最相似的图片分数:", scores) # print("最相似的图片分数:", type(scores[0]))
# print("最相似的图片分数:", scores[0,0])
# print("最相似的图片分数:", type(scores[0,0]))
# 收集相似图片的类别 # 收集相似图片的类别
similar_classes = [] similar_classes = []
@@ -1179,12 +1184,12 @@ class EmbeddingFoodClassifierApp:
vote_ratio = class_counts[predicted_class] / len(similar_classes) vote_ratio = class_counts[predicted_class] / len(similar_classes)
confidence = max_score * vote_ratio confidence = max_score * vote_ratio
return predicted_class, confidence, similar_images return predicted_class, confidence, similar_images,round(scores[0,0],3)
else: else:
# 如果没有找到相似图片,随机选择一个类别 # 如果没有找到相似图片,随机选择一个类别
predicted_class = np.random.choice(self.class_names) predicted_class = np.random.choice(self.class_names)
confidence = 0.1 confidence = 0.1
return predicted_class, confidence, [] return predicted_class, confidence, [],scores[0,0]
except Exception as e: except Exception as e:
print(f"Embedding预测出错: {e}") print(f"Embedding预测出错: {e}")
+7 -4
View File
@@ -480,12 +480,15 @@ def main():
"""主函数""" """主函数"""
# 配置参数 # 配置参数
# MODEL_PATH = "../model/embedding_20251011_133653/best_embedding_model.pth" # MODEL_PATH = "../model/embedding_20251011_133653/best_embedding_model.pth"
# MODEL_PATH = "../model/WholeIngredientRecognition/embedding_20251021_085915/best_embedding_model.pth" MODEL_PATH = "../model/ProcessedIngredientRecognition/embedding_20251029_100204/best_embedding_model.pth"
MODEL_PATH = "../model/DishClassification/embedding_20251022_093635/best_embedding_model.pth" # MODEL_PATH = "../model/WholeIngredientRecognition/embedding_20251024_091151/best_embedding_model.pth"
# MODEL_PATH = "../model/DishClassification/embedding_20251022_093635/best_embedding_model.pth"
TRAIN_DIR = "../dataset/ProcessedIngredientRecognition/train"
# TRAIN_DIR = "../dataset/WholeIngredientRecognition/train" # TRAIN_DIR = "../dataset/WholeIngredientRecognition/train"
TRAIN_DIR = "../dataset/DishClassification/train" # TRAIN_DIR = "../dataset/DishClassification/train"
OUTPUT_DIR = "ProcessedIngredientRecognition/faiss_index"
# OUTPUT_DIR = "WholeIngredientRecognition/faiss_index" # OUTPUT_DIR = "WholeIngredientRecognition/faiss_index"
OUTPUT_DIR = "DishClassification/faiss_index" # OUTPUT_DIR = "DishClassification/faiss_index"
BATCH_SIZE = 16 BATCH_SIZE = 16
INDEX_TYPE = 'flat' # 'flat', 'ivf', 'hnsw' INDEX_TYPE = 'flat' # 'flat', 'ivf', 'hnsw'
EMBEDDING_DIM = 512 EMBEDDING_DIM = 512
+4 -2
View File
@@ -162,10 +162,12 @@ def plot_2d(Z: np.ndarray, y: np.ndarray, title: str, out_path: Optional[str] =
def main(): def main():
parser = argparse.ArgumentParser(description="可视化高维 embedding 并进行坍塌诊断") parser = argparse.ArgumentParser(description="可视化高维 embedding 并进行坍塌诊断")
parser.add_argument("--embeddings", type=str, default=os.path.join("DishClassification/faiss_index", "embeddings.json"), help="embeddings.json 路径") # parser.add_argument("--embeddings", type=str, default=os.path.join("DishClassification/faiss_index", "embeddings.json"), help="embeddings.json 路径")
# parser.add_argument("--embeddings", type=str, default=os.path.join("WholeIngredientRecognition/faiss_index", "embeddings.json"), help="embeddings.json 路径") # parser.add_argument("--embeddings", type=str, default=os.path.join("WholeIngredientRecognition/faiss_index", "embeddings.json"), help="embeddings.json 路径")
parser.add_argument("--labels", type=str, default=os.path.join("DishClassification/faiss_index", "labels.json"), help="labels.json 路径") parser.add_argument("--embeddings", type=str, default=os.path.join("ProcessedIngredientRecognition/faiss_index", "embeddings.json"), help="embeddings.json 路径")
# parser.add_argument("--labels", type=str, default=os.path.join("DishClassification/faiss_index", "labels.json"), help="labels.json 路径")
# parser.add_argument("--labels", type=str, default=os.path.join("WholeIngredientRecognition/faiss_index", "labels.json"), help="labels.json 路径") # parser.add_argument("--labels", type=str, default=os.path.join("WholeIngredientRecognition/faiss_index", "labels.json"), help="labels.json 路径")
parser.add_argument("--labels", type=str, default=os.path.join("ProcessedIngredientRecognition/faiss_index", "labels.json"), help="labels.json 路径")
parser.add_argument("--method", type=str, default="pca", choices=["pca", "tsne", "umap"], help="降维方法") parser.add_argument("--method", type=str, default="pca", choices=["pca", "tsne", "umap"], help="降维方法")
parser.add_argument("--seed", type=int, default=42) parser.add_argument("--seed", type=int, default=42)
parser.add_argument("--max_points", type=int, default=None, help="抽样上限,避免t-SNE/UMAP过慢;None为全量") parser.add_argument("--max_points", type=int, default=None, help="抽样上限,避免t-SNE/UMAP过慢;None为全量")
+7 -4
View File
@@ -73,9 +73,11 @@ TASKS = {
embedding_dim=512, embedding_dim=512,
batch_size=16, batch_size=16,
lr=1e-3, lr=1e-3,
triplet_margin=0.25, # triplet_margin=0.25,
center_loss_weight=0.1, triplet_margin=0.5,
aug_strength="shape", # center_loss_weight=0.5,
center_loss_weight=20,
aug_strength="medium",
), ),
} }
@@ -818,5 +820,6 @@ if __name__ == "__main__":
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("task", choices=list(TASKS.keys()), nargs="?", default="dish") parser.add_argument("task", choices=list(TASKS.keys()), nargs="?", default="dish")
args = parser.parse_args() args = parser.parse_args()
main("processed_ingredient")
# main("whole_ingredient") # main("whole_ingredient")
main("dish") # main("dish")