在写一个印章检测的测试代码时出现问题

在写一个印章检测代码的时候出现了问题


```python
import os
import base64
import torch.hub

root_path = os.getcwd()
yolo_model_path = root_path + '/yolov5/models/seal_detect_best.pt'


class Infer_main:
    def __init__(self, yolo_model_path):
        self.seal_infer = self.yolo_model_load()
        self.model_path = yolo_model_path

    def yolo_model_load(self):
        model = torch.hub.load('D:/workspace/seal/yolov5', 'custom', path=self.model_path, source='local',
                               force_reload=True)
        model.conf = 0.4
        model.eval()
        return model

    def predict(self, images):
        result = {'seal_page': []}
        seal_page = []
        for i in range(len(images)):
            yolo_res = self.seal_infer(images[i], size=640)
            yolo_res_list = yolo_res.pandas().xyxy[0].values.tolist()
            if yolo_res_list:
                for a in range(len(yolo_res_list)):
                    seal_page.append(str(i+1))
        print(type(result['seal_page']))
        result['seal_page'] = seal_page
        print(type(seal_page))

if __name__ == '__main__':
    pic = open("8.png", "rb")
    yolo_model_path='D:/workspace/seal/yolov5/models'
    a = Infer_main(yolo_model_path)
    a.predict(pic.read())

我在写下面的测试代码时出现了一些错误,报错信息如下:

```python
Traceback (most recent call last):
  File "D:\workspace\seal\seal_detection.py", line 37, in 
    a = Infer_main(yolo_model_path)
  File "D:\workspace\seal\seal_detection.py", line 11, in __init__
    self.seal_infer = self.yolo_model_load()
  File "D:\workspace\seal\seal_detection.py", line 15, in yolo_model_load
    model = torch.hub.load('D:/workspace/seal/yolov5', 'custom', path=self.model_path, source='local',
AttributeError: 'Infer_main' object has no attribute 'model_path'

我的最终目的是正确的把图片传递给AI能力检测是否有印章

Infer_main中没有定义model_path属性,或者定义的不对,导致代码没有检测到。你要在init方法中把 self.model_path = yolo_model_path放在第一行,因为你先调用yolo_model_load方法的话,该方法中用到了model_path ,所以需要先调用 self.model_path = yolo_model_path,再调用 self.seal_infer = self.yolo_model_load(),这样yolo_model_load方法中才能检测到你定义的model_path :
具体修改如下:

    def __init__(self, yolo_model_path):
        self.model_path = yolo_model_path
        self.seal_infer = self.yolo_model_load()

如有帮助,点个采纳哦

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632

以下内容部分参考ChatGPT模型:


问题出现在 Infer_main 类的 __init__ 方法中,model_path 没有被正确地绑定到 self 上。可以将 self.model_path = yolo_model_path 改为 self.model_path = yolo_model_path,这样 model_path 就能正确地绑定到 self 上了。另外,predict 方法中需要将图片数据进行处理后再传递给模型进行预测。可以使用 Pillow 库中的 Image 类将图片数据转换为 PIL.Image 对象,然后再将其转换为 PyTorch 的 Tensor 对象传递给模型进行预测。修改后的代码如下:

import os
import base64
import torch.hub
from PIL import Image
import torchvision.transforms as transforms

root_path = os.getcwd()
yolo_model_path = root_path + '/yolov5/models/seal_detect_best.pt'


class Infer_main:
    def __init__(self, yolo_model_path):
        self.model_path = yolo_model_path
        self.seal_infer = self.yolo_model_load()

    def yolo_model_load(self):
        model = torch.hub.load('D:/workspace/seal/yolov5', 'custom', path=self.model_path, source='local',
                               force_reload=True)
        model.conf = 0.4
        model.eval()
        return model

    def predict(self, images):
        result = {'seal_page': []}
        seal_page = []
        for i in range(len(images)):
            img = Image.open(images[i])
            transform = transforms.Compose([
                transforms.Resize((640, 640)),
                transforms.ToTensor(),
            ])
            img_tensor = transform(img)
            img_tensor = img_tensor.unsqueeze(0)
            yolo_res = self.seal_infer(img_tensor, size=640)
            yolo_res_list = yolo_res.pandas().xyxy[0].values.tolist()
            if yolo_res_list:
                for a in range(len(yolo_res_list)):
                    seal_page.append(str(i+1))
        result['seal_page'] = seal_page
        return result


if __name__ == '__main__':
    pic_path = "8.png"
    yolo_model_path = 'D:/workspace/seal/yolov5/models/seal_detect_best.pt'
    a = Infer_main(yolo_model_path)
    result = a.predict([pic_path])
    print(result)

这里使用了 Pillow 库中的 Image.open 方法打开图片文件,然后使用 transforms.Compose 创建了一个转换器,包括将图片大小调整为 640×640 和将 PIL.Image 对象转换为 PyTorch 的 Tensor 对象。将转换后的 Tensor 对象传递给模型进行预测,得到检测结果后将其转换为列表,然后将结果保存到 result 字典中并返回。在 main 函数中,传递了一个图片文件路径的列表作为参数,得到检测结果后将其打印出来。


如果我的建议对您有帮助、请点击采纳、祝您生活愉快