raise ImportError("{} doesn't contains class named 'Exp'".format(exp_file))
Sarouch opened this issue · 6 comments
Hello, I have this error, could you please help me to find out the problem ?
File "track.py", line 33, in init
self.detector=build_detector(cfg,use_cuda=use_cuda)
File "\yolox-pytorch\detector.py", line 71, in build_detector
model= Detector(cfg.YOLOX.MODEL, cfg.YOLOX.WEIGHT)
File "\yolox-pytorch\detector.py", line 31, in init
self.exp = get_exp_by_name(model)
File "\yolox-pytorch\exp\build.py", line 36, in get_exp_by_name
return get_exp_by_file(exp_path)
File "\yolox-pytorch\exp\build.py", line 17, in get_exp_by_file
raise ImportError("{} doesn't contains class named 'Exp'".format(exp_file))
ImportError: \yolox-pytorch\exp\custom.py doesn't contains class named 'Exp
'
Thank you
It seems that maybe you changed the project structure and the program could not find the path of the exp file. You can change detector.py to solve it.
Firstly import another function to load exp-file:
from YOLOX.yolox.exp.build import get_exp_by_file # detector.py line 9
And then change self.exp = get_exp_by_name(model)
to self.exp = get_exp_by_file(path)
, where path
is the manually specified exp file path.
For example:
exp_path = 'YOLOX/exps/default/yolox_m.py'
self.exp = get_exp_by_file(exp_path ) # detector.py line 31
It seems that maybe you changed the project structure and the program could not find the path of the exp file. You can change detector.py to solve it.
Firstly import another function to load exp-file:
from YOLOX.yolox.exp.build import get_exp_by_file # detector.py line 9
And then change
self.exp = get_exp_by_name(model)
toself.exp = get_exp_by_file(path)
, wherepath
is the manually specified exp file path.For example:
exp_path = 'YOLOX/exps/default/yolox_m.py' self.exp = get_exp_by_file(exp_path ) # detector.py line 31
@pmj110119 Hello, thank you very much for your quick response.
The problem I think is that the code requests for an EXP in the yolox_m.py in your exemple.
I obtained this when I tried to modify as you suggested to me:
File "track.py", line 33, in __init__
self.detector=build_detector(cfg,use_cuda=use_cuda)
File "yolox-pytorch\detector.py", line 74, in build_detector
model= Detector(cfg.YOLOX.MODEL, cfg.YOLOX.WEIGHT)
File "yolox-pytorch\detector.py", line 34, in __init__
self.exp = get_exp_by_file(exp_path)
File "\yolox-pytorch\exp\build.py", line 17, in get_exp_by_file
raise ImportError("{} doesn't contains class named 'Exp'".format(exp_file))
ImportError: ./exp/custom.py doesn't contains class named 'Exp'
Thank you in advance,
Yes, class EXP should be defined in a py file, and then use get_exp_by_file(file)
to load it.
The yolox_m.py in my example is YOLOX's official exp-file example, you can find it here.
Yes, class EXP should be defined in a py file, and then use
get_exp_by_file(file)
to load it.The yolox_m.py in my example is YOLOX's official exp-file example, you can find it here.
Thank you @pmj110119
I have this in my custom.py ( so i have EXP) what do you think ?
Hello @pmj110119 I have another error, do you know why model is not detected please ?
File "track.py", line 33, in __init__ self.detector=build_detector(cfg,use_cuda=use_cuda) File "C:\Users\chouchen2-admin\PycharmProjects\pythonProjecttest\YoloX\yolox-pytorch\detector.py", line 71, in build_detector model= Detector(cfg.YOLOX.MODEL, cfg.YOLOX.WEIGHT) File "C:\Users\chouchen2-admin\PycharmProjects\pythonProjecttest\YoloX\yolox-pytorch\detector.py", line 40, in __init__ self.model.load_state_dict(checkpoint["model"]) KeyError: 'model'
detector.py :
#sys.path.insert(0, './YOLOX')
import torch
import numpy as np
import cv2
from data.data_augment import preproc
#from data.datasets import COCO_CLASSES
from data.voc_classes import Customer_classes
from exp.build import get_exp_by_name
from exp.build import get_exp_by_file
from utils.visualize import vis
from models import post_process
COCO_MEAN = (0.485, 0.456, 0.406)
COCO_STD = (0.229, 0.224, 0.225)
class Detector():
""" 图片检测器 """
def __init__(self, model='custom', ckpt='./weights/model_custom_last.pth'):
super(Detector, self).__init__()
self.device = torch.device('cuda:0') if torch.cuda.is_available() else torch.device('cpu')
#self.exp = get_exp_by_name
exp_path = "./exp/custom/custom.py"
self.exp = get_exp_by_file(exp_path)
self.test_size = self.exp.test_size # TODO: 改成图片自适应大小
self.model = self.exp.get_model()
self.model.to(self.device)
self.model.eval()
checkpoint = torch.load(ckpt, map_location='cuda:0')
self.model.load_state_dict(checkpoint["model"])
def detect(self, raw_img, visual=True, conf=0.5):
#test_size = [640, 640]
info = {}
img, ratio = preproc(raw_img, self.test_size, COCO_MEAN, COCO_STD)
info['raw_img'] = raw_img
info['img'] = img
img = torch.from_numpy(img).unsqueeze(0)
img = img.to(self.device)
with torch.no_grad():
outputs = self.model(img)
outputs = post_process(
outputs, self.exp.num_classes, self.exp.test_conf, self.exp.nmsthre # TODO:用户可更改
)[0].cpu().numpy()
info['boxes'] = outputs[:, 0:4]/ratio
info['scores'] = outputs[:, 4] * outputs[:, 5]
info['class_ids'] = outputs[:, 6]
info['box_nums'] = outputs.shape[0]
# 可视化绘图
if visual:
info['visual'] = vis(info['raw_img'], info['boxes'], info['scores'], info['class_ids'], conf, Customer_classes)
return info
def build_detector(cfg, use_cuda):
model= Detector(cfg.YOLOX.MODEL, cfg.YOLOX.WEIGHT)
# if use_cuda:
# model.cuda()
return model
if __name__=='__main__':
detector = Detector()
img = cv2.imread('dog.jpg')
img_,out = detector.detect(img)
print(out)```