news 2026/4/18 10:18:32

yolo11_yolov8_opencv 使用yolo11和yolov8分别训练混凝土裂缝检测数据集 建立基于深度学习YOLOV8_11框架混凝土缺陷检测系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
yolo11_yolov8_opencv 使用yolo11和yolov8分别训练混凝土裂缝检测数据集 建立基于深度学习YOLOV8_11框架混凝土缺陷检测系统

深度学习框架混凝土裂缝检测系统,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 的混凝土裂缝检测系统完整实现,支持:

✅ 图片 / 视频 / 摄像头实时检测
✅ 使用YOLOv8YOLOv11双模型切换(已训练权重)
✅ 一分类: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.pt

2. 运行程序

python concrete_crack_detector.py

3. 使用流程

  1. 点击「加载 YOLOv8 模型」或「加载 YOLOv11 模型」
  2. 点击「打开图片」上传裂缝图像
  3. 点击「启动摄像头」开启实时检测
  4. 检测结果自动显示在右侧窗口

✅ 六、功能亮点

功能描述
🔍 图像检测支持 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=16

3. 训练命令(YOLOv11)

yolo detect traindata=data.yamlmodel=yolov11n.ptepochs=100imgsz=640batch=16

✅ 输出模型会自动保存为runs/detect/train/weights/best.pt,复制到项目根目录即可使用。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 8:07:52

2026年企业AI预测:CIO面临碎片化、商品化与智能体推进挑战

ChatGPT重新点燃AI投资热潮三年后,企业关注焦点正从改进大语言模型转向在其基础上构建智能体系统。供应商正将智能体能力整合到工作流程中,涵盖副驾驶、自主自动化以及用于优化工厂性能的数字孪生。但许多概念验证正与复杂现实发生碰撞,包括智…

作者头像 李华
网站建设 2026/4/18 10:49:47

拒绝繁琐配置,推荐一款简洁易用的项目管理工具Kanass

为了保证项目高效、有序地推进,我们通常使用如Jira等项目管理工具。Jira整体功能完善,自定义能力强大,但配置繁琐,上手难度大,同时随着Atlassian销售策略调整Jira server中国区即将停止维护,今天给大家推荐…

作者头像 李华
网站建设 2026/4/17 16:29:34

英伟达物理AI模型为新一代机器人铺路

随着AI模型持续获得关注,开发能够连接设备屏幕与现实世界的硬件愈发重要。因此,物理AI成为CES展会的新兴主题,英伟达发布了多款模型来加速机器人开发。"机器人领域的ChatGPT时刻已经到来。物理AI的突破——理解现实世界、推理和规划行动…

作者头像 李华
网站建设 2026/4/18 5:39:36

直流无感无刷电机方波控制全解析

直流无感无刷电机方波控制!初始位置检测! 1.代码方便修改和移植,不是库! 2.方案:ADC和比较器,ADC检测完位置强拖,比较器检测完位置直接切闭环运行。 3.控制方式:开环/速度环/双闭环 …

作者头像 李华
网站建设 2026/4/18 12:53:12

一篇搞定MySQL:从环境搭建到深入理解,高效入门数据库

MySQL相关知识点可以通过点击以下链接进行学习一起加油! 文章目录 MySQL与MariaDB:同源而生的数据库系统一、MySQL的安装与初步配置 1. 更新系统软件包列表2. 安装MySQL服务器3. 检查MySQL服务状态4. 首次登入MySQL5. 为root用户配置密码 步骤一&#xf…

作者头像 李华