NBA球星知识大挑战:基于 PyQt5 的球星认识小游戏

NBA球星知识大挑战:基于 PyQt5 的球星认识小游戏

代码详见:https://github.com/xiaozhou-alt/NBA_Players_Recognition


文章目录

  • NBA球星知识大挑战:基于 PyQt5 的球星认识小游戏
  • 一、项目介绍
  • 二、文件夹结构
  • 三、项目实现
    • 1. 自定义动画按钮(AnimatedButton)
    • 2. 渐变背景组件(GradientWidget)
    • 3. 主应用类(NBAApp)
    • 4. 加载资源
    • 5. 加载球员图像
    • 6. 创建主菜单页面
    • 7. 图像上传与识别功能
    • 8. 球星识别页面
    • 9. 球星认识小游戏界面
    • 10. 游戏问题界面
    • 11. 游戏结果页面
  • 四、结果展示


关于识别球星的模型训练和数据集获取与讲解请详见:当库里遇上卷积神经网络:基于 EfficientNetV2 的NBA球星分类

一、项目介绍

项目使用深度学习技术对NBA球星图像进行分类。项目基于TensorFlow实现,采用迁移学习策略,使用预训练的 EfficientNetV2L 模型作为基础架构,并添加了自定义的通道注意力机制。整个训练过程分为两个阶段:第一阶段冻结基础模型训练分类头,第二阶段解冻顶层进行微调优化;同时结合UI界面,将球星识别系统设计了一个球星识别小游戏,测试用户对NBA球星的了解程度

项目亮点:

  • 实现加权Top-3准确率评估指标,更符合实际应用场景
  • 采用两阶段训练策略提高模型性能
  • 集成通道注意力机制增强特征提取能力
  • 使用余弦衰减+预热的学习率调度策略
  • 现代化UI设计:采用渐变背景、动画按钮和流畅交互
  • 资源优化:支持相对路径访问,便于打包分发
  • 跨平台兼容:可在Windows、macOS和Linux系统运行

此项目承接自:当库里遇上卷积神经网络:基于 EfficientNetV2 的NBA球星分类,数据集的获取方法详见:NBA 60位全明星球员图片数据集(ScienceDB)

二、文件夹结构

NBA/
├── assets/                  # 静态资源文件夹
├── data/                    # 球员图片数据集└── Allen_Iverson/       # 艾弗森图片(示例,共60位NBA球星)├── 1.png            # 球员图片(命名格式为数字)└── ...              # 每个球员约300-400张图片
├── log/                     # 日志目录
├── output/                  # 输出目录├── model/               # 训练好的模型└── pic/                 # 生成的图片
├── README.md
├── build.spec               # PyInstaller打包配置
├── class.txt                # 分类标签
├── data.ipynb
├── demo.py                  # 主程序(带GUI的识别系统)
├── demo.mp4                 # 演示视频
├── predict.py               # 预测脚本
├── requirements.txt
└── train.py                 # 训练脚本

三、项目实现

1. 自定义动画按钮(AnimatedButton)

这个自定义按钮实现了:

  • 设置按钮的初始样式(深蓝色背景)
  • 鼠标 悬停 时改变为悬停样式(浅蓝色背景)
  • 使用属性动画实现 高度变化 的动画效果
  • 设置鼠标指针为手形,增强用户体验
class AnimatedButton(QPushButton):"""带有悬停动画的按钮"""def __init__(self, text, parent=None):super().__init__(text, parent)self.setFont(QFont("Arial", 14, QFont.Bold))self.setMinimumHeight(50)self.setCursor(Qt.PointingHandCursor)# 初始样式self.normal_style = """background-color: #1e3c72;color: white;border: 2px solid #2a5298;border-radius: 25px;padding: 10px 20px;"""self.hover_style = """background-color: #2a5298;color: white;border: 2px solid #3a6bc4;border-radius: 25px;padding: 10px 20px;"""self.setStyleSheet(self.normal_style)def enterEvent(self, event):# 鼠标进入时动画...def leaveEvent(self, event):# 鼠标离开时动画...def animate_size(self, start, end):# 创建尺寸动画...

如下是一个简单按键动画展示:

请添加图片描述

2. 渐变背景组件(GradientWidget)

这个组件实现了:

  1. 定义四种颜色(深蓝、中蓝、浅蓝和红色)
  2. paintEvent中创建线性渐变
  3. 使用四种颜色创建从左上到右下的 渐变 效果
  4. 填充整个组件区域,为应用提供美观的背景
class GradientWidget(QWidget):"""带有渐变背景的组件"""def __init__(self, parent=None):super().__init__(parent)self.color1 = QColor(30, 60, 114)  # 深蓝色self.color2 = QColor(42, 82, 152)  # 中蓝色self.color3 = QColor(58, 107, 196)  # 浅蓝色self.color4 = QColor(142, 45, 65)  # 红色(NBA主题)def paintEvent(self, event):painter = QPainter(self)painter.setRenderHint(QPainter.Antialiasing)# 创建渐变...

3. 主应用类(NBAApp)

这是应用的主类:

  • 继承自QMainWindow,作为主窗口
  • 设置全局字体和应用标题、大小
  • 初始化球员图像字典
  • 创建堆叠窗口管理多个页面
  • 初始化所有页面(主菜单、识别页、游戏页等)
  • 加载模型和资源
  • 显示主菜单页面
class NBAApp(QMainWindow):def __init__(self):super().__init__()# 设置全局字体font = QFont("Times New Roman", 12)QApplication.setFont(font)# 应用设置self.setWindowTitle("NBA球星识别系统")self.setGeometry(100, 100, 1000, 750)# 初始化球员图像字典self.player_images = {}  # 修复:添加初始化# 创建主堆叠窗口self.stacked_widget = QStackedWidget()self.setCentralWidget(self.stacked_widget)# 创建各页面self.main_menu = self.create_main_menu()...# 加载模型和类别映射self.load_resources()# 显示主菜单self.stacked_widget.setCurrentIndex(0)

4. 加载资源

  1. 加载预训练的深度学习模型(包含自定义注意力层)
  2. 加载类别映射文件(JSON 格式)
  3. 从类别映射中提取球员名称列表(替换下划线为空格)
  4. 调用load_player_images方法加载球员图像
    def load_resources(self):"""加载模型和类别映射"""try:# 加载模型 - 使用相对路径model_path = self.resource_path("output/model/best_model_phase2.h5")if os.path.exists(model_path):self.model = tf.keras.models.load_model(model_path,custom_objects={'ChannelAttention': ChannelAttention},compile=False)print("✅ 模型加载成功")else:print(f"❌ 模型文件不存在: {model_path}")# 加载类别映射mapping_path = self.resource_path("output/class_mapping.json")if os.path.exists(mapping_path):with open(mapping_path, 'r') as f:self.class_mapping = json.load(f)print("✅ 类别映射加载成功")# 获取球员列表(将下划线替换为空格)self.player_names = [name.replace('_', ' ') for name in self.class_mapping['class_to_index'].keys()]else:print(f"❌ 类别映射文件不存在: {mapping_path}")# 加载球员图像(用于小游戏)self.load_player_images()except Exception as e:print(f"❌ 资源加载失败: {e}")

球员姓名映射文件(class_mapping.json):

{
“class_to_index”: {
“Allen_Iverson”: 0,

“Wilt_Chamberlain”: 59
},
“index_to_class”: {
“0”: “Allen_Iverson”,

“59”: “Wilt_Chamberlain”
}
}

5. 加载球员图像

这个方法加载球员图像用于小游戏:

  • 检查球员名称列表是否有效
  • 获取data文件夹路径
  • 遍历data文件夹下的每个球员文件夹
  • 提取球员名称(替换下划线为空格)
  • 收集该球员的所有图像文件路径
  • 将球员名称和图像路径列表存储到字典中
    def load_player_images(self):"""加载球员图像(用于小游戏)"""if not hasattr(self, 'player_names') or not self.player_names:print("⚠️ 球员名称列表未初始化或为空")return# 球员文件夹路径nba_dir = self.resource_path("data")if not os.path.exists(nba_dir):print(f"❌ data文件夹不存在: {nba_dir}")return# 确保 player_images 字典已初始化if not hasattr(self, 'player_images'):self.player_images = {}print("ℹ️ player_images 字典已初始化")  for player_folder in os.listdir(nba_dir):player_path = os.path.join(nba_dir, player_folder)if os.path.isdir(player_path):# 获取球员名称(替换下划线)player_name = player_folder.replace('_', ' ')# 获取该球员的所有图像images = [os.path.join(player_path, img) for img in os.listdir(player_path)if img.lower().endswith(('.png', '.jpg', '.jpeg'))]if images:self.player_images[player_name] = images

球员图片文件夹格式样例:

在这里插入图片描述

6. 创建主菜单页面

  • 使用渐变背景组件
  • 创建标题和副标题
  • 添加三个功能按钮(球星识别、小游戏、退出)
  • 添加篮球装饰图片
  • 使用垂直布局组织所有元素
  • 通过Stretch实现元素居中效果
    def create_main_menu(self):"""创建主菜单页面"""widget = GradientWidget()layout = QVBoxLayout(widget)# ... (布局设置)# 标题区域title_frame = QFrame()# ... (样式设置)title_layout = QVBoxLayout(title_frame)     # 标题title = QLabel("NBA球星识别系统")# ... (字体和样式设置)# 副标题subtitle = QLabel("探索篮球传奇,认识超级球星")# ... (样式设置)title_layout.addWidget(title)title_layout.addWidget(subtitle)# 按钮容器button_frame = QFrame()# ... (样式设置)button_layout = QVBoxLayout(button_frame)# 按钮btn_recognition = AnimatedButton("球星识别")...# 添加篮球装饰basketball_label = QLabel()pixmap = QPixmap(self.resource_path("assets/basketball.png"))# ... (加载和缩放图片)# 添加组件layout.addStretch(1)...return widget

最终的主界面布局如下所示:

请添加图片描述

7. 图像上传与识别功能

  • upload_image:打开文件对话框选择图片,显示在界面上
  • preprocess_image:预处理图像(调整大小、处理通道、归一化
  • recognize_player:使用模型进行预测,显示 T o p 3 Top3 Top3 结果
    def upload_image(self):"""上传图片"""file_path, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "图片文件 (*.png *.jpg *.jpeg)")if file_path:# 显示图片pixmap = QPixmap(file_path)if not pixmap.isNull():# 缩放图片以适应标签...def recognize_player(self):"""识别球星"""if not hasattr(self, 'current_image_path') or not self.model:self.recog_result_label.setText("请先上传图片或等待模型加载完成")returntry:# 添加加载提示self.recog_result_label.setText("正在识别中,请稍后...(第一次加载需要较长时间哦)")QApplication.processEvents()  # 强制刷新UI# 预处理图像processed_img, original_img = self.preprocess_image(self.current_image_path)# 进行预测predictions = self.model.predict(processed_img)[0]# 获取top-3预测结果top_indices = np.argsort(predictions)[::-1][:3]top_indices = [int(idx) for idx in top_indices]# 获取球员名称和概率top_players = [self.class_mapping['index_to_class'][str(idx)].replace('_', ' ') for idx in top_indices]top_probs = predictions[top_indices]# 构建结果字符串result_text = "🏀 识别结果:\n\n"for i, (player, prob) in enumerate(zip(top_players, top_probs)):result_text += f"{i+1}. {player}: {prob*100:.2f}%\n"self.recog_result_label.setText(result_text)except Exception as e:self.recog_result_label.setText(f"⚠️ 识别失败: {str(e)}")def preprocess_image(self, image_path, target_size=(300, 300)):"""预处理图像用于模型预测"""img = Image.open(image_path)# 保留原始图像用于显示original_img = img.copy()# 调整大小为模型输入尺寸img = img.resize(target_size)img_array = np.array(img)# 处理图像通道if len(img_array.shape) == 2:  # 灰度图img_array = np.stack((img_array,) * 3, axis=-1)elif img_array.shape[2] == 4:  # RGBA转RGBimg_array = img_array[..., :3]img_array = img_array.astype('float32') / 255.0return np.expand_dims(img_array, axis=0), original_img

8. 球星识别页面

添加返回按钮和页面标题、创建图像显示区域、添加上传和识别按钮、设置结果标签用于显示识别结果、使用垂直布局组织所有元素、

    def create_recognition_page(self):"""创建球星识别页面"""widget = GradientWidget()# ... (布局设置)# 标题栏header = QWidget()header_layout = QHBoxLayout(header)# 返回按钮btn_back = AnimatedButton("返回")...# 标题title = QLabel("球星识别")# ... (样式设置)# 主内容区域content = QWidget()content_layout = QVBoxLayout(content)# 图像显示区域self.recog_image_label = QLabel()# ... (样式设置)# 按钮容器button_container = QWidget()button_layout = QHBoxLayout(button_container)# 上传按钮btn_upload = AnimatedButton("上传图片")...# 识别按钮btn_recognize = AnimatedButton("识别球星")...# 结果区域self.recog_result_label = QLabel("上传图片后点击识别按钮")# ... (样式设置)# 添加装饰decoration = QLabel()pixmap = QPixmap(self.resource_path("assets/nba_logo.png"))# ... (加载和缩放图片)# 添加组件...return widget

最终的球星识别页面布局如下所示:

请添加图片描述

9. 球星认识小游戏界面

  • 添加返回按钮和页面标题
  • 创建游戏说明标签
  • 添加难度选择单选按钮(简单(5)中等(10)困难(20)
  • 使用垂直布局组织所有元素
    def create_game_page(self):"""创建小游戏页面"""widget = GradientWidget()# ... (布局设置)# 标题栏header = QWidget()header_layout = QHBoxLayout(header)# 返回按钮btn_back = AnimatedButton("返回")btn_back.clicked.connect(lambda: self.stacked_widget.setCurrentIndex(0))# 标题title = QLabel("球星认识小游戏")# ... (样式设置)header_layout.addWidget(btn_back)header_layout.addWidget(title)header_layout.addStretch()# 主内容区域content = QWidget()content_layout = QVBoxLayout(content)# 游戏说明instruction = QLabel("测试你对NBA球星的了解程度!\n选择难度级别,开始挑战吧!")# ... (样式设置)# 游戏选项区域group = QGroupBox("选择游戏难度")# ... (样式设置)group_layout = QHBoxLayout(group)...# 设置单选按钮样式# ... (样式设置)...# 开始游戏按钮btn_start = AnimatedButton("开始游戏")btn_start.setIcon(QIcon(self.resource_path("assets/start_icon.png")))btn_start.clicked.connect(self.start_game)# 添加装饰trophy_label = QLabel()pixmap = QPixmap(self.resource_path("assets/trophy.png"))# ... (加载和缩放图片)# 添加内容...# 添加组件...return widget

最终小游戏页面布局如下所示:

请添加图片描述

10. 游戏问题界面

  • 添加返回按钮和动态标题(显示当前问题
  • 创建图像显示区域(带边框
  • 添加四个选项按钮(单选
  • 添加提交答案按钮
  • 添加进度标签(显示当前得分
    def create_game_question_page(self):"""创建游戏问题页面"""widget = GradientWidget()# ... (布局设置)# 标题栏header = QWidget()header_layout = QHBoxLayout(header)# 返回按钮btn_back = AnimatedButton("返回")btn_back.clicked.connect(lambda: self.stacked_widget.setCurrentIndex(2))# 标题(显示当前问题)self.game_title = QLabel()# ... (样式设置)...# 主内容区域content = QWidget()content_layout = QVBoxLayout(content)# 图像显示区域self.game_image_frame = QFrame()# ... (样式设置)image_layout = QVBoxLayout(self.game_image_frame)self.game_image_label = QLabel()# ... (设置)image_layout.addWidget(self.game_image_label)# 选项组options_group = QGroupBox("请选择正确的球星名字")# ... (样式设置)option_layout = QVBoxLayout(options_group)self.option_group = QButtonGroup()self.option_buttons = []  # 存储选项按钮# 创建选项按钮for i in range(4):...# 提交答案按钮btn_submit = AnimatedButton("提交答案")btn_submit.setIcon(QIcon(self.resource_path("assets/submit_icon.png")))btn_submit.clicked.connect(self.check_answer)# 进度标签self.progress_label = QLabel()# ... (样式设置)# 添加内容...# 添加组件layout.addWidget(header)layout.addWidget(content, 1)return widget

最终问题界面布局如下所示:

请添加图片描述

11. 游戏结果页面

  • 创建结果标签(显示评价
  • 添加分数标签(显示得分
  • 添加动画标签(显示GIF动画
  • 添加两个按钮(再玩一次和返回主菜单
  • 使用垂直布局组织所有元素
  • 通过Stretch实现居中效果
    def create_result_page(self):"""创建游戏结果页面"""widget = GradientWidget()# ... (布局设置)# 标题title = QLabel("游戏结果")# ... (样式设置)# 结果容器result_container = QWidget()result_layout = QVBoxLayout(result_container)# 结果标签self.result_label = QLabel()# ... (样式设置)# 分数标签self.score_label = QLabel()# ... (样式设置)# 动画标签self.animation_label = QLabel()# 按钮容器button_container = QWidget()button_layout = QHBoxLayout(button_container)# 再玩一次按钮btn_restart = AnimatedButton("再玩一次")btn_restart.setIcon(QIcon(self.resource_path("assets/restart_icon.png")))btn_restart.clicked.connect(lambda: self.stacked_widget.setCurrentIndex(2))# 返回主菜单按钮btn_menu = AnimatedButton("返回主菜单")...# 添加内容...# 添加组件layout.addStretch(1)...return widget

最终游戏结果画面布局如下所示:

请添加图片描述

四、结果展示

NBA球星识别系统的演示视频如下所示:

如果你喜欢我的文章,不妨给小周一个免费的点赞和关注吧!

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

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

相关文章

电磁波成像(X射线、CT成像)原理简介

电磁波成像(X射线、CT成像)原理简介一、图像形成的一般形式二、可见光成像2.1可见光2.2可见光成像三、其他电磁波成像3.1X射线成像3.2CT成像3.2.1CT成像原理3.2.2CT成像与X射线成像对比3.2.3CT生成三维描述3.3PET成像一、图像形成的一般形式 大多数图像…

k8s部署2:前置条件:docker部署

前两天发布了k8s的前置发布条件,对于防火墙的处理,我看大家反响还不错,所以作为先行者,我感觉自己多了不少动力,所以今天来说说k8s部署前置条件中docker部分的部署。在此先感谢一下那些点赞和添加收藏的朋友们,你们的支持是我永远的动力!三克油喂给马吃! 之前写过docke…

某开源漫画系统RCE代码审计

免责声明 本文档所述漏洞详情及复现方法仅限用于合法授权的安全研究和学术教育用途。任何个人或组织不得利用本文内容从事未经许可的渗透测试、网络攻击或其他违法行为。使用者应确保其行为符合相关法律法规,并取得目标系统的明确授权。 对于因不当使用本文信息而造…

Pandas DataFrame 指南

📊 Pandas DataFrame 常用操作代码示例 下面用表格汇总了 DataFrame 的常用操作,方便你快速查阅和实践。 操作类别代码示例说明(简要)数据读取df pd.read_csv(data.csv)读取 CSV 文件df pd.read_excel(data.xlsx, sheet_nameS…

React学习教程,从入门到精通, React 样式语法知识点与案例详解(13)

React 样式语法知识点与案例详解 作为React初学者,掌握样式语法是构建美观UI的关键。本文将详细介绍React中所有主要的样式方法,并提供详细注释的案例代码。 一、React样式语法知识点总览 1. 行内样式 (Inline Styles) 使用style属性,值为Jav…

Proxychains 配置全解析:从入门到高级应用

引言 在数字时代,网络隐私与安全至关重要。无论是绕过地理限制访问内容,还是在渗透测试中隐藏踪迹,代理工具都不可或缺。Proxychains(或称 Proxychains-NG)作为一款经典的开源代理链工具,以其高效灵活的特性…

二叉树的前中后序遍历(迭代法)

目录 题目链接: 题目: 解题思路: 代码: 前序遍历: 中序遍历: 后序遍历: 总结: 题目链接: 144. 二叉树的前序遍历 - 力扣(LeetCode) 94. …

redis的数据类型:string

文章目录String类型介绍redis采用的字符集json类型介绍String类型的命令set key value [EX seconds] [NX|XX]incr keyincr对操作的key对应的value类型有限制吗?incr key操作的返回值是什么?incr操作的key可以不存在吗?多个客户端同时针对同…

传统神经网络实现-----手写数字识别(MNIST)项目

完整代码:# import torch # print(torch.__version__)#1.X 1、验证安装的开发环境是否正确, MNIST包含70,000张手写数字图像: 60,000张用于训练,10,000张用于测试。 图像是灰度的,28x28像素的,并且居中的&#xff…

工业机器人标杆的数字化突围,珞石机器人如何以CRM实现业务重塑

在智能制造浪潮下,工业机器人行业正迎来快速增长。作为国内领先的机器人制造商,珞石机器人面对业务规模的迅速扩张,意识到传统的管理方式已无法满足企业发展需求,急需通过数字化升级破解管理难题。因此珞石机器人选择引入纷享销客…

NVIDIA GPU的指令集详细介绍

这是一个非常核心且深入的话题。GPU的指令集架构(Instruction Set Architecture, ISA)是理解GPU如何工作的关键,它直接体现了GPU为大规模并行计算而生的设计哲学。下面我将详细、全面地介绍GPU的指令集。 第一部分:核心哲学 —— …

Day 17: 3D点云深度学习专项 - 理论深度与面试精通之路

Day 17: 3D点云深度学习专项 - 理论深度与面试精通之路 🎯 学习目标:深度理解3D点云核心理论,获得该领域面试入场券 ⏰ 预计用时:6小时 (理论深度4h + 面试准备2h) 🎨 教学特色:理论优先 + 概念深度 + 面试导向 + 行业认知 🎯 今日学习大纲 1. 点云AI的理论基础:几何…

【经济学】量化模型TradingAgents 工具集成层与数据(财报+ 基本信息指标+基本面分析)+ChromaDB 客户端+财务情况记忆库

文章目录Toolkit 作用Toolkit 逐函数解析1. 获取默认配置2. update_config3. config4. __init__5. get_reddit_news6. get_finnhub_news7. get_reddit_stock_info8. get_chinese_social_sentiment9. get_finnhub_company_insider_sentiment10. get_YFin_data11. get_YFin_data_…

Uni-App + Vue onLoad与onLaunch执行顺序问题完整解决方案 – 3种实用方法详解

导读:在 Uni-app Vue 小程序应用开发中,你是否遇到过页面加载时全局数据还未准备好的问题?本文将深入分析onLoad生命周期钩子在onLaunch未完成时就执行的常见问题,并提供三种实用的解决方案。 📋 问题描述 在 Vue 应…

25、SSH远程部署到另一台机器

25、SSH远程部署到另一台机器 因为不是每一台服务器都有jenkins的,一般都是一台jenkins,部署很多机器 1、安装插件 Publish Over SSH2、配置另一台机器 # 生成秘钥 ssh-keygen -t dsa# 把公钥复制到要访问的机器 ssh-copy-id root目标机器的ip# 第一次要…

2025年金融专业人士职业认证发展路径分析

在金融行业数字化转型的背景下,专业认证作为提升个人能力的一种方式,受到越来越多从业者的关注。本文基于行业发展趋势,分析6个金融相关领域的专业资格认证,为职业发展提供参考。一、CDA数据分析师认证含金量CDA数据分析师是数据领…

日用百货新零售小程序设计与开发(代码+数据库+LW)

摘要 本文设计并开发了一款基于Java、Spring Boot和MySQL的日用百货新零售小程序,旨在通过数字化手段优化日用百货的销售与配送流程,满足用户便捷购物的需求。系统采用前后端分离架构,前端通过微信小程序实现用户交互,后端基于Sp…

【Git】查看差异 删除文件 忽略文件

- 第 122 篇 - Date: 2025 - 09 - 07 Author: 郑龙浩(仟墨) 文章目录查看差异 && 删除文件 && 忽略文件1 git diff 可以查看哪些?基本用法比较不同提交比较分支文件比较其他2 彻底删除文件3 忽略文件「1」应该忽略哪些文件&a…

HarmonyOS应用开发:三层工程架构

引言 在HarmonyOS应用开发过程中,随着项目规模的增长,代码的组织结构显得尤为重要。 DevEco Studio创建出的默认工程仅包含一个entry类型的模块,如果直接使用平级目录进行模块管理,工程逻辑结构较混乱且模块间的一栏关系不够清晰&…

phpMyAdmin文件包含漏洞复现:原理详解+环境搭建+渗透实战(windows CVE-2018-12613)

目录 一、CVE-2018-12613漏洞 1、漏洞简介 2、漏洞原理 (1)漏洞触发点与正常逻辑 (2)过滤逻辑缺陷与绕过方式 二、渗透准备 1、访问phpmyadmin靶场 2、登录phpmyadmin 3、获取session文件位置 三、渗透准备 1、读取敏感…