search_Img1 = ["catdog/train\cat.2871.jpg"]
return_Img1 = ['catdog/train\\dog.6932.jpg ', 'catdog/train\\cat.11139.jpg', 'catdog/train\\cat.8168.jpg ', 'catdog/train\\dog.4061.jpg ', 'catdog/train\\dog.2394.jpg ', 'catdog/train\\dog.1093.jpg ', 'catdog/train\\dog.1369.jpg ', 'catdog/train\\cat.10208.jpg', 'catdog/train\\dog.11518.jpg', 'catdog/train\\cat.3974.jpg ', 'catdog/train\\cat.2541.jpg ', 'catdog/train\\cat.3440.jpg ', 'catdog/train\\dog.754.jpg ', 'catdog/train\\dog.10180.jpg', 'catdog/train\\dog.10787.jpg', 'catdog/train\\dog.9394.jpg ', 'catdog/train\\cat.2028.jpg ', 'catdog/train\\dog.5192.jpg ', 'catdog/train\\dog.8193.jpg ', 'catdog/train\\dog.11697.jpg', 'catdog/train\\cat.8737.jpg ', 'catdog/train\\dog.6829.jpg ', 'catdog/train\\dog.256.jpg ', 'catdog/train\\dog.9491.jpg ', 'catdog/train\\cat.9252.jpg ', 'catdog/train\\cat.6013.jpg ', 'catdog/train\\dog.11076.jpg', 'catdog/train\\cat.3353.jpg ', 'catdog/train\\dog.2212.jpg ', 'catdog/train\\dog.914.jpg ', 'catdog/train\\cat.7313.jpg ', 'catdog/train\\dog.12025.jpg', 'catdog/train\\dog.3153.jpg ', 'catdog/train\\cat.10778.jpg', 'catdog/train\\dog.6911.jpg ', 'catdog/train\\dog.648.jpg ', 'catdog/train\\dog.719.jpg ', 'catdog/train\\dog.4229.jpg ', 'catdog/train\\cat.5442.jpg ', 'catdog/train\\cat.6101.jpg ', 'catdog/train\\dog.11561.jpg', 'catdog/train\\dog.703.jpg ', 'catdog/train\\cat.2711.jpg ', 'catdog/train\\dog.9305.jpg ', 'catdog/train\\cat.10397.jpg', 'catdog/train\\dog.1661.jpg ', 'catdog/train\\cat.3388.jpg ', 'catdog/train\\cat.22.jpg ', 'catdog/train\\dog.10022.jpg', 'catdog/train\\dog.9199.jpg ']
search_Img2 = ["catdog/train\dog.9157.jpg"]
return_Img2 = ['catdog/train\\cat.5509.jpg ', 'catdog/train\\cat.7384.jpg ', 'catdog/train\\cat.866.jpg ', 'catdog/train\\dog.7829.jpg ', 'catdog/train\\dog.11467.jpg', 'catdog/train\\cat.6159.jpg ', 'catdog/train\\dog.7153.jpg ', 'catdog/train\\dog.1202.jpg ', 'catdog/train\\cat.3974.jpg ', 'catdog/train\\dog.11208.jpg', 'catdog/train\\dog.7600.jpg ', 'catdog/train\\dog.8793.jpg ', 'catdog/train\\dog.2921.jpg ', 'catdog/train\\dog.6981.jpg ', 'catdog/train\\dog.12472.jpg', 'catdog/train\\dog.16.jpg ', 'catdog/train\\cat.7896.jpg ', 'catdog/train\\dog.4229.jpg ', 'catdog/train\\dog.11518.jpg', 'catdog/train\\dog.264.jpg ', 'catdog/train\\dog.7942.jpg ', 'catdog/train\\cat.9102.jpg ', 'catdog/train\\dog.2955.jpg ', 'catdog/train\\dog.5227.jpg ', 'catdog/train\\dog.884.jpg ', 'catdog/train\\cat.8843.jpg ', 'catdog/train\\cat.2769.jpg ', 'catdog/train\\dog.2271.jpg ', 'catdog/train\\dog.3469.jpg ', 'catdog/train\\dog.12025.jpg', 'catdog/train\\dog.7101.jpg ', 'catdog/train\\cat.11644.jpg', 'catdog/train\\dog.8639.jpg ', 'catdog/train\\cat.11638.jpg', 'catdog/train\\dog.3763.jpg ', 'catdog/train\\dog.10395.jpg', 'catdog/train\\dog.6403.jpg ', 'catdog/train\\dog.9116.jpg ', 'catdog/train\\cat.1698.jpg ', 'catdog/train\\dog.2244.jpg ', 'catdog/train\\dog.11280.jpg', 'catdog/train\\cat.6686.jpg ', 'catdog/train\\dog.1729.jpg ', 'catdog/train\\dog.515.jpg ', 'catdog/train\\cat.8285.jpg ', 'catdog/train\\dog.914.jpg ', 'catdog/train\\cat.9316.jpg ', 'catdog/train\\dog.2291.jpg ', 'catdog/train\\cat.4929.jpg ', 'catdog/train\\cat.1338.jpg ']
searchimg_List = [search_Img1, search_Img2]
returnimg_List = [return_Img1, return_Img2]
#print(searchimg_List)
#print(returnimg_List)
class calculate_Relevantindicators(object):
def __init__(self,searchimg_List = None, returnimg_List = None):
self.searchimg_List = searchimg_List
self.returnimg_List = returnimg_List
self.img_Lencatdog = 2000
self.searchimglist_Labels = self._get_Label(self.searchimg_List)
self.returnimg_List_Labels = self._get_Label(self.returnimg_List)
#self.img_Lencat = self._get_Label(l = self.returnimg_List).count(1)
#self.img_Lendog = self._get_Label(l = self.returnimg_List).count(0)
#注意:self只有在类的方法中才会有
def _get_Label(self,l):
"""
:param list:
:return: cat->0 dog->1
"""
def label(s):
# 直接写"."
if s.split(".")[-3].split("\\")[-1] == "cat":
label = 0
else:
label = 1
return label
return list(map(label, l))
def _recall(self):
n = 0
for i in range(len(self.returnimg_List)):
if self.searchimglist_Labels[0] == self.returnimg_List_Labels[i]:
n += 1
return n / self.img_Lencatdog
def _p(self):
n = 0
for i in range(len(self.returnimg_List)):
if self.searchimglist_Labels[0] == self.returnimg_List_Labels[i]:
n += 1
return n / len(self.returnimg_List)
def _ap(self):
ranks = []
for i in range(len(self.returnimg_List)):
if self.searchimglist_Labels[0] == self.returnimg_List_Labels[i]:
ranks.append(i + 1)
ap = 0
for i, j in enumerate(ranks):
#print(i, j)
#print((i + 1) / j)
ap += (i + 1) / j
return ap / len(ranks)
if __name__ == '__main__':
Cal1 = calculate_Relevantindicators(searchimg_List = searchimg_List[0],
returnimg_List = returnimg_List[0])
print(Cal1)
print("img1_Ap:",Cal1._ap())
Cal2 = calculate_Relevantindicators(searchimg_List= searchimg_List[1],
returnimg_List= returnimg_List[1])
print(Cal2)
print("img2_Ap:", Cal2._ap())
print("map:", (Cal1._ap() + Cal2._ap()) / 2)
ap = 0
for i in range(2):
#searchimg_List = searchimg_List[i]
#returnimg_List = returnimg_List[i]
print(searchimg_List[i])
print(returnimg_List[i])
C = calculate_Relevantindicators(searchimg_List = searchimg_List[i],
returnimg_List = returnimg_List[i])
ap += C._ap()
print("map:",ap /2)
D:\ANACONDA\envs\pytorch_gpu\python.exe G:/pythonProject1/prac.py
<__main__.calculate_Relevantindicators object at 0x0000024111367E48>
img1_Ap: 0.4136057193492074
<__main__.calculate_Relevantindicators object at 0x000002411134CDD8>
img2_Ap: 0.6415111131205098
map: 0.5275584162348586
['catdog/train\\cat.2871.jpg']
['catdog/train\\dog.6932.jpg ', 'catdog/train\\cat.11139.jpg', 'catdog/train\\cat.8168.jpg ', 'catdog/train\\dog.4061.jpg ', 'catdog/train\\dog.2394.jpg ', 'catdog/train\\dog.1093.jpg ', 'catdog/train\\dog.1369.jpg ', 'catdog/train\\cat.10208.jpg', 'catdog/train\\dog.11518.jpg', 'catdog/train\\cat.3974.jpg ', 'catdog/train\\cat.2541.jpg ', 'catdog/train\\cat.3440.jpg ', 'catdog/train\\dog.754.jpg ', 'catdog/train\\dog.10180.jpg', 'catdog/train\\dog.10787.jpg', 'catdog/train\\dog.9394.jpg ', 'catdog/train\\cat.2028.jpg ', 'catdog/train\\dog.5192.jpg ', 'catdog/train\\dog.8193.jpg ', 'catdog/train\\dog.11697.jpg', 'catdog/train\\cat.8737.jpg ', 'catdog/train\\dog.6829.jpg ', 'catdog/train\\dog.256.jpg ', 'catdog/train\\dog.9491.jpg ', 'catdog/train\\cat.9252.jpg ', 'catdog/train\\cat.6013.jpg ', 'catdog/train\\dog.11076.jpg', 'catdog/train\\cat.3353.jpg ', 'catdog/train\\dog.2212.jpg ', 'catdog/train\\dog.914.jpg ', 'catdog/train\\cat.7313.jpg ', 'catdog/train\\dog.12025.jpg', 'catdog/train\\dog.3153.jpg ', 'catdog/train\\cat.10778.jpg', 'catdog/train\\dog.6911.jpg ', 'catdog/train\\dog.648.jpg ', 'catdog/train\\dog.719.jpg ', 'catdog/train\\dog.4229.jpg ', 'catdog/train\\cat.5442.jpg ', 'catdog/train\\cat.6101.jpg ', 'catdog/train\\dog.11561.jpg', 'catdog/train\\dog.703.jpg ', 'catdog/train\\cat.2711.jpg ', 'catdog/train\\dog.9305.jpg ', 'catdog/train\\cat.10397.jpg', 'catdog/train\\dog.1661.jpg ', 'catdog/train\\cat.3388.jpg ', 'catdog/train\\cat.22.jpg ', 'catdog/train\\dog.10022.jpg', 'catdog/train\\dog.9199.jpg ']
['catdog/train\\dog.9157.jpg']
['catdog/train\\cat.5509.jpg ', 'catdog/train\\cat.7384.jpg ', 'catdog/train\\cat.866.jpg ', 'catdog/train\\dog.7829.jpg ', 'catdog/train\\dog.11467.jpg', 'catdog/train\\cat.6159.jpg ', 'catdog/train\\dog.7153.jpg ', 'catdog/train\\dog.1202.jpg ', 'catdog/train\\cat.3974.jpg ', 'catdog/train\\dog.11208.jpg', 'catdog/train\\dog.7600.jpg ', 'catdog/train\\dog.8793.jpg ', 'catdog/train\\dog.2921.jpg ', 'catdog/train\\dog.6981.jpg ', 'catdog/train\\dog.12472.jpg', 'catdog/train\\dog.16.jpg ', 'catdog/train\\cat.7896.jpg ', 'catdog/train\\dog.4229.jpg ', 'catdog/train\\dog.11518.jpg', 'catdog/train\\dog.264.jpg ', 'catdog/train\\dog.7942.jpg ', 'catdog/train\\cat.9102.jpg ', 'catdog/train\\dog.2955.jpg ', 'catdog/train\\dog.5227.jpg ', 'catdog/train\\dog.884.jpg ', 'catdog/train\\cat.8843.jpg ', 'catdog/train\\cat.2769.jpg ', 'catdog/train\\dog.2271.jpg ', 'catdog/train\\dog.3469.jpg ', 'catdog/train\\dog.12025.jpg', 'catdog/train\\dog.7101.jpg ', 'catdog/train\\cat.11644.jpg', 'catdog/train\\dog.8639.jpg ', 'catdog/train\\cat.11638.jpg', 'catdog/train\\dog.3763.jpg ', 'catdog/train\\dog.10395.jpg', 'catdog/train\\dog.6403.jpg ', 'catdog/train\\dog.9116.jpg ', 'catdog/train\\cat.1698.jpg ', 'catdog/train\\dog.2244.jpg ', 'catdog/train\\dog.11280.jpg', 'catdog/train\\cat.6686.jpg ', 'catdog/train\\dog.1729.jpg ', 'catdog/train\\dog.515.jpg ', 'catdog/train\\cat.8285.jpg ', 'catdog/train\\dog.914.jpg ', 'catdog/train\\cat.9316.jpg ', 'catdog/train\\dog.2291.jpg ', 'catdog/train\\cat.4929.jpg ', 'catdog/train\\cat.1338.jpg ']
map: 0.5275584162348586
随机选20张照片进行检索并且输出MAP
# -*- encoding: utf-8 -*-
"""
@File : catdog_Retrieval.py
@Time : 2021-05-10 10:07
@Author : XD
@Email : gudianpai@qq.com
@Software: PyCharm
"""
import os
import scipy.io as sio
from tqdm import tqdm
import glob
from sklearn.preprocessing import normalize
import matplotlib.pyplot as plt
import numpy as np
import cv2
import torch
import torch.nn as nn
from torchvision import models
from ResNet50 import ResNet50
# input = torch.rand(1, 3, 224, 224)
# output = model(input)
# embed()
def show_img(ori_path, aim_path):
plt.figure(figsize=(20, 10))
img = cv2.imread(ori_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.subplot(3, 5, 1)
plt.imshow(img)
plt.xticks([])
plt.yticks([])
plt.title('Original Image')
if not os.path.exists("PNG"):
os.mkdir("PNG")
for idx in range(10):
img = cv2.imread(aim_path[idx])
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.subplot(3, 5, 6 + idx)
plt.imshow(img)
plt.xticks([])
plt.yticks([])
plt.savefig("PNG\{}.png".format(search_idx))
plt.show()
def create_Feature():
#加载特征提取模型
model = ResNet50(num_class = 2)
model.eval()
params = torch.load("G:\pythonProject1\models\\159-99.06%.pth")
model.load_state_dict(params)
import random
jpgs = random.sample(glob.glob("catdog/train/*.jpg"), 2000)
img_array = []
for path in tqdm(jpgs[:]):
img = cv2.imread(path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (224, 224))
img_array.append(img)
img_array = np.stack(img_array)
img_array = np.transpose(img_array, [0, 3, 1, 2]).astype(np.float32)
img_array = torch.from_numpy(img_array)
cnn_feat = []
step = int(len(img_array) / 50) + 1
for i in range(0, len(img_array), 50):
with torch.no_grad():
print("Extracting {} - {} images feature ".format(i, i +50))
feat = model(img_array[i: i + 50])
feat = feat.data.numpy()
cnn_feat.append(feat)
print("Finish extract")
cnn_feat = np.concatenate(cnn_feat, 0)
cnn_feat = cnn_feat.reshape(-1, 2048)
cnn_feat = normalize(cnn_feat)
img_Feature = dict(jpgs = jpgs, Feature = cnn_feat)
if not os.path.exists("Feature"):
os.mkdir("Feature")
sio.savemat("Feature/2000_trainFeature", img_Feature)
if __name__ == '__main__':
#create_Feature()
feature = sio.loadmat("Feature/2000_trainFeature")
jpgs = feature["jpgs"]
cnn_feat = feature["Feature"]
ap = 0
for i in range(100):
search_idx = i
ids = np.dot(cnn_feat[search_idx], cnn_feat.T)
ids = np.argsort(ids)[::-1][1:]
#show_img(jpgs[search_idx], [jpgs[x] for x in ids[:10]])
#print(jpgs[search_idx])
#print(list(jpgs[search_idx]))
#print(([jpgs[x] for x in ids[:10]]))
l = []
l.append(jpgs[search_idx])
from prac import calculate_Relevantindicators
C = calculate_Relevantindicators(searchimg_List = l,
returnimg_List = [jpgs[x] for x in ids[:10]])
print("第{}epoc AP:{:.2f}".format(i + 1,C._ap()))
ap += C._ap()
print("MAP:",ap / 10)
D:\ANACONDA\envs\pytorch_gpu\python.exe G:/pythonProject1/catdog_Retrieval.py
第1epoc AP:0.49
第2epoc AP:0.42
第3epoc AP:0.63
第4epoc AP:0.36
第5epoc AP:0.53
第6epoc AP:0.49
第7epoc AP:0.89
第8epoc AP:0.69
第9epoc AP:0.74
第10epoc AP:0.58
第11epoc AP:1.00
第12epoc AP:0.29
第13epoc AP:0.76
第14epoc AP:0.25
第15epoc AP:0.73
第16epoc AP:0.35
第17epoc AP:0.75
第18epoc AP:0.34
第19epoc AP:0.82
第20epoc AP:1.00
第21epoc AP:0.62
第22epoc AP:0.37
第23epoc AP:0.73
第24epoc AP:0.42
第25epoc AP:0.58
第26epoc AP:0.52
第27epoc AP:0.43
第28epoc AP:0.95
第29epoc AP:0.73
第30epoc AP:0.85
第31epoc AP:0.62
第32epoc AP:0.56
第33epoc AP:0.51
第34epoc AP:0.77
第35epoc AP:0.95
第36epoc AP:0.27
第37epoc AP:0.76
第38epoc AP:0.79
第39epoc AP:0.70
第40epoc AP:0.57
第41epoc AP:0.80
第42epoc AP:0.56
第43epoc AP:0.52
第44epoc AP:0.91
第45epoc AP:0.73
第46epoc AP:0.81
第47epoc AP:0.64
第48epoc AP:0.80
第49epoc AP:0.77
第50epoc AP:0.59
第51epoc AP:0.17
第52epoc AP:0.48
第53epoc AP:0.72
第54epoc AP:0.48
第55epoc AP:0.78
第56epoc AP:0.81
第57epoc AP:0.67
第58epoc AP:1.00
第59epoc AP:0.37
第60epoc AP:0.24
第61epoc AP:1.00
第62epoc AP:0.58
第63epoc AP:0.91
第64epoc AP:0.94
第65epoc AP:0.62
第66epoc AP:0.59
第67epoc AP:0.60
第68epoc AP:0.96
第69epoc AP:0.67
第70epoc AP:0.81
第71epoc AP:0.76
第72epoc AP:0.70
第73epoc AP:0.17
第74epoc AP:0.32
第75epoc AP:0.55
第76epoc AP:0.41
第77epoc AP:0.52
第78epoc AP:0.76
第79epoc AP:0.51
第80epoc AP:0.58
第81epoc AP:0.64
第82epoc AP:0.69
第83epoc AP:0.88
第84epoc AP:0.77
第85epoc AP:0.92
第86epoc AP:0.48
第87epoc AP:0.53
第88epoc AP:0.72
第89epoc AP:0.39
第90epoc AP:0.68
第91epoc AP:0.49
第92epoc AP:0.70
第93epoc AP:0.65
第94epoc AP:0.76
第95epoc AP:0.96
第96epoc AP:0.30
第97epoc AP:0.83
第98epoc AP:0.84
第99epoc AP:1.00
第100epoc AP:0.57
MAP: 0.6435938429075333
Process finished with exit code 0