深度学习中 构建一个用于混凝土缺陷检测的 YOLOv8 系统,包括数据集准备、模型训练、评估以及 GUI 应用程序开发。
文章目录
- 1. 数据集准备
- **XML 转 YOLO 格式**
- 2. 数据集预处理
- 3. 安装依赖
- 4. 配置 YOLOv8
- 5. 训练模型
- 6. 评估模型
- 7. 构建 GUI 应用程序
- 8. 运行应用程序
仅供参考学习,步骤和代码示例。
类别:exposed reinforcement,rust stain,Crack,Spalling,Efflorescence,delamination(外露钢筋,生锈,裂缝,剥落,风化,分层);
最起码你得有数据集吧
1. 数据集准备
图像,同学,假设你的数据集包含 7353 张图片和对应的 XML 标注文件(Pascal VOC 格式)。需要将 XML 转换为 YOLOv8 的标注格式(txt 文件)。
XML 转 YOLO 格式
YOLO 格式的标注是每行一个目标,格式如下:
<class_id> <x_center> <y_center> <width> <height>以下是一个 Python 脚本,用于将 Pascal VOC 格式的 XML 文件转换为 YOLO 格式:
importosimportxml.etree.ElementTreeasETdefconvert_annotation(xml_file,output_dir,class_mapping):tree=ET.parse(xml_file)root=tree.getroot()size=root.find('size')img_w=int(size.find('width').text)img_h=int(size.find('height').text)yolo_lines=[]forobjinroot.findall('object'):cls_name=obj.find('name').textifcls_namenotinclass_mapping:continuecls_id=class_mapping[cls_name]bbox=obj.find('bndbox')xmin=float(bbox.find('xmin').text)ymin=float(bbox.find('ymin').text)xmax=float(bbox.find('xmax').text)ymax=float(bbox.find('ymax').text)# Normalize coordinatesx_center=(xmin+xmax)/2.0/img_w y_center=(ymin+ymax)/2.0/img_h width=(xmax-xmin)/img_w height=(ymax-ymin)/img_h yolo_lines.append(f"{cls_id}{x_center:.6f}{y_center:.6f}{width:.6f}{height:.6f}")# Save to txt filefilename=os.path.splitext(os.path.basename(xml_file))[0]withopen(os.path.join(output_dir,f"{filename}.txt"),'w')asf:f.write("\n".join(yolo_lines))# Example usagexml_dir="path/to/xml"output_dir="path/to/yolo_labels"class_mapping={"exposed_reinforcement":0,"rust_stain":1,"Crack":2,"Spalling":3,"Efflorescence":4,"delamination":5}os.makedirs(output_dir,exist_ok=True)forxml_fileinos.listdir(xml_dir):ifxml_file.endswith(".xml"):convert_annotation(os.path.join(xml_dir,xml_file),output_dir,class_mapping)2. 数据集预处理
将数据集划分为训练集和验证集(例如 8:2),并创建train.txt和val.txt文件,列出图像路径。
importosimportrandom image_dir="path/to/images"output_dir="path/to/split"images=[fforfinos.listdir(image_dir)iff.endswith(".jpg")]random.shuffle(images)split_idx=int(len(images)*0.8)train_images=images[:split_idx]val_images=images[split_idx:]withopen(os.path.join(output_dir,"train.txt"),"w")asf:f.write("\n".join([os.path.join(image_dir,img)forimgintrain_images]))withopen(os.path.join(output_dir,"val.txt"),"w")asf:f.write("\n".join([os.path.join(image_dir,img)forimginval_images]))3. 安装依赖
安装 YOLOv8 和其他必要的库:
pipinstallultralytics pipinstallopencv-python pipinstallPyQt54. 配置 YOLOv8
创建一个配置文件dataset.yaml,定义数据集路径和类别:
train:path/to/train.txtval:path/to/val.txtnc:6# number of classesnames:['exposed_reinforcement','rust_stain','Crack','Spalling','Efflorescence','delamination']# class names5. 训练模型
使用 YOLOv8 进行训练:
fromultralyticsimportYOLO# Load a pretrained modelmodel=YOLO("yolov8n.pt")# You can choose other models like yolov8s, yolov8m, etc.# Train the modelmodel.train(data="path/to/dataset.yaml",epochs=50,imgsz=640,batch=16)6. 评估模型
在验证集上评估模型性能:
metrics=model.val()print(metrics)7. 构建 GUI 应用程序
使用 PyQt5 构建一个简单的 GUI 应用程序,读取图像、运行模型并显示结果。
importsysimportcv2fromPyQt5.QtWidgetsimportQApplication,QMainWindow,QLabel,QPushButton,QFileDialog,QVBoxLayout,QWidgetfromPyQt5.QtGuiimportQImage,QPixmapfromultralyticsimportYOLOclassConcreteDefectDetectionApp(QMainWindow):def__init__(self):super().__init__()self.initUI()self.model=YOLO("path/to/best.pt")# Load your trained modeldefinitUI(self):self.setWindowTitle("Concrete Defect Detection")self.label=QLabel(self)self.label.setText("Select an image to detect defects.")self.label.setScaledContents(True)self.btn_load=QPushButton("Load Image",self)self.btn_load.clicked.connect(self.load_image)layout=QVBoxLayout()layout.addWidget(self.label)layout.addWidget(self.btn_load)container=QWidget()container.setLayout(layout)self.setCentralWidget(container)defload_image(self):options=QFileDialog.Options()file_path,_=QFileDialog.getOpenFileName(self,"Select Image","","Images (*.png *.jpg *.jpeg)",options=options)iffile_path:self.detect_defects(file_path)defdetect_defects(self,image_path):img=cv2.imread(image_path)results=self.model(img)forresultinresults:boxes=result.boxes.cpu().numpy()forboxinboxes:x1,y1,x2,y2=map(int,box.xyxy[0])cls_id=int(box.cls[0])label=self.model.names[cls_id]cv2.rectangle(img,(x1,y1),(x2,y2),(0,255,0),2)cv2.putText(img,label,(x1,y1-10),cv2.FONT_HERSHEY_SIMPLEX,0.9,(0,255,0),2)# Convert to QImage and displayheight,width,channel=img.shape bytes_per_line=3*width q_img=QImage(img.data,width,height,bytes_per_line,QImage.Format_RGB888).rgbSwapped()self.label.setPixmap(QPixmap.fromImage(q_img))self.label.adjustSize()if__name__=="__main__":app=QApplication(sys.argv)window=ConcreteDefectDetectionApp()window.show()sys.exit(app.exec_())8. 运行应用程序
运行上述脚本,加载图像并查看检测结果。
python gui_app.py以上是从数据集准备到构建 GUI 应用程序的完整流程。
仅供参考。