Files
ieemoo-ai-imageassessment/ComparisonAnalysis.py
2024-11-27 15:37:10 +08:00

170 lines
6.0 KiB
Python

import os.path
import shutil
import numpy as np
import matplotlib.pyplot as plt
def showHist(err, correct, date):
err = np.array(err)
correct = np.array(correct)
fig, axs = plt.subplots(2, 1)
axs[0].hist(err, bins=50, edgecolor='black')
axs[0].set_xlim([0, 1])
axs[0].set_title('err')
axs[1].hist(correct, bins=50, edgecolor='black')
axs[1].set_xlim([0, 1])
axs[1].set_title('correct')
plt.title(date)
plt.savefig('comparisonResult/Hist_' + date + '.png')
plt.show()
def showgrid(recall, prec, date):
x = np.linspace(start=-0, stop=1, num=11, endpoint=True).tolist()
plt.figure(figsize=(10, 6))
plt.plot(x, recall, color='red', label='recall')
plt.plot(x, prec, color='blue', label='PrecisePos')
plt.legend()
plt.xlabel('threshold')
plt.title(date)
# plt.ylabel('Similarity')
plt.grid(True, linestyle='--', alpha=0.5)
# plt.savefig('accuracy_recall_grid.png')
plt.savefig('comparisonResult/grid_' + date + '.png')
plt.show()
plt.close()
def read_txt_file(filePth):
with open(filePth, 'r', encoding='utf-8') as f:
lines = f.readlines()
dict = {}
all_list = []
barcode_list = []
similarity_list = []
split_flag = False
clean_lines = [line.strip().replace("'", '').replace('"', '') for line in lines]
for line in clean_lines:
stripped_line = line.strip()
if not stripped_line:
split_flag = False
all_list.append(dict)
dict = {}
barcode_list, similarity_list = [], []
continue
label = line.split(':')[0]
value = line.split(':')[1]
if label == 'SeqDir':
dict['SeqDir'] = value
if label == 'Deleted':
dict['Deleted'] = value
if label == 'List':
split_flag = True
continue
if split_flag:
dict['barcode'] = barcode_list
dict['similarity'] = similarity_list
barcode_list.append(label)
similarity_list.append(value)
all_list.append(dict)
all_list = [d for d in all_list if d]
return all_list
def move_file(seqdirs, filePth):
comparisonData = os.path.basename(filePth).split('.')[0]
comparisonData = os.sep.join(['D:\Project\ieemoo\image_quality_assessment\comparisonData', comparisonData])
print('comparisonData', comparisonData)
for seqdir in seqdirs:
print(seqdir[0], seqdir[1])
err_pair = os.sep.join([comparisonData, 'err_pair', seqdir[1]])
if not os.path.exists(err_pair):
os.makedirs(err_pair)
for comparison in os.listdir(comparisonData):
print(os.sep.join([comparisonData, comparison]))
print(os.sep.join([err_pair, comparison]))
try:
if seqdir[0] in comparison:
shutil.copytree(os.sep.join([comparisonData, comparison]),
os.sep.join([err_pair, comparison]))
if seqdir[1] in comparison:
shutil.copytree(os.sep.join([comparisonData, comparison]),
os.sep.join([err_pair, comparison]))
except Exception as e:
continue
def compute_recall_precision(err_similarity, correct_similarity, date=None):
# ths = np.linspace(0, 1, 11)
ths = np.linspace(start=-0, stop=1, num=11, endpoint=True).tolist()
recall, prec = [], []
for th in ths:
TP = len([num for num in correct_similarity if num >= th])
FP = len([num for num in err_similarity if num >= th])
if (TP + FP) == 0:
prec.append(1)
recall.append(0)
else:
prec.append(TP / (TP + FP))
recall.append(TP / (len(err_similarity) + len(correct_similarity)))
# print(recall)
# print(prec)
showgrid(recall, prec, date)
return recall, prec
def deal_one_file(filePth):
date = filePth.split('\\')[-1].split('.')[0]
all_list = read_txt_file(filePth)
num = 0
err_barcode_list, correct_barcode_list, err_similarity, correct_similarity, seqdirs = [], [], [], [], []
for s_list in all_list:
seqdir = s_list['SeqDir'].strip()
delete = s_list['Deleted'].strip()
barcodes = [s.strip() for s in s_list['barcode']]
similarity = [float(s.strip()) for s in s_list['similarity']]
if delete in barcodes[:1]:
num += 1
correct_barcode_list.append(delete)
correct_similarity.append(similarity[0])
else:
seqdirs.append((seqdir, delete))
err_barcode_list.append(delete)
err_similarity.append(similarity[0])
compute_recall_precision(err_similarity, correct_similarity, date)
showHist(err_similarity, correct_similarity, date)
move_file(seqdirs, filePth) # 统计错误对
return err_similarity, correct_similarity
def main(filesPth):
err_similarities, correct_similarities = [], []
dir_lists = os.listdir(filesPth)
# dir_lists = ['deletedBarcode_10_0716_pm_3.txt']
for name in dir_lists:
filePth = os.sep.join([filesPth, name])
err_similarity, correct_similarity = deal_one_file(filePth)
err_similarities += err_similarity
correct_similarities += correct_similarity
compute_recall_precision(err_similarities, correct_similarities, date='zong')
showHist(err_similarities, correct_similarities, date='zong')
print('END')
if __name__ == '__main__':
# filePth = 'D:\Project\ieemoo\image_quality_assessment\comparisonResult\deletedBarcode_10_0722_pm_01.txt'
# read_txt_file(filePth)
filesPth = 'comparisonResult'
main(filesPth)
# for name in os.listdir('comparisonData\deletedBarcode_15_0628_pm\err_pair'):
# path = os.sep.join(['comparisonData\deletedBarcode_15_0628_pm\err_pair', name])
# print(len(os.listdir(path)))
# if len(os.listdir(path)) < 2:
# print(path)