新闻详情

新闻详情

首页 / 资讯中心 / 详情

TensorFlow 2.3花卉识别实战:CNN、迁移学习与OpenCV部署

发布时间:2026/10/1 8:51:20来源:尧图网络
TensorFlow 2.3花卉识别实战:CNN、迁移学习与OpenCV部署
简介面向深度学习初学者及高校相关课程学生的TensorFlow 2.3花卉识别完整工程属于已获导师指导并通过的高分期末大作业下载后即可直接运行适用于课程设计、期末答辩等场景。项目覆盖数据划分、模型训练、测试评估到图形界面展示的完整流程能够识别多种花卉整体识别率约97%。资源压缩包共27个文件、约239MB包含数据切分、数据读取、模型训练、模型测试与窗口界面展示等5个Python脚本2个训练好的h5模型权重文件txt文件给出花卉数据集说明与依赖环境md文档为使用说明png/jpg图片用于界面与效果展示目录结构清晰便于对照学习与二次开发。已有251人学习下载读者可直接获得完整可运行代码、预处理数据集、训练权重与项目配置文件省去环境搭建与调参时间适合快速上手图像分类项目或完成同类期末作业时参考借鉴。1. 花卉识别怎么入的门TensorFlow 2.3 才是期末作业的正确打开方式期末大作业要交一个能跑的花卉识别系统用 Python 搭配 TensorFlow 2.3 是很多人的第一反应。但真正动手你会发现坑全在版本、数据目录和回调函数上。这套资源把训练、预测、避坑的完整代码和数据集都打包好了适合 Python 学到基础语法、想拿深度学期末高分的学生也适合想快速复现一个图像分类 Demo 的从业者。整个项目走的是 tf.keras 高层 API不需要手写反向传播先跑通再改结构。步骤看着不难可一旦版本选错或者数据增强参数开太大后面每一步都会跟着翻车。我下面的笔记就是按期末作业验收的标准来写的照着做能让你的模型在短时间内收敛到可用的准确率。2. 环境与数据准备从零搭出可复现的 TensorFlow 2.3 训练环境2.1 版本锁死的理由为什么是 2.3 而不是 2.10TensorFlow 2.3 虽然是 2020 年的版本但它在期末作业这场景里比新版更稳。一是很多课程讲义和开源案例都是基于 2.x 早期写法比如tf.keras.preprocessing.image.ImageDataGenerator在 2.10 以后虽然还能用但控制台会刷一堆 deprecation 警告观感不好。二是 TensorFlow 2.3 支持 Python 3.5 到 3.8我建议直接用 Python 3.7这是当时兼容性最稳的搭配。你装 3.9 或 3.10 再 pip 会碰到缺少二进制包的麻烦。安装命令很简单先建一个干净的虚拟环境然后执行conda create -n flower python3.7 -y conda activate flower pip install tensorflow2.3.0 pip install opencv-python matplotlib scikit-learn pandas逻辑说明conda create -n flower python3.7把 Python 版本锁死避免系统里其他项目干扰tensorflow2.3.0是 CPU 版如果你的电脑有 NVIDIA 显卡也可以换成tensorflow-gpu2.3.0但要注意它对应 CUDA 10.1 和 cuDNN 7.6装错版本会报Could not load dynamic library cudnn64_7.dll。参数说明opencv-python是后面做实时预测用的matplotlib用于画训练曲线sklearn可以用来算混淆矩阵虽然不是必须但期末验收时加分。装完在命令行执行python -c import tensorflow as tf; print(tf.__version__)能输出2.3.0就说明环境没问题。2.2 数据集组织方式ImageFolder 目录结构与 label 映射花数据集网上有很多版本常用的有 Oxford 102 Flowers也有从百度图片爬下来的人工整理集。期末作业一般不会要求做目标检测所以图片分类最省事的组织方式就是 ImageFolder一个根目录下面按类别分文件夹每个文件夹里放同一类花的图片。我的目录结构长这样flower_dataset/ ├── train/ │ ├── rose/ │ │ ├── rose_001.jpg │ │ └── rose_002.jpg │ ├── tulip/ │ └── sunflower/ └── val/ ├── rose/ └── tulip/用 TensorFlow 2.3 自带的ImageDataGenerator可以直接从这个目录读取图片并生成标签不需要手写 CSV。关键代码from tensorflow.keras.preprocessing.image import ImageDataGenerator datagen ImageDataGenerator(rescale1./255) train_generator datagen.flow_from_directory( flower_dataset/train, target_size(224, 224), batch_size32, class_modecategorical ) val_generator datagen.flow_from_directory( flower_dataset/val, target_size(224, 224), batch_size32, class_modecategorical ) print(train_generator.class_indices)逻辑说明flow_from_directory会自动扫描train下的子文件夹名按字母顺序生成类别索引。比如daisy、rose、sunflower对应的索引是0、1、2。这个索引顺序就是模型输出层 softmax 的类别顺序后面做推理时必须用同一个映射否则预测结果会对不上号。参数说明target_size(224, 224)要和后续模型输入尺寸一致batch_size32是每批图片数量显存小的改成 16class_modecategorical会生成 one-hot 标签配合 softmax 分类层。训练集和验证集要分开目录千万别用同一份图片做验证不然模型准确率虚高答辩时一测真实数据就露馅。2.3 数据增强与预处理tf.keras.preprocessing.image 的常用参数表数据增强是训练图像分类模型时最容易过拟合的解法。TensorFlow 2.3 的ImageDataGenerator支持在读取图片时在线做随机变换不会占用额外磁盘空间。我用到的参数组合如下直接写在ImageDataGenerator里train_datagen ImageDataGenerator( rescale1./255, rotation_range20, width_shift_range0.2, height_shift_range0.2, shear_range0.15, zoom_range0.2, horizontal_flipTrue, fill_modenearest )逻辑说明rescale1./255把 0 到 255 的像素值压缩到 0 到 1这是深度网络收敛的前提。旋转、平移、缩放、翻转这些操作相当于在原始图片上构造新样本让模型见过更多角度和位置的同一朵花从而降低过拟合。注意验证集val_datagen只做rescale不能做数据增强否则验证集就不干净了。参数说明rotation_range20表示图片随机旋转 ±20 度width_shift_range0.2表示水平方向平移幅度占图片宽度的 20%zoom_range0.2是缩放幅度大于 1 表示放大小于 1 是缩小horizontal_flipTrue只对左右翻转有效花这种对称结构可以开但如果是识别手写数字翻转就会把 6 变 9那类任务不能开。这些参数不是越大越好我在调参时把rotation_range从 30 改成 20验证准确率反而提升了两个点所以不要让增强强度盖过原始特征。3. 模型搭建与选型从 LeNet 到 MobileNetV2 的迁移学习3.1 自建 CNN 基线ConvBNMaxPool 的三段式结构如果你的期末作业要求“体现自己对网络结构的理解”那最好先搭一个自建 CNN 当基线模型再对比迁移学习的效果。TensorFlow 2.3 写一个可运行的 CNN 非常快from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, BatchNormalization, MaxPooling2D, Flatten, Dense, Dropout def build_cnn(): model Sequential() model.add(Conv2D(32, (3, 3), activationrelu, input_shape(224, 224, 3))) model.add(BatchNormalization()) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(64, (3, 3), activationrelu)) model.add(BatchNormalization()) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(128, (3, 3), activationrelu)) model.add(BatchNormalization()) model.add(MaxPooling2D((2, 2))) model.add(Flatten()) model.add(Dropout(0.5)) model.add(Dense(64, activationrelu)) model.add(Dense(5, activationsoftmax)) return model逻辑说明Conv2D提取局部特征BatchNormalization在每次卷积后把特征分布拉回正常范围能明显加快收敛还能起到轻微正则化作用。MaxPooling2D压缩特征图尺寸减少计算量。最后接Dropout(0.5)随机丢弃一半神经元防止小数据集过拟合。参数说明input_shape(224, 224, 3)这是标准输入尺寸第一层卷积核数量 32后面递增成 64、128这是常见做法。如果你电脑是纯 CPU可以缩小到(112, 112, 3)以及 16、32、64但准确率会下降。最后一层Dense(5)里的 5 要改成你自己的花类别数注意class_modecategorical时输出单元数和类别数必须一致。3.2 迁移学习加载预训练权重并冻结底层的参数设置自建 CNN 在小数据集上很难训到 90% 以上准确率而迁移学习可以轻松达到。我一般选MobileNetV2而不是VGG16原因是它模型小、推理快期末答辩现场就算是低配笔记本也能跑得流畅。加载方式如下from tensorflow.keras.applications import MobileNetV2 base_model MobileNetV2( weightsimagenet, include_topFalse, input_shape(224, 224, 3) ) base_model.trainable False逻辑说明weightsimagenet会加载 ImageNet 上预训练好的权重这些权重已经学会了花朵的纹理、边缘等通用特征。include_topFalse把原来的 1000 类分类层去掉只保留卷积部分然后我们在上面接自己的分类层。base_model.trainable False是冻结所有预训练层让反向传播只更新新加的层既省算力又不容易破坏预训练特征。参数说明input_shape必须和 MobileNetV2 能接受的尺寸匹配如果你用的是ResNet50、EfficientNet同样保持 224x224 即可。冻结底层后新加的层参数量很小训练时间会短很多。如果发现自己数据集和 ImageNet 的分布差异很大比如全是黑白图片可以考虑把最后几层解冻再微调但这不是期末作业的首选因为调参复杂度会陡增。3.3 全连接层与输出层设计softmax 和 class_id 对齐无论自建 CNN 还是迁移学习最后都要接一个全连接层把卷积特征映射到类别分数。我在 MobileNetV2 后面这样接from tensorflow.keras.layers import GlobalAveragePooling2D, Dense model Sequential([ base_model, GlobalAveragePooling2D(), Dense(5, activationsoftmax) ])逻辑说明GlobalAveragePooling2D把特征图每个通道做全局平均得到一个向量这样比单纯的Flatten参数量更小也不容易过拟合。Dense(5, activationsoftmax)输出每个类别的概率概率总和为 1。这一步最关键的是和flow_from_directory里的class_indices顺序对齐。比如class_indices从 0 到 4模型输出的索引 0 就对应第一个类不能错位。参数说明Dense(5)中的 5 是类别数如果你有 10 类花这里就写 10。activationsoftmax是必须的因为后面compile里的损失函数默认期望模型输出概率分布。如果你用from_logitsTrue那么最后一层就不要加 softmax两者选一千万别都做。4. 训练与调参损失函数、优化器、回调函数的实际配置4.1 训练脚本模板与关键超参数说明训练阶段是整个项目里最出“玄学”的部分。同样一套代码别人开batch_size32能到 95%你开64可能卡在 80%。把超参数写进一个可复制的脚本里很有必要我的训练入口长这样from tensorflow.keras.optimizers import Adam model.compile( optimizerAdam(learning_rate0.001), losscategorical_crossentropy, metrics[accuracy] ) history model.fit( train_generator, validation_dataval_generator, epochs30, verbose1 )逻辑说明losscategorical_crossentropy是分类问题最常用的损失函数。前面模型输出是 softmax 概率所以这里不要加from_logitsTrue如果你把模型最后一层换成了不带 softmax 的Dense(5)才需要写tf.keras.losses.CategoricalCrossentropy(from_logitsTrue)。这个细节我看过不少同学栽跟头后面避坑章节会重点讲。参数说明learning_rate0.001是 Adam 优化器默认值对迁移学习来说够用。epochs30不是非得跑满后面接EarlyStopping会自动停止。verbose1会在终端实时打印每个 epoch 的 loss 和 accuracy。训练时如果发现训练集准确率已经 99%、验证集 85%那就是过拟合信号需要加大数据增强或者减小网络容量。训练过程我习惯把中间特征图也打印几层出来看看虽然没有定量帮助但能让你直观确认预处理后的图片是不是正常。做法是在flow_from_directory返回的 generator 上取一批数据imgs, labels next(train_generator)然后用 matplotlib 显示前几张。这一步能让换 TensorFlow 2.3 的忙碌过程里先透口气。4.2 EarlyStopping 和 ReduceLROnPlateau防止过拟合的两个回调期末作业最怕什么训练到一半 loss 突然变成nan或者准确率震荡上不去。TensorFlow 2.3 的callbacks模块自带两个救命工具一个是早停一个是自适应学习率。from tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau early_stop EarlyStopping( monitorval_loss, patience5, restore_best_weightsTrue ) reduce_lr ReduceLROnPlateau( monitorval_loss, factor0.2, patience3, min_lr1e-6 ) model.fit( train_generator, validation_dataval_generator, epochs50, callbacks[early_stop, reduce_lr] )逻辑说明EarlyStopping每跑完一个 epoch 就检查验证集 loss如果连续patience个 epoch 没有下降就终止训练并把模型权重恢复到验证 loss 最好的那一步。ReduceLROnPlateau更细验证 loss 卡住不动时把学习率乘以factor0.2相当于把0.001降到0.0002让优化器在更小步长下继续找更优解。参数说明monitorval_loss比val_accuracy更灵敏因为 loss 的微小变化能反映模型泛化能力的改善。restore_best_weightsTrue很关键否则最终保存的是最后一个 epoch 的权重可能是过拟合状态。min_lr1e-6可以防止学习率缩到 0训练卡死。4.3 训练曲线可视化与模型保存策略训练只是过程期末验收通常要看训练曲线和最终模型。用matplotlib把 history 里的损失和准确率画出来是答辩现场最直观的证据import matplotlib.pyplot as plt plt.figure(figsize(12, 4)) plt.subplot(1, 2, 1) plt.plot(history.history[loss], labeltrain_loss) plt.plot(history.history[val_loss], labelval_loss) plt.legend() plt.title(Loss) plt.subplot(1, 2, 2) plt.plot(history.history[accuracy], labeltrain_acc) plt.plot(history.history[val_accuracy], labelval_acc) plt.legend() plt.title(Accuracy) plt.savefig(training_curve.png)逻辑说明history.history是字典键就是 compile 时传入的metrics和loss。训练集曲线和验证集曲线之间的差距能直接反映过拟合程度两条线贴得近说明泛化好验证集 loss 在后半段掉头往上而训练集还在降这就是典型的过拟合。模型保存我一般同时存两份一份是h5格式方便下次加载一份是SavedModel文件夹方便部署到 Flask 或 OpenCV 环境里。代码是model.save(flower_model.h5) model.save(flower_model_saved, save_formattf)参数说明save_formattf在 TensorFlow 2.3 里是可选参数不写默认就是 SavedModel。h5版本在load_model时需要注意把自定义层也导入由于我们只用了标准层所以tf.keras.models.load_model(flower_model.h5)直接能读。保存前最好先打印model.summary()确认输出层的最后一维等于类别数我见过有人模型输出 1000 类但训练时却用 5 类标签训练和推理两个错乱。5. 避坑与常见问题TensorFlow 2.3 花卉识别实测踩坑记录5.1 坑一数据增强造成 GPU 显存溢出现象训练刚跑完第一个 epoch程序直接报CUDA_ERROR_OUT_OF_MEMORY或者终端卡死在Read batch阶段。有时候是 CPU 内存耗尽风扇狂转然后 Python 进程被杀掉。原因flow_from_directory在每次迭代时都要把图片解码、缩放、增强如果batch_size开得大同时target_size又大GPU 显存或内存就会被一次性数据撑爆。数据增强的旋转、缩放也会临时产生多组中间张量峰值内存比不增强时高 2 到 3 倍。解决先把batch_size从 32 降到 16 或 8再看target_size是否真的需要 224。如果数据集图片本就小改成(160, 160)能省一半显存。另外可以给 TensorFlow 设置显存按需增长在训练脚本最开头加上 GPU 配置import tensorflow as tf gpus tf.config.experimental.list_physical_devices(GPU) if gpus: try: for gpu in gpus: tf.config.experimental.set_memory_growth(gpu, True) except RuntimeError as e: print(e)逻辑说明set_memory_growth(True)让 TensorFlow 不要在一开始就把整个显存占满而是随着分配逐步增长。这样即使显存小也能跑通只是速度略慢。5.2 坑二from_logits 搞错导致 loss 爆炸现象模型训练 loss 从一开始就是几十甚至几百准确率一直在 10% 左右不动像随机猜。或者 loss 在几个 epoch 内出现nan。原因最常见是模型最后一层用了activationsoftmax但在losscategorical_crossentropy里忘了 TensorFlow 2.3 的默认行为是from_logitsFalse。如果自信地写出losstf.keras.losses.CategoricalCrossentropy(from_logitsTrue)而实际上输出是 softmax 概率就会把概率值当成 logits 求交叉熵所有样本的损失都异常大。解决先明确模型最后一层有没有 softmax。有就用默认的categorical_crossentropy没有就用from_logitsTrue。最简单的自检办法是打印模型预测概率pred model.predict(train_generator[0][0])[:1] import numpy as np print(np.sum(pred)) # 有softmax会接近1.0没有softmax就是任意和如果是概率总和接近 1就说明from_logitsFalse是正确选择。这个问题没有银弹只能在最后修改这一行。5.3 坑三预训练权重下载失败现象第一次运行MobileNetV2(weightsimagenet)时终端卡在Downloading data from https://storage.googleapis.com/...很久不动最后报URLConnectionError或者Connection timed out。原因keras.applications默认从官方 storage 下载权重文件国内网络访问经常超时。加上校园网有防火墙或代理限制下载就是死活下不下来。解决去~/.keras/models/目录下查看是否有mobilenet_v2_weights_tf_dim_ordering_tf_kernels_1.0_224_no_top.h5如果没有就手动从镜像或者同学的缓存里把文件拷过来。Windows 的路径是C:\Users\你的用户名\.keras\models\。另外也可以在加载时直接指定本地权重路径base_model MobileNetV2( include_topFalse, weightspath/to/mobilenet_v2_weights.h5, input_shape(224, 224, 3) )参数说明weights参数传本地路径会跳过下载直接加载权重文件。注意文件名末尾的no_top因为它不包含分类层正好和include_topFalse匹配。如果你下载了带 top 的版本而include_topFalse加载时会报维度不匹配。5.4 坑四中文路径和文件编码问题现象训练集目录放在D:\期末作业\花数据集\下面用flow_from_directory读取时报UnicodeDecodeError或者 OpenCV 读图片时cv2.imread返回None。原因Windows 系统的中文路径在编码转换时经常出问题特别是cv2.imread底层调用的是 vc 的字符转换接口不认 Unicode 路径。而 Python 的pathlib.Path可以处理中文但 TensorFlow 的 dataloader 内部可能还是用字节流读取。解决把所有数据集目录和文件名改成纯英文这是最省事的做法。如果目录已经存在大量中文名可以用脚本一次性改名find flower_dataset -name *玫瑰花* -exec mv {} {}.tmp \; # 这是一个伪代码实际请用Python我更建议直接在 Python 里做from pathlib import Path base Path(flower_dataset/train) for p in base.iterdir(): if p.is_dir(): new_name p.name.encode(utf-8).decode(utf-8) # 简单重命名成英文字母 if not new_name.isascii(): p.rename(p.parent / flower str(len(list(p.parent.iterdir()))) _dir)逻辑说明Path能规避大部分 Windows 路径转义问题但最终还是要保证路径里只有 ASCII 字符。期末作业交到老师机器上老师的电脑可能是英文用户名、英文路径而你自己是中文用户名两边的绝对路径不一致所以代码里尽量用相对路径不要写死D:\。6. 把模型用起来OpenCV 实时识别和导出 SavedModel 给 Flask 接口调用模型训完不能只停在控制台里你得让评委看到你的模型能识别摄像头里的花哪怕那朵花是打印出来的图片。这里说两个最实用的进阶技巧。第一个是 OpenCV 实时识别。我用笔记本电脑摄像头对准网页上的花图片窗口里直接显示类别和置信度import cv2 from tensorflow.keras.models import load_model import numpy as np model load_model(flower_model.h5) class_names list(train_generator.class_indices.keys()) cap cv2.VideoCapture(0) while True: ret, frame cap.read() if not ret: break img cv2.resize(frame, (224, 224)) img img / 255.0 img np.expand_dims(img, axis0) pred model.predict(img)[0] idx np.argmax(pred) label class_names[idx] conf pred[idx] cv2.putText(frame, f{label}: {conf:.2f}, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) cv2.imshow(Flower Recognition, frame) if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()注意img / 255.0必须和训练时用的rescale一致否则模型输入分布错乱准确率会骤降。class_names是从train_generator.class_indices里取的保证顺序和训练时一样。如果你的摄像头前是一株真实的盆栽模型大概率会识别成树叶这很正常因为训练数据都是近距离的花卉没有这种背景。第二个是导出成 SavedModel 给 Flask 接口调用。在最后的答辩环节你可以在手机浏览器里提交一张图片后端返回 JSON 结果这就是一个完整的“花卉识别系统”了。import flask from tensorflow import saved_model app flask.Flask(__name__) model saved_model.load(flower_model_saved) app.route(/predict, methods[POST]) def predict(): f flask.request.files[image] img flask.request.files[image].read() # 用 PIL 读入并预处理 from PIL import Image import io img Image.open(io.BytesIO(img)).resize((224, 224)) arr np.array(img) / 255.0 arr np.expand_dims(arr, axis0) pred model(arr) idx int(np.argmax(pred.numpy()[0])) return {label: class_names[idx], confidence: float(pred.numpy()[0][idx])}这里用model(arr)而不是model.predict(arr)是因为 SavedModel 加载后是tf.function调用方式输入必须带 batch 维的 Tensor。我给所有跑过这个项目的同学说验证一个模型能不能见人最简单的方法就是随机挑一张验证集图片打印预测结果和真实标签。我自己的习惯是从那以后每次训练完成都强制走一遍真实图片预测而不是只看验证集准确率。因为准确率是平均值偶尔会掩盖个别类别的错乱。这么一测能立刻发现类别对齐问题希望帮到你少走这一段弯路。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

JSON转义与HTML实体转义混淆:定位后端收到quot;与反序列化异常 2026/10/1 9:43:59

JSON转义与HTML实体转义混淆:定位后端收到quot;与反序列化异常

1."和\"是两条完全不同的转义链路,先别混为一谈前端传 JSON、后台收到",这个现象我前后遇到过不下五次,每次的根因都不一样。刚接手的同学最容易犯的错,是把\"(反斜杠加引号)和…

阅读更多 →
PyTorch YOLO模型TensorRT加速部署实战指南 2026/10/1 9:43:59

PyTorch YOLO模型TensorRT加速部署实战指南

做推理加速绕不开 TensorRT,部署 YOLO 模型更是绕不开。开头先问一个问题:你的 YOLO 模型在 PyTorch 里跑得挺欢,帧率看起来也还行,但真到了线上环境——比如要同时扛几路视频流、或者在一台只有 8GB 显存的工控机上跑实例分割&am…

阅读更多 →
蒲公英书可视化解读:循环神经网络的时间展开与 LSTM / GRU 门控机制 2026/10/1 9:43:59

蒲公英书可视化解读:循环神经网络的时间展开与 LSTM / GRU 门控机制

【免费下载链接】nndl 邱锡鹏《神经网络与深度学习》第二版与通识版:电子书、章节目录、学习资源与勘误。 项目地址: https://gitcode.com/GitHub_Trending/nn/nndl 点击查看 免费下载 本文基于邱锡鹏《神经网络与深度学习(第二版&#xff0…

阅读更多 →
JavaScript深拷贝与浅拷贝:从原理到实战方案全解析 2026/10/1 9:43:59

JavaScript深拷贝与浅拷贝:从原理到实战方案全解析

1. 先从"引用"聊起:你变量里装的根本不是你想的那个数据有次排查线上问题,用户在一个表单里改了某个下拉框的值,结果页面右侧的配置面板整个跟着变了,连隐藏列都被重置了。查到最后,问题出在一行代码上&…

阅读更多 →
算法竞赛组合计数:Great Cells 的贡献法推导与拉格朗日插值 2026/10/1 9:43:58

算法竞赛组合计数:Great Cells 的贡献法推导与拉格朗日插值

Gym 101194H,刷题时间够久的人看到这个编号,应该都会对 2016 年青岛赛区的 H 题有点印象。题名 Great Cells,放在当年现场赛的中间位置,卡住过的队伍不在少数。这题不是那种硬刚数据结构的题,代码量也不大,…

阅读更多 →
Win11 WSL2安装CentOS:rootfs导入与systemd配置 2026/10/1 9:43:51

Win11 WSL2安装CentOS:rootfs导入与systemd配置

在 Windows11 上折腾 WSL 的人不少,但大多数人装完 Ubuntu 就停下了,因为微软官方商店里压根没有 CentOS 这个选项。偏偏国内不少企业的服务端环境、老项目的编译链、运维脚本,全是围着 CentOS 写的,尤其是 CentOS 7 那一套 rpm 生…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉