当前位置: 首页 > news >正文

基于深度学习算法的动物检测系统(含PyQt+代码+训练数据集)

基于深度学习算法的动物检测系统(含PyQt+代码+训练数据集)

  • 前言
  • 一、数据集
    • 1.1 数据集介绍
    • 1.2 数据预处理
  • 二、模型搭建
  • 三、训练与测试
    • 3.1 模型训练
    • 3.2 模型测试
  • 四、PyQt界面实现
  • 五、讨论
    • 5.1 模型优缺点分析
    • 5.2 实验意义
  • 参考资料

前言

本项目是基于MobileNet深度学习网络模型的动物检测系统,目前能够检测大象、狗、蝴蝶、坤坤、牛、马等10种动物,可以自己添加动物种类进行训练。本文将详述数据集处理、模型构建、训练代码、以及基于PyQt5的应用界面设计。在应用中可以对动物的图片进行识别,输出动物的类别、模型对其预测结果的置信度以及关于该动物的详细描述。本文附带了完整的应用界面设计、深度学习模型代码和训练数据集的下载链接。

完整资源下载链接:

  1. 基于深度学习的动物分类检测识别系统(PyQT+代码+训练数据集+UI界面版本1)
  2. 基于深度学习的动物分类检测识别系统(PyQT+代码+训练数据集+UI界面版本2)

项目演示视频:

一、数据集

1.1 数据集介绍

本项目使用的数据集在all_data文件夹下。它包含了来自10种不同的动物类别的图像(来自网络采集),每个类别有1000张以上的图像,共计26179张图像。这些动物类别包括:大象、狗、蝴蝶、坤坤、牛、马等。
在这里插入图片描述

该文件夹下包含了10个子文件夹,每个子文件夹都存储了一种类别的动物图像,子文件夹的名称就是动物类别的名称,同时为了保证数据的多样性和代表性,每类动物包括多个个体和不同的姿态。动物数据集,如下图所示:
在这里插入图片描述

1.2 数据预处理

首先使用MyDataSet类在 PyTorch 中加载图像数据并将其与相应的类别标签配对,完成自定义数据集的生成。它包含初始化方法__init__来接收图像文件路径列表和对应的类别标签列表,并提供了__getitem__方法来获取图像及其标签,同时还可以使用collate_fn将多个样本进行批处理。

class MyDataSet(Dataset):"""自定义数据集"""def __init__(self, images_path: list, images_class: list, transform=None):self.images_path = images_pathself.images_class = images_classself.transform = transformdef __len__(self):return len(self.images_path)def __getitem__(self, item):img = Image.open(self.images_path[item])# RGB为彩色图片,L为灰度图片if img.mode != 'RGB':raise ValueError("image: {} isn't RGB mode.".format(self.images_path[item]))label = self.images_class[item]if self.transform is not None:img = self.transform(img)return img, label@staticmethoddef collate_fn(batch):images, labels = tuple(zip(*batch))images = torch.stack(images, dim=0)labels = torch.as_tensor(labels)return images, labels

然后,我们将所有图像的尺寸调整为224x224像素,以适应模型输入层的要求。最后,应用了一系列数据增强技术来提高模型的泛化能力,包括随机裁剪、水平翻转等。此外,对所有图像进行了标准化处理,使用了ImageNet的预训练均值和标准差,即均值[0.485, 0.456, 0.406],标准差[0.229, 0.224, 0.225]。这些预处理步骤有助于减轻模型在训练过程中因图像大小、颜色变化等因素带来的偏差。

    img_size = 224data_transform = transforms.Compose([transforms.Resize(int(img_size * 1.143)),transforms.CenterCrop(img_size),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])assert os.path.exists(img_path), "file: '{}' dose not exist.".format(img_path)img = Image.open(img_path)plt.imshow(img)# [N, C, H, W]img = data_transform(img)# expand batch dimensionimg = torch.unsqueeze(img, dim=0)

二、模型搭建

选择MobileNet作为主要的模型结构。MobileNet是一种轻量级卷积神经网络,特别适合于资源受限的设备,如移动设备和嵌入式系统。MobileNet通过引入深度可分离卷积(Depthwise Separable Convolution),显著降低了模型的计算复杂度和参数量,同时保持了较高的分类性能。传统的卷积操作在进行特征提取时需要大量的计算资源。MobileNet通过将标准卷积分解为深度卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution),大幅减少了计算量。具体而言,深度卷积是指对每个输入通道单独应用一个卷积核,而逐点卷积则是在深度卷积的输出上应用1x1卷积核,用于组合这些输出通道。通过这种分解,MobileNet的计算量和参数量分别减少了约8-9倍,而模型的分类性能则得到了有效的保持。
在这里插入图片描述
MobileNet的网络架构主要由若干个深度可分离卷积模块组成,每个模块包括一个深度卷积层和一个逐点卷积层。
在这里插入图片描述
以下是MobileNet的主要结构特点:

  1. 输入层:输入层接受224x224的RGB图像,并通过标准卷积层提取初步特征。
  2. 深度可分离卷积模块:多个深度可分离卷积模块逐层提取和组合特征。每个模块通常伴随着批归一化(Batch Normalization)和ReLU激活函数,以加速收敛和提高非线性表达能力。
  3. 全局平均池化层:在特征提取完成后,使用全局平均池化层将特征映射缩减为一个向量,减少参数量的同时保持重要信息。
  4. 全连接层:最终的全连接层用于输出每个类别的概率分布,模型通过Softmax函数生成最终的分类结果。

MobileNet的网络架构代码如下,

"""mobilenet in pytorch[1] Andrew G. Howard, Menglong Zhu, Bo Chen, Dmitry Kalenichenko, Weijun Wang, Tobias Weyand, Marco Andreetto, Hartwig AdamMobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applicationshttps://arxiv.org/abs/1704.04861
"""import torch
import torch.nn as nnclass DepthSeperabelConv2d(nn.Module):def __init__(self, input_channels, output_channels, kernel_size, **kwargs):super().__init__()self.depthwise = nn.Sequential(nn.Conv2d(input_channels,input_channels,kernel_size,groups=input_channels,**kwargs),nn.BatchNorm2d(input_channels),nn.ReLU(inplace=True))self.pointwise = nn.Sequential(nn.Conv2d(input_channels, output_channels, 1),nn.BatchNorm2d(output_channels),nn.ReLU(inplace=True))def forward(self, x):x = self.depthwise(x)x = self.pointwise(x)return xclass BasicConv2d(nn.Module):def __init__(self, input_channels, output_channels, kernel_size, **kwargs):super().__init__()self.conv = nn.Conv2d(input_channels, output_channels, kernel_size, **kwargs)self.bn = nn.BatchNorm2d(output_channels)self.relu = nn.ReLU(inplace=True)def forward(self, x):x = self.conv(x)x = self.bn(x)x = self.relu(x)return xclass MobileNet(nn.Module):"""Args:width multipler: The role of the width multiplier α is to thina network uniformly at each layer. For a givenlayer and width multiplier α, the number ofinput channels M becomes αM and the number ofoutput channels N becomes αN."""def __init__(self, width_multiplier=1, class_num=100):super().__init__()alpha = width_multiplierself.stem = nn.Sequential(BasicConv2d(3, int(32 * alpha), 3, padding=1, bias=False),DepthSeperabelConv2d(int(32 * alpha),int(64 * alpha),3,padding=1,bias=False))#downsampleself.conv1 = nn.Sequential(DepthSeperabelConv2d(int(64 * alpha),int(128 * alpha),3,stride=2,padding=1,bias=False),DepthSeperabelConv2d(int(128 * alpha),int(128 * alpha),3,padding=1,bias=False))#downsampleself.conv2 = nn.Sequential(DepthSeperabelConv2d(int(128 * alpha),int(256 * alpha),3,stride=2,padding=1,bias=False),DepthSeperabelConv2d(int(256 * alpha),int(256 * alpha),3,padding=1,bias=False))#downsampleself.conv3 = nn.Sequential(DepthSeperabelConv2d(int(256 * alpha),int(512 * alpha),3,stride=2,padding=1,bias=False),DepthSeperabelConv2d(int(512 * alpha),int(512 * alpha),3,padding=1,bias=False),DepthSeperabelConv2d(int(512 * alpha),int(512 * alpha),3,padding=1,bias=False),DepthSeperabelConv2d(int(512 * alpha),int(512 * alpha),3,padding=1,bias=False),DepthSeperabelConv2d(int(512 * alpha),int(512 * alpha),3,padding=1,bias=False),DepthSeperabelConv2d(int(512 * alpha),int(512 * alpha),3,padding=1,bias=False))#downsampleself.conv4 = nn.Sequential(DepthSeperabelConv2d(int(512 * alpha),int(1024 * alpha),3,stride=2,padding=1,bias=False),DepthSeperabelConv2d(int(1024 * alpha),int(1024 * alpha),3,padding=1,bias=False))self.fc = nn.Linear(int(1024 * alpha), class_num)self.avg = nn.AdaptiveAvgPool2d(1)def forward(self, x):x = self.stem(x)x = self.conv1(x)x = self.conv2(x)x = self.conv3(x)x = self.conv4(x)x = self.avg(x)x = x.view(x.size(0), -1)x = self.fc(x)return xdef mobilenet(alpha=1, class_num=10):return MobileNet(alpha, class_num)

为了提高MobileNet模型的识别精度,训练过程中采用了随机梯度下降(SGD)优化器,学习率初始设置为0.0001,并采用了动态学习率调整策略,根据验证集的表现进行适当的学习率衰减。

三、训练与测试

3.1 模型训练

为了确保模型能够在多样化的数据上进行训练,数据集被划分为训练集(80%)和验证集(20%),并在独立的验证集上进行性能评估。在训练过程中,模型训练了50个Epoch,每个Epoch包含多个Batch处理,每个Batch的大小为16。通过小批量随机梯度下降法(Mini-batch SGD)进行优化,Batch size设置为16,能够在内存和计算效率之间取得平衡。

 	 parser = argparse.ArgumentParser()parser.add_argument('--num_classes', type=int, default=10)parser.add_argument('--epochs', type=int, default=100)parser.add_argument('--batch-size', type=int, default=2)parser.add_argument('--lr', type=float, default=0.0001)# 数据集所在根目录parser.add_argument('--data-path', type=str,default="all_data")# 预训练权重路径,如果不想载入就设置为空字符parser.add_argument('--weights', type=str, default='',help='initial weights path')# 是否冻结权重parser.add_argument('--freeze-layers', type=bool, default=False)parser.add_argument('--device', default='cuda:0', help='device id (i.e. 0 or 0,1 or cpu)')opt = parser.parse_args()train_loss_list = []train_acc_list = []val_loss_list = []val_acc_list = []main(opt)draw(train_acc_list, val_acc_list, 'acc')draw(train_loss_list, val_loss_list, 'loss')

然后通过下面代码,设置模型训练设备和文件夹路径。接着对数据进行预处理并创建数据集和数据加载器。并根据命令行参数配置模型并加载预训练权重,可选择性地冻结部分模型参数。最后,使用SGD优化器进行训练,并在每个epoch结束时保存模型权重。整个训练过程可以记录损失、准确率等指标,并将其写入TensorBoard。

def main(args):device = torch.device(args.device if torch.cuda.is_available() else "cpu")if os.path.exists("./weights") is False:os.makedirs("./weights")tb_writer = SummaryWriter()train_images_path, train_images_label, val_images_path, val_images_label = read_split_data(args.data_path)img_size = 224data_transform = {"train": transforms.Compose([transforms.RandomResizedCrop(img_size),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]),"val": transforms.Compose([transforms.Resize(int(img_size * 1.143)),transforms.CenterCrop(img_size),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])}# 实例化训练数据集train_dataset = MyDataSet(images_path=train_images_path,images_class=train_images_label,transform=data_transform["train"])# 实例化验证数据集val_dataset = MyDataSet(images_path=val_images_path,images_class=val_images_label,transform=data_transform["val"])batch_size = args.batch_sizenw = min([os.cpu_count(), batch_size if batch_size > 1 else 0, 8])  # number of workersprint('Using {} dataloader workers every process'.format(nw))train_loader = torch.utils.data.DataLoader(train_dataset,batch_size=batch_size,shuffle=True,pin_memory=True,num_workers=nw,collate_fn=train_dataset.collate_fn)val_loader = torch.utils.data.DataLoader(val_dataset,batch_size=batch_size,shuffle=False,pin_memory=True,num_workers=nw,collate_fn=val_dataset.collate_fn)model = create_model(class_num=args.num_classes).to(device)if args.weights != "":assert os.path.exists(args.weights), "weights file: '{}' not exist.".format(args.weights)model.load_state_dict(torch.load(args.weights, map_location=device))if args.freeze_layers:for name, para in model.named_parameters():# 除head外,其他权重全部冻结if "head" not in name:para.requires_grad_(False)else:print("training {}".format(name))pg = [p for p in model.parameters() if p.requires_grad]optimizer = optim.AdamW(pg, lr=args.lr, weight_decay=5E-2)for epoch in range(args.epochs):# traintrain_loss, train_acc = train_one_epoch(model=model,optimizer=optimizer,data_loader=train_loader,device=device,epoch=epoch)# validateval_loss, val_acc = evaluate(model=model,data_loader=val_loader,device=device,epoch=epoch)train_acc_list.append(train_acc)train_loss_list.append(train_loss)val_acc_list.append(val_acc)val_loss_list.append(val_loss)tags = ["train_loss", "train_acc", "val_loss", "val_acc", "learning_rate"]tb_writer.add_scalar(tags[0], train_loss, epoch)tb_writer.add_scalar(tags[1], train_acc, epoch)tb_writer.add_scalar(tags[2], val_loss, epoch)tb_writer.add_scalar(tags[3], val_acc, epoch)tb_writer.add_scalar(tags[4], optimizer.param_groups[0]["lr"], epoch)if train_loss == min(train_loss_list):print('save-best-epoch:{}'.format(epoch))torch.save(model.state_dict(), "./weights/best-epoch.pth")

整个训练、测试过程可以记录损失、准确率、混淆矩阵等性能评价指标
1. 损失指标
损失值是衡量模型在给定数据上预测误差的重要指标,随着训练的进行,损失值应逐渐降低,直到达到某一稳定值。
在这里插入图片描述
根据实验数据,训练集的损失值从初始的1.87逐步下降到0.448,验证集的损失值则从1.75下降到0.309(如图上图所示)。验证集的损失值明显低于训练集,表明模型在验证数据上的表现优于训练数据,这可能与验证数据的样本分布更加均匀有关。同时,损失值的收敛趋势表明,经过50个Epoch的训练,模型已经达到了较好的拟合效果,并且没有出现过拟合现象。
2. 准确率
模型的分类准确率是评估其性能的关键指标之一。
在这里插入图片描述
实验结果显示,训练集的准确率从初始的约0.1逐渐提升到0.852,而验证集的准确率则从0.12提升至0.914(如图上图所示)。验证集的准确率在模型训练后期持续高于训练集,这进一步验证了模型在验证数据上的良好表现。这表明模型不仅能够有效地学习训练数据中的模式,而且能够很好地泛化到未见过的验证数据。最高的验证准确率为91.4%,表明本系统在动物分类任务中具有较高的识别精度。

  1. 混淆矩阵分析
    混淆矩阵提供了更为详细的分类结果信息,显示了模型在每一类上的预测准确性。
    在这里插入图片描述
    根据混淆矩阵的结果,模型对大部分类别的识别准确率都非常高,平均准确率达到了95%。对于部分类别,如狗和绵羊,尽管存在少量的误分类情况,但整体表现依然令人满意。这些误分类现象可能与这些类别之间存在较高的相似性或样本的多样性有关。进一步的误分类分析可以帮助优化数据集,或者调整模型的超参数设置。

3.2 模型测试

可以分别使用predict.py对单张动物图片进行检测。

# predict.py
def main(img_path):import osos.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")img_size = 224data_transform = transforms.Compose([transforms.Resize(int(img_size * 1.143)),transforms.CenterCrop(img_size),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])assert os.path.exists(img_path), "file: '{}' dose not exist.".format(img_path)img = Image.open(img_path)plt.imshow(img)# [N, C, H, W]img = data_transform(img)# expand batch dimensionimg = torch.unsqueeze(img, dim=0)# read class_indictjson_path = './class_indices.json'assert os.path.exists(json_path), "file: '{}' dose not exist.".format(json_path)json_file = open(json_path, "r")class_indict = json.load(json_file)# create model  创建模型网络model = create_model(class_num=10).to(device)# load model weights  加载模型model_weight_path = "weights/best-epoch.pth"model.load_state_dict(torch.load(model_weight_path, map_location=device))model.eval()#调用模型进行检测with torch.no_grad():# predict classoutput = torch.squeeze(model(img.to(device))).cpu()predict = torch.softmax(output, dim=0)predict_cla = torch.argmax(predict).numpy()for i in range(len(predict)):print("class: {:10}   prob: {:.3}".format(class_indict[str(i)],predict[i].numpy()))# 返回检测结果和准确率res = class_indict[str(list(predict.numpy()).index(max(predict.numpy())))]num= "%.2f" % (max(predict.numpy()) * 100) + "%"print(res,num)return res,num

测试结果:
在这里插入图片描述

四、PyQt界面实现

当整个项目构建完成后,使用PyQt5编写可视化界面,可以支持植物/中草药的检测。运行ui.py,然后点击文件夹图片传入待检测的动物图像即可。经过动物识别系统识别后,会输出相应的类别和置信度,以及相应类别的详细介绍。

系统界面UI基础版,只可以选择单张图形进行识别检测。
在这里插入图片描述
系统界面UI升级版,可以批量地对动物图像进行识别检测。
在这里插入图片描述

五、讨论

5.1 模型优缺点分析

1、模型优点

本研究选择了MobileNet作为核心模型,这一选择带来了多方面的优势。首先,MobileNet通过引入深度可分离卷积,有效地降低了模型的计算复杂度和参数量,这使得模型在资源受限的环境下也能够运行良好。具体而言,MobileNet的参数量仅为传统卷积神经网络的1/8至1/9,这不仅减少了计算成本,也降低了内存占用,使得模型可以在移动设备或嵌入式系统中部署。

其次,实验结果表明,尽管MobileNet是一个轻量级模型,但它在分类准确率上表现出色。验证集的最高准确率达到了91.4%,平均准确率达到了96%,这表明MobileNet能够在保证高识别精度的同时,兼顾模型的效率和轻量化需求。此外,模型在多种不同类别的动物识别任务中表现稳定,没有明显的类别偏差,说明其具有良好的泛化能力。

2、模型缺点

尽管MobileNet在本研究中表现良好,但它也存在一些局限性。首先,轻量级的设计虽然降低了计算复杂度,但在处理非常复杂的图像特征时,MobileNet可能无法与更深层次的网络(如ResNet或DenseNet)相比。这一点在处理高相似度的动物类别时尤为明显,虽然整体准确率较高,但在某些细分类别上,误分类的现象仍然存在。

此外,MobileNet在应对极端情况下(如低光照、遮挡或严重噪声干扰)时的表现还有待提升。虽然本研究通过数据增强技术部分缓解了这些问题,但仍需进一步研究如何提高模型在复杂环境下的鲁棒性。

5.2 实验意义

本研究的实验结果对动物识别技术的发展具有重要意义。首先,我们验证了MobileNet作为轻量级模型在实际应用中的可行性和有效性。这表明在资源有限的场景中,如移动设备或嵌入式系统,轻量级的深度学习模型仍能提供高效且准确的动物识别服务。

其次,实验结果也显示了深度学习在处理多样化数据时的强大能力。通过对26179张多样化动物图像的训练,模型成功学会了捕捉各类动物的关键特征,这不仅证明了深度学习的强大学习能力,也为进一步的应用奠定了基础。

参考资料

  1. 论文:https://arxiv.org/pdf/2103.14030.pdf
  2. MobileNet网络模型详解资料:详解MobileNet
  3. 界面设计

相关文章:

基于深度学习算法的动物检测系统(含PyQt+代码+训练数据集)

基于深度学习算法的动物检测系统(含PyQt代码训练数据集) 前言一、数据集1.1 数据集介绍1.2 数据预处理 二、模型搭建三、训练与测试3.1 模型训练3.2 模型测试 四、PyQt界面实现五、讨论5.1 模型优缺点分析5.2 实验意义 参考资料 前言 本项目是基于Mobil…...

微信小程序美团点餐

引言:外卖已经成为了都市人的必备,在无数个来不及(懒得)做饭的时刻拯救孤单寂寞的胃。美团外卖无疑是外卖届的领头羊,它的很多功能与设计都值得我们学习。本文将从五个方面,对美团外卖展开产品分析&#xf…...

音频剪辑还花钱?2024年这4款免费工具让你告别烦恼

音乐迷们!是不是还在为找个音频剪辑软件就得花钱这事儿头疼呢?别急,2024年有好几个既免费又特别给力的音频剪辑免费的小帮手来了,保证帮你省下这笔钱,还让你用得爽歪歪!来来来,让我给你们介绍4个…...

【YOLO模型】(4)--YOLO V3超超超超详解!!!

文章目录 YOLO V3一、改进二、三种scale三、残差连接四、核心网络结构1. 结构2. 输出与先验框关系 五、softmax层替代 总结 YOLO V3 YOLO V3是由Joseph Redmon等人在2018年推出的一款目标检测算法。作为YOLO系列的第三代版本,它在实时性和准确性上取得了显著的提升…...

管理类联考 信息整理和经验分享

说明:大家在准备读MBA之前,肯定会去百度下MBA的相关常识,然而一上某度 你就发现 各种广告、各种培训机构 铺天盖地而来,想了解一些有价值的信息都有些困难,因此这些我在这里做了一些整理,方便准备参加 MBA …...

JetBrains IDE中GPU进程(JCEF)重启问题(Too many restarts of GPU-process)解决方案

目录 前言1. GPU进程重启问题概述1.1 什么是GPU进程重启问题?1.2 该问题带来的影响 2. GPU进程重启问题的原因分析2.1 显卡驱动的兼容性问题2.2 系统资源的限制2.3 JCEF组件的设置不合理 3. 解决方案3.1 方法一:通过自定义属性禁用GPU加速3.2 方法二&…...

《泛基因组:高质量参考基因组的新标准》

摘要 随着三代测序技术的进步和高质量参考基因组的发布,研究者们发现单一个体的参考基因组无法全面代表整个物种的遗传序列。这一现象导致了群体遗传变异图谱的不完整。为了解决这一问题,构建来自多个个体的泛基因组成为一种有效的方法。 泛基因组研究…...

模型其他压缩方法

文章目录 模型蒸馏模型剪枝除了模型量化之外,下面再介绍两种常见的模型压缩方法,即模型蒸馏和模型剪枝。与模型量化不同,模型蒸馏和模型剪枝则通过精简模型的结构,进而减少参数的数量。 不同表示精度的模型性能对比 模型蒸馏 模型蒸馏(ModelDistillation)的目标是将复杂…...

Python学习的自我理解和想法(22)

学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码! 今天是学Python的第22天,学的内容是正则表达式,明天会出一篇详细实例介绍。电脑刚修好!开学了,时间不多&…...

基于neo4j的糖尿病知识图谱数据

基于Neo4j的糖尿病知识图谱项目:毕业设计必备💡 这个项目,专为需要深入挖掘医学或AI数据的朋友们量身定制,尤其适合用于毕业设计!如果你对图谱构建、AI问答系统、或者正在学习Neo4j,那么你不得不看看这个技…...

分布式搜索引擎elasticsearch操作文档操作介绍

1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有数据,…...

C++ 中的可调用对象

目录 一.可调用对象简介 1.什么是可调用对象? 2.可调用对象有什么用? 二.函数指针和仿函数 1.函数指针 a.函数指针的使用语法 b.函数指针的应用场景 2.仿函数 a.仿函数的基本概念 b.仿函数的优点 三.lambda表达式和function 1.lambda表达式 …...

[HBase]二 HBase原生Shell命令大全

HBase原生Shell命令汇总 1. General组 5 1.1. 查看集群状态:status 5 1.2. 查看表的操作方法:table_help 5 1.3. 查看HBase的版本信息:version 5 1.4. 查看当前用户:whoami 5 2. Namespace组 5 2.1. 创建命名空间:create_namespace 5 2.2. 显示命名空…...

Kafka之消费者客户端

1、历史上的二个版本 与生产者客户端一样,在Kafka的发展过程当中,消费者客户端主要有两个大的版本: 旧消费者客户端(Old Consumer):基于Scala语言开发的版本,又称为Scala消费者客户端。新消费…...

使用Python进行数据分析入门

文章目录 Python环境搭建安装Anaconda验证安装 必备库介绍NumPyPandasMatplotlibSciPy 数据导入与清洗导入数据清洗数据 数据探索与分析描述性统计相关性分析 数据可视化绘制直方图 高级主题机器学习深度学习 总结 随着大数据时代的到来,数据分析变得越来越重要。Py…...

ubuntu20 从源码编译升级到版本5.15.263

author: hjjdebug date: 2024年 10月 25日 星期五 15:38:48 CST description: ubuntu20 从源码编译升级到版本5.15.263 我的内核是 5.15.105, 用apt 下载源码后其版本是5.15.263 为什么要从源码编译内核. 升级内核? 目的: 练练手. 消除内核神秘性. 还可以裁减内核,也是调试内核…...

php 程序开发分层与验证思想

在PHP程序开发中,合理的层级设计可以提高代码的可维护性、可扩展性和可测试性。以下是常见的层级设计模式及建议: 1. 分层架构 通常可以将PHP应用分为以下几层: 表示层(Presentation Layer): 负责与用户交…...

关于InternVL2的单卡、多卡推理

关于InternVL2的单卡、多卡推理 前言单卡推理多卡推理总结前言 本章节将介绍如何使用上一章节微调后的模型进行推理。推理又分为单卡和多卡,这里介绍的两种方式都是Hugging Face的transformers方法进行推理。模型的话可以使用上一章微调的任意一个非lora模型进行测试。 单卡推…...

Go语言设计Web框架

如何设计一个Web框架 项目规划 在开始设计Web框架之前,我们需要对整个项目进行规划。主要包括以下几个方面: 项目结构依赖管理路由设计控制器设计日志和配置管理 项目结构 首先,我们定义项目的目录结构: ├── cmd/ │ └…...

2024年10月28日练习(双指针算法)

一.11. 盛最多水的容器 - 力扣(LeetCode) 1.题目描述: 这个题目代表的意思就是数组上每个对应的值就相当于每条垂直线的高度,就相当于短板效应,两 个高度的线会取最短的长度因为那样水才不会漏。而两条线的数组的下标…...

Objective-C 音频爬虫:实时接收数据的 didReceiveData_ 方法

在互联网技术领域,数据的获取和处理是至关重要的。尤其是对于音频内容的获取,实时性和效率是衡量一个爬虫性能的重要指标。本文将深入探讨在Objective-C中实现音频爬虫时,如何高效地使用didReceiveData:方法来实时接收数据,并通过…...

提升网站流量和自然排名的SEO基本知识与策略分析

内容概要 在当今数字化时代,SEO(搜索引擎优化)成为加强网站可见度和提升流量的重要工具。SEO的基础知识包括理解搜索引擎的工作原理,以及如何通过优化网站内容和结构来提高自然排名。白帽SEO和黑帽SEO代表了两种截然不同的策略&a…...

雷池社区版compose文件配置讲解--fvm

在现代网络安全中,选择合适的 Web 应用防火墙至关重要。雷池(SafeLine)社区版免费切好用。为网站提供全面的保护,帮助网站抵御各种网络攻击。 docker-compose.yml 文件是 Docker Compose 的核心文件,用于定义和管理多…...

基于51单片机的智能断路器proteus仿真

地址: https://pan.baidu.com/s/16lfGgrgVr9V7JehonMNVQA 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C52/AT89C51是一款经典的8位单片机,是意法半导体(STMicroelectro…...

(N-154)基于springboot酒店预订管理系统

开发工具:IDEA 服务器:Tomcat9.0, jdk1.8 项目构建:maven 数据库:mysql5.7 前端技术:AdminLTEBootstrapLayUIHTMLjQuery 服务端技术:springbootmybatis-plusthymeleaf 本项目分前台和后台…...

elasticsearch 8.x 插件安装(三)之拼音插件

elasticsearch 8.x 插件安装(三)之拼音插件 elasticsearch插件安装合集 elasticsearch插件安装(一)之ik分词器安装(含MySQL更新) elasticsearch 8.x插件(二)之同义词安装如何解决…...

快速遍历包含合并单元格的Word表格

Word中的合并表格如下,现在需要根据子类(例如:果汁)查找对应的品类,如果这是Excel表格,那么即使包含合并单元格,也很容易处理,但是使用Word VBA进行查找,就需要一些技巧。…...

手机收银云进销存管理软件,商品档案Excel格式批量导入导出,一键导入Excel的商品档案

如果您有Excel的商品档案,那么就可以批量导入到我们的手机云进销存软件系统里,就不需要人工手工一个个商品的新建商品档案,大大提高工作效率。如果您看下面的步骤不会操作,可以联系我们技术支持,来帮您把商品档案导入。…...

html 中识别\n自动换行

CSS实现&#xff1a;white-space <div style"white-space: pre-wrap;" v-html"str"> </div>white-space: normal|nowrap|pre|pre-line|pre-wrap|initial|inherit;值描述换行符空格和制表符文字换行行尾空格normal默认。空白会被浏览器忽略。合…...

用QWebSocketServer写websocket服务端

1. 引入必要的头文件 #include <QCoreApplication> #include <QWebSocketServer> #include <QWebSocket> #include <QDebug> #include <QObject>QCoreApplication&#xff1a;用于创建控制台应用的事件循环。QWebSocketServer&#xff1a;提供 …...

郴州网站建设专业定制/精美软文句子

精确表达浮点数 问题描述 在计算机中&#xff0c;使用float或者double来存储小数是不能得到精确值的。如果你希望得到精确计算结果&#xff0c;最好是用分数形式来表示小数。有限小数或者无限循环小数都可以转化为分数。比如&#xff1a; 0.9 9/10 0.333&#xff08;3&#xf…...

p2p借贷网站开发 论文/今日新闻头条新闻摘抄

单一职责代码优化第一步&#xff0c;单一职责原则 (Single Responsibility Principle)。对于一个Java类&#xff0c;应该仅有一个引起它变化的原因&#xff0c;也就是说&#xff0c;一个类中&#xff0c;应该是一组相关性很高的函数、数据的封装。但是这个原则的界限划分的并不…...

利用博客做网站/seo实战密码第三版pdf下载

在 Apache RocketMQ 中&#xff0c;当消费者去消费消息的时候&#xff0c;无论是通过 pull 的方式还是 push 的方式&#xff0c;都可能会出现大批量的消息突刺。如果此时要处理所有消息&#xff0c;很可能会导致系统负载过高&#xff0c;影响稳定性。但其实可能后面几秒之内都没…...

dw做网站模板/seo工资

回调函数 如果要处理 $.ajax() 得到的数据&#xff0c;则需要使用回调函数&#xff1a;beforeSend、error、dataFilter、success、complete。 beforeSend在发送请求之前调用&#xff0c;并且传入一个 XMLHttpRequest 作为参数。error在请求出错时调用。传入 XMLHttpRequest 对…...

公司变更股东要交税吗/北京seo顾问服务

在上周的 Vue.js 伦敦大会上&#xff0c;Vue.js 作者尤雨溪简要介绍了 Vue 下一个主要版本要发布的内容&#xff0c;9 月 30 日&#xff0c;尤雨溪在 medium 个人博客上发布了 Vue 3.0 的开发路线&#xff0c;我们不妨看看 Vue 3.0 将会有怎样的发展。 兼容 按照尤雨溪的说法…...

怎么查网站做百度竞价信息/app开发公司排行榜

一、准备工作 1、Lumen环境搭建 可参考上篇文章《Lumen安装配置使用入门》一文。 2、数据库信息 数据库地址&#xff1a;localhost 数据库名称&#xff1a;lumenauth 数据库用户&#xff1a;root 数据库密码&#xff1a;****** 二、初始化Lumen lumen new LumenAuth 三…...