深度学习框架目标检测算法 如何使用Yolov8_训练焊缝焊接缺陷检测数据集,钢材缺陷数据集及塑料焊缝缺陷数据集的训练及应用。
这里以训练塑料焊缝数据集为参考。
训练数据集都是一样的,配置好环境,设置好训练路径,就可以操作了。
JPEGWD焊缝数据集 塑料焊缝缺陷数据集 NEU-DET焊缝缺陷数据集 钢材缺陷数据集训练。同理都是一样的道理。
文章目录
- 数据准备
- 环境搭建
- 模型训练
- 训练命令
- 推理与验证
- 推理代码示例
- 验证模型性能
- 进一步优化与部署
- 导出模型
- ✅ 一、系统目标
- 🧱 二、系统架构图
- 💻 三、代码实现(YOLOv8 + OpenCV)
- 1. 安装依赖
- 2. 加载模型 & 单张图片推理
- 文件名:`detect_pipe_defect.py`
- 3. 视频/摄像头实时检测
- 4. 批量图像检测
- 🌐 四、构建 Web API(Flask)
- 文件名:`app.py`
- 🔔 五、报警机制(可选)
- 准备工作
- 项目结构
- 实现步骤
- 1. 创建主窗口 `main.py`
- 说明
- 运行应用程序
使用 YOLOv8 训练焊缝缺陷检测数据集
NEUDET
一、数据准备
- 数据集结构
假设同学你的数据集已经按照 YOLO 格式组织,并且结构如下:
使用YOLOv8训练塑料焊缝检测的数据集,备数据、配置模型参数、进行训练并评估结果。7个类别:['0', '1', 'Defective', 'L Joint', 'T Joint', 'sp1', 'tubos-pv-2pulgadas']。下面是详细的步骤指南。仅供参考学习。
数据准备
假设如果你有这套数据集,并且其结构如下:
/path/to/dataset/ ├── train/ │ ├── images/ │ └── labels/ ├── valid/ │ ├── images/ │ └── labels/ └── test/ ├── images/ └── labels/并且有一个YAML文件描述了数据集的结构和类别信息:
train:../train/imagesval:../valid/imagestest:../test/imagesnc:7names:['0','1','Defective','L Joint','T Joint','sp1','tubos-pv-2pulgadas']环境搭建
首先,确保安装了必要的依赖项:
gitclone https://github.com/ultralytics/ultralytics.gitcdultralytics pipinstall-r requirements.txt模型训练
接下来是训练模型的部分。使用YOLOv8提供的命令行工具来启动训练过程。
训练命令
yolo traindata=path/to/your/dataset.yamlmodel=yolov8s.ptepochs=100batch=16imgsz=640data: 指向您的数据集配置文件(即上述的.yaml文件)。model: 使用的预训练模型权重。您可以选择不同大小的模型如yolov8n,yolov8s,yolov8m,yolov8l,yolov8x等。epochs: 设置总的训练周期数。根据您的需求调整这个值。batch: 批处理大小。取决于您的硬件资源,可以适当调整。imgsz: 输入图像尺寸,默认为640x640。也可以设置为其他尺寸如320或1280等。
推理与验证
完成训练后,可以使用训练好的模型进行推理以及对模型性能进行评估。
推理代码示例
fromultralyticsimportYOLOimportcv2# 加载最佳模型model=YOLO('runs/train/exp/weights/best.pt')# 对单张图片进行推理results=model('path/to/image.jpg')annotated_img=results[0].plot()cv2.imshow("Inference",annotated_img)cv2.waitKey(0)cv2.destroyAllWindows()# 或者批量处理图片image_folder='test_images/'output_folder='inference_output/'os.makedirs(output_folder,exist_ok=True)forimg_fileinos.listdir(image_folder):ifimg_file.endswith('.jpg')orimg_file.endswith('.png'):img_path=os.path.join(image_folder,img_file)results=model(img_path)annotated_img=results[0].plot()output_path=os.path.join(output_folder,img_file)cv2.imwrite(output_path,annotated_img)print("✅ Inference completed, results saved to inference_output/")验证模型性能
yolo valdata=path/to/your/dataset.yamlmodel=runs/train/exp/weights/best.ptimgsz=640这将输出诸如mAP@0.5、mAP@0.5:0.95等指标,帮助您了解模型在验证集上的表现。
进一步优化与部署
根据验证结果,您可能需要进一步调整模型超参数或尝试不同的模型架构以获得更好的性能。此外,考虑将模型导出为ONNX或其他格式以便于在边缘设备上部署。
导出模型
yoloexportmodel=runs/train/exp/weights/best.ptformat=onnx训练一个基于YOLOv8的塑料焊缝检测模型。
接着我们来操作,建立深度学习焊缝缺陷检测系统
要基于训练好的YOLOv8 模型(如best.pt)构建一个完整的深度学习塑料焊缝缺陷检测系统,你可以按照以下步骤进行开发、部署和应用。该系统可以用于图像、视频或摄像头流中的实时检测,适用于工业质检、自动化生产线等场景。
✅ 一、系统目标
构建一个基于 YOLOv8 的塑料焊缝缺陷检测系统,具备以下功能:
- 图像/视频中塑料焊缝的自动检测
- 缺陷类别识别(如:Defective, L Joint 等)
- 可视化标注框与类别信息
- 支持:
- 实时视频流检测(摄像头)
- 批量图像检测
- 报警触发机制(声光 / 邮件 / 推送通知)
- Web API 接口服务(可选)
🧱 二、系统架构图
[输入源] → [YOLOv8模型加载权重 + 推理] → [结果输出] ↑ ↓ 数据源: 显示/保存/报警/API返回 图像/视频/摄像头💻 三、代码实现(YOLOv8 + OpenCV)
1. 安装依赖
pipinstallultralytics opencv-python flask numpy若你已使用过 YOLOv8 的训练环境,可直接复用。
2. 加载模型 & 单张图片推理
文件名:detect_pipe_defect.py
fromultralyticsimportYOLOimportcv2# 加载训练好的模型model=YOLO('runs/train/exp/weights/best.pt')# 替换为你自己的路径# 图像路径image_path='test_images/pipe_001.jpg'# 推理results=model(image_path)# 获取绘制后的图像annotated_image=results[0].plot()# 显示结果cv2.imshow("Pipe Defect Detection",annotated_image)cv2.waitKey(0)cv2.destroyAllWindows()📌 输出说明:
results[0].boxes可获取预测框坐标、类别、置信度等信息。results[0].plot()返回带标注框的图像。
3. 视频/摄像头实时检测
defdetect_video(source=0):cap=cv2.VideoCapture(source)whilecap.isOpened():ret,frame=cap.read()ifnotret:breakresults=model(frame)annotated_frame=results[0].plot()cv2.imshow("Real-time Pipe Defect Detection",annotated_frame)ifcv2.waitKey(1)==27:# ESC键退出breakcap.release()cv2.destroyAllWindows()if__name__=="__main__":detect_video()# source=0 表示摄像头,source='video.mp4' 表示视频文件4. 批量图像检测
importos image_folder='test_images/'output_folder='output/'os.makedirs(output_folder,exist_ok=True)forimg_fileinos.listdir(image_folder):ifimg_file.endswith('.jpg')orimg_file.endswith('.png'):img_path=os.path.join(image_folder,img_file)results=model(img_path)annotated_img=results[0].plot()output_path=os.path.join(output_folder,img_file)cv2.imwrite(output_path,annotated_img)print("✅ 批量检测完成,结果已保存至 output/")🌐 四、构建 Web API(Flask)
将系统封装为远程服务接口,可以使用 Flask 构建 RESTful API。
文件名:app.py
fromflaskimportFlask,request,jsonifyimportbase64importnumpyasnpimportcv2fromultralyticsimportYOLO app=Flask(__name__)model=YOLO('runs/train/exp/weights/best.pt')@app.route('/detect',methods=['POST'])defdetect():data=request.json.get("image")# base64编码的图像img_bytes=base64.b64decode(data)img_np=np.frombuffer(img_bytes,dtype=np.uint8)img=cv2.imdecode(img_np,flags=1)results=model(img)annotated_img=results[0].plot()_,buffer=cv2.imencode('.jpg',annotated_img)response_data=base64.b64encode(buffer).decode('utf-8')returnjsonify({"result_image":response_data})if__name__=='__main__':app.run(host='0.0.0.0',port=5000)📌 请求格式(JSON):
{"image":"base64encoded_string_of_jpeg"}🔔 五、报警机制(可选)
可添加以下逻辑,在检测到缺陷时触发报警:
forrinresults:boxes=r.boxesforboxinboxes:cls=int(box.cls)conf=float(box.conf)ifcls==2andconf>0.5:# 如果是 'Defective' 类别且置信度高print("⚠️ 检测到焊缝缺陷!触发报警!")# 这里可以调用声光报警、发送邮件、微信推送等使用PyQt构建一个桌面 GUI 应用,展示基于 YOLOv8 训练好的模型对塑料焊缝缺陷的检测结果,可按照以下步骤进行。应用将允许用户通过图形界面加载图像或视频,并实时显示检测结果。
准备工作
确保同学你已经安装了必要的依赖库:
pipinstallultralytics opencv-python pyqt5项目结构
假设项目结构如下:
plastic_weld_defect_detection/ ├── main.py # 主程序入口 ├── resources/ # 资源文件夹(可选) │ └── logo.png # 应用图标(可选) └── model/ # 存放YOLOv8模型权重 └── best.pt # 已训练好的YOLOv8模型权重实现步骤
1. 创建主窗口main.py
以下是完整的 PyQt 应用程序代码示例,它包括了加载图片、视频播放和实时检测功能。
importsysfromPyQt5.QtWidgetsimportQApplication,QMainWindow,QLabel,QPushButton,QFileDialog,QVBoxLayout,QWidget,QComboBoxfromPyQt5.QtGuiimportQPixmap,QImagefromPyQt5.QtCoreimportQt,QTimerimportcv2fromultralyticsimportYOLOimportnumpyasnpclassWeldDefectApp(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle("Plastic Weld Defect Detection")self.setGeometry(100,100,800,600)# 加载模型self.model=YOLO('model/best.pt')# UI组件self.initUI()# 视频捕获对象self.cap=None# 定时器用于视频帧更新self.timer=QTimer(self)self.timer.timeout.connect(self.update_frame)definitUI(self):self.image_label=QLabel(self)self.image_label.setAlignment(Qt.AlignCenter)self.open_image_btn=QPushButton("Open Image",self)self.open_image_btn.clicked.connect(self.load_image)self.open_video_btn=QPushButton("Open Video",self)self.open_video_btn.clicked.connect(self.load_video)self.start_stop_btn=QPushButton("Start",self)self.start_stop_btn.clicked.connect(self.toggle_capture)layout=QVBoxLayout()layout.addWidget(self.image_label)layout.addWidget(self.open_image_btn)layout.addWidget(self.open_video_btn)layout.addWidget(self.start_stop_btn)container=QWidget()container.setLayout(layout)self.setCentralWidget(container)defload_image(self):options=QFileDialog.Options()file_name,_=QFileDialog.getOpenFileName(self,"Open Image","","Images (*.png *.xpm *.jpg);;All Files (*)",options=options)iffile_name:img=cv2.imread(file_name)self.display_image(img)defload_video(self):options=QFileDialog.Options()file_name,_=QFileDialog.getOpenFileName(self,"Open Video","","Videos (*.mp4 *.avi);;All Files (*)",options=options)iffile_name:self.cap=cv2.VideoCapture(file_name)self.timer.start(30)# 每30ms更新一次帧deftoggle_capture(self):ifself.capisnotNone:ifself.timer.isActive():self.timer.stop()self.start_stop_btn.setText("Start")else:self.timer.start(30)self.start_stop_btn.setText("Stop")defupdate_frame(self):ret,frame=self.cap.read()ifret:results=self.model(frame)annotated_frame=results[0].plot()self.display_image(annotated_frame)else:self.cap.release()self.timer.stop()self.start_stop_btn.setText("Start")defdisplay_image(self,img):rgb_img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)h,w,ch=rgb_img.shape bytes_per_line=ch*w convert_to_Qt_format=QImage(rgb_img.data,w,h,bytes_per_line,QImage.Format_RGB888)p=convert_to_Qt_format.scaled(self.image_label.width(),self.image_label.height(),Qt.KeepAspectRatio)self.image_label.setPixmap(QPixmap.fromImage(p))if__name__=='__main__':app=QApplication(sys.argv)mainWindow=WeldDefectApp()mainWindow.show()sys.exit(app.exec_())说明
WeldDefectApp类: 这是应用程序的主要类,继承自QMainWindow。initUI方法: 设置了用户界面元素,如按钮和标签。load_image方法: 打开并显示一张图片。load_video方法: 打开并开始播放视频,同时进行实时检测。toggle_capture方法: 切换视频播放的开始和停止。update_frame方法: 更新视频帧,并调用模型进行预测后显示结果。display_image方法: 将 OpenCV 图像转换为适合 PyQt 显示的格式。
运行应用程序
保存上述代码到main.py文件中,并运行:
python main.py这将启动一个包含“打开图片”、“打开视频”按钮的应用程序。点击相应按钮选择图片或视频文件,即可看到检测结果。
=