基于keras的停车场车位识别

news2025/2/4 17:52:59

1. 项目简介

该项目旨在利用深度学习模型与计算机视觉技术,对停车场中的车位进行检测和状态分类,从而实现智能停车管理系统的功能。随着城市化的发展,停车场管理面临着车位检测效率低、停车资源分配不均等问题,而传统的人工检测方法不仅耗时费力,且难以适应大规模停车场的实时需求。为此,本项目提出了一种基于图像处理和深度学习的解决方案,通过摄像头实时获取停车场视频或图像数据,并借助卷积神经网络模型(Convolutional Neural Network, CNN)对车位进行自动识别、位置标注以及空闲与占用状态的分类。项目使用了VGG16作为基础模型,并通过数据增强、迁移学习等技术对车位状态进行精确预测。应用场景包括:停车场监控系统、车位引导系统以及停车资源管理平台等。该方案能够显著提升停车场管理效率,减少停车时间,提高用户体验,并为未来智慧城市停车管理系统的设计提供了参考与借鉴。整体项目分为数据预处理、车位检测、状态分类、结果可视化等模块,并采用Python与Keras库进行模型训练和部署,具有可扩展性和较高的应用价值。

2.技术创新点摘要

  1. 多阶段图像处理与区域提取策略:在车位检测过程中,该项目使用了一套多阶段的图像处理流程来确保目标区域的精确识别。通过颜色过滤(select_rgb_white_yellow)将背景与目标车位区域分离,结合灰度化和边缘检测(convert_gray_scaledetect_edges)突出车位轮廓。随后使用霍夫变换(hough_lines)提取直线特征,并基于位置和长度对直线进行过滤与聚类。该模块独特的区域选择算法(select_region)有效地去除了图像中无关的区域,减少了噪声干扰,使得后续的车位定位更加精准。
  2. 基于直线聚类的车位识别方法:通过对检测到的直线进行聚类排序(identify_blocks),项目能够有效识别停车场中不同车道的车位位置,并根据聚类结果自动生成每个车位的矩形坐标。这种方法相比传统的基于图像分割或模板匹配的检测方式,更加鲁棒,适用于多种不同角度和光照条件下的停车场图像。
  3. 动态调整与车位划分策略:在车位标定模块中,代码加入了自定义的车位调整策略(draw_parking),根据不同停车场车道的实际情况,对车位位置和边界进行微调,确保检测结果能够与实际车位布局精确匹配。同时,通过合理的纵向和横向划分策略,项目能够自动将每个车道内的车位区域进一步细分,并生成详细的车位分割坐标。
  4. 迁移学习与自定义分类模型的结合:项目在车位状态分类中使用了VGG16预训练模型,并对部分卷积层进行冻结(只训练高层特征)以保留原有模型的视觉特征表达,同时通过自定义全连接层进行车位状态的二分类(空闲/占用)。这种方法在保留原有特征的基础上大幅减少了训练时间,提升了分类模型的收敛速度和准确性。

在这里插入图片描述

3. 数据集与预处理

该项目的数据集主要包含两部分:用于车位检测的停车场图像数据和用于车位状态分类的车位图像数据。停车场图像数据来自于实际拍摄的停车场照片和视频,包含不同时间、角度、光照条件下的场景,具有一定的复杂性和多样性。而车位图像数据是通过对停车场图像进行检测与裁剪获得的,划分为空闲车位和已占用车位两类。

数据预处理流程:
  1. 图像颜色过滤与特征提取:在车位检测过程中,项目首先通过颜色过滤将停车场图像中非车位区域的背景剔除,仅保留白色和黄色区域(车位线),并进一步转换为灰度图像以便后续的边缘检测与霍夫变换直线检测。这一预处理步骤能够有效地降低复杂背景对车位识别的影响,突出车位特征。
  2. 数据裁剪与车位区域提取:基于检测到的直线特征,通过聚类与坐标分析识别停车场中的车位区域,并根据这些区域生成单个车位的图像数据。此步骤将原始停车场图像数据划分为多个车位样本,用于训练和测试车位状态分类模型。
  3. 数据增强与归一化:为了提升分类模型的泛化能力和鲁棒性,项目在分类模型的训练数据生成阶段应用了多种数据增强技术,包括水平翻转、平移、缩放、旋转以及亮度调整等操作。数据增强后的车位图像能够模拟停车场中不同光照和角度条件,减少过拟合风险。与此同时,所有图像数据都经过归一化处理(像素值缩放至[0,1]区间),以加快模型训练的收敛速度。
  4. 标签映射与类别平衡处理:车位状态数据被分为“空闲”和“占用”两类,并采用独热编码的方式生成分类标签。项目特别关注类别平衡,确保训练集中两类样本数量均衡,以避免模型在类别不平衡情况下产生偏置。该数据集预处理流程确保了模型能够在复杂场景下进行准确的车位状态预测。

4. 模型架构

1) 模型结构的逻辑

本项目使用的是基于VGG16的卷积神经网络(CNN)模型进行车位状态的二分类。VGG16是一种深层卷积网络结构,由多个卷积层(Convolutional Layers)和池化层(Pooling Layers)堆叠而成,其主要特点是使用小卷积核(3x3)进行特征提取,能够有效地捕捉图像的局部空间特征。项目通过迁移学习技术,冻结了VGG16模型前10层卷积层,仅对最后几层进行微调,并添加了自定义的全连接层(Fully Connected Layers)来进行车位状态的分类。以下是详细的模型结构描述:

  1. 输入层(Input Layer):

    1. 输入尺寸:(48, 48, 3),表示48x48的RGB车位图像。
  2. VGG16特征提取层(Feature Extraction using VGG16):

    1. 卷积层(Conv Layer) :每一层卷积操作的输出公式如下: H o u t = ⌊ H i n − K + 2 P S ⌋ + 1 H_{out} = \left\lfloor \frac{H_{in} - K + 2P}{S} \right\rfloor + 1 Hout=SHinK+2P+1 其中,Hin 和 Hout 分别为输入和输出的高度,K 为卷积核的大小,P 为填充(Padding),S 为步长(Stride)。VGG16中每个卷积层的 K 均为 3x3S1P1
    2. 激活函数(Activation Function) :使用 ReLU 函数: f ( x ) = max ⁡ ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x) 能有效地引入非线性特性,使得模型能够学习更复杂的特征。
    3. 池化层(Pooling Layer) :在池化层中,使用 2x2 的最大池化(Max Pooling),其输出公式为: H o u t = ⌊ H i n − K S ⌋ + 1 H_{out} = \left\lfloor \frac{H_{in} - K}{S} \right\rfloor + 1 Hout=SHinK+1 其中,K 为池化核的大小,S 为步长。
    4. 通过多层卷积和池化操作,VGG16能逐层提取车位图像的边缘、纹理等特征。
  3. 自定义全连接层(Fully Connected Layer)

    1. 将VGG16模型的输出展平(Flatten),并连接到自定义全连接层。
    2. Dense层:输出维度为 2,表示车位状态的两个分类(空闲和已占用)。 激活函数:Softmax,用于多分类问题: Softmax ( x i ) = e x i ∑ j = 1 K e x j \text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=1}^{K} e^{x_j}} Softmax(xi)=j=1Kexjexi其中,K 为分类的总数,即 2
  4. 输出层(Output Layer)

    1. 最终输出两个类别的概率值,表示车位处于“空闲”或“占用”状态。
2) 模型的整体训练流程
  1. 数据准备与处理:使用 ImageDataGenerator 对训练数据集和验证数据集进行数据增强处理(包括水平翻转、旋转、缩放和平移等),将数据归一化至 [0, 1] 范围,并生成训练和验证数据的迭代器。

  2. 模型编译(Model Compilation)

    1. 损失函数(Loss Function):使用交叉熵损失(Categorical Cross Entropy)进行多分类问题的优化。 Loss = − ∑ i = 1 N y i ⋅ log ⁡ ( p i ) \text{Loss} = -\sum_{i=1}^{N} y_i \cdot \log(p_i) Loss=i=1Nyilog(pi) 其中,N 为类别总数,y_i 为真实标签,p_i 为预测概率。
    2. 优化器(Optimizer):使用 SGD(随机梯度下降)优化器,设置学习率 lr = 0.0001 和动量 momentum = 0.9,能够在稳定的梯度下降中获得更好的收敛效果。
    3. 评估指标(Metrics):使用 accuracy(准确率)作为模型评估指标。
  3. 模型训练(Model Training)

    1. 使用 fit_generator 方法训练模型,输入为经过增强的训练数据生成器,训练周期 epochs = 15,批次大小 batch_size = 32
    2. 回调函数(Callbacks):采用 ModelCheckpointEarlyStoppingModelCheckpoint 在验证集准确率提升时保存最优模型,EarlyStopping 在验证集准确率停止提升时提前结束训练,防止过拟合。
  4. 模型评估(Model Evaluation)

    1. 使用验证数据集对模型进行评估,获取最终的分类准确率(accuracy),以衡量模型在车位状态分类任务上的性能表现。

5. 核心代码详细讲解

1. 图像预处理与车位检测模块(文件 Parking.py

这是项目的图像处理模块,主要包含以下几个核心功能:

a) select_rgb_white_yellow 函数
lower = np.uint8([120, 120, 120]) 
upper = np.uint8([255, 255, 255]) 
white_mask = cv2.inRange(image, lower, upper)
  • 解释:该段代码使用OpenCV的 inRange 函数创建了一个基于颜色的二值掩码(mask),用于将图像中颜色值介于 [120, 120, 120][255, 255, 255] 之间的像素点提取出来。这样能够有效过滤掉背景,保留停车场车位线(通常是白色和黄色)。输出的 white_mask 是一个二值图像,其中满足条件的像素值为 255(白色),不满足的为 0(黑色)。
masked = cv2.bitwise_and(image, image, mask = white_mask)
  • 解释bitwise_and 操作将原始图像和 white_mask 进行逐像素的逻辑与(AND)运算,仅保留白色或黄色区域,并将其他区域设为黑色(0值)。这个步骤用于进一步隔离车位线区域,减少噪声干扰。
b) detect_edges 函数
return cv2.Canny(image, low_threshold, high_threshold)
  • 解释:使用 Canny 边缘检测算法提取图像中的边缘特征。low_thresholdhigh_threshold 是两个用于控制边缘检测敏感度的参数。该操作能够突出车位线的边缘信息,方便后续使用霍夫变换提取直线。
c) hough_lines 函数
return cv2.HoughLinesP(image, rho=0.1, theta=np.pi/10, threshold=15, minLineLength=9, maxLineGap=4)
  • 解释:该行代码使用了霍夫直线变换(Hough Line Transform)来检测图像中的直线。rhotheta 分别表示极坐标系中的距离和角度分辨率,threshold 定义了检测直线的最小累加值,minLineLength 表示检测直线的最小长度,而 maxLineGap 表示两条直线段之间的最大允许间隔。该操作能够从Canny边缘图中提取出车位线的直线段,为后续的车位区域识别提供基础。
d) identify_blocks 函数
list1 = sorted(cleaned, key=operator.itemgetter(0, 1))
  • 解释:该代码行使用 operator.itemgetter 对检测到的直线按 x1 坐标(横向)进行排序。通过对直线进行排序,可以将停车位划分为多个列(每个列代表一排车位),便于后续的车位识别与矩形坐标计算。
clusters = {}
for i in range(len(list1) - 1):
    distance = abs(list1[i+1][0] - list1[i][0])if distance <= clus_dist:if not dIndex in clusters.keys(): clusters[dIndex] = []
        clusters[dIndex].append(list1[i])
        clusters[dIndex].append(list1[i + 1]) else:
        dIndex += 1
  • 解释:此段代码通过对排序后的直线列表进行聚类操作,将彼此 x 坐标差距小于 clus_dist(距离阈值)的直线聚为一个簇(cluster)。这种聚类方法能够有效将同一车道的车位线分为同一组,并将不同车道的直线分隔开来,从而确定车位列的位置。
e) draw_parking 函数
adj_y1 = {0: 20, 1:-10, 2:0, 3:-11, 4:28, 5:5, 6:-15, 7:-15, 8:-10, 9:-30, 10:9, 11:-32}
adj_y2 = {0: 30, 1: 50, 2:15, 3:10, 4:-15, 5:15, 6:15, 7:-20, 8:15, 9:15, 10:0, 11:30}
  • 解释:该段代码为每个车位列预定义了位置调整参数(adj_y1adj_y2),以便在绘制车位时进行微调。这样可以适应不同停车场中车位的实际布局,确保标注的车位区域能够与实际车道对齐。
2. 模型训练与评估模块(文件 train.py
a) 模型构建与特征层冻结
model = applications.VGG16(weights='imagenet', include_top=False, input_shape = (img_width, img_height, 3))
for layer in model.layers[:10]:
    layer.trainable = False
  • 解释:首先加载了 VGG16 预训练模型,使用 weights='imagenet' 加载在 ImageNet 数据集上预训练的权重,并设置 include_top=False 表示去除模型的顶层全连接分类层,只保留卷积特征提取层。接着,通过 for 循环将前 10 层卷积层冻结(设置 trainable=False),防止这些层在训练过程中被更新。这种做法利用了VGG16的低层特征(如边缘和纹理),避免了模型参数过多而导致的过拟合问题。
b) 自定义分类层
x = model.output
x = Flatten()(x)
predictions = Dense(num_classes, activation="softmax")(x)
model_final = Model(input = model.input, output = predictions)
  • 解释:首先将 VGG16 的输出进行展平(Flatten),然后通过自定义的 Dense 层(全连接层)实现二分类输出(num_classes = 2)。该层使用 softmax 作为激活函数,将预测结果转化为两类的概率分布。最终将自定义层与 VGG16 基础网络组合为一个完整模型(model_final)。
c) 模型编译与优化
model_final.compile(loss = "categorical_crossentropy",
                    optimizer = optimizers.SGD(lr=0.0001, momentum=0.9),
                    metrics=["accuracy"])
  • 解释:使用 categorical_crossentropy 作为损失函数,这是多分类问题中常用的损失函数,适用于二分类情况。优化器选择了 SGD(随机梯度下降),并设置了较低的学习率 lr=0.0001 和较高的动量 momentum=0.9,能够在加速收敛的同时避免梯度震荡。评估指标设置为 accuracy,表示模型在训练和评估过程中关注分类准确度。
d) 模型训练与回调函数
history_object = model_final.fit_generator(train_generator,
                                           samples_per_epoch = nb_train_samples,
                                           epochs = epochs,
                                           validation_data = validation_generator,
                                           nb_val_samples = nb_validation_samples,
                                           callbacks = [checkpoint, early])
  • 解释:使用 fit_generator 方法训练模型,输入的 train_generatorvalidation_generator 分别是经过数据增强后的训练集和验证集生成器。训练过程中采用了 ModelCheckpointEarlyStopping 两个回调函数,前者用于在验证集准确率提升时保存最优模型,后者用于当验证集准确率不再提升时提前终止训练。这样可以有效避免过拟合并确保最佳模型保存。

6. 模型优缺点评价

模型优点
  1. 迁移学习提升模型性能:本项目使用预训练的VGG16模型,通过冻结低层特征提取层,仅训练高层分类层的方式,能够有效利用VGG16在ImageNet上的预训练权重,提升模型的泛化能力,并减少模型训练时间。
  2. 多阶段图像处理策略:在车位检测过程中,通过多种图像处理技术(颜色过滤、边缘检测、霍夫变换)进行车位区域提取,并采用聚类和直线过滤等方法识别车位线条,提升了车位检测的精度,适应多种复杂场景。
  3. 数据增强与类别平衡策略:项目采用了多种数据增强方法(旋转、平移、缩放等),并特别注重样本类别平衡,从而增强了模型在不同条件下的鲁棒性和准确率。
  4. 多样化的检测场景支持:项目同时支持静态图像与动态视频的车位检测,能够应用于不同类型的停车场场景,为实际部署提供了灵活性。
模型缺点
  1. 模型计算量大,部署成本高:由于VGG16模型层次较深,卷积层数量较多,因此在车位状态分类时需要较高的计算资源,这可能导致实时检测性能下降,不适合在低性能设备(如边缘设备)上运行。
  2. 对数据集依赖较大:模型在车位状态分类时依赖高质量的训练数据集,而不同停车场的拍摄角度、车位尺寸和光照条件存在较大差异,可能导致模型在实际应用中效果不佳。
  3. 图像预处理过程复杂:图像预处理过程中涉及多个阶段(颜色过滤、边缘检测、直线聚类等),该流程可能因图像质量或环境变化而失效,导致检测精度不稳定。
模型改进方向
  1. 使用更轻量级的模型:考虑引入轻量化的卷积神经网络(如MobileNet或EfficientNet),以降低模型的计算成本,提高检测速度和实时性。
  2. 多尺度特征提取:可以引入多尺度特征提取模块(如FPN或UNet)来提升对不同尺寸车位的检测效果,解决复杂停车场场景中的小目标检测问题。
  3. 改进数据增强策略:采用更多样化的数据增强技术(如光照调整、仿射变换、对比度变化等),增强模型在不同环境条件下的鲁棒性。
  4. 模型结构优化与超参数调优:进一步探索最优的网络结构和超参数(如学习率、权重衰减等),以提升模型训练效果。

↓↓↓更多热门推荐:
WaveNet模型实现电力预测

更多项目数据集、代码、教程点击下方名片

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

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

相关文章

【Python】Dejavu:Python 音频指纹识别库详解

Dejavu 是一个基于 Python 实现的开源音频指纹识别库&#xff0c;主要用于音频文件的识别和匹配。它通过生成音频文件的唯一“指纹”并将其存储在数据库中&#xff0c;来实现音频的快速匹配。Dejavu 的主要应用场景包括识别音乐、歌曲匹配、版权管理等。 ⭕️宇宙起点 &#x1…

【AI知识点】泊松分布(Poisson Distribution)

泊松分布&#xff08;Poisson Distribution&#xff09; 是统计学和概率论中的一种离散概率分布&#xff0c;通常用于描述在固定时间或空间内&#xff0c;某个事件发生的次数。该分布适用于稀有事件的建模&#xff0c;特别是当事件发生是独立的、随机的&#xff0c;且发生的平均…

[Go语言快速上手]初识Go语言

目录 一、什么是Go语言 二、第一段Go程序 1、Go语言结构 注意 2、Go基础语法 关键字 运算符优先级 三、Go语言数据类型 示例 小结 一、什么是Go语言 Go语言&#xff0c;通常被称为Golang&#xff0c;是一种静态类型、编译型的计算机编程语言。它由Google的Robert Gr…

关闭IDM自动更新

关闭IDM自动更新 1 打开注册表2 找到IDM注册表路径 1 打开注册表 winR regedit 2 找到IDM注册表路径 计算机\HKEY_CURRENT_USER\Software\DownloadManager 双击LstCheck&#xff0c;把数值数据改为0 完成 感谢阅读

存储电话号码的数据类型,用 int 还是用 string?

在 Java 编程中&#xff0c;存储电话号码的选择可以通过两种常见方式进行&#xff1a;使用 int 类型或 String 类型。这种选择看似简单&#xff0c;但实际上涉及到 JVM 内部的字节码实现、内存优化、数据表示、以及潜在的可扩展性问题。 Java 基本数据类型与引用数据类型的差异…

Windows安全加固详解

一、补丁管理 使用适当的命令或工具&#xff0c;检查系统中是否有未安装的更新补丁。 Systeminfo 尝试手动安装一个系统更新补丁。 • 下载适当的补丁文件。 • 打开命令提示符或PowerShell&#xff0c;并运行 wusa.exe <patch_file_name>.msu。 二、账号管…

使用seata管理分布式事务

做应用开发时&#xff0c;要保证数据的一致性我们要对方法添加事务管理&#xff0c;最简单的处理方案是在方法上添加 Transactional 注解或者通过编程方式管理事务。但这种方案只适用于单数据源的关系型数据库&#xff0c;如果项目配置了多个数据源或者多个微服务的rpc调用&…

thinkphp 学习记录

1、PHP配置 &#xff08;点开链接后&#xff0c;往下拉&#xff0c;找到PHP8.2.2版本&#xff0c;下载的是ZIP格式&#xff0c;解压即用&#xff09; PHP For Windows: Binaries and sources Releases &#xff08;这里是下载地址&#xff09; 我解压的地址是&#xff1a;D:\…

Spring中Bean创建过程中各个阶段的作用

文章目录 Instantiate&#xff08;实例化&#xff09;Populate properties&#xff08;填充属性&#xff09;BeanNameAwares setBeanName()BeanFactoryAwares setBeanFactory()ApplicationContextAwares setApplicationContext()Pre-initialization BeanPostProcessorsInitiali…

【Python篇】从零到精通:全面分析Scikit-Learn在机器学习中的绝妙应用

文章目录 从零到精通&#xff1a;全面揭秘Scikit-Learn在机器学习中的绝妙应用前言第一部分&#xff1a;深入了解Scikit-Learn的基础知识1. 什么是Scikit-Learn&#xff1f;2. 安装Scikit-Learn3. Scikit-Learn中的基本构件4. 数据集的加载与探索5. 数据预处理标准化数据 6. 构…

【Kubernetes】常见面试题汇总(五十五)

目录 121. POD 创建失败&#xff1f; 122. POD 的 ready 状态未进入&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。 题目 69-113 属于【Kube…

C# 数组和集合

本课要点&#xff1a; 1、数组概述 2、一维数组的使用 3、二维数组的使用 4、数组的基本操作 5、数组排序算法 6、ArrayList集合 7、Hashtable类 8、常见错误 一 数组 1 数组引入1 问题&#xff1a; 简单问题&#xff1a;求4个整数的最大值&#xff1f; int a 40,…

C语言自定义类型联合和枚举(25)

文章目录 前言一、联合体联合体的声明联合体的特点联合体和结构体内存布局对比联合体的大小计算联合体的实际使用样例礼品兑换单判断当前机器是大端还是小端 二、枚举枚举的定义枚举类型的声明枚举类型的优点枚举类型的使用 总结 前言 关于自定义类型除了我们常用的结构体&…

Kubernetes-Operator篇-04-operator部署验证

1、部署命令 这个是很多博客教程都在使用的部署命令&#xff1a; make manifests make install export ENABLE_WEBHOOKSfalse make run我们使用之前的demo来进行部署验证&#xff1a;Kubernetes-Operator篇-02-脚手架熟悉 这里面涉及到的makefile的配置可以参考&#xff1a;…

10.5二分专练,二分边界情况,+1不加1的判断,方向判断,各种DEBUG

5 https://leetcode.cn/problems/minimum-speed-to-arrive-on-time/submissions/570242512/ 就是说总时间是 前n-1量汽车的运行时间&#xff0c;向上取整&#xff0c;然后再加上最后一辆列车的运行时间 最快的话是需要n-1个小时 搜索空间就是时速&#xff0c;左边界是1&#x…

数学建模 第三讲 - 简单的优化模型

在数学建模的学习过程中&#xff0c;第三章介绍了几种简单的优化模型&#xff0c;这些模型在实际生活中有广泛的应用。以下是对这些模型的整理和总结。 3.1 存贮模型 问题描述 配件厂为装配线生产产品&#xff0c;更换设备需要支付生产准备费&#xff0c;产量大于需求时需要…

Llama 3.2 微调指南

让我们通过微调 Llama 3.2 来找到一些精神上的平静。 我们需要安装 unsloth&#xff0c;以更小的尺寸实现 2 倍的快速训练 !pip install unsloth!pip uninstall unsloth -y && pip install --upgrade --no-cache-dir "unsloth[colab-new] githttps://github.co…

OpenCV马赛克

#马赛克 import cv2 import numpy as np import matplotlib.pyplot as pltimg cv2.imread(coins.jpg,1) imgInfo img.shape height imgInfo[0] width imgInfo[1]for m in range(200,400): #m,n表示打马赛克区域for n in range(200,400):# pixel ->10*10if m%10 0 and …

初识Linux · 文件(1)

目录 前言&#xff1a; 回顾语言层面的文件 理解文件的预备知识 文件和磁盘 使用和认识系统调用函数 前言&#xff1a; 本文以及下篇文章&#xff0c;揭露的都是Linux中文件的奥秘&#xff0c;对于文件来说&#xff0c;初学Linux第一节课接触的就是文件&#xff0c;对于C…

Windows删除service服务

Windows删除service服务 找到命令提示符&#xff1a; 右键&#xff0c;以管理员身份运行 输入&#xff1a; sc delete 服务名 Windows根据TCP端口号查找进程PID再kill进程_windows tcpkill-CSDN博客文章浏览阅读5.3k次&#xff0c;点赞42次&#xff0c;收藏104次。Windows根据…