first commit

This commit is contained in:
Semi212 committed 2021-09-15 11:33:58 +08:00
commit 54ccfb11fe
218 files changed
+19525

No files matched your search

Executable
+159
View File
@@ -0,0 +1,159 @@
# coding=utf-8
'''
Input:(Device, ImagePath, ResultVisualationPath)
DclNumberToSpeciesPath:we need to convert number to related species,so need to find a train.txt to relieve this operation
DclNumberToSpeciesPath:../data_MPKFNet/data/DCL/datasets/HCData/anno/train.txt
ImagePath:../data_MPKFNet/data/DCL/datasets/HCData/data
ResultVisualationPath:../data_MPKFNet/result/Dcl_FineGrainedRecognition
How to use:
Dcl = DclInference(devices, args.ImagePath, args.ResultVisualation)
Dcl.NumbwerToSpecies()
Dcl.parse_args()
Species, ConfidenceLevel= Dcl.DclInference()
'''
import os
import json
import time
import cv2
import sys
import csv
import pickle
import shutil
import argparse
import pandas as pd
import numpy as np
from math import ceil
from tqdm import tqdm
import PIL.Image as Image
import matplotlib.pyplot as plt
import torch
import torch.nn as nn
from torch.autograd import Variable
from torch.nn import CrossEntropyLoss
from torchvision import datasets, models
import torch.backends.cudnn as cudnn
# Add the absolute path to find the package
#sys.path.append('/data1/Hatcher/model/MPKFNet/Dcl')
from Dcl.transforms import transforms
from Dcl.models.LoadModel import MainModel
from Dcl.DclConfig import LoadConfig, load_data_transformers
from Dcl.util.test_tool import set_text, save_multi_img, cls_base_acc
os.environ['CUDA_VISIBLE_DEVICES'] = '6'
devices = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
class DclInference:
def __init__(self, device, DclImagePath, DclResultVisualationPath):
self.device = device
self.ImagesPath = []
self.DclOutputSpecies = []
self.DclOutputConfidenceLevel = []
self.DclImagePath = DclImagePath
self.DataSpeciesClassier = dict()
self.DclResultVisualationPath = DclResultVisualationPath
self.DclNumberToSpeciesPath = '../data_MPKFNet/data/DCL/datasets/HCData/anno/train.txt'
self.DclPreWeightPath = '../data_MPKFNet/weigth/FinedGrainedRecognition/Test/weights_170_999_0.8298_0.9289.pth'
def DclSoftmax(DcloutputsMatrix, DclPredictedValue):
InputMax, InputIdx = DcloutputsMatrix.max(dim=1) # row max
InputExp = torch.exp(DclPredictedValue - InputMax)
ConfidenceLevel = InputExp / torch.sum(torch.exp(DcloutputsMatrix - InputMax))
ConfidenceLevel = ConfidenceLevel.item()
return ConfidenceLevel
def NumbwerToSpecies(self):
Number_last = 0
with open(self.DclNumberToSpeciesPath) as file:
Data = file.readlines()
for line in Data:
line = line.strip('\n')
species = line.split(' ')[0]
Number = line.split(' ')[1]
# Judge Number
if Number != Number_last:
self.DataSpeciesClassier[Number] = str(species.split('_')[0]) + '_' + str(species.split('_')[1])
Number_last = Number
def parse_args(self):
parser = argparse.ArgumentParser(description='dcl parameters')
parser.add_argument('--data', dest='dataset', default='HCData', type=str)
parser.add_argument('--backbone', dest='backbone', default='resnet50', type=str)
parser.add_argument('--b', dest='batch_size', default=1, type=int)
parser.add_argument('--nw', dest='num_workers', default=8, type=int)
parser.add_argument('--ver', dest='version', default='val', type=str)
parser.add_argument('--size', dest='resize_resolution', default=512, type=int)
parser.add_argument('--crop', dest='crop_resolution', default=448, type=int)
parser.add_argument('--ss', dest='save_suffix', default=None, type=str)
parser.add_argument('--acc_report', dest='acc_report', action='store_true')
parser.add_argument('--swap_num', default=[7, 7], nargs=2, metavar=('swap1', 'swap2'), type=int, help='specify a range')
self.args = parser.parse_args()
def DclInference(self):
# Traverse Images
if os.path.exists(self.DclImagePath):
for File in os.listdir(self.DclImagePath):
if File.endswith('jpg'):
self.ImagesPath.append(os.path.join(self.DclImagePath, File))
print('Load data is ok')
# Data Pretreated
self.Config = LoadConfig(self.args, 's')
transformers = load_data_transformers(self.args.resize_resolution, self.args.crop_resolution, self.args.swap_num)
# load model
self.model = MainModel(self.Config)
model_dict = self.model.state_dict()
pretrained_dict = torch.load(self.DclPreWeightPath)
model_dict.update(pretrained_dict)
self.model.load_state_dict(model_dict)
print("load model weight is ok")
self.model.to(self.device)
self.model.train(False)
count_bar = tqdm(total = len(self.ImagesPath), desc='Dcl Inference')
with torch.no_grad():
for ImgPath in self.ImagesPath:
count_bar.update(1)
Img = cv2.imread(ImgPath)
Img = Image.fromarray(cv2.cvtColor(Img, cv2.COLOR_BGR2RGB))
Img = transformers['test_totensor'](Img)
Img = Img.unsqueeze(0)
inputs = Variable(Img.cuda())
outputs = self.model(inputs)
t1 = time.time()
top3_val, top3_pos = torch.topk(outputs[0], 1) # topk返回的是一个元组,第一个元素是每一行最大的三个值(默认是按行取最大值),第二个元素是每一行最大的值的排序
Species = top3_pos.squeeze()
ConfidenceLevel = DclInference.DclSoftmax(outputs[0], top3_val[0][0])
t2 = time.time()
self.DclOutputSpecies.append(Species)
self.DclOutputConfidenceLevel.append(ConfidenceLevel)
print('Post Process Time:{:.2f} ConfidenceLevel:{:.2f}'.format((t2 - t1) * 1000, ConfidenceLevel))
return self.DclOutputSpecies, self.DclOutputConfidenceLevel
def parse_args():
parser = argparse.ArgumentParser(description='dcl parameters')
parser.add_argument('--save', dest='resume',
default='../data_MPKFNet/weigth/FinedGrainedRecognition/Test/weights_170_999_0.8298_0.9289.pth', type=str)
parser.add_argument('--ResultVisualation',
default='../data_MPKFNet/result/Dcl_FineGrainedRecognition', type=str)
parser.add_argument('--ImagePath',
default='../data_MPKFNet/data/DCL/datasets/HCData/data', type=str)
parser.add_argument('--NumberToSpecies',
default='../data_MPKFNet/data/DCL/datasets/HCData/anno/train.txt', type=str)
args = parser.parse_args()
return args
if __name__ == '__main__':
args = parse_args()
Dcl = DclInference(devices, args.ImagePath, args.ResultVisualation)
Dcl.NumbwerToSpecies()
Dcl.parse_args()
Species, ConfidenceLevel = Dcl.DclInference()
print(Species)