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

计算机视觉的应用17-利用CrowdCountNet模型解决人群数量计算问题(pytorch搭建模型)

大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用17-利用CrowdCountNet模型解决人群数量计算问题(pytorch搭建模型)。本篇文章,我将向大家展示如何使用CrowdCountNet这个神奇的工具,以及它是如何利用深度学习技术来解决复杂的人群计数问题。让我们一起进入这个充满活力和创新的世界,开启图像和视频中人群数量计算的新篇章!

目录

  1. 项目介绍
  2. 应用场景
    • 人流监测和管理
    • 安全防控
    • 市场调研和决策支持
    • 城市规划和交通管理
  3. 实战项目
    • 数据准备
    • 模型构建
    • 模型训练
    • 图片检测人群数量
    • 视频检测人群数量
  4. 结论

1. 项目介绍

本文我将利用深度神经网络来解决一个现实中普遍存在的问题:如何准确计算图像和视频中的人群数量。当您走进拥挤的城市街头或繁忙的公共场所时,人群数量经常让人难以置信。然而,现在有了深度学习模型的帮助,我们可以轻松地通过计算机视觉来解决这个挑战。

CrowdCountNet是我们的主角,它是一种被广泛应用于图像识别和处理领域的深度学习模型。它背后的原理十分精巧,利用了神经网络的强大能力来理解和分析图像中的人群分布。这个模型通过学习大量的图像数据,自动捕捉到了各种人群密集度的模式和特征。

想象一下,当你看着一张摄像头拍摄的城市街景时,CrowdCountNet正在忙碌地工作着。它会逐像素地扫描整个图像,并识别每个像素点上是否存在人群。从细微的行人到人群聚集的区域,CrowdCountNet都能准确地捕捉到每个人的存在。

使用这个强大的深度学习模型,我们可以实现许多令人惊叹的功能。无论是为城市规划提供人流热图、帮助安保人员监控拥挤场所,还是为交通管理提供实时的交通流量信息,CrowdCountNet都能在不同领域发挥巨大作用。

2. 应用场景

2.1 人流监测和管理

在公共场所,例如商场、机场、火车站等,监测和管理人流量是至关重要的。我们的模型可以用于实时监测人流量,帮助管理者做出更有效的决策,比如调整人流方向,预防拥挤等。

在一个繁忙的购物中心,通过我们的人流监测系统,可以实时显示各个商店的人流量。商场管理员可以在控制中心的大屏幕上看到不同区域的人流状况,比如一楼的时尚区人流量饱和,而二楼的电子产品区人流相对稀少。管理员立即作出反应,调整楼梯和电梯的方向,引导顾客流向较空闲的区域,以缓解拥挤。

2.2 安全防控

在大型活动或集会中,通过实时监测人群数量,可以预防和控制安全事故的发生,及时制定疏散计划,提高人员安全。

想象一个音乐节现场,数以万计的观众聚集在一个开放的场地上。通过我们的人流监测系统,主办方能够实时获得观众的数量和密度数据。突然,系统发出警报,显示某个区域的人流超过了安全限制。主办方立刻启动紧急预案,引导人群有序撤离,避免发生踩踏事故。

2.3 市场调研和决策支持

商家可以通过监测店铺或某个区域的人流量,来评估其营销策略的效果,或者进行更准确的市场调研。

一家新开业的百货公司想要评估其广告宣传效果和吸引力。通过人流监测系统,他们可以统计每天进入商场的人数,并与营销活动的时间和内容进行对比。他们发现,当进行打折促销时,入场人数骤增,而在没有促销的日子里,人流量相对稀少。这为他们提供了有价值的市场调研数据,帮助他们更准确地评估促销策略的成效。

2.4 城市规划和交通管理

在城市规划和交通管理中,通过人群数量的监测,可以更好地理解和预测城市中的人流动态,从而更科学地进行城市规划和交通管理。

想象一座拥挤的大都市,上班高峰期大批人涌入地铁站。通过我们的人流监测系统,地铁管理部门可以实时了解不同地铁站的客流情况,并根据需求增加或减少列车班次。当一个地铁站即将达到容纳上限时,系统会自动发出警报,引导乘客选择其他线路或利用公共交通换乘,以减少人流压力。

2.5 相册与毕业生人数统计

通常毕业合影中有大批的人一起合作,我们要统计人数的话,基本都是人工去一个一个数出来,这样费时费力。现在利用模型直接统计合照人数,统计合照人数,判断是否学生来齐了。

3. 实战项目

在这个项目中,我们将首先讨论如何准备数据,然后构建和训练我们的模型,并最后使用我们的模型来检测人群数量。

3.1 数据准备

首先,我们需要准备一个包含大量标注人群数量的图像数据集。这可以是公开的人群数量数据集,也可以是自己收集并标注的数据集。

3.2 模型构建

然后,我们需要构建一个CrowdCountNet模型来学习如何从图像中预测人群数量。

import torch.nn as nn
import torch
import torch.nn.functional as F
from torch.autograd import Variable
from torch.nn.utils.weight_norm import weight_norm
import math
from collections import OrderedDictclass CrowdCountNet(nn.Module):def __init__(self,leaky_relu=False,attn_weight=1,fix_domain=1,domain_center_model='',**kwargs):super(CrowdCountNet, self).__init__()self.criterion_attn = torch.nn.MSELoss(reduction='sum')self.domain_center_model = domain_center_modelself.attn_weight = attn_weightself.fix_domain = fix_domainself.cosine = 1self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=2, padding=1, bias=False)self.bn1 = nn.BatchNorm2d(64, momentum=BN_MOMENTUM)self.conv2 = nn.Conv2d(64, 64, kernel_size=3, stride=2, padding=1, bias=False)self.bn2 = nn.BatchNorm2d(64, momentum=BN_MOMENTUM)self.relu = nn.ReLU(inplace=True)num_channels = 64block = blocks_dict['BOTTLENECK']num_blocks = 4self.layer1 = self._make_layer(block, 64, num_channels, num_blocks)stage1_out_channel = block.expansion * num_channels# -- stage 2self.stage2_cfg = {}self.stage2_cfg['NUM_MODULES'] = 1self.stage2_cfg['NUM_BRANCHES'] = 2self.stage2_cfg['BLOCK'] = 'BASIC'self.stage2_cfg['NUM_BLOCKS'] = [4, 4]self.stage2_cfg['NUM_CHANNELS'] = [40, 80]self.stage2_cfg['FUSE_METHOD'] = 'SUM'num_channels = self.stage2_cfg['NUM_CHANNELS']block = blocks_dict[self.stage2_cfg['BLOCK']]num_channels = [num_channels[i] * block.expansionfor i in range(len(num_channels))]self.transition1 = self._make_transition_layer([stage1_out_channel],num_channels)self.stage2, pre_stage_channels = self._make_stage(self.stage2_cfg, num_channels)# -- stage 3self.stage3_cfg = {}self.stage3_cfg['NUM_MODULES'] = 4self.stage3_cfg['NUM_BRANCHES'] = 3self.stage3_cfg['BLOCK'] = 'BASIC'self.stage3_cfg['NUM_BLOCKS'] = [4, 4, 4]self.stage3_cfg['NUM_CHANNELS'] = [40, 80, 160]self.stage3_cfg['FUSE_METHOD'] = 'SUM'num_channels = self.stage3_cfg['NUM_CHANNELS']block = blocks_dict[self.stage3_cfg['BLOCK']]num_channels = [num_channels[i] * block.expansionfor i in range(len(num_channels))]self.transition2 = self._make_transition_layer(pre_stage_channels,num_channels)self.stage3, pre_stage_channels = self._make_stage(self.stage3_cfg, num_channels)last_inp_channels = np.int(np.sum(pre_stage_channels)) + 256self.redc_layer = nn.Sequential(nn.Conv2d(in_channels=last_inp_channels,out_channels=128,kernel_size=3,stride=1,padding=1),nn.BatchNorm2d(128, momentum=BN_MOMENTUM),nn.ReLU(True),)self.aspp = nn.ModuleList(aspp(in_channel=128))# additional layers specfic for Phase 3self.pred_conv = nn.Conv2d(128, 512, 3, padding=1)self.pred_bn = nn.BatchNorm2d(512)self.GAP = nn.AdaptiveAvgPool2d(1)# Specially for hidden domain# Set the domain for learnable parametersdomain_center_src = np.load(self.domain_center_model)G_SHA = torch.from_numpy(domain_center_src['G_SHA']).view(1, -1, 1, 1)G_SHB = torch.from_numpy(domain_center_src['G_SHB']).view(1, -1, 1, 1)G_QNRF = torch.from_numpy(domain_center_src['G_QNRF']).view(1, -1, 1, 1)self.n_domain = 3self.G_all = torch.cat([G_SHA.clone(), G_SHB.clone(),G_QNRF.clone()], dim=0)self.G_all = nn.Parameter(self.G_all)self.last_layer = nn.Sequential(nn.Conv2d(in_channels=128,out_channels=64,kernel_size=3,stride=1,padding=1),nn.BatchNorm2d(64, momentum=BN_MOMENTUM),nn.ReLU(True),nn.Conv2d(in_channels=64,out_channels=32,kernel_size=3,stride=1,padding=1),nn.BatchNorm2d(32, momentum=BN_MOMENTUM),nn.ReLU(True),nn.Conv2d(in_channels=32,out_channels=1,kernel_size=1,stride=1,padding=0),)def _make_transition_layer(self, num_channels_pre_layer,num_channels_cur_layer):num_branches_cur = len(num_channels_cur_layer)num_branches_pre = len(num_channels_pre_layer)transition_layers = []for i in range(num_branches_cur):if i < num_branches_pre:if num_channels_cur_layer[i] != num_channels_pre_layer[i]:transition_layers.append(nn.Sequential(nn.Conv2d(num_channels_pre_layer[i],num_channels_cur_layer[i],3,1,1,bias=False),nn.BatchNorm2d(num_channels_cur_layer[i],momentum=BN_MOMENTUM), nn.ReLU(inplace=True)))else:transition_layers.append(None)else:conv3x3s = []for j in range(i + 1 - num_branches_pre):inchannels = num_channels_pre_layer[-1]outchannels = num_channels_cur_layer[i] \if j == i - num_branches_pre else inchannelsconv3x3s.append(nn.Sequential(nn.Conv2d(inchannels, outchannels, 3, 2, 1, bias=False),nn.BatchNorm2d(outchannels, momentum=BN_MOMENTUM),nn.ReLU(inplace=True)))transition_layers.append(nn.Sequential(*conv3x3s))return nn.ModuleList(transition_layers)def _make_layer(self, block, inplanes, planes, blocks, stride=1):downsample = Noneif stride != 1 or inplanes != planes * block.expansion:downsample = nn.Sequential(nn.Conv2d(inplanes,planes * block.expansion,kernel_size=1,stride=stride,bias=False),nn.BatchNorm2d(planes * block.expansion, momentum=BN_MOMENTUM),)layers = []layers.append(block(inplanes, planes, stride, downsample))inplanes = planes * block.expansionfor i in range(1, blocks):layers.append(block(inplanes, planes))return nn.Sequential(*layers)def _make_stage(self,layer_config,num_inchannels,multi_scale_output=True):num_modules = layer_config['NUM_MODULES']num_branches = layer_config['NUM_BRANCHES']num_blocks = layer_config['NUM_BLOCKS']num_channels = layer_config['NUM_CHANNELS']block = blocks_dict[layer_config['BLOCK']]fuse_method = layer_config['FUSE_METHOD']modules = []for i in range(num_modules):# multi_scale_output is only used last moduleif not multi_scale_output and i == num_modules - 1:reset_multi_scale_output = Falseelse:reset_multi_scale_output = Truemodules.append(HighResolutionModule(num_branches, block, num_blocks,num_inchannels, num_channels, fuse_method,reset_multi_scale_output))num_inchannels = modules[-1].get_num_inchannels()return nn.Sequential(*modules), num_inchannelsdef forward(self, x):x = self.conv1(x)x = self.bn1(x)x = self.relu(x)x = self.conv2(x)x = self.bn2(x)x = self.relu(x)x = self.layer1(x)x_head_1 = xx_list = []for i in range(self.stage2_cfg['NUM_BRANCHES']):if self.transition1[i] is not None:x_list.append(self.transition1[i](x))else:x_list.append(x)y_list = self.stage2(x_list)x_list = []for i in range(self.stage3_cfg['NUM_BRANCHES']):if self.transition2[i] is not None:x_list.append(self.transition2[i](y_list[-1]))else:x_list.append(y_list[i])x = self.stage3(x_list)# Replace the classification heaeder with custom setting# Upsamplingx0_h, x0_w = x[0].size(2), x[0].size(3)x1 = F.interpolate(x[1], size=(x0_h, x0_w), mode='bilinear', align_corners=False)x2 = F.interpolate(x[2], size=(x0_h, x0_w), mode='bilinear', align_corners=False)x = torch.cat([x[0], x1, x2, x_head_1], 1)# first, reduce the channel downx = self.redc_layer(x)pred_attn = self.GAP(F.relu_(self.pred_bn(self.pred_conv(x))))pred_attn = F.softmax(pred_attn, dim=1)pred_attn_list = torch.chunk(pred_attn, 4, dim=1)aspp_out = []for k, v in enumerate(self.aspp):if k % 2 == 0:aspp_out.append(self.aspp[k + 1](v(x)))else:continue# Using Aspp add, and relu insidefor i in range(4):x = x + F.relu_(aspp_out[i] * 0.25) * pred_attn_list[i]bz = x.size(0)# -- Besides, we also need to let the prediction attention be close to visable domain# -- Calculate the domain distance and get the weights# - First, detach domainsG_all_d = self.G_all.detach()  # use detached G_all for calulcatingpred_attn_d = pred_attn.detach().view(bz, 512, 1, 1)if self.cosine == 1:G_A, G_B, G_Q = torch.chunk(G_all_d, self.n_domain, dim=0)cos_dis_A = F.cosine_similarity(pred_attn_d, G_A, dim=1).view(-1)cos_dis_B = F.cosine_similarity(pred_attn_d, G_B, dim=1).view(-1)cos_dis_Q = F.cosine_similarity(pred_attn_d, G_Q, dim=1).view(-1)cos_dis_all = torch.stack([cos_dis_A, cos_dis_B,cos_dis_Q]).view(bz, -1)  # bz*3cos_dis_all = F.softmax(cos_dis_all, dim=1)target_attn = cos_dis_all.view(bz, self.n_domain, 1, 1, 1).expand(bz, self.n_domain, 512, 1, 1) * self.G_all.view(1, self.n_domain, 512, 1, 1).expand(bz, self.n_domain, 512, 1, 1)target_attn = torch.sum(target_attn, dim=1, keepdim=False)  # bz * 512 * 1 * 1if self.fix_domain:target_attn = target_attn.detach()else:raise ValueError('Have not implemented not cosine distance yet')x = self.last_layer(x)x = F.relu_(x)x = F.interpolate(x, size=(x0_h * 2, x0_w * 2), mode='bilinear', align_corners=False)return x, pred_attn, target_attndef init_weights(self,pretrained='',):logger.info('=> init weights from normal distribution')for m in self.modules():if isinstance(m, nn.Conv2d):nn.init.normal_(m.weight, std=0.01)if m.bias is not None:nn.init.constant_(m.bias, 0)elif isinstance(m, nn.BatchNorm2d):nn.init.constant_(m.weight, 1)nn.init.constant_(m.bias, 0)if os.path.isfile(pretrained):pretrained_dict = torch.load(pretrained)logger.info(f'=> loading pretrained model {pretrained}')model_dict = self.state_dict()pretrained_dict = {k: vfor k, v in pretrained_dict.items() if k in model_dict.keys()}for k, _ in pretrained_dict.items():logger.info(f'=> loading {k} pretrained model {pretrained}')model_dict.update(pretrained_dict)self.load_state_dict(model_dict)else:assert 1 == 2

3.3 图片检测人群数量

接下来,我们加载已经训练好的模型进行预测,这里省略了中间复杂的过程,大家可以一键调用预测。

from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
from modelscope.outputs import OutputKeys
from modelscope.utils.cv.image_utils import numpy_to_cv2img
import cv2crowd_model = pipeline(Tasks.crowd_counting,model='damo/cv_hrnet_crowd-counting_dcanet')imgs = '111.png'
results = crowd_model(imgs)print('人数为:', int(results[OutputKeys.SCORES]))vis_img = results[OutputKeys.OUTPUT_IMG]
vis_img = numpy_to_cv2img(vis_img)
cv2.imwrite('result1.jpg', vis_img)

在这里插入图片描述
预测生成图:
在这里插入图片描述
毕业合照人群计数:
在这里插入图片描述
预测生成图:
在这里插入图片描述

3.4 视频检测人群数量

对于视频,我们可以将其分解为一系列的图像帧,然后使用我们的模型来检测每一帧中的人群数量。

import cv2
from modelscope.outputs import OutputKeysdef predict_video(video_path):cap = cv2.VideoCapture(video_path)while (cap.isOpened()):ret, frame = cap.read()if ret:gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)preds = crowd_model(gray)print(preds[OutputKeys.SCORES])else:breakcap.release()video_path = 'test.mp4'
predict_video(video_path)

4. 结论

在这个项目中,我们成功地使用深度学习模型来计算图像和视频中的人群数量。这个模型可以被广泛地应用于人流监测和管理、安全防控、市场调研和决策支持、城市规划和交通管理等领域。

相关文章:

计算机视觉的应用17-利用CrowdCountNet模型解决人群数量计算问题(pytorch搭建模型)

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用17-利用CrowdCountNet模型解决人群数量计算问题(pytorch搭建模型)。本篇文章&#xff0c;我将向大家展示如何使用CrowdCountNet这个神奇的工具&#xff0c;以及它是如何利用深度学习技术来解决复杂…...

源启容器平台KubeGien 打造云原生转型的破浪之舰

云原生是应用上云的标准路径&#xff0c;也是未来发展大的趋势。如何将业务平滑过渡到云上&#xff1f;怎样应对上云期间的各项挑战呢&#xff1f;中电金信基于金融级数字底座“源启”打造了一款非常稳定可靠、多云异构、安全可控、开放灵活的容器平台产品——源启容器平台Kube…...

斯坦福机器学习 Lecture2 (假设函数、参数、样本等等术语,还有批量梯度下降法、随机梯度下降法 SGD 以及它们的相关推导,还有正态方程)

假设函数定义 假设函数&#xff0c;猜一个 x->y 的类型&#xff0c;比如 y ax b&#xff0c;随后监督学习的任务就是找到误差最低的 a 和 b 参数 有时候我们可以定义 x0 1&#xff0c;来让假设函数的整个表达式一致统一 如上图是机器学习中的一些术语 额外的符号&#xf…...

【腾讯云云上实验室-向量数据库】TAI时代的数据枢纽-向量数据库 VectorDB

一、向量数据库的发展历程和时代机遇 回顾向量数据库的发展历程&#xff1a; 2012年开始&#xff0c;深度神经网络的发展催生了向量数据库的发展&#xff1b;2015年至2016年&#xff0c;Google和微软发布了标志性的论文&#xff1b;2017年&#xff0c;Facebook开源了Faiss框架…...

掌握深度学习利器——TensorFlow 2.x实战应用与进阶

掌握深度学习利器——TensorFlow 2.x实战应用与进阶 摘要&#xff1a;随着人工智能技术的飞速发展&#xff0c;深度学习已成为当下最热门的领域之一。作为深度学习领域的重要工具&#xff0c;TensorFlow 2.x 备受关注。本文将通过介绍TensorFlow 2.x的基本概念和特性&#xff…...

MySQL 之多版本并发控制 MVCC

MySQL 之多版本并发控制 MVCC 1、MVCC 中的两种读取方式1.1、快照读1.2、当前读 2、MVCC实现原理之 ReadView2.1、隐藏字段2.2、ReadView2.3、读已提交和可重复读隔离级别下&#xff0c;产生 ReadView 时机的区别 3、MVCC 解决幻读4、总结 MVCC&#xff08;多版本并发控制&…...

优步让一切人工智能化

优步(Uber)的商业模式建立在对数据的颠覆性使用上--通过将双方智能手机的位置数据关联起来&#xff0c;将出租车司机与乘客配对。这意味着&#xff0c;它可以比传统出租车公司更快地安排司机去接乘客&#xff0c;极大地冲击了传统出租车公司的业务。 优步自成立以来&#xff0…...

DeepMind发布新模型Mirasol3B:更高效处理音频、视频数据

Google DeepMind日前悄然宣布了其人工智能研究的重大进展&#xff0c;推出了一款名为“Mirasol3B”的新型自回归模型&#xff0c;旨在提升对长视频输入的理解能力。该新模型展示了一种颠覆性的多模态学习方法&#xff0c;以更综合和高效的方式处理音频、视频和文本数据。 Googl…...

键盘方向键移动当前选中的table单元格,并可以输入内容

有类似于这样的表格&#xff0c;用的<table>标签。原本要在单元格的文本框里面输入内容&#xff0c;需要用鼠标一个一个去点以获取焦点&#xff0c;现在需要不用鼠标选中&#xff0c;直接用键盘的上下左右来移动当前正在输入的单元格文本框。 const currentCell React.u…...

(八)、基于 LangChain 实现大模型应用程序开发 | 基于知识库的个性化问答 (检索 Retrieval)

检索增强生成&#xff08;RAG&#xff09;的整体工作流程如下&#xff1a; 在构建检索增强生成 (RAG) 系统时&#xff0c;信息检索是核心环节。检索是指根据用户的问题去向量数据库中搜索与问题相关的文档内容&#xff0c;当我们访问和查询向量数据库时可能会运用到如下几种技术…...

高效案例检索工具,Alpha案例库智慧检索成为律师检索工具首选

“工欲善其事&#xff0c;必先利其器。”当今&#xff0c;律界同仁需要权衡的问题早已不是“要不要”使用法律科技&#xff0c;而是如何高质量、高效率地使用法律科技工具。在业内人士看来&#xff0c;随着人工智能技术的不断发展&#xff0c;法律行业科技化将成为不可逆转的趋…...

stable diffusion十七种controlnet详细使用方法总结

个人网站&#xff1a;https://tianfeng.space 前言 最近不知道发点什么&#xff0c;做个controlnet 使用方法总结好了&#xff0c;如果你们对所有controlnet用法&#xff0c;可能了解但是有点模糊&#xff0c;希望能对你们有用。 一、SD controlnet 我统一下其他参数&#…...

【机器学习基础】对数几率回归(logistic回归)

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;后面的内容会越来越有意思~ &#x1f4a1;往期推荐&#xff1a; 【机器学习基础】机器学习入门&#xff08;1&#xff09; 【机器学习基…...

团结引擎已全面支持 OpenHarmony 操作系统

Unity 中国宣布与开放原子开源基金会达成平台级战略合作。 据称团结引擎已全面支持 OpenHarmony 操作系统&#xff0c;同时将为 OpenHarmony 生态快速带来更多高品质游戏与实时 3D 内容。Unity 称现在用户可以 “在 OpenHarmony 框架中感受到与安卓和 iOS 同样丝滑的游戏体验”…...

【brpc学习案例实践一】rpc服务构造基本流程

前言 在crpc框架中&#xff0c;brpc简直越用越爽&#xff0c;平时工作中也常用到brpc&#xff0c;一直没来得及总结&#xff0c;抽空写点&#xff0c;也供自己查阅用。下附几个常用学习地址&#xff1a; brpc官网开源地址&#xff1a; https://github.com/luozesong/brpc/blob…...

Redis数据的持久化

Redis的持久化有两种方式&#xff1a; RDB&#xff08;Redis Database&#xff09;和AOF&#xff08;Append Only File&#xff09; 目录 一、RDB 保存方式 2、rdb在redis.conf文件中的配置 二、AOF 1、保存方式 2、aof方式持久化在redis.conf文件中的配置 三、持久化建…...

uniapp App 端 版本更新检测

function checkVersion() { var req { //升级检测数据 appid: plus.runtime.appid, version: plus.runtime.version }; const timestamp Date.parse(new Date()); config.server.query_news uni.reque…...

python用最小二乘法实现平面拟合

文章目录 数学原理代码实现测试 数学原理 平面方程可写为 A x B y C z D 0 AxByCzD0 AxByCzD0 假设 C C C不为0&#xff0c;则上式可以改写为 z a x b y d zaxbyd zaxbyd 则现有一组点 { p i } \{p_i\} {pi​}&#xff0c;则根据 x i , y i x_i,y_i xi​,yi​以及平面…...

SpringCloud微服务:Nacos和Eureka的区别

目录 配置&#xff1a; 区别&#xff1a; ephemeral设置为true时 ephemeral设置为false时&#xff08;这里我使用的服务是order-service&#xff09; 1. Nacos与eureka的共同点 都支持服务注册和服务拉取 都支持服务提供者心跳方式做健康检测 2. Nacos与Eu…...

基于Springboot+Vue的校园在线打印预约系统

基于SpringbootVue的校园在线打印预约系统的设计与实现 (1) 注册功能&#xff1a;允许学生、教职员工注册账户&#xff0c;并提供安全的身份验证机制&#xff0c;确保只有授权用户可以使用系统。 (2) 登录功能&#xff1a;店家或学生可以使用各自账号登录。登录后允许修改用户…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...