yolov3 pytorch错误集合

本文解决了一个关于PyTorch YOLOv3项目的配置文件错误,详细介绍了由于浮点数除法导致网络尺寸不匹配的问题,并给出了正确的网络层配置。

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


 File "D:\tmp\pytorch-yolo3\cfg.py", line 134, in print_cfg

    assert(prev_width == out_widths[layers[1]])

是因为cfg中有除法,python3中除法自动转为float类型,需要//变成整除

这个错误,把网络后面几层变成了55,

原版的:

   87 conv    256  1 x 1 / 1    26 x  26 x 768   ->    26 x  26 x 256
   88 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512
   89 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256
   90 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512
   91 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256
   92 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512
   93 conv    255  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 255
   94 detection
   95 route  91
   96 conv    128  1 x 1 / 1    26 x  26 x 256   ->    26 x  26 x 128
   97 upsample           * 2    26 x  26 x 128   ->    52 x  52 x 128
   98 route  97 36
   99 conv    128  1 x 1 / 1    52 x  52 x 384   ->    52 x  52 x 128
  100 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256
  101 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128
  102 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256
  103 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128
  104 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256
  105 conv    255  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 255

  106 detection

变错的:

  87 conv    256  1 x 1 / 1    27 x  27 x 768   ->    27 x  27 x 256
   88 conv    512  3 x 3 / 1    27 x  27 x 256   ->    27 x  27 x 512
   89 conv    256  1 x 1 / 1    27 x  27 x 512   ->    27 x  27 x 256
   90 conv    512  3 x 3 / 1    27 x  27 x 256   ->    27 x  27 x 512
   91 conv    256  1 x 1 / 1    27 x  27 x 512   ->    27 x  27 x 256
   92 conv    512  3 x 3 / 1    27 x  27 x 256   ->    27 x  27 x 512
   93 conv    255  1 x 1 / 1    27 x  27 x 512   ->    27 x  27 x 255
   94 detection
   95 route  91
   96 conv    128  1 x 1 / 1    27 x  27 x 256   ->    27 x  27 x 128
   97 upsample           * 2    27 x  27 x 128   ->    55 x  55 x 128
   98 route  97 36
   99 conv    128  1 x 1 / 1    55 x  55 x 384   ->    55 x  55 x 128
  100 conv    256  3 x 3 / 1    55 x  55 x 128   ->    55 x  55 x 256
  101 conv    128  1 x 1 / 1    55 x  55 x 256   ->    55 x  55 x 128
  102 conv    256  3 x 3 / 1    55 x  55 x 128   ->    55 x  55 x 256
  103 conv    128  1 x 1 / 1    55 x  55 x 256   ->    55 x  55 x 128
  104 conv    256  3 x 3 / 1    55 x  55 x 128   ->    55 x  55 x 256
  105 conv    255  1 x 1 / 1    55 x  55 x 256   ->    55 x  55 x 255
  106 detection

<think>好的,我现在需要帮用户编写一个Python脚本,实现遍历两个文件夹中的PNG图像,找到同名文件,然后相减取绝对值,保存结果到另一个文件夹。首先,我需要理清楚用户的需求和可能的实现步骤。 用户的需求是处理两个文件夹中的同名图像,这些图像都是640x640的单通道灰度图。处理方式是对它们进行相减取绝对值,然后将结果保存到第三个文件夹。我需要确保代码能够正确找到同名文件,并且处理图像的正确性。 首先,我需要考虑如何遍历这两个文件夹。可以使用os模块来列出目录中的文件,或者用glob模块来匹配PNG文件。然后,需要提取文件名(不带后缀)来比较是否在两个文件夹中都存在。 接下来,处理图像部分。由于是单通道灰度图,可以用PIL库或者OpenCV来读取。需要注意图像的模式是否为“L”(即灰度模式)。然后进行相减操作,取绝对值,生成新的图像。这里要确保两张图像的尺寸相同,用户提到是640x640,但代码中可能需要加入检查,防止尺寸不一致导致的错误。 保存路径方面,第三个文件夹需要存在,否则保存时会出错。可以在保存前检查目录是否存在,如果不存在则创建,使用os.makedirs。 然后,可能的异常处理,比如文件无法读取、图像尺寸不一致、非灰度图等情况,是否需要处理?用户可能希望代码具备一定的健壮性,但需求中没有特别说明,可能暂时不考虑,但可以添加基本的检查。 现在,整理步骤: 1. 遍历两个输入文件夹,获取所有PNG文件的文件名(不带后缀)。 2. 找出两个文件夹中共同存在的文件名。 3. 对于每个共同文件名,读取两张图像,确保都是单通道灰度。 4. 相减并取绝对值,得到新图像。 5. 将新图像保存到输出文件夹,保持同名。 接下来,编写代码的大致结构: 使用os模块处理路径,用glob.glob获取文件列表。提取基名,使用集合的交集找出共同的文件名。然后用PIL.Image打开图像,转换为numpy数组进行计算,或者直接用PIL的像素操作。不过PIL的像素操作可能较慢,numpy更高效。 例如,用PIL读取两张图像,转换为numpy数组,相减后取绝对值,再转换回Image对象保存。需要注意数据类型,uint8可能会溢出,但取绝对值后应该没问题,因为灰度值范围是0-255,相减可能得到负数,取绝对值后应限制在0-255之间。不过,如果结果超过255,可能需要处理,但用户可能希望直接取模或者截断?或者可能相减后的绝对值不会超过255,因为原图是单通道的,所以相减后的绝对值最大可能是255(如0-255的情况)。所以直接使用uint8类型应该可以。 代码示例: 导入必要的库: import os from PIL import Image import numpy as np 定义输入和输出路径: folder1 = r"D:\lwm\JRD\yolov8-pytorch-master\VOCdevkit\VOC2007\JRD_test_outputs\44th" folder2 = r"D:\lwm\JRD\yolov8-pytorch-master\VOCdevkit\VOC2007\JPEGImages" output_folder = r"D:\lwm\JRD\yolov8-pytorch-master\VOCdevkit\VOC2007\JRDmaps\44th" 确保输出文件夹存在: os.makedirs(output_folder, exist_ok=True) 获取两个文件夹中的PNG文件列表: files1 = {os.path.splitext(f)[0] for f in os.listdir(folder1) if f.endswith(&#39;.png&#39;)} files2 = {os.path.splitext(f)[0] for f in os.listdir(folder2) if f.endswith(&#39;.png&#39;)} 共同的文件名: common_files = files1 & files2 遍历每个共同文件: for file in common_files: # 构造文件路径 path1 = os.path.join(folder1, file + &#39;.png&#39;) path2 = os.path.join(folder2, file + &#39;.png&#39;) # 读取图像 img1 = Image.open(path1) img2 = Image.open(path2) # 转换为灰度图(确保) if img1.mode != &#39;L&#39;: img1 = img1.convert(&#39;L&#39;) if img2.mode != &#39;L&#39;: img2 = img2.convert(&#39;L&#39;) # 转换为numpy数组 arr1 = np.array(img1) arr2 = np.array(img2) # 检查尺寸 if arr1.shape != arr2.shape: print(f"尺寸不一致,跳过文件:{file}") continue # 相减取绝对值 diff = np.abs(arr1 - arr2) # 转换为图像 diff_img = Image.fromarray(diff.astype(&#39;uint8&#39;)) # 保存 output_path = os.path.join(output_folder, file + &#39;.png&#39;) diff_img.save(output_path) 这里需要注意,如果图像不是单通道,可能需要进行转换。例如,如果原图是RGB,用户可能需要转换为灰度。但用户已经说明是单通道灰度图,所以可能不需要,但为了安全,可以强制转换。 另外,检查尺寸是否相同,避免错误。 可能的问题:如果图像的文件名相同但大小写不同,比如file.PNG和file.png,在Windows上可能视为相同,但代码会视为不同。但用户可能在同一个系统下处理,所以可能没问题。 另外,保存时是否覆盖已有文件?用户希望另存,所以不管是否已存在都保存。 现在,测试一下代码是否可行。例如,处理两个图像,相减是否正确。 此外,是否需要考虑图像的数据类型?比如,如果图像是16位的话,但用户说是单通道8位的,所以没问题。 综上,这段代码应该可以满足用户的需求。接下来,可能需要将代码整理为函数形式,或者直接写成脚本。</think><< 以下是实现该功能的Python代码: ```python import os import numpy as np from PIL import Image def process_images(folder1, folder2, output_folder): # 确保输出目录存在 os.makedirs(output_folder, exist_ok=True) # 获取文件夹1中的png文件集合(不带后缀) files1 = {os.path.splitext(f)[0] for f in os.listdir(folder1) if f.lower().endswith(&#39;.png&#39;)} # 获取文件夹2中的png文件集合(不带后缀) files2 = {os.path.splitext(f)[0] for f in os.listdir(folder2) if f.lower().endswith(&#39;.png&#39;)} # 获取共同文件名 common_files = files1 & files2 for filename in common_files: # 构建完整文件路径 img1_path = os.path.join(folder1, filename + ".png") img2_path = os.path.join(folder2, filename + ".png") output_path = os.path.join(output_folder, filename + ".png") try: # 打开图像并转换为灰度 with Image.open(img1_path) as img1, Image.open(img2_path) as img2: # 转换为单通道灰度图 img1_gray = img1.convert("L") img2_gray = img2.convert("L") # 转换为numpy数组 arr1 = np.array(img1_gray) arr2 = np.array(img2_gray) # 验证尺寸 if arr1.shape != (640, 640) or arr2.shape != (640, 640): print(f"警告:{filename} 尺寸不符合640x640要求,已跳过") continue # 计算差异图(绝对值差异) diff = np.abs(arr1 - arr2) # 转换为图像并保存 Image.fromarray(diff.astype(np.uint8)).save(output_path) print(f"已处理:{filename}") except Exception as e: print(f"处理 {filename} 时发生错误:{str(e)}") # 调用函数 folder1 = r"D:\lwm\JRD\yolov8-pytorch-master\VOCdevkit\VOC2007\JRD_test_outputs\44th" folder2 = r"D:\lwm\JRD\yolov8-pytorch-master\VOCdevkit\VOC2007\JPEGImages" output_folder = r"D:\lwm\JRD\yolov8-pytorch-master\VOCdevkit\VOC2007\JRDmaps\44th" process_images(folder1, folder2, output_folder) ``` 代码解释: 1. 使用集合操作快速找到两个文件夹中的同名文件 2. 强制将输入图像转换为单通道灰度模式(L模式) 3. 使用numpy进行高效的矩阵运算计算绝对值差异 4. 添加了尺寸验证和异常处理机制 5. 使用with语句确保正确关闭图像文件 6. 自动创建输出目录(如果不存在) 7. 保留原始文件名格式,确保输出文件名与输入一致 注意事项: - 要求输入图像必须都是640x640尺寸 - 会自动处理不同大小写的.png扩展名(如.PNG) - 差异图将保存为8位无符号整型的单通道PNG - 如果遇到错误会跳过当前文件继续处理
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI算法网奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值