news 2026/6/3 18:27:19

西瓜生熟自动判别工具包:PyTorch+MobileNet训练脚本+中文注释+图形界面

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
西瓜生熟自动判别工具包:PyTorch+MobileNet训练脚本+中文注释+图形界面

本文还有配套的精品资源,点击获取

简介:一套面向农业一线人员的轻量级西瓜成熟度识别实现方案,基于PyTorch框架调用MobileNet模型,支持从数据准备到结果可视化的完整闭环。包含三个核心功能脚本:01生成txt.py自动整理图像路径并划分训练集与验证集;02CNN训练数据集.py执行模型训练、保存最佳权重(model.ckpt)及训练过程可视化;03pyqt界面.py提供点击式操作入口,可直接加载模型对单张或批量西瓜图片进行成熟/未成熟二分类预测。所有代码均含逐行中文注释,覆盖数据读取(需用户按‘西瓜成熟’‘西瓜未成熟’两个文件夹组织图像)、模型定义、损失计算、学习率调整、准确率统计及GUI响应逻辑。不附带原始图像,建议每类准备50张以上清晰正面西瓜照片即可启动训练。依赖环境明确写入requirement.txt(适配Python 3.7–3.8、PyTorch 1.7.1/1.8.1),推荐使用Anaconda创建独立环境。配套说明文档.docx详解各步骤作用、常见报错原因(如路径错误、CUDA不可用、图像尺寸不一致)及解决方法,1.jpg为数据目录结构示意图,帮助快速理解输入格式。

1. 项目概述:为什么一个西瓜需要“被读懂”?

在田间地头,老瓜农靠敲、看、摸就能八九不离十判断西瓜熟没熟——这背后是几十年积累的感官经验。但当你要在采摘季每天过手上千个西瓜,或者想把这套经验标准化、教给新员工、甚至嵌入自动化分拣线时,“敲一敲听声”就很难量化、复现和规模化。我去年在山东寿光一个合作社做技术驻点时,亲眼见过分拣工人因判断失误,把一批刚转色的优质瓜误判为生瓜,直接拉去做了饲料,损失不小。那会儿我就意识到:农业场景里最缺的不是算法模型,而是能真正扛住泥土、汗水、强光和低算力环境的“接地气”工具

这套“西瓜生熟自动判别工具包”,就是从这个痛点里长出来的。它不是实验室里的炫技Demo,而是一套你插上U盘、配好环境、放好照片,两小时内就能跑通预测结果的实操方案。核心就三件事:怎么让电脑认出哪张图是熟瓜、怎么教会它认、最后怎么让没写过代码的人也能点几下就用上。它用的是MobileNet——不是因为它是SOTA(当前最优),恰恰相反,是因为它够“糙”也够“稳”:参数量只有ResNet-50的1/10,推理速度在普通笔记本CPU上也能跑到35帧/秒,模型文件不到12MB,连树莓派4B都能轻松加载。PyTorch选1.7.1/1.8.1也不是偶然,这两个版本对CUDA 10.2兼容性极好,而市面上大量老旧工控机、边缘盒子预装的就是这个组合,避免了升级驱动引发的连锁崩溃。

三个脚本的名字看着土,但每个都卡在关键链路上:01生成txt.py解决的是农业数据最头疼的问题——没有标准标注平台,农民拍的照片散落在手机、微信、U盘里,命名五花八门;02CNN训练数据集.py把训练过程拆解成可打断、可回溯、可监控的模块,哪怕你只有一块GTX 1050 Ti,也能边训练边看loss曲线是否发散;03pyqt界面.py则彻底绕开命令行,用一个带按钮、进度条、结果框的窗口,让合作社大姐点开就能测瓜,不用记任何命令。所有注释都是中文,不是“# 定义模型”,而是“# 这里定义MobileNet主干网络,像搭积木一样先堆卷积层,再接全局平均池化——省掉全连接层,既减参又防过拟合”。它不附带图片?对,因为真实场景里,你的瓜和我的瓜长得就不一样:新疆的麒麟瓜皮纹细密,海南的黑美人底色偏青,东北的无籽瓜瓜蒂微凹……模型必须学你田里的瓜,而不是网上搜来的图。所以目录结构强制要求两个文件夹:“西瓜成熟”和“西瓜未成熟”,这不是形式主义,是倒逼你用真实样本构建业务闭环。我试过用50张图起步训练,第三轮验证准确率就冲到86%,到第15轮稳定在92%左右——对一线分拣来说,这个置信度已经足够触发“人工复检”动作,而不是盲目信任。

2. 整体设计思路与方案选型逻辑

2.1 为什么是MobileNet,而不是更火的ViT或EfficientNet?

很多人看到图像分类第一反应是“上ViT”,但我在山东大棚里调试时发现,一块i5-8250U+MX150的旧笔记本,跑ViT-base要2.3秒/张,而MobileNetV2只要0.028秒。差了80多倍。这不是理论指标,是实测——用同一张4096×3072的西瓜高清图,在关闭GPU加速的情况下跑出来的数字。MobileNet的核心优势在于它的深度可分离卷积(Depthwise Separable Convolution),我把这个结构画成一张纸来理解:普通卷积像用整块橡皮擦整个字,而深度可分离卷积是先用细笔尖(depthwise卷积)沿着字的笔画方向擦一遍,再用软橡皮(pointwise卷积)把擦过的区域整体抹匀。前者计算量是3×3×3×C_in×C_out,后者是3×3×C_in + 1×1×C_in×C_out,当通道数C_in=64、C_out=128时,计算量直接从73728降到12288,压缩比达6倍。这正是农业边缘设备最渴求的——用最小的计算代价守住精度底线。

至于为什么不是EfficientNet,关键在部署成本。EfficientNet-B0虽然精度略高0.3%,但它依赖复杂的复合缩放(compound scaling)策略,训练时必须严格按论文设定的width/depth/resolution比例调整,稍有偏差loss就爆炸。而MobileNetV2的结构极其透明:17个残差块,每个块的通道数、步长、膨胀系数都写死在源码里,你改一行就能知道影响范围。我在02CNN训练数据集.py里把backbone部分单独拎出来封装成MobileNetV2_FeatureExtractor()类,就是为了方便替换——比如你后续想试试ShuffleNetV2,只需重写这个类的forward()方法,其他训练逻辑完全不动。这种“主干可拔插”的设计,是给未来留的活路,不是为了现在炫技。

2.2 为什么训练脚本要拆成三个独立文件,而不是一个main.py?

这是被现实教训砸出来的设计。去年在江苏东山镇帮一个瓜农做试点,他用一台二手ThinkPad T480(i5-8250U + 8GB内存)跑训练,结果main.py跑着跑着内存爆了,报错信息全是OSError: [Errno 12] Cannot allocate memory。查了半天才发现,他把数据加载、模型训练、可视化绘图全塞在一个进程里,PyTorch的Dataloader开了8个worker,每个worker又缓存了200张图,加上模型参数,直接吃光16GB虚拟内存。后来我把流程硬切成三段:

  • 01生成txt.py只做一件事:遍历两个类别文件夹,把每张图的绝对路径+标签写进train.txtval.txt,格式是/path/to/西瓜成熟/IMG_001.jpg 1。它不加载图片,不占显存,纯IO操作,3000张图生成列表只要1.2秒;
  • 02CNN训练数据集.py专注训练:用torch.utils.data.Dataset子类读取txt文件,按需加载图片(不是一次性全读进内存),训练完自动保存model.ckpt(含模型权重、优化器状态、当前epoch),断电重启后能从断点继续;
  • 03pyqt界面.py彻底脱离训练环境:它只加载.ckpt文件,不碰任何训练相关库,连torchvision都不需要,只依赖PyQt5PIL,这样即使你删了PyTorch,GUI依然能运行预测。

这种“时空解耦”设计,本质是把资源消耗错峰。农民白天拍照整理数据,晚上让旧电脑挂机训练,第二天早上打开GUI直接测新瓜——三个环节互不干扰。我在脚本里还埋了个小技巧:02CNN训练数据集.py默认开启torch.backends.cudnn.benchmark = True,但加了异常捕获,如果检测到CUDA不可用(比如没独显),自动切回CPU模式,并把batch_size从32降到8,保证流程不断。

2.3 图形界面为何坚持用PyQt5,而不是Streamlit或Gradio?

Streamlit确实香,写三行代码就能出Web界面。但问题在于:农业现场根本没有稳定WiFi。我在云南元谋的基地测试时,用手机热点连Streamlit,上传一张图要等15秒,中间断连两次,日志里全是ConnectionResetError。而PyQt5是本地二进制程序,双击即开,所有逻辑在本机跑,不依赖网络。更重要的是控制粒度——Streamlit的按钮点击后只能触发整个脚本重跑,而PyQt5我能精确控制:点击“选择图片”只调用QFileDialog,点击“开始识别”才加载模型并推理,识别完立刻释放显存(torch.cuda.empty_cache()),避免连续测100张图导致显存泄漏。03pyqt界面.py里那个进度条也不是摆设:它绑定的是QThread子线程,主线程永远响应UI事件,不会出现“点击没反应、界面卡死”的情况。我甚至给批量识别加了并发控制——默认最多开3个线程同时处理图片,防止把CPU打满导致系统假死。这些细节,是Web框架天生难以覆盖的。

3. 核心细节解析与实操要点

3.1 数据准备:两个文件夹背后的硬性约束

很多用户第一次跑失败,90%栽在数据组织上。这里必须说透:西瓜成熟西瓜未成熟这两个文件夹名,不是建议,是代码里写死的字符串。打开01生成txt.py第15行,你会看到:

class_names = ['西瓜未成熟', '西瓜成熟'] # 注意顺序!索引0对应未成熟,索引1对应成熟

这意味着:如果你把文件夹改成unriperipe,脚本会直接报错FileNotFoundError,因为它根本不会去找这两个名字的目录。更隐蔽的坑是图片格式——脚本默认只读.jpg.jpeg,如果你混进了.png.JPG(大写),os.listdir()返回的文件名大小写敏感,就会漏掉。我在01生成txt.py第42行加了强制小写转换:

for img_name in os.listdir(class_dir): if img_name.lower().endswith(('.jpg', '.jpeg')): # .lower()确保JPG也被识别 img_path = os.path.join(class_dir, img_name) # 后续处理...

但最致命的是图像尺寸一致性。MobileNet输入要求224×224像素,而农民拍的图千奇百怪:有的横屏有的竖屏,有的带黑边有的裁剪过度。如果直接resize,熟瓜的红色瓤和生瓜的白色筋络可能被拉伸变形。我的解决方案是在02CNN训练数据集.py的数据增强部分,用transforms.Resize((256, 256))先等比放大到短边256,再用transforms.CenterCrop(224)抠中心——这样既保留主体特征,又避免畸变。但前提是原始图不能太糊。我实测过:iPhone 12拍的图(4032×3024)缩放到224×224后PSNR仍达38.2dB,而某安卓千元机拍的图(2048×1536)缩放后PSNR跌到32.1dB,识别率直接降7%。所以文档里强调“清晰正面照片”,不是客套话,是数学约束。

提示:用手机拍时,把西瓜放在白纸或浅灰布上,关掉闪光灯,用专业模式锁定ISO 100、快门1/125s,手动对焦在瓜脐位置。这样拍出来的图,纹理对比度高,模型最容易学。

3.2 模型构建:MobileNetV2的轻量化改造

官方MobileNetV2最后一层是1000维输出(ImageNet类别),但我们只需要2维(熟/生)。02CNN训练数据集.py第88行开始重构分类头:

# 原始MobileNetV2的classifier是: # (1): Linear(in_features=1280, out_features=1000, bias=True) # 我们替换成: self.classifier = nn.Sequential( nn.Dropout(0.2), # 防止过拟合,农业数据量小,Dropout比L2正则更有效 nn.Linear(1280, 256), # 先降维到256,保留更多特征 nn.ReLU(inplace=True), nn.Dropout(0.2), nn.Linear(256, 2) # 最终输出2类 )

为什么要加ReLU和两层Dropout?因为农业图像噪声大:光照不均造成局部过曝、叶片遮挡形成阴影、水珠反光产生高亮斑点。单纯用一层Linear,模型容易记住这些噪声模式。加ReLU激活后,负值被截断,相当于强制模型关注“有信息”的区域;两层Dropout则让每次训练随机屏蔽部分神经元,迫使模型学习更鲁棒的特征组合。我在山东的对比实验显示:加了这两层后,验证集准确率提升4.2%,更重要的是,对模糊、逆光图的误判率下降了11%。

另一个关键是冻结主干网络(Freeze Backbone)02CNN训练数据集.py第105行:

for param in self.features.parameters(): param.requires_grad = False # 冻结前16个残差块 # 只训练最后3个残差块和整个classifier

理由很实在:MobileNetV2前16个块学的是通用纹理(边缘、斑点、颜色块),这些在西瓜图上已经足够用;后3个块才开始组合高级语义(瓜皮纹路走向、瓤色分布)。如果全放开训练,小数据集(每类50张)会导致前面的通用特征被破坏,模型反而退化。我试过全参数训练,loss曲线剧烈震荡,最终准确率卡在83%不上升;而冻结主干后,loss平滑下降,15轮就收敛。

3.3 训练循环:不只是调用fit()那么简单

PyTorch没有Keras那种model.fit(),所以02CNN训练数据集.py第150行起的手写训练循环,每一行都有讲究:

for epoch in range(start_epoch, num_epochs): model.train() # 切换到训练模式,启用Dropout和BN train_loss = 0.0 train_corrects = 0 for inputs, labels in train_loader: # DataLoader按batch喂数据 inputs, labels = inputs.to(device), labels.to(device) # GPU加速 optimizer.zero_grad() # 清空梯度,否则会累加! outputs = model(inputs) # 前向传播 _, preds = torch.max(outputs, 1) # 取最大概率的类别索引 loss = criterion(outputs, labels) # 计算交叉熵损失 loss.backward() # 反向传播,计算梯度 optimizer.step() # 更新权重 train_loss += loss.item() * inputs.size(0) # 累加loss(按batch size加权) train_corrects += torch.sum(preds == labels.data) # 统计正确数

这里有两个新手必踩的坑:
第一,optimizer.zero_grad()必须在每个batch开头调用。我见过有人把它放在循环外,结果梯度越积越大,loss直接飙到inf
第二,train_loss的累加要用loss.item() * inputs.size(0),而不是loss.item()。因为loss.item()是当前batch的平均损失,乘以batch_size才是总损失,这样才能算出epoch级别的平均loss。

学习率调度也动了手脚:不用简单的StepLR,而是ReduceLROnPlateau——当验证loss连续3轮不下降时,学习率自动减半。这比固定衰减更适应农业数据的波动性。我在脚本里设了patience=3, factor=0.5, min_lr=1e-6,实测效果比固定学习率提升2.3%准确率。

4. 实操过程与核心环节实现

4.1 环境搭建:Anaconda环境的黄金配置

requirement.txt里写的torch==1.7.1+cu102不是随便选的。CUDA 10.2是NVIDIA在2019年发布的长期支持版(LTS),至今仍有大量工控机预装。而PyTorch 1.7.1是最后一个完美兼容CUDA 10.2且不强制要求Python 3.9的版本——因为很多农业软件(如某些农机GPS终端)还锁在Python 3.7上。所以我的标准操作流程是:

# 1. 创建独立环境(避免污染系统Python) conda create -n watermelon python=3.7.12 conda activate watermelon # 2. 安装PyTorch(必须指定cu102,不能只写1.7.1) conda install pytorch==1.7.1 torchvision==0.8.2 cpuonly -c pytorch # 无GPU时 # 或 conda install pytorch==1.7.1 torchvision==0.8.2 cudatoolkit=10.2 -c pytorch # 有GPU时 # 3. 安装其他依赖(注意顺序!先装PyTorch再装其他) pip install -r requirement.txt

为什么强调cpuonlycudatoolkit=10.2?因为如果只写pip install torch==1.7.1,pip会默认下载CPU版本,但torchvision却可能匹配到CUDA版本,导致import torch成功但import torchvision报错DLL load failed。我吃过这个亏,在河北一个基地折腾了4小时才定位到是torchvision的CUDA版本不匹配。

注意:安装完务必验证CUDA可用性:
python import torch print(torch.__version__) # 应输出1.7.1 print(torch.cuda.is_available()) # True表示GPU可用 print(torch.version.cuda) # 应输出10.2

4.2 三步走通全流程:从数据到预测

步骤一:运行01生成txt.py(1分钟)

双击运行,或命令行执行:

python "01生成txt.py"

脚本会自动扫描当前目录下的西瓜成熟西瓜未成熟文件夹,按8:2比例随机划分训练集和验证集,生成四个文件:
-train.txt:训练图片路径+标签(每行/abs/path/xxx.jpg 1
-val.txt:验证图片路径+标签
-class_names.txt:记录类别名和索引映射(供后续GUI读取)
-dataset_info.txt:统计各类别图片数量、总耗时等信息

关键检查点:打开train.txt,确认前几行路径是绝对路径(不是相对路径),且标签只有0或1。如果看到-12,说明文件夹名拼错了。

步骤二:运行02CNN训练数据集.py(30分钟~2小时)

执行命令:

python "02CNN训练数据集.py" --epochs 30 --batch-size 16 --lr 0.001

脚本启动后,你会看到实时输出:

Epoch 1/30 Train Loss: 0.4214 Acc: 0.782 Val Loss: 0.3892 Acc: 0.856 Best model saved! (acc improved from 0.000 to 0.856)

每5轮,脚本自动生成logs/loss_acc_curve.png,包含训练/验证loss和accuracy曲线。重点看验证accuracy曲线是否持续上升——如果到第10轮还在80%徘徊,大概率是数据质量有问题(比如两类图片曝光差异太大)。

训练结束,会在根目录生成model.ckpt,这是一个.pth文件,里面存着:
-state_dict:模型权重
-optimizer_state_dict:优化器状态(下次可续训)
-best_acc:最高验证准确率
-epoch:当前轮次

步骤三:运行03pyqt界面.py(秒级启动)

双击运行,或:

python "03pyqt界面.py"

界面弹出后:
- 点击“选择模型” → 选中model.ckpt
- 点击“选择图片” → 选一张西瓜图(支持jpg/jpeg)
- 点击“开始识别” → 界面右下角显示结果:“西瓜成熟(置信度:96.3%)”

批量识别更简单:点击“批量识别” → 选中整个文件夹 → 自动遍历所有图片,结果导出为result.csv,含图片名、预测类别、置信度三列。

实操心得:首次使用时,先用02CNN训练数据集.py自带的--test-mode参数快速验证模型是否加载正常:
bash python "02CNN训练数据集.py" --test-mode --model-path model.ckpt
它会用10张验证图跑一次前向推理,输出准确率。如果这里报错,说明模型文件损坏或环境不匹配,不用等到GUI才发现问题。

4.3 图形界面深度解析:不只是按钮和文本框

03pyqt界面.py的架构是典型的MVC(Model-View-Controller):
-View(视图)WatermelonGUI类,继承QMainWindow,负责绘制窗口、按钮、图片显示区;
-Model(模型)WatermelonPredictor类,封装模型加载、预处理、推理全过程;
-Controller(控制器):按钮的clicked.connect()信号,把用户操作翻译成Model调用。

最关键的预处理逻辑在WatermelonPredictor.preprocess_image()方法里(第62行):

def preprocess_image(self, image_path): image = Image.open(image_path).convert('RGB') # 强制转RGB,避免RGBA报错 # 使用和训练时完全一致的transform transform = transforms.Compose([ transforms.Resize((256, 256)), transforms.CenterCrop(224), transforms.ToTensor(), # 转tensor并归一化到[0,1] transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # ImageNet标准 ]) return transform(image).unsqueeze(0) # 增加batch维度

这里Normalize的mean/std必须和训练时完全一致,否则模型输入分布偏移,预测结果全乱。我特意把这组数值写死在代码里,而不是从训练日志读取,就是为了杜绝配置不一致。

界面还藏了一个实用功能:点击“查看模型信息”,会弹出对话框显示model.ckpt的创建时间、训练轮次、最佳准确率——这让你一眼分辨出用的是哪个版本的模型,避免A/B测试时混淆。

5. 常见问题与排查技巧实录

5.1 典型报错速查表

报错信息根本原因解决方案实操验证方式
FileNotFoundError: [Errno 2] No such file or directory: '西瓜成熟'文件夹名拼写错误(如多了空格、用了全角字符)或不在脚本同级目录用Windows资源管理器地址栏确认路径,确保文件夹名为纯英文ASCII字符,或重命名为ripe/unripe并同步修改01生成txt.py第15行class_names在命令行执行dir /AD(Windows)或ls -d */(Linux/Mac),确认目录名完全匹配
RuntimeError: CUDA out of memoryGPU显存不足(常见于GTX 1050 Ti等2GB显存卡)修改02CNN训练数据集.py第35行batch_size = 8,或第38行num_workers = 0(禁用多进程加载)运行nvidia-smi,观察显存占用峰值,确保低于显卡总显存的80%
AttributeError: 'NoneType' object has no attribute 'shape'图片路径错误或图片已损坏(如下载中断的jpg)PIL.Image.open()逐个打开train.txt里的图片路径,捕获OSError异常并删除坏图01生成txt.py末尾加一段校验代码,自动过滤无法打开的图片
ModuleNotFoundError: No module named 'PyQt5'PyQt5未安装或环境不匹配conda activate watermelon && pip install PyQt5==5.15.2(指定版本,避免新版API变更)在Python交互环境执行from PyQt5.QtWidgets import QApplication,不报错即成功

5.2 精度提升实战技巧

技巧一:用“伪标签”扩充数据(适合50张以下小样本)
当你只有30张熟瓜图时,可以这样操作:
1. 先用这30张训一个初始模型(哪怕准确率只有70%);
2. 找100张未标注的西瓜图,用模型预测,筛选出置信度>95%的预测结果;
3. 把这些高置信度预测图,按模型输出的类别放进对应文件夹;
4. 用扩充后的数据集重新训练。
我在甘肃一个试验点用这招,30张图起步,两轮扩充后准确率从72%提升到89%。原理是:模型在初始阶段学到的粗粒度特征(如整体红绿占比)已经足够可靠,可以指导数据扩充。

技巧二:光照鲁棒性增强(针对阴天/大棚弱光图)
02CNN训练数据集.py的数据增强部分(第120行),加入transforms.ColorJitter

train_transform = transforms.Compose([ transforms.Resize((256, 256)), transforms.ColorJitter(brightness=0.3, contrast=0.3, saturation=0.3, hue=0.1), # 随机调整亮度/对比度 transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(...) ])

这个变换会让模型看到各种光照下的西瓜,实测对阴天拍摄图的识别率提升6.8%。但注意hue参数不能超过0.1,否则西瓜瓤会变成紫色,超出真实分布。

技巧三:模型蒸馏(用大模型指导小模型)
如果你有算力,可以训练一个ResNet18作为“教师模型”,然后用它的logits(softmax前输出)监督MobileNetV2的训练。02CNN训练数据集.py第185行预留了KL散度损失接口:

# if teacher_model is not None: # teacher_logits = teacher_model(inputs) # kd_loss = F.kl_div(F.log_softmax(outputs, dim=1), F.softmax(teacher_logits, dim=1), reduction='batchmean') # loss = 0.7 * ce_loss + 0.3 * kd_loss

取消注释即可启用。我在内部测试中,用ResNet18蒸馏MobileNetV2,小模型准确率提升了1.2%,且推理速度不变。

5.3 硬件适配避坑指南

  • 树莓派4B(4GB内存)部署:必须用--cpu-only参数运行03pyqt界面.py,并把batch_size改为1。实测单图推理耗时1.8秒,可接受;
  • Jetson Nano(2GB)部署:安装torch-1.7.0-cp37-cp37m-linux_aarch64.whl专用包,transforms.Resize改用interpolation=Image.BILINEAR(避免默认的LANCZOS在ARM上崩溃);
  • 无GPU笔记本(i5-8250U):关闭02CNN训练数据集.py第45行的pin_memory=True(该参数在CPU上反而拖慢),num_workers设为0。

最后分享一个真实案例:内蒙古赤峰一个合作社,用这套工具包+旧iPhone拍的图,训练出的模型在分拣线上准确率91.3%,误判率比人工低2.7个百分点。他们没做任何算法魔改,只是严格执行了“两个文件夹、50张图、三次训练”这个最朴素的流程。农业智能化的真相往往就藏在这种克制里——不追求最新模型,而追求最稳落地。

本文还有配套的精品资源,点击获取

简介:一套面向农业一线人员的轻量级西瓜成熟度识别实现方案,基于PyTorch框架调用MobileNet模型,支持从数据准备到结果可视化的完整闭环。包含三个核心功能脚本:01生成txt.py自动整理图像路径并划分训练集与验证集;02CNN训练数据集.py执行模型训练、保存最佳权重(model.ckpt)及训练过程可视化;03pyqt界面.py提供点击式操作入口,可直接加载模型对单张或批量西瓜图片进行成熟/未成熟二分类预测。所有代码均含逐行中文注释,覆盖数据读取(需用户按‘西瓜成熟’‘西瓜未成熟’两个文件夹组织图像)、模型定义、损失计算、学习率调整、准确率统计及GUI响应逻辑。不附带原始图像,建议每类准备50张以上清晰正面西瓜照片即可启动训练。依赖环境明确写入requirement.txt(适配Python 3.7–3.8、PyTorch 1.7.1/1.8.1),推荐使用Anaconda创建独立环境。配套说明文档.docx详解各步骤作用、常见报错原因(如路径错误、CUDA不可用、图像尺寸不一致)及解决方法,1.jpg为数据目录结构示意图,帮助快速理解输入格式。


本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/3 18:27:14

OnmyojiAutoScript:阴阳师玩家的终极自动化解放方案

OnmyojiAutoScript:阴阳师玩家的终极自动化解放方案 【免费下载链接】OnmyojiAutoScript Onmyoji Auto Script | 阴阳师脚本 项目地址: https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript 还在为阴阳师手游中每天重复的日常任务感到疲惫吗?你…

作者头像 李华
网站建设 2026/6/3 18:21:29

如何快速掌握物理信息神经网络:DeepXDE终极入门指南

如何快速掌握物理信息神经网络:DeepXDE终极入门指南 【免费下载链接】DeepXDE-and-PINN DeepXDE and PINN 项目地址: https://gitcode.com/gh_mirrors/de/DeepXDE-and-PINN DeepXDE是一个革命性的开源库,专门用于通过物理信息神经网络&#xff08…

作者头像 李华
网站建设 2026/6/3 18:21:18

在macOS上运行Windows应用的终极指南:Whisky让你的Mac更强大

在macOS上运行Windows应用的终极指南:Whisky让你的Mac更强大 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 想在苹果电脑上无缝运行Windows专属的软件和游戏吗&#xff…

作者头像 李华
网站建设 2026/6/3 18:21:15

3分钟快速上手:阅读APP书源导入完整教程,告别书荒困扰

3分钟快速上手:阅读APP书源导入完整教程,告别书荒困扰 【免费下载链接】Yuedu 📚「阅读」自用书源分享 项目地址: https://gitcode.com/gh_mirrors/yu/Yuedu 还在为找不到想看的网络小说而烦恼吗?Yuedu项目为你提供了一站式…

作者头像 李华