变压器设备漏油数据集 voc txt
变压器设备漏油数据集
油浸式变压器通常采用油浸自冷式、油浸风冷式和强迫油循环三种冷却方式。该数据集采集于油浸式变压器的设备漏油情况,一般用于变电站的无人巡检,代替传统的人工巡检,与绝缘子的破损检测来源于同一课题。数据集一部分来自真实场景,由于真实场景下样本较少,外加一部分合成图片,共338张,采用VOC标注格式,新增txt格式标签,可以用于yolo训练,赠送五个常用脚本
变压器设备漏油数据集
数据集描述
该数据集是一个专门用于检测油浸式变压器设备漏油情况的数据集,旨在帮助研究人员和开发者训练和评估基于深度学习的目标检测模型。数据集涵盖了油浸自冷式、油浸风冷式和强迫油循环三种冷却方式的油浸式变压器,并记录了设备漏油的情况。通过高质量的图像和详细的标注信息,该数据集为开发高效且准确的漏油检测系统提供了坚实的基础。
数据规模
- 总样本数量:338张图片
- 标注格式:
- Pascal VOC XML格式
- YOLO txt格式
图像特性
- 多样化场景:覆盖了不同类型的油浸式变压器在各种环境下的图像情况。
- 高质量手工标注:每张图像都有详细的边界框标注,支持直接用于训练目标检测模型。
- 真实与合成结合:数据集一部分来自真实场景,另一部分是合成图片,以弥补真实场景下样本较少的问题。
- 多类别支持:主要关注变压器设备的漏油情况,但可能包含其他相关缺陷或背景信息,丰富了数据集的多样性。
- 无需预处理:数据集已经过处理,可以直接用于训练,无需额外的数据预处理步骤。
应用场景
- 智能监控:自动检测变压器设备的漏油情况,辅助管理人员及时发现并采取应对措施,提高设备的安全性和可靠性。
- 无人巡检:集成到变电站的无人巡检系统中,代替传统的人工巡检,提高巡检效率和准确性。
- 科研分析:用于研究目标检测算法在特定工业应用场景中的表现,特别是在复杂背景和光照条件下的鲁棒性。
- 教育与培训:可用于安全相关的教育和培训项目,帮助学生和从业人员更好地识别和理解变压器设备的漏油情况。
- 自动化管理:集成到电力系统的管理系统中,实现对设备状态的自动化监测和管理,预防设备故障。
数据集结构
典型的数据集目录结构如下:
深色版本
1transformer_oil_leakage_dataset/
2├── images/
3│ ├── img_00001.jpg
4│ ├── img_00002.jpg
5│ └── ...
6├── annotations/
7│ ├── img_00001.xml # Pascal VOC XML格式
8│ ├── img_00002.xml
9│ └── ...
10├── labels/ # YOLO txt格式
11│ ├── img_00001.txt
12│ ├── img_00002.txt
13│ └── ...
14├── scripts/
15│ ├── convert_voc_to_yolo.py
16│ ├── train_yolo.py
17│ ├── evaluate_yolo.py
18│ ├── visualize_annotations.py
19│ └── data_augmentation.py
20├── README.txt # 数据说明文件
数据说明
- 检测目标:以Pascal VOC XML格式和YOLO txt格式进行标注。
- 数据集内容:
- 总共338张图片,每张图片都带有相应的XML和txt标注文件。
- 标签类型:
- 边界框 (Bounding Box)
- 数据增广:数据集未做数据增广,用户可以根据需要自行进行数据增广。
- 无需预处理:数据集已经过处理,可以直接用于训练,无需额外的数据预处理步骤。
示例代码
以下是一些常用脚本的示例代码,包括将VOC格式转换为YOLO格式、训练YOLO模型、评估模型性能、可视化标注以及数据增强。
脚本1: 将VOC格式转换为YOLO格式
1# convert_voc_to_yolo.py
2import os
3import xml.etree.ElementTree as ET
4
5def convert_voc_to_yolo(xml_file, image_size):
6 tree = ET.parse(xml_file)
7 root = tree.getroot()
8 yolo_lines = []
9
10 for obj in root.findall('object'):
11 name = obj.find('name').text
12 bbox = obj.find('bndbox')
13 xmin = int(bbox.find('xmin').text)
14 ymin = int(bbox.find('ymin').text)
15 xmax = int(bbox.find('xmax').text)
16 ymax = int(bbox.find('ymax').text)
17
18 x_center = (xmin + xmax) / 2.0 / image_size[0]
19 y_center = (ymin + ymax) / 2.0 / image_size[1]
20 width = (xmax - xmin) / image_size[0]
21 height = (ymax - ymin) / image_size[1]
22
23 class_id = 0 # 假设只有一个类别
24 yolo_line = f"{class_id} {x_center} {y_center} {width} {height}\n"
25 yolo_lines.append(yolo_line)
26
27 return yolo_lines
28
29def main():
30 voc_dir = 'path/to/annotations'
31 yolo_dir = 'path/to/labels'
32 image_dir = 'path/to/images'
33
34 if not os.path.exists(yolo_dir):
35 os.makedirs(yolo_dir)
36
37 for xml_file in os.listdir(voc_dir):
38 if xml_file.endswith('.xml'):
39 image_path = os.path.join(image_dir, xml_file.replace('.xml', '.jpg'))
40 image = Image.open(image_path)
41 image_size = image.size
42
43 yolo_lines = convert_voc_to_yolo(os.path.join(voc_dir, xml_file), image_size)
44 with open(os.path.join(yolo_dir, xml_file.replace('.xml', '.txt')), 'w') as f:
45 f.writelines(yolo_lines)
46
47if __name__ == "__main__":
48 main()
脚本2: 训练YOLO模型
1# train_yolo.py
2import os
3import torch
4from yolov5 import train
5
6def main():
7 data_yaml = 'path/to/data.yaml' # 包含数据集路径和类别的配置文件
8 model_yaml = 'path/to/model.yaml' # 模型配置文件
9 weights = 'path/to/weights.pt' # 预训练权重(可选)
10 epochs = 100
11 batch_size = 8
12 img_size = 640
13
14 train.run(
15 data=data_yaml,
16 cfg=model_yaml,
17 weights=weights,
18 epochs=epochs,
19 batch_size=batch_size,
20 imgsz=img_size
21 )
22
23if __name__ == "__main__":
24 main()
脚本3: 评估YOLO模型
1# evaluate_yolo.py
2import os
3import torch
4from yolov5 import val
5
6def main():
7 data_yaml = 'path/to/data.yaml' # 包含数据集路径和类别的配置文件
8 weights = 'path/to/best.pt' # 训练好的模型权重
9 img_size = 640
10
11 val.run(
12 data=data_yaml,
13 weights=weights,
14 imgsz=img_size
15 )
16
17if __name__ == "__main__":
18 main()
脚本4: 可视化标注
1# visualize_annotations.py
2import os
3import cv2
4import numpy as np
5from PIL import Image
6import xml.etree.ElementTree as ET
7
8def load_image_and_boxes(image_path, annotation_path):
9 # 读取图像
10 image = Image.open(image_path).convert('RGB')
11
12 # 解析Pascal VOC格式的XML标注文件
13 tree = ET.parse(annotation_path)
14 root = tree.getroot()
15 boxes = []
16 for obj in root.findall('object'):
17 class_name = obj.find('name').text
18 bbox = obj.find('bndbox')
19 xmin = int(bbox.find('xmin').text)
20 ymin = int(bbox.find('ymin').text)
21 xmax = int(bbox.find('xmax').text)
22 ymax = int(bbox.find('ymax').text)
23 boxes.append([class_name, xmin, ymin, xmax, ymax])
24
25 return image, boxes
26
27def show_image_with_boxes(image, boxes):
28 img = np.array(image)
29 for box in boxes:
30 class_name, xmin, ymin, xmax, ymax = box
31 cv2.rectangle(img, (xmin, ymin), (xmax, ymax), (0, 255, 0), 2)
32 label = f'{class_name}'
33 cv2.putText(img, label, (xmin, ymin - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
34
35 cv2.imshow('Image with Boxes', img)
36 cv2.waitKey(0)
37 cv2.destroyAllWindows()
38
39def main():
40 images_dir = 'path/to/images'
41 annotations_dir = 'path/to/annotations'
42
43 # 获取图像列表
44 image_files = [f for f in os.listdir(images_dir) if f.endswith('.jpg')]
45
46 # 随机选择一张图像
47 selected_image = np.random.choice(image_files)
48 image_path = os.path.join(images_dir, selected_image)
49 annotation_path = os.path.join(annotations_dir, selected_image.replace('.jpg', '.xml'))
50
51 # 加载图像和边界框
52 image, boxes = load_image_and_boxes(image_path, annotation_path)
53
54 # 展示带有边界框的图像
55 show_image_with_boxes(image, boxes)
56
57if __name__ == "__main__":
58 main()
脚本5: 数据增强
1# data_augmentation.py
2import os
3import cv2
4import numpy as np
5import albumentations as A
6from PIL import Image
7import xml.etree.ElementTree as ET
8
9def load_image_and_boxes(image_path, annotation_path):
10 # 读取图像
11 image = Image.open(image_path).convert('RGB')
12 image = np.array(image)
13
14 # 解析Pascal VOC格式的XML标注文件
15 tree = ET.parse(annotation_path)
16 root = tree.getroot()
17 boxes = []
18 for obj in root.findall('object'):
19 class_name = obj.find('name').text
20 bbox = obj.find('bndbox')
21 xmin = int(bbox.find('xmin').text)
22 ymin = int(bbox.find('ymin').text)
23 xmax = int(bbox.find('xmax').text)
24 ymax = int(bbox.find('ymax').text)
25 boxes.append([xmin, ymin, xmax, ymax, class_name])
26
27 return image, boxes
28
29def save_augmented_data(augmented_image, augmented_boxes, output_image_path, output_annotation_path):
30 # 保存增强后的图像
31 augmented_image = Image.fromarray(augmented_image)
32 augmented_image.save(output_image_path)
33
34 # 保存增强后的标注
35 tree = ET.parse(output_annotation_path)
36 root = tree.getroot()
37 for obj, new_box in zip(root.findall('object'), augmented_boxes):
38 bbox = obj.find('bndbox')
39 bbox.find('xmin').text = str(new_box[0])
40 bbox.find('ymin').text = str(new_box[1])
41 bbox.find('xmax').text = str(new_box[2])
42 bbox.find('ymax').text = str(new_box[3])
43
44 tree.write(output_annotation_path)
45
46def augment_data(image, boxes):
47 transform = A.Compose([
48 A.RandomRotate90(p=0.5),
49 A.HorizontalFlip(p=0.5),
50 A.VerticalFlip(p=0.5),
51 A.RandomBrightnessContrast(p=0.2),
52 A.HueSaturationValue(p=0.2)
53 ], bbox_params=A.BboxParams(format='pascal_voc', label_fields=['category_ids']))
54
55 category_ids = [box[-1] for box in boxes]
56 bboxes = [box[:-1] for box in boxes]
57
58 transformed = transform(image=image, bboxes=bboxes, category_ids=category_ids)
59 transformed_image = transformed['image']
60 transformed_bboxes = transformed['bboxes']
61
62 return transformed_image, transformed_bboxes
63
64def main():
65 images_dir = 'path/to/images'
66 annotations_dir = 'path/to/annotations'
67 output_images_dir = 'path/to/augmented_images'
68 output_annotations_dir = 'path/to/augmented_annotations'
69
70 if not os.path.exists(output_images_dir):
71 os.makedirs(output_images_dir)
72
73 if not os.path.exists(output_annotations_dir):
74 os.makedirs(output_annotations_dir)
75
76 # 获取图像列表
77 image_files = [f for f in os.listdir(images_dir) if f.endswith('.jpg')]
78
79 for image_file in image_files:
80 image_path = os.path.join(images_dir, image_file)
81 annotation_path = os.path.join(annotations_dir, image_file.replace('.jpg', '.xml'))
82
83 # 加载图像和边界框
84 image, boxes = load_image_and_boxes(image_path, annotation_path)
85
86 # 增强数据
87 augmented_image, augmented_boxes = augment_data(image, boxes)
88
89 # 保存增强后的数据
90 output_image_path = os.path.join(output_images_dir, image_file)
91 output_annotation_path = os.path.join(output_annotations_dir, image_file.replace('.jpg', '.xml'))
92 save_augmented_data(augmented_image, augmented_boxes, output_image_path, output_annotation_path)
93
94if __name__ == "__main__":
95 main()
改进方向
如果您已经使用YOLOv3、YOLOv5或其他模型对该数据集进行了训练,并且认为还有改进空间,以下是一些可能的改进方向:
-
数据增强:
- 进一步增加数据增强策略,例如旋转、翻转、缩放、颜色抖动等,以提高模型的泛化能力。
- 使用混合增强技术,如MixUp、CutMix等,以增加数据多样性。
-
模型优化:
- 调整模型超参数,例如学习率、批量大小、优化器等,以找到最佳配置。
- 尝试使用不同的骨干网络(Backbone),例如EfficientNet、ResNet等,以提高特征提取能力。
- 引入注意力机制,如SENet、CBAM等,以增强模型对关键区域的关注。
-
损失函数:
- 尝试使用不同的损失函数,例如Focal Loss、IoU Loss等,以改善模型的收敛性能。
- 结合多种损失函数,例如分类损失和回归损失的组合,以平衡不同类型的任务。
-
后处理:
- 使用非极大值抑制(NMS)的改进版本,如Soft-NMS、DIoU-NMS等,以提高检测结果的质量。
- 引入边界框回归的改进方法,如GIoU、CIoU等,以提高定位精度。
-
迁移学习:
- 使用预训练模型进行微调,利用大规模数据集(如COCO、ImageNet)上的预训练权重,加快收敛速度并提高性能。
-
集成学习:
- 使用多个模型进行集成学习,通过投票或加权平均的方式提高最终的检测效果。
相关文章:

变压器设备漏油数据集 voc txt
变压器设备漏油数据集 油浸式变压器通常采用油浸自冷式、油浸风冷式和强迫油循环三种冷却方式。该数据集采集于油浸式变压器的设备漏油情况,一般用于变电站的无人巡检,代替传统的人工巡检,与绝缘子的破损检测来源于同一课题。数据集一部分来自…...

算法练习题25——leetcode3279统计重新排列后包含另一个字符串的子字符串的数目(滑动窗口 双指针 哈希)
题目描述 解题思路 本题用到了滑动窗口 双指针 哈希 刚开始我是没读懂题的因为我笨 我想把我的思路说一下 左端不轻易缩小 只有找到跟word2匹配了 比如说abbcdd 遍历到c的时候才能匹配这个word2 对吧 那么之后加上以一个d或者俩d 都符合了 然后我们算完了 才能缩小左端 扩大…...

JavaEE: 深入探索TCP网络编程的奇妙世界(二)
文章目录 TCP核心机制TCP核心机制二: 超时重传为啥会丢包?TCP如何对抗丢包?超时重传的时间设定超时时间该如何确定? TCP核心机制 前一篇文章 JavaEE: 深入探索TCP网络编程的奇妙世界(一) 书接上文~ TCP核心机制二: 超时重传 在网络传输中,并不会一帆风顺,而是可能出现&qu…...

GPT1-GPT3论文理解
GPT1-GPT3论文理解 视频参考:https://www.bilibili.com/video/BV1AF411b7xQ/?spm_id_from333.788&vd_sourcecdb0bc0dda1dccea0b8dc91485ef3e74 1 历史 2017.6 Transformer 2018.6 GPT 2018.10 BERT 2019.2 GPT-2 2020…...

C/C++内存管理 ——
目录 五、C/C内存管理 1、C/C内存分布 2、C语言中动态内存管理方式:malloc/calloc/realloc/free 3、C内存管理方式 1.new/delete操作内置类型 2.new和delete操作自定义类型 4、operator new与operator delete函数 5、new和delete的实现原理 1.内置类…...

深度学习02-pytorch-04-张量的运算函数
在 PyTorch 中,张量(tensor)运算是核心操作之一,PyTorch 提供了丰富的函数来进行张量运算,包括数学运算、线性代数、索引操作等。以下是常见的张量运算函数及其用途: 1. 基本数学运算 加法运算:…...

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【文件系统】上
往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核(LiteOS-M) 轻量系统内核&#…...

NISP 一级 | 8.4 《网络安全法》
关注这个证书的其他相关笔记:NISP 一级 —— 考证笔记合集-CSDN博客 2017 年 6 月 1 日,《中华人民共和国网终安全法》(以下简称《网终安全法》)正式实施。这是我国第一部全面规范网络空间安全管理方面问题的基础性法律࿰…...

实现人体模型可点击
简化需求:实现项目内嵌人体模型,实现点击不同部位弹出部位名称 一:优先3d, 方案:基于three.js,.gltf格式模型,vue3 缺点:合适且免费的3d模型找不到,因为项目对部位有要…...

C++ | Leetcode C++题解之第429题N叉树的层序遍历
题目: 题解: class Solution { public:vector<vector<int>> levelOrder(Node* root) {if (!root) {return {};}vector<vector<int>> ans;queue<Node*> q;q.push(root);while (!q.empty()) {int cnt q.size();vector<…...

Pandas简介
Pandas 是一个流行的开源数据分析库,它是基于 NumPy 构建的,为 Python 编程语言提供了高性能、易用的数据结构和数据分析工具。Pandas 主要用于数据清洗、数据转换、数据分析等任务,使得数据处理工作变得更加高效和便捷。 Pandas 的两个主要…...

Python | Leetcode Python题解之第430题扁平化多级双向链表
题目: 题解: class Solution:def flatten(self, head: "Node") -> "Node":def dfs(node: "Node") -> "Node":cur node# 记录链表的最后一个节点last Nonewhile cur:nxt cur.next# 如果有子节点&#…...

机器人机构、制造
简单整理一下,在学习了一些运动学和动力学之类的东西,简单的整合了一些常用的机械结构和图片。 1.电机: 市面上的电机有:直流电机,交流电机,舵机,步进电机,电缸,无刷电…...

《拿下奇怪的前端报错》:nvm不可用报错`GLIBC_2.27‘‘GLIBCXX_3.4.20‘not Found?+ 使用docker构建多个前端项目实践
有些前端的小伙伴可能会好奇,nvm是什么?这里接简单介绍下,它是一个Nodejs版本管理工具。为什么需要它呢?当然是需要多个Nodejs版本的时候,那什么时候需要多个Nodejs版本?那肯定是在有点年头的公司了&#x…...

5.《DevOps》系列K8S部署CICD流水线之K8S通过Yaml部署GitLab
架构 服务器IP服务名称硬件配置192.168.1.100k8s-master8核、16G、120G192.168.1.101k8s-node18核、16G、120G192.168.1.102k8s-node28核、16G、120G192.168.1.103nfs2核、4G、500G操作系统:Rocky9.3 后续通过K8S部署Jenkins NFS的SC创建参考:2.《DevOps》系列K8S部署CICD流…...

[SAP ABAP] 创建数据库视图和维护视图
数据准备 学校表(ZDBT_SCH_437) 学生表(ZDBT_STU_437) 学校表(ZDBT_SCH_437)与学生表(ZDBT_STU_437)字段 学校表(ZDBT_SCH_437)与学生表(ZDBT_STU_437)行数据明细 1.创建数据库视图 使用SE11创建数据库视图 填写视图名称ZV_DATABASEV_437,点击创建按钮 选择数据库视…...

【最快最简单的排序 —— 桶排序算法】
最快最简单的排序 —— 桶排序算法 桶排序是一种排序算法,其工作原理是将数据分到有限数量的桶子里,然后对每个桶内的元素进行单独排序,最后依次把各个桶中的记录列出来。桶排序的效率取决于映射函数的选择和桶的数量。 桶排序适用于数据分…...

AI时代,服务器厂商能否打破薄利的命运?
文|刘俊宏 编|王一粟 AI大模型正在引发新一轮的“算力焦渴”。 近日,OpenAI刚发布的o1大模型再次刷新了大模型能力的上限。对比上一次迭代的版本,o1的推理能力全方位“吊打”了GPT-4o。更优秀的能力,来自与o1将思维…...

2024年9月python二级易错题和难题大全(附详细解析)(二)
2024年9月python二级易错题和难题大全(附详细解析)(二) 第1题第2题第3题第4题第5题第6题第7题第8题第9题第10题第11题第12题第13题第14题第15题第16题第17题第18题第19题第20题第1题 1、以下代码的输出结果是() x = 12 + 3 * ((5 * 8) - 14) // 6 print(x) A、25.0 B、6…...

4.结构型设计模式 - 第1回:引言与适配器模式 (Adapter Pattern) ——设计模式入门系列
一、引言 在现代软件开发中,设计模式是帮助我们解决复杂问题的工具,它们提供了在常见场景下重用已验证解决方案的途径。而结构型设计模式主要关注类与对象之间的组合方式,旨在通过增强灵活性和降低耦合度来改进代码的结构。 本次讨论的是结…...

解决mybatis plus 中 FastjsonTypeHandler无法正确反序列化List类型的问题
由于是根据自动映射类型,我们设置的字段类型是List 也就是反序列化的时候也只是用 FastjsonTypeHandler中的 Override protected Object parse(String json) { return JSON.parseObject(json, type); } 反序列化方法,这是type为List 反序列后我们并没…...

MacOS安装homebrew,jEnv,多版本JDK
1 安装homebrew homebrew官网 根据官网提示,运行安装命令 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"安装后,bash会提示执行两条命令 (echo; echo eval "$(/opt/homebrew/b…...

【HTTP】认识 URL 和 URL encode
文章目录 认识 URLURL 基本格式**带层次的文件路径****查询字符串****片段标识符** URL encode 认识 URL 计算机中非常重要的概念,并不仅仅是在 HTTP 中使用。用来描述一个网络资源所处的位置,全称“唯一资源定位符” URI 是“唯一资源标识符“严格的说…...

【AI学习笔记】初学机器学习西瓜书概要记录(二)常用的机器学习方法篇
初学机器学习西瓜书的概要记录(一)机器学习基础知识篇(已完结) 初学机器学习西瓜书的概要记录(二)常用的机器学习方法篇(持续更新) 初学机器学习西瓜书的概要记录(三)进阶知识篇(待更) 文字公式撰写不易&am…...

[SDX35+WCN6856]SDX35 + WCN6856 默认增加打包wifi配置hostapd_24g.conf和hostapd_5g.conf操作方法
SDX35 SDX35介绍 SDX35设备是一种多模调制解调器芯片,支持 4G/5G sub-6 技术。它是一个4nm芯片专为实现卓越的性能和能效而设计。它包括一个 1.9 GHz Cortex-A7 应用处理器。 SDX35主要特性 ■ 3GPP Rel. 17 with 5G Reduced Capability (RedCap) support. Backward compati…...

【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数
文章目录 什么是自动引用计数 内存管理/引用计数 概要 内存管理的思考方式 自己生成的对象,自己所持有 非自己生成的对象,自己也能持有 不再需要自己持有的对象时释放 无法释放非自己持有的对象 什么是自动引用计数 自动引用计数(AR…...

网络安全-LD_PRELOAD,请求劫持
目录 一、环境 二、开始做题 三、总结原理 四、如何防护 一、环境 我们这里用蚁剑自带的靶场第一关来解释 docker制作一下即可 二、开始做题 首先环境内很明显给我们已经写好了webshell 同样我们也可以访问到 我们使用这个蚁剑把这个webshell连上 我们发现命令不能执行&am…...

GO入门之值传递于引用(指针、内存地址)传递扫盲
GO入门之值传递于引用(指针、内存地址)传递扫盲 Go 语言中,值传递和引用(指针)传递是两个关键的概念。通过案例可以很好地展示两者的区别。 值传递与引用传递的区别: 值传递:传递的是变量的副…...

【渗透测试】-vulnhub源码框架漏洞-Os-hackNos-1
vulnhub源码框架漏洞中的CVE-2018-7600-Drupal 7.57 文章目录 前言 1.靶场搭建: 2.信息搜集: 主机探测: 端口扫描: 目录扫描: 3.分析: 4.步骤: 1.下载CVE-2018-7600的exp 2.执行exp: 3.写入木…...

sqli-lab靶场学习(三)——Less8-10(盲注、时间盲注)
Less8 第八关依然是先看一般状态 http://localhost/sqli-labs/Less-8/?id1 然后用单引号闭合: http://localhost/sqli-labs/Less-8/?id1 这关的问题在于报错是不显示,那没办法通过上篇文章的updatexml大法处理。对于这种情况,需要用“盲…...