基于Python的CNN花卉枯萎识别:从数据到训练全流程实战

最近接了个咨询,是个要做毕业设计的同学,题目是“基于Python的CNN卷积神经网络识别花卉是否枯萎”。听上去很标准的深度学习图像分类项目,但真正上手后才发现,这类题目的坑远比想象中多。标题里每个关键词——Python、CNN、卷积神经网络、花卉枯萎识别——看着都不难,但合在一起就是一个完整的工程链路:数据怎么来、标签怎么打、模型怎么设计、训练怎么收敛、效果怎么评估,每一环都有讲究。

这篇文章我打算从实操角度完整拆解一遍这个项目。不光是网络结构那段代码,也包括训练前你会踩的数据坑、训练中要盯的曲线、训练后怎么向导师或评委证明“我这个模型真的有用”。无论你是照着做毕业设计,还是单纯想找个入门计算机视觉的练手项目,这篇应该都能帮你少走不少弯路。

1. 为什么用CNN做花卉枯萎识别,而不是传统方法

1.1 传统图像处理做不好这个任务

先说结论:如果你用传统方法做“枯萎识别”,比如颜色直方图加SVM、纹理特征加逻辑回归,也不是完全不行,但泛化能力会很差,而且每一张新图都可能让你怀疑人生。

枯萎这个状态,体现在图像上通常是叶片变黄、变褐、卷曲、下垂,或者整株失去光泽。这些特征听起来很明确,但实际拍摄的花卉照片里,光照一会儿强一会儿弱,背景里可能有土壤、杂草、花盆,甚至水渍反光。传统方法要先把叶片分割出来,再提取颜色特征,一旦分割做得不好,后续再精致的特征工程都白搭。

我试过一个思路:把图片转到HSV空间,用绿色像素占比、叶片边缘密度这些手工特征训练逻辑回归。在精心挑选的100张测试图上准确率能有82%,但换成室外随手拍的图,直接掉到75%以下。原因很简单,手工特征描述不了“枯萎”在不同品种、不同光照下的复杂表现。玫瑰的枯萎和绿萝的枯萎,视觉模式差异很大,但标签都叫“枯萎”。

1.2 CNN到底在学什么,为什么它更合适

卷积神经网络的思路跟传统方法完全不同。你不需要告诉模型“枯萎=叶片变黄”,而是喂一批标注好的图片,让模型自己去学哪些视觉模式能区分健康与枯萎。卷积层就像一组可学习的滤波器,前几层学到的是边缘、颜色块这些低级特征,中间层学到的是叶片纹理、斑块形状,后面几层则会组合出“黄化区域”“卷曲轮廓”这类跟枯萎直接相关的高级语义。

对于花卉这种对象,叶片局部变化是关键,而卷积操作天然就擅长捕捉局部图案。一个3x3的卷积核在一张224x224的图上滑动,每一步只看周围很小的区域,这种局部连接方式跟“通过叶片局部颜色和纹理判断枯萎”这个任务高度匹配。再加上池化层不断压缩特征图尺寸,模型既能保留重要信息,又不会因为图片尺寸变化而崩溃。

另外一个优势是鲁棒性。CNN在做判断时,会自动把背景、花盆这类无关信息弱化,把注意力放到叶片区域。这一点在毕设答辩时很好讲:你可以展示训练好的模型在带杂草、带阴影的图片上依然能输出正确标签,这在传统方法里是很难做到的。

2. 数据集准备与预处理:项目成败的第一道关

2.1 花卉图像怎么收集、怎么标注才靠谱

很多同学上来就想着找现成的花卉数据集,但“花卉是否枯萎”这个细分任务公开数据集不多。更可行的做法是自己采集,或者从多个来源筛选组合。我建议每个类别至少300到500张图,二分类就是总共600到1000张。这个量级对从头训练一个简单CNN来说勉强够用,配合数据增强可以跑到一个能看的准确率。

采集时要注意多样性。不要只拍一种花、一个角度、一种光照。不同品种、不同生长阶段、不同花盆颜色、不同背景,都要尽量覆盖。我见过一个反面案例:训练集里全是红玫瑰在白色背景下的照片,测试时给了一张红玫瑰在草地背景里的图,模型直接判成健康,因为背景的绿色干扰了判断。

标注是另一个容易被忽视的环节。建议用两层目录结构:train/healthy、train/wilted、val/healthy这样组织,省去解析CSV的麻烦。但要注意,“枯萎”和“健康”之间其实存在中间态,比如花朵表面有点蔫但叶片还绿着,这种模糊样本最容易产生标签噪声。我推荐一个土办法:让两个人分别标一遍,不一致的样本拿出来单独看,实在分不清就从数据集里去掉,不要硬标。一个错误的标签会让模型学到错误模式,比少一张图更伤。

2.2 图像预处理与数据增强的实操细节

预处理环节有三个关键点:尺寸统一、数值归一化、数据增强。

尺寸方面,常见选择是224x224或者128x128。224是很多经典网络的输入尺寸,但128可以显著减少显存占用和训练时间。如果你用的是简易CNN,128x128已经够用;只要别低于64,否则叶片纹理就丢失了。

归一化方面,把像素值从0到255缩放到0到1就够了,不需要过度纠结均值方差标准化。我在实际项目里,直接除以255得到的准确率和用标准化的差距很小,但实现简单不少。

数据增强是提升泛化能力的核心手段。我常用的组合是:随机水平翻转、随机旋转±30度、随机亮度对比度扰动、随机裁剪后缩放到原尺寸。需要提醒两点:垂直翻转要谨慎使用,因为花盆里的花有明确的方向性,翻转180度虽然模型不介意,但会给数据引入不真实的分布;亮度扰动幅度也不要太大,否则会把健康的绿叶子变得诡异。

还有一个小技巧可供参考:如果你的训练集里图片分辨率参差不齐,不要简单地拉伸成正方形,那样会让花变形。可以先等比缩放到短边为224,再居中裁剪到224x224,或者用padding补成正方形,效果都会好一些。

2.3 数据划分与类别不平衡处理

数据划分要按7:2:1或8:1:1分成训练、验证、测试三份。很多人只在训练和验证之间切分,最后用验证集的效果当作最终结果,这在毕设里偶尔可以糊弄过去,但严谨的做法是单独留一份测试集,只在全部调参结束后用一次。

更关键的一点是:划分时要避免同一株花的照片同时出现在训练集和测试集里。如果你是从视频里抽帧得到的图片,相邻帧高度相似,如果随机切分,模型可能“记住”了训练集里的画面,测试时遇上几乎一样的帧,准确率虚高。正确做法是按拍摄批次划分,同一批次的图全部归到同一个集合里。

类别不平衡方面,如果健康图有800张,枯萎图只有300张,模型会对多数类过拟合。最简单的方法是过采样少数类,或者使用加权损失函数,在交叉熵里给少数类更高的权重。我习惯先把两类数量尽量控制在2:1以内,超过这个比例再考虑加权。

3. 模型搭建与训练调参:从网络结构到损失函数

3.1 网络结构与关键参数设计

对于这种二分类任务,不需要一上来就搬ResNet或者EfficientNet。一个三层卷积堆出来的小型CNN已经能跑出不错的效果,也更符合“从零训练”的课程设计要求。我常用的结构是这样的:

import torch.nn as nn class WiltCNN(nn.Module): def __init__(self, num_classes=2): super().__init__() self.features = nn.Sequential( nn.Conv2d(3, 32, kernel_size=3, padding=1), nn.BatchNorm2d(32), nn.ReLU(inplace=True), nn.MaxPool2d(2), nn.Conv2d(32, 64, kernel_size=3, padding=1), nn.BatchNorm2d(64), nn.ReLU(inplace=True), nn.MaxPool2d(2), nn.Conv2d(64, 128, kernel_size=3, padding=1), nn.BatchNorm2d(128), nn.ReLU(inplace=True), nn.MaxPool2d(2), ) self.classifier = nn.Sequential( nn.Flatten(), nn.Linear(128 * 16 * 16, 256), nn.ReLU(inplace=True), nn.Dropout(0.5), nn.Linear(256, num_classes) ) def forward(self, x): return self.classifier(self.features(x))

这个网络输入是128x128的RGB图,经过三次卷积加池化后,特征图尺寸从128变成64、32、16,通道数从3变成32、64、128,最后展平成128×16×16=32768维,接一个256维的全连接层,再输出2类分数。整个模型参数量大概在850万左右,对显存的要求很低,普通笔记本CPU也能跑,只是慢一些。

关于卷积核大小,我推荐全部用3x3。两个3x3堆叠的感受野等效于一个5x5,但参数更少、非线性更强。BatchNorm一定要加,它能让训练收敛稳定很多,尤其是学习率稍微调高时不容易震荡。Dropout放在全连接层前,比例设0.5,能有效减少过拟合。

为什么不建议直接用预训练模型?不是说不能用,而是这个任务里,“枯萎”特征的底层视觉模式跟ImageNet里学到的那些物体形状差异较大,迁移学习未必比从零训练的小网络更好。如果你后续想提升精度,可以试一遍VGG16或ResNet18冻结前面层只训练分类头的方案,跟这个简易CNN做对比。毕设里这种“对比实验”非常加分。

3.2 优化器、学习率与损失函数怎么搭配

优化器直接选Adam,学习率初始设1e-3,这是最稳妥的组合。如果你训练过程中发现loss开始震荡,不要硬着头皮继续,先降学习率到1e-4。我习惯配合“学习率衰减”策略:每5个epoch验证loss没有下降,就把学习率乘0.5。

损失函数用交叉熵。分类问题为什么不用MSE?因为MSE配合softmax输出时,梯度会被衰减得很厉害,尤其当预测结果接近0或1时,梯度趋近于零,训练速度很慢。交叉熵在分类任务里就是标准答案,PyTorch里的CrossEntropyLoss自带softmax,所以网络最后一层不需要再加softmax激活。

批次大小设32或64都行,取决于显卡显存。显存不够就减少输入尺寸,不要硬撑大batch,否则训练一两次就显存溢出,浪费时间。训练轮数不用固定,配合早停(Early Stopping)更合理。我常用的逻辑是:记录验证集准确率,连续10个epoch不提升就停止训练,同时保存验证准确率最高的那一次权重。

3.3 训练过程的监控与调参思路

训练时一定要盯着两条曲线:训练loss和验证loss。理想状态下两条线都下降,验证loss略高于训练loss,这是正常且健康的。如果训练loss降得很低,验证loss反而上升,那就是过拟合的典型信号。这时候优先做的事是加强数据增强、提高Dropout比例,而不是换一个更大的模型。

如果训练一开始loss就不降,先别急着调网络结构,检查三点:数据有没有正确归一化、标签有没有搞反、学习率是不是太小。我遇到过最无语的情况是训练集和验证集的预处理不一致,训练时做了归一化,验证时忘了做,导致验证准确率一直在50%上下跳动,像在猜硬币。

另外,训练日志里要记录每个epoch的损失和准确率,最后画成折线图。这张图不仅帮助你自己判断调参方向,写进论文里也比纯文字描述有说服力得多。

4. 验证评估与常见问题排查实录

4.1 准确率之外还要看什么

二分类任务里,大家最容易盯着准确率看,但我建议你做一张混淆矩阵。如果测试集有200张图,矩阵会告诉你:健康类被错判成枯萎类多少张、枯萎类被错判成健康类多少张。这两种错误的代价完全不同。如果把枯萎的花判成健康,意味着用户没发现植物已经生病;如果把健康的花判成枯萎,只是虚惊一场。根据这个思路,可以计算精确率、召回率和F1分数,这些指标在样本不平衡时比准确率有意义得多。

还要做错误案例分析。把测试集里预测错误的图片单独打印出来,拼成一张网格图,看看到底是什么情况导致模型走眼。我遇到过两类典型错误:一类是健康花正处于花期盛开,花瓣颜色深红,模型却把它判成枯萎,因为深红色和枯黄边缘在低分辨率下确实容易混淆;另一类是背景里有大片枯叶,模型把背景的枯萎特征当成了花朵本身。发现这些规律后,可以针对性地补充训练数据,或者用Grad-CAM热力图看看模型到底在关注图像的哪个区域。

如果模型把某张图判错,而热力图显示它看的是背景枯叶,那就说明特征提取被背景干扰了;如果热力图显示它确实在看花朵主体,说明是特征本身的代表性不够。后者要增加更多同类样本,而不是盲目调参。

4.2 常见问题速查表

下面这张表是我在实际调试中整理出来的,基本上覆盖了初学者最容易遇到的几种状况:

现象可能原因解决方案
训练loss不降或下降极慢学习率太小、数据未归一化、标签错乱调大学习率到1e-3,检查预处理流程,抽样核对标签
训练准确率接近100%,验证准确率只有70%过拟合加强数据增强、提高Dropout、减小模型容量
训练loss出现NaN学习率过大、数据里有异常像素值降低学习率到1e-4,检查图片是否包含损坏文件
验证集准确率始终在50%附近标签打反、训练与验证预处理不一致打印一批预测结果人工核对,检查归一化是否对齐
模型对背景变化非常敏感训练集中背景太单一增加背景多样化的图片,做随机裁剪增强
训练速度极慢输入尺寸太大、模型参数量过多把输入降到96或64,减少卷积通道数
健康与枯萎类别数量差距悬殊类别不平衡导致模型偏好多数类过采样少数类或对损失函数加权

4.3 几条很少被写进教程的避坑经验

数据增强不是越多越好。我在一个版本里加了很强的颜色抖动,健康的绿色叶子被扭曲成蓝色、紫色,模型确实学到了更“鲁棒”的特征,但同时也把颜色本身的判断力削弱了。枯萎识别里,叶片变黄是很强的指示信号,你不能把颜色信息彻底破坏掉。适度增强的原则是:让模型见过更多真实的“变化”,而不是制造现实中不存在的“怪图”。

不要反复用同一个测试集调参。很多同学把测试集当成验证集用,发现准确率不够就回头调参,再测一次,来回折腾五六轮。这样做的问题是,你实际上已经在测试集上做了隐式的拟合,最后报出来的准确率偏乐观。正确做法是:用验证集调参,最后只在测试集上测一次,把这个结果作为最终指标。

如果最后效果离要求还差一点,可以先做一个“人类基线”。找几个不懂机器学习的朋友,让他们看一眼测试集图片判断枯萎还是健康,拿他们的准确率和模型对比。这个对比很有意义:如果模型已经超过了人类判断的平均水平,这个项目的完成度已经相当高了。我在这个模拟项目里试过,人工判断准确率大概85%,模型能到95%左右,这样的差距拿到答辩现场,比单纯说数字更有说服力。

5. 训练细节:一个完整可复现的训练流程示例

前面讲了很多理论和经验,这一节把训练流程串成一份可直接套用的脚本。我用PyTorch写了一个缩略版的训练主流程,你完全可以在这个基础上改数据路径和参数。

import torch from torch.utils.data import DataLoader from torchvision import datasets, transforms # 训练集增强与预处理 train_transform = transforms.Compose([ transforms.Resize((128, 128)), transforms.RandomHorizontalFlip(), transforms.RandomRotation(20), transforms.ColorJitter(brightness=0.2, contrast=0.2), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) # 验证集不需要随机增强 val_transform = transforms.Compose([ transforms.Resize((128, 128)), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) # 用ImageFolder加载两层目录的数据 train_dataset = datasets.ImageFolder('data/train', transform=train_transform) val_dataset = datasets.ImageFolder('data/val', transform=val_transform) train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True) val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False) model = WiltCNN(num_classes=2) criterion = torch.nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=1e-3) scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau( optimizer, mode='max', factor=0.5, patience=3 ) best_acc = 0.0 for epoch in range(30): model.train() total_loss = 0.0 for images, labels in train_loader: optimizer.zero_grad() outputs = model(images) loss = criterion(outputs, labels) loss.backward() optimizer.step() total_loss += loss.item() # 验证 model.eval() correct = 0 total = 0 with torch.no_grad(): for images, labels in val_loader: outputs = model(images) _, predicted = torch.max(outputs, 1) total += labels.size(0) correct += (predicted == labels).sum().item() acc = correct / total print(f"epoch {epoch+1}, loss: {total_loss/len(train_loader):.4f}, val acc: {acc:.4f}") scheduler.step(acc) if acc > best_acc: best_acc = acc torch.save(model.state_dict(), "best_model.pt")

这个脚本比较粗糙,但胜在能跑通。如果你要拿到更大规模的数据上跑,要加的东西还很多:GPU显存不足时的cpu换gpu控制、梯度裁剪、TensorBoard记录曲线,等等。但我一直坚持一个原则——先让整个流程跑起来,再考虑优化细节。跑通一次之后,你对模型、数据和调试方法的理解会上升一个台阶。

6. 最后分享一点我自己的体会

项目做完后回头看,这个题目真正核心的东西不是CNN本身,而是“怎么把一个模糊的视觉判断变成一套可复现的决策系统”。网络结构改来改去,准确率可能在93%和94%之间打转,但数据质量、预处理一致性、评估方式这些看起来不耀眼的工作,才是决定项目上限的因素。

如果你想在这个项目上继续扩展,我可以提三个方向:一是做一个简单的Web页面,用Flask或FastAPI把训练好的模型包进去,上传图片就能判断枯萎状态;二是针对不同花卉品种分别训练模型,做细粒度的品种感知识别;三是结合时序数据,连续几天对同一株花拍照,预测枯萎趋势而不只是判断当前状态。这些方向都不需要颠覆现有框架,但会让整个项目的完整度和创新性明显提升。

做毕设或者练手项目,最忌讳的是陷入“光看不动”的状态。照着这篇文章把代码跑起来,让准确率从50%涨到90%,那种成就感比看十篇教程都实在。

相关新闻

2026数字化口腔印模机器升级:口内扫描仪如何驱动椅旁全链路闭环落地?

2026数字化口腔印模机器升级:口内扫描仪如何驱动椅旁全链路闭环落地?

首段(核心需求覆盖) 传统硅橡胶物理印模在临床效率、患者舒适度与数据流转环节的固有瓶颈,正倒逼口腔诊疗链条从“取模—送技工所—等待修复体”的线性模式向椅旁即时闭环迁移。2025年全球数字化口腔印模机器市场规模约95.01亿元,…

2026/10/21 7:13:53 阅读更多 →
AgentEmulator:面向AI智能体的轻量级链上存证与可信验证框架

AgentEmulator:面向AI智能体的轻量级链上存证与可信验证框架

1. 项目概述:这不是又一个“AI区块链”概念玩具,而是一套可验证、可审计、可复现的智能体行为沙盒最近在几个技术社区里看到有人转发一份叫AgentEmulator的英文技术论文,标题里带着“区块链赋能的AI智能体可信基础设施实验平台”——光看这个…

2026/10/21 7:13:53 阅读更多 →
AI视频自动化:用Coze+剪映搭建流水线,把视频制作时间压缩到20%

AI视频自动化:用Coze+剪映搭建流水线,把视频制作时间压缩到20%

一直想做AI视频自动化,拖到今年才真正动手。原因很简单:我每天要产出一条短视频,但剪辑排版这些重复工作占掉的时间,比内容构思还多。后来我把流程拆开看,发现真正需要动脑的环节只有两成,剩下八成都是可以…

2026/10/21 7:13:53 阅读更多 →

最新新闻

WPF界面切换特效:基于渲染管线的丝滑过渡方案

WPF界面切换特效:基于渲染管线的丝滑过渡方案

简介:本资源是一套完整的WPF界面切换特效实现方案,面向C#桌面应用开发者及WPF进阶学习者,聚焦解决多页面导航中视觉过渡生硬、交互体验单一等实际问题。压缩包共47个文件,包含15个核心C#逻辑文件(如UserControl1.xaml.…

2026/10/21 7:57:11 阅读更多 →
GobiNet驱动交叉编译与嵌入式Linux USB 4G/5G模块适配指南

GobiNet驱动交叉编译与嵌入式Linux USB 4G/5G模块适配指南

简介:面向移远(Quectel)Gobi系列无线网卡模块的Linux/Android GobiNet驱动程序V1.6.2.9,用于在Linux系统中识别并驱动Gobi蜂窝模块,从而建立3G/4G/LTE移动数据通信链路,主要面向嵌入式开发者、系统运维人员…

2026/10/21 7:57:10 阅读更多 →
MySQL子查询报错Unknown column排查:列名可见性解析与修复方案

MySQL子查询报错Unknown column排查:列名可见性解析与修复方案

1. 报错现场:一次商品版本筛选需求的排查起点1.1 业务背景与第一版SQL前阵子我在做一个图书商品维度的查询时,被这个报错卡了大半个小时。业务需求本身不复杂:产品表products按商品维度存基础信息,另一张product_editions表存同一…

2026/10/21 7:57:10 阅读更多 →
C++ Winsock简易聊天系统拆解:阻塞socket、广播与粘包实战

C++ Winsock简易聊天系统拆解:阻塞socket、广播与粘包实战

简介:简易聊天系统由C语言和Winsock网络库实现,面向正在学习计算机网络或Windows网络编程的初学者,也适用于课程设计、毕业设计起步与工程实训。资源压缩包共56个文件,大小仅1.23MB;其中cpp与h源码承担核心聊天逻辑&am…

2026/10/21 7:57:10 阅读更多 →
WPF MVVM登录窗口完整示例:从分层设计到单元测试

WPF MVVM登录窗口完整示例:从分层设计到单元测试

简介:一份基于WPF MVVM模式的登录窗口完整示例,围绕MVVM核心分层、数据绑定、命令驱动、PasswordBox安全绑定、RadioButton偏好设置、数据验证以及登录成功后窗口导航等关键知识点展开,适合正在学习WPF桌面开发或希望规范项目结构的初中级开发…

2026/10/21 7:57:10 阅读更多 →
充电桩防占位实战:车牌识别+主动预警系统怎么做才有效

充电桩防占位实战:车牌识别+主动预警系统怎么做才有效

做了三年充电运营相关的项目,我一直觉得“车位被占”是比“充电桩故障”更让人头疼的问题。桩坏了至少还能报修等备件,但油车往充电位一停,或者充满电不挪车的“僵尸车”出现,整个站点的利用率直接腰斩。最近接触的“天曜WE P7 Ul…

2026/10/21 7:56:10 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →