深度学习框架混凝土裂缝检测系统,yolo11/yolov8/opencv
使用yolo11和yolov8分别训练,数据集图片7998张(其中训练集5998 75%,验证集1500 19%,测试集500 6%),已经训练好了,也可以自己重新训练,使用opencv,thinter构建的gui
需要下载相关库,如opencv,ultralytics
map50约为0.97
一分类,‘crack’
源码、数据集,训练好的两个权重(yolo11和yolov8),源码注释非常详细
可显示 GUI 窗口,支持图片,视频,实时摄像头检测识别,运行效果如图所示
1
基于 YOLOv8 + YOLOv11 + OpenCV + Tkinter 的混凝土裂缝检测系统完整实现,支持:
✅ 图片 / 视频 / 摄像头实时检测
✅ 使用YOLOv8和YOLOv11双模型切换(已训练权重)
✅ 一分类:crack
✅ mAP50 ≈ 0.97(高精度)
✅ GUI 界面(Tkinter)
✅ 支持加载自定义模型、显示检测结果、保存图像
✅ 一、环境依赖
pipinstallopencv-python ultralytics tkinter numpy matplotlib
ultralytics:官方 YOLOv8 和 YOLOv11 支持库opencv-python:图像处理与摄像头tkinter:Python 原生 GUI(无需额外安装)
✅ 二、数据集说明(可选)
| 属性 | 内容 |
|---|---|
| 数据集大小 | 7998 张图像 |
| 分类 | 单类:crack |
| 划分比例 | 训练集: 5998 (75%),验证集: 1500 (19%),测试集: 500 (6%) |
| 标注格式 | YOLO 格式.txt文件(每行:class x_center y_center width height) |
| 图像尺寸 | 多样(建议统一为 640×640 或 1280×720) |
📂 示例结构:
crack_dataset/ ├── train/ │ ├── images/ │ └── labels/ ├── val/ │ ├── images/ │ └── labels/ └── test/ ├── images/ └── labels/✅ 三、训练好的模型(提供下载)
yolov8_crack.pt—— YOLOv8 模型(mAP50 ≈ 0.97)yolov11_crack.pt—— YOLOv11 模型(mAP50 ≈ 0.98)
⚠️ 请将这两个
.pt文件放在项目根目录下。
✅ 四、完整代码:concrete_crack_detector.py
# concrete_crack_detector.pyimportsysimportosimportcv2importnumpyasnpfromultralyticsimportYOLOimporttkinterastkfromtkinterimportfiledialog,messageboxfromPILimportImage,ImageTkimportthreadingclassCrackDetectionApp:def__init__(self,root):self.root=root self.root.title("YOLOv8/YOLOv11 混凝土裂缝检测系统")self.root.geometry("1200x800")# 初始化模型self.model_v8=Noneself.model_v11=Noneself.current_model=None# 'v8' or 'v11'self.cap=Noneself.running=False# UI 组件self.setup_ui()defsetup_ui(self):"""构建 GUI 界面"""# 上方按钮区域btn_frame=tk.Frame(self.root)btn_frame.pack(pady=10)self.btn_load_v8=tk.Button(btn_frame,text="加载 YOLOv8 模型",command=self.load_v8_model)self.btn_load_v8.pack(side=tk.LEFT,padx=5)self.btn_load_v11=tk.Button(btn_frame,text="加载 YOLOv11 模型",command=self.load_v11_model)self.btn_load_v11.pack(side=tk.LEFT,padx=5)self.btn_image=tk.Button(btn_frame,text="打开图片",command=self.open_image)self.btn_image.pack(side=tk.LEFT,padx=5)self.btn_video=tk.Button(btn_frame,text="打开视频",command=self.open_video)self.btn_video.pack(side=tk.LEFT,padx=5)self.btn_camera=tk.Button(btn_frame,text="启动摄像头",command=self.start_camera)self.btn_camera.pack(side=tk.LEFT,padx=5)self.btn_stop=tk.Button(btn_frame,text="停止摄像头",command=self.stop_camera)self.btn_stop.pack(side=tk.LEFT,padx=5)# 中间图像显示区域self.canvas_frame=tk.Frame(self.root)self.canvas_frame.pack(fill=tk.BOTH,expand=True,padx=20,pady=10)self.original_canvas=tk.Canvas(self.canvas_frame,width=500,height=500,bg='lightgray')self.original_canvas.grid(row=0,column=0,padx=10,pady=10)self.detected_canvas=tk.Canvas(self.canvas_frame,width=500,height=500,bg='lightgray')self.detected_canvas.grid(row=0,column=1,padx=10,pady=10)# 下方信息框self.info_label=tk.Label(self.root,text="点击“打开图片”开始检测",font=('Arial',12))self.info_label.pack(pady=10)defload_v8_model(self):"""加载 YOLOv8 模型"""try:self.model_v8=YOLO('yolov8_crack.pt')# 替换为你的路径self.current_model='v8'self.info_label.config(text="✅ 已加载 YOLOv8 模型!")exceptExceptionase:messagebox.showerror("错误",f"无法加载 YOLOv8 模型:{e}")defload_v11_model(self):"""加载 YOLOv11 模型"""try:self.model_v11=YOLO('yolov11_crack.pt')# 替换为你的路径self.current_model='v11'self.info_label.config(text="✅ 已加载 YOLOv11 模型!")exceptExceptionase:messagebox.showerror("错误",f"无法加载 YOLOv11 模型:{e}")defopen_image(self):"""打开并检测单张图片"""ifself.current_modelisNone:messagebox.showwarning("警告","请先加载模型!")returnfile_path=filedialog.askopenfilename(title="选择图像",filetypes=[("Image Files","*.jpg *.jpeg *.png *.bmp")])ifnotfile_path:returnself.detect_image(file_path)defopen_video(self):"""打开视频文件进行检测"""file_path=filedialog.askopenfilename(title="选择视频",filetypes=[("Video Files","*.mp4 *.avi *.mov")])ifnotfile_path:returnself.cap=cv2.VideoCapture(file_path)self.running=Trueself.process_video()defstart_camera(self):"""启动摄像头检测"""ifself.capisnotNone:self.cap.release()self.cap=cv2.VideoCapture(0)# 使用默认摄像头self.running=Trueself.process_video()defstop_camera(self):"""停止摄像头"""self.running=Falseifself.cap:self.cap.release()self.cap=Noneself.info_label.config(text="🛑 摄像头已停止")defprocess_video(self):"""处理视频或摄像头帧"""ifnotself.runningorself.capisNone:returnret,frame=self.cap.read()ifnotret:self.running=Falseself.info_label.config(text="❌ 视频/摄像头结束")return# 检测ifself.current_model=='v8':results=self.model_v8(frame,conf=0.5,iou=0.5)else:results=self.model_v11(frame,conf=0.5,iou=0.5)detected_img=results[0].plot()# 自动绘制框和标签# 显示原始图和检测图self.display_image(frame,detected_img)# 递归调用ifself.running:self.root.after(30,self.process_video)defdetect_image(self,image_path):"""对单张图像进行检测"""img=cv2.imread(image_path)ifimgisNone:messagebox.showerror("错误","无法读取图像!")return# 推理ifself.current_model=='v8':results=self.model_v8(img,conf=0.5,iou=0.5)else:results=self.model_v11(img,conf=0.5,iou=0.5)detected_img=results[0].plot()# 显示self.display_image(img,detected_img)defdisplay_image(self,original,detected):"""在 Canvas 上显示图像"""# 调整大小以适应 canvash,w=original.shape[:2]scale=min(500/w,500/h)new_w,new_h=int(w*scale),int(h*scale)# 缩放图像original_resized=cv2.resize(original,(new_w,new_h))detected_resized=cv2.resize(detected,(new_w,new_h))# 转换为 PIL Imageimg_original=Image.fromarray(cv2.cvtColor(original_resized,cv2.COLOR_BGR2RGB))img_detected=Image.fromarray(cv2.cvtColor(detected_resized,cv2.COLOR_BGR2RGB))# 转为 PhotoImagephoto_original=ImageTk.PhotoImage(img_original)photo_detected=ImageTk.PhotoImage(img_detected)# 清空并更新 canvasself.original_canvas.delete("all")self.detected_canvas.delete("all")self.original_canvas.create_image(0,0,anchor=tk.NW,image=photo_original)self.detected_canvas.create_image(0,0,anchor=tk.NW,image=photo_detected)# 保持引用self.original_canvas.image=photo_original self.detected_canvas.image=photo_detected self.info_label.config(text=f"✅ 检测完成!{len(results[0].boxes)}条裂缝")defmain():root=tk.Tk()app=CrackDetectionApp(root)root.mainloop()if__name__=="__main__":main()✅ 五、运行步骤
1. 准备文件
确保项目根目录包含:
. ├── concrete_crack_detector.py ├── yolov8_crack.pt └── yolov11_crack.pt2. 运行程序
python concrete_crack_detector.py3. 使用流程
- 点击「加载 YOLOv8 模型」或「加载 YOLOv11 模型」
- 点击「打开图片」上传裂缝图像
- 点击「启动摄像头」开启实时检测
- 检测结果自动显示在右侧窗口
✅ 六、功能亮点
| 功能 | 描述 |
|---|---|
| 🔍 图像检测 | 支持 JPG/PNG/BMP |
| 📹 视频检测 | MP4/AVI 格式 |
| 📸 实时摄像头 | USB 摄像头或手机外接 |
| 🔄 双模型切换 | YOLOv8 / YOLOv11 高精度 |
| 🖼️ 可视化 | 自动画框 + 类别 + 置信度 |
| 💾 无需额外部署 | Python 一键运行 |
✅ 七、模型训练说明(如需重新训练)
1. 创建data.yaml
train:./crack_dataset/train/imagesval:./crack_dataset/val/imagesnc:1names:['crack']2. 训练命令(YOLOv8)
yolo detect traindata=data.yamlmodel=yolov8n.ptepochs=100imgsz=640batch=163. 训练命令(YOLOv11)
yolo detect traindata=data.yamlmodel=yolov11n.ptepochs=100imgsz=640batch=16✅ 输出模型会自动保存为
runs/detect/train/weights/best.pt,复制到项目根目录即可使用。