惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Announcements
Recent Announcements
人人都是产品经理
人人都是产品经理
月光博客
月光博客
博客园 - 三生石上(FineUI控件)
GbyAI
GbyAI
博客园 - 司徒正美
美团技术团队
Vercel News
Vercel News
IT之家
IT之家
U
Unit 42
Y
Y Combinator Blog
罗磊的独立博客
Microsoft Security Blog
Microsoft Security Blog
MongoDB | Blog
MongoDB | Blog
Jina AI
Jina AI
V
Visual Studio Blog
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
MyScale Blog
MyScale Blog
博客园 - 叶小钗
A
About on SuperTechFans
WordPress大学
WordPress大学
Hugging Face - Blog
Hugging Face - Blog
B
Blog RSS Feed

博客园 - Angry_Panda

军事防务 —— 城市反无 —— 无线电侦测设备需要进行攻击目标分配吗?无线电侦测设备的调度在应用中是需要在部署时进行考虑还是在攻击时进行考虑 从一张AI合成的无人机救援图说起 —— 多人机协作的可行性 985大学不相信眼泪,信奉丛林法则;211大学更讲人情味 军事防务 —— 反无激光武器攻后的冷却和充能时间与其攻击的持续时长是否有关系 军事防务 —— 北京顺义李桥镇 (AI大模型生成答案)—— 反无激光武器攻后的冷却和充能时间与其攻击的持续时长是否有关系 军事防务:激光武器的参数 武器装备参数介绍 军事防务:城市反无 —— 无线电干扰设备的攻击范围 百家讲坛 —— 再度翻红 —— 长大后才发现最好的教育早已播下种子,只等阅历浇灌才真正发芽 军事防务 —— AFSim雷达传感器仿真技术 防务 —— 军事建模AFSIM —— 电磁波 为什么倒卖 军火最赚钱 —— 从防务公司的业务发展来看待军费问题 防务:防务业务 —— 武器开火后的返回结果 —— 武器结果:0=开火, 1=命中, 2=未命中 豆包AI回答 —— 为什么城市反无场景下无线电干扰设备即使击中目标也会一直攻击呢 防务:雷达和光电探测设备 —— 无人机的轨迹信息与真实位置信息的差异性,是根据随机函数来实现的吗,比如在真实位置上加一点的随机扰动吗 —— AFsim的手册 北京市顺义区李桥镇 —— 中科星图公司 —— 出行路线交通 —— “东方通勤车”(误区,“东方通勤车”的站点根本就找不到,如果不坐地铁,那么就坐850号公交) 北京市顺义区李桥镇(首都机场附件)—— 中科星图(星图防务) 公司宿舍 【转载】cessium python部署离线版本 ———— 如何使用Python操作三维地图 cessium —— cessium python部署离线版本 如何使用uv安装pytorch 基于GA-BP神经网络的防空导弹实时目标分配方法 【人生哲理】【视频】为什么说该花的钱不花,就会变成灾难呢? 随身移动WiFi ——50元级别的(三网 4G移动网络)—— 网速测试 豆包AI —— 为什么不把离散的状态空间属性用one-shot方式编码而是直接归一化为0到1范围的属性值 dogfight问题中(UAV 无人机空战——狗斗)—— 状态空间设计 为ubuntu系统安装samba网络磁盘,实现局域网中的共享网络磁盘 —— 跨系统文件共享的完整方案 sudo fwupdmgr get-upgrades —— 在 Linux 系统中,用 fwupd 工具查看当前机器所有可升级固件(BIOS/UEFI、SSD、雷电、外设等) git免密认证同步仓库代码报错——git@github.com: Permission denied (publickey) —— 所需的ssh-add加载加密私钥 —— 指定加密私钥存储位置 【转载】 执行 ssh-add 报错 Could not open a connection to your authentication agent —— git免密认证同步仓库代码,所需的ssh-add加载加密私钥 uv python环境管理工具 ubuntu系统python安装pycairo报错:Run-time dependency python found: NO (tried pkgconfig and sysconfig)
神经网络(人工智能)—— CNN模型在训练过程中图片的预处理过...
Angry_Panda · 2026-04-15 · via 博客园 - Angry_Panda

本文测试的项目:

https://github.com/zhongzhengli13/MobileNetV3-for-leaf

硬件:

CPU: 9700k 8核心(16线程,8个物理核心+8个虚拟核心)
GPU: 2060 SUPER

图片从磁盘读取时使用16线程:

image

用时:396秒

image

用时:391秒

image

用时:395秒

图片从磁盘读取时使用4线程:

image

用时:612秒

image

用时:612秒

image

用时:615秒

如果将图片预处理过程中的transform函数去掉,不进行CPU端的图片处理,那么计算效率如何,具体操作如下:

首先对图片进行单独的预处理,不在训练时候进行处理,而是在训练之前就处理,为此增加代码:

x.py 文件

import os
from PIL import Image
from torchvision import transforms

def get_data_transforms():
    """获取图像预处理transforms(和你训练一致)"""
    data_transforms = {
        "train": transforms.Compose([
            transforms.Resize(256),
            transforms.CenterCrop(224),
            transforms.RandomHorizontalFlip(),
            transforms.ToTensor(),
            transforms.Normalize([0.4717, 0.5892, 0.3972],
                                 [0.1704, 0.1531, 0.1755])
        ]),
        "val": transforms.Compose([
            transforms.Resize(256),
            transforms.CenterCrop(224),
            transforms.ToTensor(),
            transforms.Normalize([0.4717, 0.5892, 0.3972],
                                 [0.1704, 0.1531, 0.1755])
        ]),
    }
    return data_transforms

def tensor_to_image(tensor):
    """
    将归一化后的 tensor 转回 PIL 图片
    逆归一化 + 通道转换
    """
    mean = [0.4717, 0.5892, 0.3972]
    std = [0.1704, 0.1531, 0.1755]

    # 逆归一化
    # for t, m, s in zip(tensor, mean, std):
    #     t.mul_(s).add_(m)

    # 转成图片
    tensor = tensor.clamp(0, 1)  # 防止越界
    image = transforms.ToPILImage()(tensor)
    return image

def process_and_replace_images(folder_path, mode='val'):
    """
    批量读取图片 → 预处理 → 覆盖保存
    :param folder_path: 图片文件夹路径
    :param mode: train / val (train会随机翻转)
    """
    transforms_dict = get_data_transforms()
    transform = transforms_dict[mode]

    # 支持的图片格式
    img_exts = ('.jpg', '.jpeg', '.png', '.bmp')

    # 遍历文件夹
    for x in ["Healthy", "Powdery", "Rust"]:
        for filename in os.listdir(folder_path+"/"+mode+"/"+x):
            file_path = os.path.join(folder_path+"/"+mode+"/"+x, filename)
            print(file_path)



            # 只处理图片
            if filename.lower().endswith(img_exts):
                print(f"正在处理: {filename}")

                # 1. 读取图片
                img = Image.open(file_path).convert('RGB')

                # 2. 预处理
                img_tensor = transform(img)

                # 3. tensor 转回图片
                processed_img = tensor_to_image(img_tensor)

                # 4. 覆盖保存原图片
                processed_img.save(file_path)

        print("\n✅ 所有图片处理完成,已覆盖原文件!")

# ------------------- 运行入口(直接改路径即可) -------------------
if __name__ == "__main__":
    # 在这里修改你的图片文件夹路径
    IMAGE_FOLDER = r"./plant-dataset"  # Linux
    # IMAGE_FOLDER = r"C:\Users\xxx\Pictures"  # Windows

    # 处理并覆盖
    process_and_replace_images(IMAGE_FOLDER, mode='train')
    process_and_replace_images(IMAGE_FOLDER, mode='val')

然后修改训练文件 train.py 中的transform 函数,只保留to_tensor功能,具体如下:

image

用时:28秒

image

image

可以看到,当训练过程中不对图片进行CPU端的resize、裁剪工作后,总的性能提高了20倍(都是4个线程读取图片),当保留训练过程中对图片实时进行resize、裁剪工作的情况下如果图片读取和resize、裁剪工作的线程设置为16时计算效率也会提高三分之一,即从600秒缩减到390秒。

从这个例子可以知道,CNN模型在训练过程中图片的预处理过程对整体算法训练过程中计算效率有极大的影响;我们应该尽可能的将CPU的图片处理操作简化掉,如果不能的话也就可能在这一部分进行更多线程的并行以缩短时间消耗。

需要注意的是:

上面的x.py文件中没有使用 transforms.RandomHorizontalFlip() 操作,导致 val 准确率从 95% 掉到了 90% 或 85%,也就是说本文中所进行的图片预处理的单独处理的方法在某种程度上减少了图片的多样性或者可以看做是减少了图片的数量,从而导致训练模型的性能有了一定的下降,不过这个并不是本文要探索的重点,本文的重点在于CPU端的图片预处理操作会极大的影响CNN模型的训练速度,甚至出现了20倍性能的差距,即使我们本文中的处理方法导致了val过程的性能下降,但是也可以通过增加图片数据集大小的方法来弥补,像本文中的这个transforms.RandomHorizontalFlip()操作,即使增加一倍的图片数据那也会提高整体训练速度的10倍,从而可以看到提高神经网络模型训练速度可以对CNN模型的图片进行单独的处理,而不是和训练放在一起。

本博客是博主个人学习时的一些记录,不保证是为原创,个别文章加入了转载的源地址,还有个别文章是汇总网上多份资料所成,在这之中也必有疏漏未加标注处,如有侵权请与博主联系。 如果未特殊标注则为原创,遵循 CC 4.0 BY-SA 版权协议。