[DL课程作业本地化 解疑] load_model() 出现编码错误

本文解决在使用吴恩达课程中的YOLO算法进行目标检测时遇到的模型加载错误问题,通过对比本地与GitHub上的keras源码差异,给出了有效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.问题:
在吴恩达第四课第三周作业 利用YOLO算法实现Detection中,需要导入预先训练好的模型,此时用到keras中的函数load_model(),运行时报出以下错误:

File "D:/Program Files/Anaconda3/envs/Tensorflow/Lib/site-packages/keras/utils/generic_utils.py", line 224, in func_load
    raw_code = codecs.decode(code.encode('ascii'), 'base64')

UnicodeEncodeError: 'ascii' codec can't encode character '\xe3' in position 0: ordinal not in range(128)

2.原因:
由于出现此问题前,博主曾在本地运行过该程序,未出现此问题,之后重新安装过keras,因此初步认定为keras版本导致此问题出现。
通过查看本地generic_utils.py 中的func_load()函数及GitHub-Keras/utlis/generic_utils.py
中对应函数,发现存在差异:
本地:

if closure is not None:
        closure = tuple(ensure_value_to_cell(_) for _ in closure)
raw_code = codecs.decode(code.encode('ascii'), 'base64')

code = marshal.loads(raw_code)

GitHub:

if closure is not None:
        closure = tuple(ensure_value_to_cell(_) for _ in closure)
try:
    raw_code = codecs.decode(code.encode('ascii'), 'base64')
except (UnicodeEncodeError, binascii.Error):
    # backwards compatibility for models serialized prior to 2.1.2
    raw_code = code.encode('raw_unicode_escape')

code = marshal.loads(raw_code)

3.解决方法
更改代码并在文件头加入

import binascii

问题解决。

<think>我们正在处理用户在Halcon中调用apply_dl_model时因图像尺寸错误导致的问题。根据之前的上下文,用户已经了解基本的推理流程,但遇到了图像尺寸不匹配的错误。以下将详细解释错误原因和解决方案。错误原因分析:当使用apply_dl_model时,输入图像的尺寸必须与模型期望的输入尺寸一致。这个尺寸通常在训练模型时确定,并在模型文件中保存。如果输入图像的尺寸不符合,就会报错。解决方案步骤:1.**获取模型要求的输入尺寸**:使用`get_dl_model_param`获取模型定义的输入宽度和高度。```halconget_dl_model_param(DLModelHandle,'image_size_variables',[ImageWidth,ImageHeight])```注意:这里返回的是一个包含宽度和高度的元组,我们可以分别提取出来。2.**调整输入图像尺寸**:有两种方式处理输入图像尺寸:a)在预处理阶段自动调整:通过设置预处理参数,使得在预处理阶段将图像缩放到模型要求的尺寸。但是注意,在创建预处理参数时,我们使用的是`create_dl_preprocess_param`,其中有一个参数可以设置是否保持宽高比('maintain_aspect_ratio')。如果设置为'true',则会保持宽高比,但可能需要在图像周围填充灰色区域;如果设置为'false',则会直接拉伸图像,可能导致变形。用户需要根据训练时的设置来选择。b)在读取图像后,手动调整图像尺寸:如果预处理参数设置不当,或者需要特殊处理,可以手动调整。3.**正确的预处理参数设置**:在创建预处理参数时,确保指定正确的目标尺寸。例如:```halconcreate_dl_preprocess_param('model_specific',ImageWidth,ImageHeight,3,'false',PreprocessParam)```这里,第三个参数是通道数,一般彩色图像为3。第四个参数'maintain_aspect_ratio'设置为'false'表示不保持宽高比(直接拉伸)。如果训练时是保持宽高比的,则这里应设置为'true'。4.**检查图像通道数**:模型可能是基于RGB或灰度图像训练的,所以需要确保输入图像与模型期望的通道数一致。5.**使用正确的预处理函数**:使用`preprocess_dl_model`对图像进行预处理,它会根据预处理参数调整图像尺寸和通道等。6.**错误排查**:如果仍然报错,检查以下几点:-确保模型句柄DLModelHandle有效。-确保输入图像已经被正确读取(使用`get_image_size`检查原始图像尺寸)。-确保预处理后的图像尺寸与模型要求一致(同样使用`get_image_size`检查PreprocessedImage的尺寸)。示例代码(修正尺寸问题):```halcon*加载模型read_dl_model('model.hdl',DLModelHandle)*获取模型输入尺寸get_dl_model_param(DLModelHandle,'image_size_variables',ImageSize)ImageWidth:=ImageSize[0]ImageHeight:=ImageSize[1]*创建预处理参数,注意这里设置不保持宽高比(根据训练设置调整)create_dl_preprocess_param('model_specific',ImageWidth,ImageHeight,3,'false',PreprocessParam)*读取图像read_image(Image,'test.jpg')*预处理图像(会自动调整尺寸)preprocess_dl_model(Image,PreprocessedImage,PreprocessParam)*检查预处理后的图像尺寸是否正确get_image_size(PreprocessedImage,WidthPreprocessed,HeightPreprocessed)*打印尺寸,确保与模型要求一致*然后进行推理create_dict(DLResult)apply_dl_model(DLModelHandle,PreprocessedImage,DLResult)```如果训练时预处理是保持宽高比的,那么创建预处理参数时应设置为'true',并注意填充方式(可能需要设置填充颜色,默认灰色填充):```halconcreate_dl_preprocess_param('model_specific',ImageWidth,ImageHeight,3,'true',PreprocessParam)```另外,有时错误可能不是图像整体尺寸,而是模型要求多张图像(批量处理)或通道尺寸不对。但根据报错信息,最常见的就是宽度和高度不对。总结:确保输入模型前的图像尺寸(包括宽度、高度和通道数)与模型要求完全一致。如果上述步骤仍然不能解决问题,可能需要检查模型训练时的设置,或者提供更多错误信息。相关问题:1.如何获取Halcon深度学习模型的具体参数?2.Halcon中如何处理不同尺寸的输入图像同时保持宽高比?3.在Halcon中,预处理函数preprocess_dl_model的详细参数设置有哪些?</think> 在 Halcon 中调用 `apply_dl_model` 时遇到图像尺寸错误是常见问题,以下是详细的解决方案: ### 图像尺寸错误的根本原因 模型训练和推理需要**严格的图像尺寸一致性**,三个关键维度必须完全匹配: 1. **宽度** ($w$) - $x$ 方向像素数量 2. **高度** ($h$) - $y$ 方向像素数量 3. **通道数** ($c$) - RGB(3) 或灰度(1) 任何维度不匹配都会导致 `apply_dl_model` 报错 [^1]。 ### 分步解决方案 #### 1. 获取模型要求的尺寸参数 ```halcon * 获取模型定义的输入尺寸 get_dl_model_param (DLModelHandle, 'image_size_variables', ImageSize) * 输出格式: [Width, Height, Channels] ``` #### 2. 动态调整输入图像(推荐) ```halcon read_image (InputImage, 'your_image.jpg') get_image_size (InputImage, OriginalWidth, OriginalHeight) count_channels (InputImage, OriginalChannels) * 动态缩放图像 zoom_image_size (InputImage, ScaledImage, ImageSize[0], ImageSize[1], 'constant') ``` #### 3. 验证通道一致性 ```halcon * 通道转换(必要时) if (OriginalChannels != ImageSize[2]) * 灰度转RGB if (OriginalChannels == 1 and ImageSize[2] == 3) compose3 (InputImage, InputImage, InputImage, ColorImage) * RGB转灰度 elseif (OriginalChannels == 3 and ImageSize[2] == 1) rgb1_to_gray (InputImage, GrayImage) endif endif ``` #### 4. 完整的预处理流程 ```halcon * 创建预处理参数 create_dl_preprocess_param ('model_specific', ImageSize[0], ImageSize[1], ImageSize[2], 'constant', PreprocessParam) * 执行预处理 preprocess_dl_model (FinalImage, PreprocessedImage, PreprocessParam) ``` ### 避免尺寸错误的实用技巧 1. **批量处理自动化** ```halcon list_files ('image_dir', 'files', ImageFiles) foreach (File in ImageFiles) read_image (Image, File) * 自动缩放代码... endforeach ``` 2. **设置容错机制** ```halcon try apply_dl_model (DLModelHandle, PreprocessedImage, DLResult) catch (Exception) * 记录错误图像路径 set_tposition (WindowHandle, 10, 10) write_string (WindowHandle, '尺寸错误: ' + File) endcatch ``` 3. **尺寸验证检查点** ```halcon * 预处理前后尺寸验证 get_image_size (PreprocessedImage, W, H) assert (W == ImageSize[0] and H == ImageSize[1]) ``` > **关键提示**:工业检测中如果要求保持原始比例,可在预处理时添加灰边填充: > ```halcon > create_dl_preprocess_param ('model_specific', 512, 512, 3, 'true', PreprocessParam) > ``` ### 常见错误排查表 | 错误类型 | 检查点 | 解决代码 | |---------|--------|----------| | 宽度/高度不匹配 | `get_image_size()` | `zoom_image_size()` | | 通道数不匹配 | `count_channels()` | `compose3()`/`rgb1_to_gray()` | | 批处理尺寸不一致 | 图像列表尺寸差异 | 预处理循环中统一尺寸 | | GPU显存不足 | 大尺寸图像 | 添加`reduce_domain()`裁剪ROI | 通过以上方法可彻底解决 Halcon 语义分割中的图像尺寸匹配问题。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值