深度学习实战-基于EfficientNetB5的家禽鸡病图像分类识别模型

news2026/5/5 3:12:58
‍♂️ 个人主页艾派森的个人主页✍作者简介Python学习者 希望大家多多支持我们一起进步如果文章对你有帮助的话欢迎评论 点赞 收藏 加关注目录1.项目背景2.数据集介绍3.技术工具4.实验过程4.1导入数据4.2数据可视化4.3特征工程4.4构建模型4.5训练模型4.6模型评估4.7模型预测5.总结源代码1.项目背景在中小规模家禽养殖产业中疫病的早期发现与精准诊断直接关系到农户的经济命脉。然而传统的兽医诊断模式往往受限于地理位置与技术资源特别是在坦桑尼亚的阿鲁沙Arusha和乞力马扎罗Kilimanjaro等偏远地区养殖户很难在疫病爆发初期获得及时的专家指导。为了打破这一壁垒本项目利用开放数据工具包ODK应用通过手机采集了大量真实场景下的家禽粪便图像。这些图像不仅承载了球虫病、新城疫、沙门氏菌等常见致命疫病的视觉病理特征更包含了复杂的环境背景噪声具有极高的实战分析价值。我们希望通过引入高性能的EfficientNetB5深度学习架构构建一套能够精准识别家禽健康状态的自动化分类模型为缺乏兽医资源的农户提供一种低成本、高效率的即时诊断手段从而为智慧农业的防灾减损贡献技术方案。2.数据集介绍本实验数据集来源于Kaggle用于家禽疾病诊断的机器学习数据集本数据集包含用于中小规模家禽养殖户的家禽疾病诊断标注数据其中包括家禽粪便图像。这些图像于2020年9月至2021年2月期间在坦桑尼亚的阿鲁沙和乞力马扎罗地区使用手机上的开放数据工具包ODK应用程序拍摄。图像类别包括“球虫病”、“健康”、“新城疫”和“沙门氏菌”。图像尺寸调整为224像素×224像素。3.技术工具Python版本:3.9代码编辑器jupyter notebook4.实验过程4.1导入数据在正式构建家禽疾病识别模型之前环境配置与原始数据的清洗工作是决定模型上限的关键。由于家禽疾病图像如各种鸡类病害表现在细节上往往非常微妙我们需要利用高效的数据处理库来精确定位每一张样本及其对应的病理标签。这一阶段我们首先调动了核心的数值计算与自动化路径处理工具并重点通过 Pandas 框架加载存储在 CSV 文件中的元数据为后续的高分辨率图像读取打下坚实的基础。import numpy as np # 用于大规模矩阵运算 import pandas as pd # 用于高效的数据分析与 CSV 文件处理 import os # 提供跨平台的操作系统接口用于路径管理 import time # 用于记录训练与推理的时间开销 import matplotlib.pyplot as plt # 用于可视化图像与训练曲线 import cv2 # 强大的计算机视觉库用于图像读取与预处理 # 定义训练集所在的根目录路径 sdir r/kaggle/input/chicken-disease-1/Train # 定义存储图像路径与对应标签映射关系的 CSV 文件路径 csvpath r/kaggle/input/chicken-disease-1/train_data.csv # 使用 pandas 读取 CSV 数据将其转化为结构化的 DataFrame 对象 df pd.read_csv(csvpath) # 统一重命名列名为 filepaths文件路径和 labels疾病标签确保后续调用的规范性 df.columns [filepaths, labels] # 预览数据表的前几行确认数据加载是否正确且列名映射无误 df.head()4.2数据可视化在正式进入模型训练之前通过肉眼观察样本图像是必不可少的一步。家禽疾病的病理特征往往隐藏在复杂的背景中直接观察原始图像有助于我们确认数据标注的准确性并评估图像质量是否足以支撑 EfficientNetB5 这种深层网络的学习需求。利用 Matplotlib 的子图布局我们可以从数据集中随机抽取并展示代表性样本确保输入模型的数据符合预期。# 创建一个 3x3 的画布布局设置较大的尺寸以便清晰观察图像细节 fig, ax plt.subplots(nrows3, ncols3, figsize(20, 20)) # 将多维的 axes 数组展平为一维方便后续通过循环索引进行访问 ax ax.ravel() # 循环读取前 9 张图像并进行展示 for idx in range(min(9, len(df))): # 使用 OpenCV 根据 CSV 文件中的路径加载图像 img cv2.imread(df[filepaths][idx]) if img is not None: # 将图像统一缩放至 224x224 像素这是许多深度学习模型的标准输入尺寸 img cv2.resize(img, (224, 224)) # 由于 OpenCV 默认读取的是 BGR 格式需要转换为 RGB 格式才能用 Matplotlib 正确显示色彩 img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 在对应的子图中显示图像 ax[idx].imshow(img_rgb) # 从 DataFrame 中提取对应的疾病标签 label df[labels][idx] # 将标签设置为当前子图的标题方便对照图像与病害种类 ax[idx].title.set_text(label) # 隐藏坐标轴刻度使可视化界面更加整洁、聚焦 ax[idx].axis(off) else: # 如果路径失效或文件损坏打印错误提示以方便排查数据问题 print(f索引为 {idx} 的图像未找到或无法加载请检查文件路径。) # 自动调整子图间距防止标题与图像发生重叠 plt.tight_layout() plt.show()4.3特征工程原始数据往往包含不同分辨率的图片和文本分类标签这无法直接输入神经网络。我们编写了transform_data函数将所有图像统一缩放到180 x180分辨率并进行归一化处理将像素值缩减到 [0, 1] 区间以加速模型的收敛。同时针对疾病名称这种定性标签我们先通过标签编码器将其转换为整数再利用独热编码转换为分类向量确保损失函数能够正确计算类别间的差异。from sklearn.preprocessing import LabelEncoder from tensorflow.keras.utils import to_categorical def transform_data(df, image_size(180, 180)): 数据转换核心函数涵盖图像读取、缩放、归一化以及标签的数字化编码 images [] labels [] # 遍历 DataFrame 中的每一行数据 for _, row in df.iterrows(): # 读取指定路径的图像 img cv2.imread(row[filepaths]) if img is not None: img cv2.resize(img, image_size) # 统一修改图像尺寸适配模型输入 img img / 255.0 # 归一化处理将像素值从 [0, 255] 映射到 [0, 1] images.append(img) labels.append(row[labels]) # 将列表结构转换为 NumPy 矩阵方便张量运算 X np.array(images) # 实例化标签编码器 lb LabelEncoder() # 第一步将文本标签如 Coccidiosis转换为整数索引如 0, 1, 2... y lb.fit_transform(labels) # 第二步将整数索引转换为独热编码One-hot本项目共涉及 4 个疾病类别 y to_categorical(y, num_classes4) return X, y def load_data(X, y): # 此函数预留用于数据的进一步加载或磁盘持久化操作 return X, y # 第一步执行转换逻辑获取预处理后的特征矩阵 X 和标签矩阵 y X, y transform_data(df) # 第三步正式加载数据 X_train_raw, y_train_raw load_data(X, y) # 打印处理后的形状确认样本量与维度是否正确 print(fData shape: {X_train.shape}, Labels shape: {y_train.shape})为了科学评估 EfficientNetB5 的泛化能力我们需要将处理好的数据划分为训练集、验证集和测试集。这里我们采用了“二阶段切分法”首先剥离出 80% 的数据用于模型学习剩下的 20% 则平分为两半分别充当训练过程中的“监考官”验证集和期末考的“考卷”测试集。特别地我们开启了stratify参数确保在每一份子集中各类家禽疾病的样本比例保持一致防止模型产生分类偏见。from sklearn.model_selection import train_test_split # 第一次切分8:2 比例划分出训练集和临时集验证测试 # stratifyy 保证了分类标签在各数据集中的分布比例与原始数据完全一致 train_df, temp_df, train_labels, temp_labels train_test_split( X, y, train_size0.8, shuffleTrue, random_state123, stratifyy ) # 第二次切分将 20% 的临时集对半分生成最终的验证集10%和测试集10% val_df, test_df, val_labels, test_labels train_test_split( temp_df, temp_labels, test_size0.5, shuffleTrue, random_state123, stratifytemp_labels ) # 输出各阶段切分后的样本规模确保总数闭环 print(Train set:, train_df.shape, train_labels.shape) print(Validation set:, val_df.shape, val_labels.shape) print(Test set:, test_df.shape, test_labels.shape)4.4构建模型在处理复杂的农业图像数据时样本的多样性直接影响模型的鲁棒性。我们首先通过ImageDataGenerator引入了实时数据增强技术通过旋转、缩放、平移和镜像等手段模拟实际养殖场中光照变化或拍摄角度不一的复杂情况。核心架构上我们选择了经典的EfficientNetB5作为底层特征提取器。为了充分发挥迁移学习的优势我们加载了在 ImageNet 上预训练的权重并在此基础上构建了一个全连接层序列。通过引入BatchNormalization批标准化层来稳定训练过程并利用 ReLU 激活函数增强非线性表达能力最后通过 Softmax 层输出 4 类疾病的预测概率。from tensorflow.keras.preprocessing.image import ImageDataGenerator from tensorflow.keras.applications import EfficientNetB5 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Flatten, BatchNormalization from tensorflow.keras.optimizers import Adam # 配置数据增强生成器提升模型对不同环境干扰的抵抗力 train_datagen ImageDataGenerator( rescale1./255, # 像素重放缩通常在上一阶段已处理此处作为生成器配置 rotation_range20, # 随机旋转角度范围 width_shift_range0.2, # 水平平移比例 height_shift_range0.2, # 垂直平移比例 shear_range0.2, # 剪切变换强度 zoom_range0.2, # 随机缩放比例 horizontal_flipTrue, # 开启水平翻转 fill_modenearest # 变换后空缺处的填充模式 ) # 实例化 EfficientNetB5 基座模型 # include_topFalse 表示舍弃原有的分类头以便我们自定义输出层 base_model EfficientNetB5(weightsimagenet, include_topFalse, input_shape(180, 180, 3)) # 开启基座模型的可训练属性以便进行深度微调Fine-tuning base_model.trainable True # 采用 Sequential 顺序容器构建自定义模型顶层 model Sequential([ base_model, # 嵌入预训练基座 Flatten(), # 展平高维特征图 Dense(256, activationrelu), # 第一个全连接层捕捉高阶特征 BatchNormalization(), # 批标准化加速收敛并防止梯度爆炸 Dense(128, activationrelu), # 第二个全连接层 Dense(64, activationrelu), # 第三个全连接层 Dense(4, activationsoftmax) # 输出层对应 4 个疾病类别使用 Softmax 归一化概率 ]) # 显式构建模型并指定输入形状 model.build(input_shape(None, 180, 180, 3)) # 配置模型编译参数 # 使用较低的学习率0.0001以确保在微调阶段不会破坏预训练好的权重 model.compile( optimizerAdam(learning_rate0.0001), losscategorical_crossentropy, # 配合上一阶段的独热编码使用交叉熵损失 metrics[accuracy] # 监控准确率指标 ) # 输出模型结构摘要检查参数总量及各层连接情况 model.summary()4.5训练模型训练过程是模型将预训练的通用视觉特征转化为家禽疾病识别能力的“进化”过程。我们设置了 30 个迭代轮数Epochs并采用 32 的批大小Batch Size这在显存占用与梯度更新稳定性之间取得了较好的平衡。通过实时监控验证集Validation Data的表现我们可以直观地看到模型在未见数据上的泛化性能提升曲线。# 启动模型训练流程 # 使用处理好的训练集数据与对应的标签进行拟合 history model.fit( train_df, train_labels, # 训练数据与标签 validation_data(val_df, val_labels), # 验证集用于每个 epoch 后评估模型泛化能力 epochs30, # 迭代轮数根据收敛情况可灵活调整 batch_size32, # 批处理大小兼顾训练速度与内存开销 verbose1 # 日志显示模式1 为输出进度条记录 )4.6模型评估训练完成后我们首先在完全独立、未参与过训练的测试集上运行model.evaluate获取最真实的泛化性能指标。随后通过绘制训练集与验证集的准确率Accuracy和损失值Loss随迭代次数Epochs变化的曲线我们可以直观地评估模型是否存在欠拟合或过拟合现象。一个理想的训练轨迹应该是两条曲线趋于平稳且间距较小。# 在独立的测试集上评估模型性能获取最终的损失值和准确率 test_loss, test_accuracy model.evaluate(test_df, test_labels) print(f测试集损失: {test_loss:.4f}, 测试集准确率: {test_accuracy:.4f}) # --- 绘制模型准确率变化曲线 --- plt.plot(history.history[accuracy], label训练集准确率) plt.plot(history.history[val_accuracy], label验证集准确率) plt.title(模型准确率演变图) plt.ylabel(准确率) plt.xlabel(迭代轮数 (Epochs)) plt.legend() plt.show() # --- 绘制模型损失值变化曲线 --- plt.plot(history.history[loss], label训练集损失) plt.plot(history.history[val_loss], label验证集损失) plt.title(模型损失演变图) plt.ylabel(损失值) plt.xlabel(迭代轮数 (Epochs)) plt.legend() plt.show()单纯的准确率往往会掩盖一些细节问题例如模型是否容易将 A 病误判为 B 病。为了深入剖析模型的分类逻辑我们利用confusion_matrix生成了混淆矩阵。通过对预测标签与真实标签的交叉比对我们可以清晰地看到模型在 4 类家禽疾病上的识别偏好。矩阵对角线上的数值越高代表模型对该类别的识别越精准。from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay # 重新验证测试集确保评估的一致性 test_loss, test_accuracy model.evaluate(test_df, test_labels, verbose1) print(最终测试准确率:, test_accuracy) # 执行模型推理获取测试集所有样本的预测概率分布 predictions model.predict(test_df) # 使用 argmax 提取概率最大的索引作为预测类别 predicted_labels np.argmax(predictions, axis1) # 同样提取真实标签的索引以便进行比对 true_labels np.argmax(test_labels, axis1) # 计算混淆矩阵统计各类别之间的预测分布情况 cm confusion_matrix(true_labels, predicted_labels) # 使用 ConfusionMatrixDisplay 以热力图的形式进行可视化展示 # cmapBlues 可以让数值较高的区域颜色更深视觉对比更明显 disp ConfusionMatrixDisplay(confusion_matrixcm) disp.plot(cmapBlues) plt.title(家禽疾病分类混淆矩阵) plt.show()4.7模型预测在完成所有评估指标的计算后最直观的验证方式莫过于将模型置于实际的测试样本中进行“盲测”。我们从测试集中随机抽取 9 张家禽图像让训练好的 EfficientNetB5 模型给出判断结果并将其与真实标签进行比对。为了提高可读性我们通过颜色标识来区分预测结果绿色代表判断正确红色则警示预测偏差这能帮助我们快速复盘模型在处理特定病症如新城疫或沙门氏菌感染时的视觉辨析逻辑。import matplotlib.pyplot as plt # 第一步对测试集数据进行推理获取每个样本属于各疾病类别的概率 predictions model.predict(test_df) # 第二步将预测的概率分布转换为具体的类别索引 # 取概率最大的索引作为模型最终的预测结论 encoded_predictions np.argmax(predictions, axis1) # 第三步将数字索引还原为人类可读的疾病名称 # 手动定义类别名称映射表球虫病、健康、新城疫、沙门氏菌 lb LabelEncoder() lb.classes_ np.array([Coccidiosis, Healthy, New Castle Disease, Salmonella]) # 还原预测标签和真实标签 decoded_predictions lb.inverse_transform(encoded_predictions) decoded_real_labels lb.inverse_transform(np.argmax(test_labels, axis1)) # 设置绘图画布大小准备展示 3x3 的九宫格预测图 plt.figure(figsize(12, 12)) # 遍历前 9 个测试样本进行可视化对比 for i in range(9): # 提取第 i 个测试样本的图像数据 img test_df[i] real_label decoded_real_labels[i] predicted_label decoded_predictions[i] # 在 3x3 布局中定位子图 plt.subplot(3, 3, i 1) # 显示原始图像已归一化处理imshow 会自动适配 [0, 1] 范围 plt.imshow(img) plt.axis(off) # 隐藏坐标轴 # 动态设置标题颜色预测正确显示绿色预测错误显示红色 title_color green if predicted_label real_label else red # 在图像上方标注预测值与真实值 plt.title(fPred: {predicted_label}\nActual: {real_label}, colortitle_color) # 优化子图排版确保标题与图片不发生重叠 plt.tight_layout() plt.show()最后可以可视化并保存模型的架构from tensorflow.keras.utils import plot_model from IPython.display import Image, display plot_model(model, to_filemodel_architecture.png, show_shapesTrue, show_layer_namesTrue)5.总结本实验基于 Kaggle 提供的家禽疾病诊断数据集深入探索了深度学习在中小规模养殖场景下的实战应用。该数据集具有极强的现实意义所有粪便样本图像均由养殖户通过移动端 ODK 应用在坦桑尼亚阿鲁沙及乞力马扎罗地区实地采集涵盖了球虫病、新城疫、沙门氏菌及健康状态四个核心类别。在模型构建中我们通过将图像标准化为224x224像素并引入EfficientNetB5强力主干网络成功捕获了不同病害在视觉特征上的细微差异。实验结果显示模型在经过 30 轮迭代后表现出了卓越的性能训练准确率达到了 97.79%而独立测试集的准确率也稳定在 97.40% 左右且损失值控制在极低的 0.0974。这一高精度的识别表现充分证明了迁移学习架构在处理真实农业场景、辅助养殖户进行低成本疫病预警方面的巨大潜力为后续开发便携式智能诊疗工具提供了坚实的算法基础。源代码import numpy as np import pandas as pd import os import time import matplotlib.pyplot as plt import cv2 sdirr/kaggle/input/chicken-disease-1/Train csvpathr/kaggle/input/chicken-disease-1/train_data.csv dfpd.read_csv(csvpath) df.columns[filepaths, labels ] df.head() # Adjust the figure to have 3 rows and 3 columns fig, ax plt.subplots(nrows3, ncols3, figsize(20, 20)) ax ax.ravel() # Flatten the axes array for easier indexing # Loop through the images (up to 9) for idx in range(min(9, len(df))): # Get up to 9 images # Load the image from the file path img cv2.imread(df[filepaths][idx]) if img is not None: img cv2.resize(img, (224, 224)) # Resize if needed img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # Convert to RGB format ax[idx].imshow(img_rgb) # Display the image # Get the label label df[labels][idx] # Set title based on the label ax[idx].title.set_text(label) ax[idx].axis(off) # Hide axes for a cleaner look else: print(fImage at index {idx} not found or couldnt be loaded.) plt.tight_layout() plt.show() from sklearn.preprocessing import LabelEncoder from tensorflow.keras.utils import to_categorical def transform_data(df, image_size(180, 180)): images [] labels [] # Load and preprocess images for _, row in df.iterrows(): img cv2.imread(row[filepaths]) if img is not None: img cv2.resize(img, image_size) # Resize image img img / 255.0 # Normalize image images.append(img) labels.append(row[labels]) # Convert to NumPy arrays X np.array(images) # Encode labels lb LabelEncoder() y lb.fit_transform(labels) # Integer encode labels y to_categorical(y, num_classes4) # One-hot encode labels for 4 classes return X, y def load_data(X, y): # This step can involve saving to disk, or directly using in model training return X, y # Step 1: Transform X, y transform_data(df) # Step 3: Load X_train, y_train load_data(X, y) print(fData shape: {X_train.shape}, Labels shape: {y_train.shape}) from sklearn.model_selection import train_test_split # Initial 80-20 split for train and temp (test validation) train_df, temp_df, train_labels, temp_labels train_test_split( X, y, train_size0.8, shuffleTrue, random_state123, stratifyy ) # Split the temporary set equally (50-50) into validation and test sets val_df, test_df, val_labels, test_labels train_test_split( temp_df, temp_labels, test_size0.5, shuffleTrue, random_state123, stratifytemp_labels ) # This results in: # - train_df and train_labels: 80% of the data # - val_df and val_labels: 10% of the data (validation set) # - test_df and test_labels: 10% of the data (test set) print(Train set:, train_df.shape, train_labels.shape) print(Validation set:, val_df.shape, val_labels.shape) print(Test set:, test_df.shape, test_labels.shape) from tensorflow.keras.preprocessing.image import ImageDataGenerator from tensorflow.keras.applications import EfficientNetB5 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Flatten, BatchNormalization from tensorflow.keras.optimizers import Adam from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping # Data Augmentation train_datagen ImageDataGenerator( rescale1./255, rotation_range20, width_shift_range0.2, height_shift_range0.2, shear_range0.2, zoom_range0.2, horizontal_flipTrue, fill_modenearest ) # Define the model using EfficientNetB5 base_model EfficientNetB5(weightsimagenet, include_topFalse, input_shape(180, 180, 3)) # Freeze the layers in the base model base_model.trainable True # Optionally keep this True for fine-tuning # Create the model model Sequential([ base_model, Flatten(), Dense(256, activationrelu), BatchNormalization(), Dense(128, activationrelu), Dense(64, activationrelu), Dense(4, activationsoftmax) # Adjust output layer for the number of classes ]) # Build the model with the input shape model.build(input_shape(None, 180, 180, 3)) # Include the channel dimension # Adjust the model compilation model.compile(optimizerAdam(learning_rate0.0001), losssparse_categorical_crossentropy, metrics[accuracy]) # Compile the model model.compile(optimizerAdam(learning_rate0.0001), losscategorical_crossentropy, # Use sparse categorical if labels are not one-hot encoded metrics[accuracy]) # Print the model summary model.summary() # Train the model without data generators history model.fit( train_df, train_labels, validation_data(val_df, val_labels), epochs30, # Adjust the number of epochs as needed batch_size32, verbose1 ) # Evaluate the model on the test set test_loss, test_accuracy model.evaluate(test_df, test_labels) print(fTest Loss: {test_loss:.4f}, Test Accuracy: {test_accuracy:.4f}) # Visualize training history plt.plot(history.history[accuracy], labelTrain Accuracy) plt.plot(history.history[val_accuracy], labelValidation Accuracy) plt.title(Model Accuracy) plt.ylabel(Accuracy) plt.xlabel(Epochs) plt.legend() plt.show() plt.plot(history.history[loss], labelTrain Loss) plt.plot(history.history[val_loss], labelValidation Loss) plt.title(Model Loss) plt.ylabel(Loss) plt.xlabel(Epochs) plt.legend() plt.show() from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay test_loss, test_accuracy model.evaluate(test_df, test_labels, verbose1) print(Test Accuracy:, test_accuracy) # Make predictions on the test data predictions model.predict(test_df) predicted_labels np.argmax(predictions, axis1) true_labels np.argmax(test_labels, axis1) # Calculate the confusion matrix cm confusion_matrix(true_labels, predicted_labels) # Display the confusion matrix disp ConfusionMatrixDisplay(confusion_matrixcm) disp.plot(cmapBlues) plt.title(Confusion Matrix) plt.show() import matplotlib.pyplot as plt # Assume X_test and y_test are your test data and test labels, respectively # Step 1: Make predictions on the test set predictions model.predict(test_df) # Step 2: Convert predictions from one-hot encoding to label indices # This gets the index with the highest probability for each prediction encoded_predictions np.argmax(predictions, axis1) # Step 3: Decode the predictions and true labels to get original label names lb LabelEncoder() lb.classes_ np.array([Coccidiosis, Healthy, New Castle Disease, Salmonella]) # Define your classes decoded_predictions lb.inverse_transform(encoded_predictions) decoded_real_labels lb.inverse_transform(np.argmax(test_labels, axis1)) # Plot settings plt.figure(figsize(12, 12)) # Display 9 sample predictions with images for i in range(9): # Select image and labels for the i-th sample img test_df[i] real_label decoded_real_labels[i] predicted_label decoded_predictions[i] # Plotting the image plt.subplot(3, 3, i 1) plt.imshow(img) plt.axis(off) # Display predicted and actual labels plt.title(fPred: {predicted_label}\nActual: {real_label}, colorgreen if predicted_label real_label else red) # Show the plot plt.tight_layout() plt.show()资料获取更多粉丝福利关注下方公众号获取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2583692.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…