【bug】ssd-master使用自己训练的权重模型重新训练

解决思路

由于我想是使用自己训练好的模型增加轮数继续训练,开始我将代码指向模型的地方在model_zoo.py中

    if model_dir is None:
        """
        如果model_dir没有指定(即None),则尝试寻找模型目录。
        首先检查环境变量TORCH_HOME,如果没有设置,则默认使用~/.torch。
        接着检查环境变量TORCH_MODEL_ZOO,如果没有设置,则默认使用TORCH_HOME(或默认的~/.torch)下的models目录作为模型目录。
        """
        torch_home = os.path.expanduser(os.getenv("TORCH_HOME", "~/.torch"))
        model_dir = os.getenv("TORCH_MODEL_ZOO", os.path.join(torch_home, "models"))
    if not os.path.exists(model_dir):
        os.makedirs(model_dir)
    parts = urlparse(url)
    filename = os.path.basename(parts.path)
    if filename == "model_final.pkl":
        # workaround as pre-trained Caffe2 models from Detectron have all the same filename
        # so make the full path the filename by replacing / with _
        filename = parts.path.replace("/", "_")
    cached_file = os.path.join(model_dir, filename)

可以自己修改,我没有修改,我将模型训练好的名称model_final.pth改为vgg16_reducedfc.pth放到了C:\Users\Administrator.torch\models下,并执行train.py文件,但是报错了:RuntimeError: Error(s) in loading state_dict for ModuleList: Missing key(s)

解决问题

在vgg.py中修改load_state_dict函数即可

    def init_from_pretrain(self, state_dict):
        # 调用的load_state_dict方法用预训练的模型参数来初始化自己定义的新网络结构,pytorch中通用的用一个模型的参数初始化另一个模型的层的操作
        # 重要的一个参数strict,默认为True,表示预训练的层和自己定义的网络结构严格对应相等,比如层名和维度
        # self.vgg.load_state_dict(state_dict)
        self.vgg.load_state_dict(state_dict,strict=False)


        # 如果是加载本地下载好的预训练模型,就用torch.load(),再将strict改为False
        # self.vgg.load_state_dict(torch.load(r"C:\Users\Administrator\.torch\models\vgg16_reducedfc.pth"),strict=False)

参考

https://huaweicloud.csdn.net/6380837bdacf622b8df8955d.html
<think>好的,我现在需要解决用户在SSD目标检测算法中遇到的ImageDraw对象没有textsize属性的错误。用户提到的问题具体是AttributeError: 'ImageDraw' object has no attribute 'textsize',并且引用了相关的错误信息[^2][^3]。我需要先理解这个错误的原因,然后找到解决方案。 首先,我应该回忆一下Python中Pillow库的ImageDraw模块。用户可能在使用某个版本的Pillow库时遇到了这个问题。因为textsize方法可能在某些版本中被弃用或者移除。比如,Pillow的10.0.0版本之后,textsize被移除了,导致旧代码调用时出现属性错误。 接下来,我需要验证这个猜测是否正确。查阅Pillow的更新日志或者文档,确认textsize方法的变化。假设确实在较新的版本中,textsize被移除了,那么用户可能需要修改代码以适应新版本。例如,替换textsize为textbbox或者textsize方法被其他函数替代的方式。 然后,解决方案可能包括两个方向:降级Pillow版本到兼容的旧版本,或者修改代码使用新方法。降级虽然直接,但可能影响其他依赖新版本库的功能。因此,推荐修改代码更为稳妥。 例如,原来的代码可能类似这样: ```python draw = ImageDraw.Draw(image) text_width, text_height = draw.textsize(text) ``` 需要改为使用textbbox方法: ```python text_bbox = draw.textbbox((0, 0), text) text_width = text_bbox[2] - text_bbox[0] text_height = text_bbox[3] - text_bbox[1] ``` 或者根据具体实现调整坐标参数。 同时,用户可能还需要检查其他相关代码部分,确保所有使用textsize的地方都被正确替换。此外,如果用户使用的是第三方库或框架(比如SSD的实现代码),可能需要寻找该框架的更新版本或社区提供的补丁。 另外,用户提到的路径问题[^4]可能与此错误无关,但需要确保代码中的文件路径正确,避免其他错误干扰。 总结可能的步骤: 1. 检查Pillow版本,确认是否>=10.0.0。 2. 修改代码中的textsize调用为textbbox或其他替代方法。 3. 测试修改后的代码,确保功能正常。 4. 如果无法修改代码,考虑降级Pillow到9.x版本。 最后,生成相关问题,帮助用户深入理解问题原因和解决方法。</think>针对SSD目标检测算法中出现的`ImageDraw`对象缺少`textsize`属性的错误,以下是分步解决方案: ### 错误原因分析 该错误通常由Pillow库版本升级导致。在Pillow 10.0.0版本中,`ImageDraw.textsize`方法被弃用并替换为`textbbox`方法[^3],直接调用旧方法会触发`AttributeError`。 ### 解决方案 #### 方法1:修改代码适配新版本Pillow 1. **定位代码中调用`textsize`的位置** 在SSD可视化标注或绘制文本的代码段中,找到类似以下代码: ```python draw = ImageDraw.Draw(image) text_width, text_height = draw.textsize(text) ``` 2. **替换为`textbbox`方法** 修改为使用`textbbox`获取文本包围盒并计算尺寸: ```python text_bbox = draw.textbbox((0, 0), text) # 获取文本的(left, top, right, bottom) text_width = text_bbox[2] - text_bbox[0] # right - left text_height = text_bbox[3] - text_bbox[1] # bottom - top ``` 3. **调整坐标参数(根据实际需求)** 若原代码中`textsize`包含字体参数,需补充传递: ```python font = ImageFont.truetype("arial.ttf", 12) text_bbox = draw.textbbox((0, 0), text, font=font) ``` #### 方法2:降级Pillow版本 若无法立即修改代码,可临时降级Pillow: ```bash pip install pillow==9.5.0 ``` ### 验证修复 重新运行SSD检测代码,确认可视化模块不再报错。若使用第三方库(如SSD-PyTorch),需检查其GitHub仓库是否有相关修复补丁。 ### 附加建议 - **检查文件路径问题**:确保数据集路径正确设置,避免`FileNotFoundError`干扰[^4] - **更新依赖库**:同步更新SSD实现代码库以兼容新版Pillow ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值