当前位置: 首页 > news >正文

耐张线夹压接图片智能识别

目录

  • 一、图片压接部位定位
    • 1、图像准备
    • 2、人工标注
    • 3、训练
    • 4、推理
    • 5、UI界面
  • 压接状态智能识别

一、图片压接部位定位

,往往X射线照片是一个大图,进行图片压接部位定位目的是先找到需识别的部位,再进行识别时可排除其他图像部位的干扰,提高准确率。

1、图像准备

准备多个需进行压接状态智能识别的图片保存再source文件夹中

2、人工标注

使用labelImg 工具进行标注
图片文件夹设置为source
另存标注文件夹为annotations
保存格式为YOLO
快捷键:W为标注、D为下一张、A为上一张

3、训练

使用split_dataset.py 工具将图像与标注文件划分数据集

import os
import random
import shutil# 设置路径
source_dir = 'd:/Xradio/photo_enhance/source'
annotations_dir = 'd:/Xradio/photo_enhance/annotations'
output_dir = 'd:/Xradio/photo_enhance/dataset'# 创建输出目录
os.makedirs(os.path.join(output_dir, 'train/images'), exist_ok=True)
os.makedirs(os.path.join(output_dir, 'train/labels'), exist_ok=True)
os.makedirs(os.path.join(output_dir, 'val/images'), exist_ok=True)
os.makedirs(os.path.join(output_dir, 'val/labels'), exist_ok=True)
os.makedirs(os.path.join(output_dir, 'test/images'), exist_ok=True)
os.makedirs(os.path.join(output_dir, 'test/labels'), exist_ok=True)# 获取所有文件
image_files = [f for f in os.listdir(source_dir) if f.endswith(('.jpg', '.bmp'))]
random.shuffle(image_files)# 划分数据集
train_files = image_files[:int(len(image_files)*0.7)]
val_files = image_files[int(len(image_files)*0.7):int(len(image_files)*0.9)]
test_files = image_files[int(len(image_files)*0.9):]# 复制文件到相应目录
def copy_files(files, split):for f in files:# 复制图像shutil.copy(os.path.join(source_dir, f), os.path.join(output_dir, split, 'images', f))# 复制标注label_file = f.replace('.jpg', '.txt').replace('.bmp', '.txt')shutil.copy(os.path.join(annotations_dir, label_file),os.path.join(output_dir, split, 'labels', label_file))copy_files(train_files, 'train')
copy_files(val_files, 'val')
copy_files(test_files, 'test')print("数据集划分完成!")

创建labels.yaml 文件告诉训练系统各文件路径
其中train为训练数据、val为验证集、test为测试集

train: d:/Xradio/photo_enhance/dataset/train/images
val: d:/Xradio/photo_enhance/dataset/val/images
test: d:/Xradio/photo_enhance/dataset/test/imagesnc: 1
names: ['target']

使用以下指令进行训练:

yolo train data=labels.yaml model=yolov8n.pt epochs=50 imgsz=640 batch=8 amp=True device=0

训练结果保存在run/detect/train6/weights/best.pt

best.pt为训练的结果模型。

4、推理

编写推理程序,输入为模型与要检测的照片,输出为位置坐标

from ultralytics import YOLO
import cv2
import osdef main(image_path):# 加载YOLO模型model_path = 'runs/detect/train6/weights/best.pt'try:model = YOLO(model_path)except Exception as e:raise RuntimeError(f'无法加载模型: {str(e)}')# 验证图片路径if not os.path.exists(image_path):raise FileNotFoundError(f"文件不存在: {image_path}")# 读取图片original_image = cv2.imread(image_path)if original_image is None:raise ValueError("无法读取图片,请检查文件格式")# 进行推理results = model.predict(original_image)detections = results[0].boxes.xyxy.cpu().numpy()# 在图像上绘制检测框并返回第一个检测框的坐标annotated_image = original_image.copy()if len(detections) > 0:x1, y1, x2, y2 = map(int, detections[0])# 裁剪检测框内的图片部分cropped_image = original_image[y1:y2, x1:x2]return cropped_image, (x1, y1, x2, y2)else:return None, Noneif __name__ == '__main__':main()

5、UI界面

支持单张推理,也支持批量推理

import tkinter as tk
from tkinter import filedialog, messagebox, ttk
from PIL import Image, ImageTk
from inference_app import main as run_inference
from ultralytics import YOLO
import cv2
import osclass YOLOApp:def __init__(self, root):self.root = rootself.root.title("YOLOv8 图像检测")self.root.geometry("800x600")# 创建界面元素self.create_widgets()def create_widgets(self):# 文件选择按钮self.select_button = tk.Button(self.root, text="选择图片", command=self.select_image)self.select_button.pack(pady=10)# 文件夹选择按钮self.select_folder_button = tk.Button(self.root, text="选择文件夹", command=self.select_folder)self.select_folder_button.pack(pady=10)# 图片显示区域self.image_label = tk.Label(self.root)self.image_label.pack(expand=True, fill=tk.BOTH)# 推理按钮self.infer_button = tk.Button(self.root, text="开始检测", command=self.run_detection, state=tk.DISABLED)self.infer_button.pack(pady=10)# 保存按钮self.save_button = tk.Button(self.root, text="保存结果", command=self.save_result, state=tk.DISABLED)self.save_button.pack(pady=10)def select_image(self):# 打开文件选择对话框file_path = filedialog.askopenfilename(filetypes=[("图片文件", "*.jpg *.jpeg *.png *.bmp")])if file_path:self.image_path = file_pathself.display_image(file_path)self.infer_button.config(state=tk.NORMAL)def display_image(self, file_path):# 显示原始图片image = Image.open(file_path)image.thumbnail((800, 600))self.photo = ImageTk.PhotoImage(image)self.image_label.config(image=self.photo)def run_detection(self):# 运行推理try:# 使用inference_app中的推理逻辑annotated_image, bbox = run_inference(self.image_path)# 显示带检测框的图片if annotated_image is not None:annotated_image = cv2.cvtColor(annotated_image, cv2.COLOR_BGR2RGB)annotated_image = Image.fromarray(annotated_image)annotated_image.thumbnail((800, 600))self.photo = ImageTk.PhotoImage(annotated_image)self.image_label.config(image=self.photo)self.save_button.config(state=tk.NORMAL)except Exception as e:messagebox.showerror("错误", f"推理失败: {str(e)}")def save_result(self):# 保存结果图片save_path = filedialog.asksaveasfilename(defaultextension=".jpg",filetypes=[("JPEG 文件", "*.jpg"), ("PNG 文件", "*.png")])if save_path:try:# 获取原始图片original_image = cv2.imread(self.image_path)# 运行推理获取检测框model_path = 'runs/detect/train6/weights/best.pt'model = YOLO(model_path)results = model.predict(original_image)detections = results[0].boxes.xyxy.cpu().numpy()if len(detections) > 0:x1, y1, x2, y2 = map(int, detections[0])# 裁剪图片cropped_image = original_image[y1:y2, x1:x2]# 保存裁剪后的图片cv2.imwrite(save_path, cropped_image)# 显示保存的图片self.display_image(save_path)messagebox.showinfo("成功", f"裁剪后的图片已保存到: {save_path}")else:messagebox.showwarning("警告", "未检测到目标,无法裁剪")except Exception as e:messagebox.showerror("错误", f"保存失败: {str(e)}")def select_folder(self):# 打开文件夹选择对话框folder_path = filedialog.askdirectory()if folder_path:# 创建输出目录output_dir = os.path.join(folder_path, "processed")os.makedirs(output_dir, exist_ok=True)# 获取所有图片文件image_files = [f for f in os.listdir(folder_path) if f.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp'))]# 创建进度条self.progress = tk.DoubleVar()self.progress_bar = ttk.Progressbar(self.root, variable=self.progress, maximum=len(image_files))self.progress_bar.pack(pady=10)# 批量处理for i, image_file in enumerate(image_files):try:# 更新进度self.progress.set(i + 1)self.root.update_idletasks()# 处理图片image_path = os.path.join(folder_path, image_file)annotated_image, _ = run_inference(image_path)# 保存结果output_path = os.path.join(output_dir, image_file)cv2.imwrite(output_path, annotated_image)except Exception as e:messagebox.showerror("错误", f"处理 {image_file} 失败: {str(e)}")continue# 处理完成messagebox.showinfo("完成", f"所有图片已处理完成,保存到: {output_dir}")self.progress_bar.pack_forget()if __name__ == "__main__":root = tk.Tk()app = YOLOApp(root)root.mainloop()

压接状态智能识别

相关文章:

耐张线夹压接图片智能识别

目录 一、图片压接部位定位1、图像准备2、人工标注3、训练4、推理5、UI界面 压接状态智能识别 一、图片压接部位定位 ,往往X射线照片是一个大图,进行图片压接部位定位目的是先找到需识别的部位,再进行识别时可排除其他图像部位的干扰&#x…...

ADC 的音频实验,无线收发模块( nRF24L01)

nRF24L01 采用 QFN20 封装,有 20 个引脚,以下是各引脚的详细介绍: 1. 电源引脚 ◦ VDD:电源输入端,一般接 3V 电源,为芯片提供工作电压,供电电压范围为 1.9V~3.6V。 ◦ VSS&#xf…...

企业SSL 证书管理指南

文章从以下几个部分展开 SSL证书的用途和使用场景SSL证书的申请类型和实现方式SSL证书的管理SSL证书的续签 一、SSL 证书的用途和使用场景 1.1 为什么要使用 SSL 证书? 1. 数据安全 🛡️- 在 HTTP 传输中,TCP 包可以被截获,攻…...

Python Pandas(7):Pandas 数据清洗

数据清洗是对一些没有用的数据进行处理的过程。很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要使数据分析更加准确,就需要对这些没有用的数据进行处理。数据清洗与预处理的常见步骤: 缺失值处理:识别并…...

南京观海微电子----整流滤波电路实用

01 变压电路 通常直流稳压电源使用电源变压器来改变输入到后级电路的电压。电源变压器由初级绕组、次级绕组和铁芯组成。初级绕组用来输入电源交流电压,次级绕组输出所需要的交流电压。通俗的说,电源变压器是一种电→磁→电转换器件。即初级的交流电转化…...

【python】向Jira测试计划下,附件中增加html测试报告

【python】连接Jira获取token以及jira对象 # 往 jira 测试计划下面,上传测试结果html def put_jira_file(plain_id):# 配置连接jiraconn ConnJira()jira conn.jira_login()[2]path jira.issue(O45- plain_id)attachments_dir os.path.abspath(..) \\test_API…...

探索ChatGPT背后的前端黑科技

由于图片和格式解析问题,可前往 阅读原文 在人工智能与互联网技术飞速发展的今天,像ChatGPT这样的智能对话系统已经成为科技领域的焦点。它不仅能够进行自然流畅的对话,还能以多种格式展示内容,为用户带来高效且丰富的交互体验。然…...

Agents Go Deep 智能体深入探索

Agents Go Deep 智能体深入探索 核心事件 OpenAI发布了一款先进的智能体“深度研究”,它能借助网络搜索和推理生成研究报告。 最新进展 功能特性:该智能体依据数百个在线资源生成详细报告,目前仅支持文本输出,不过很快会增加对图…...

DeepSeek全生态接入指南:官方通道+三大云平台

DeepSeek全生态接入指南:官方通道三大云平台 一、官方资源入口 1.1 核心交互平台 🖥️ DeepSeek官网: https://chat.deepseek.com/ (体验最新对话模型能力) 二、客户端工具 OllamaChatboxCherry StudioAnythingLLM …...

c++TinML转html

cTinML转html 前言解析解释转译html类定义开头html 结果这是最终效果(部分): ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6cf6c3e3c821446a84ae542bcc2652d4.png) 前言 在python.tkinter设计标记语言(转译2-html)中提到了将Ti…...

STM32硬件SPI函数解析与示例

1. SPI 简介 SPI(Serial Peripheral Interface)即串行外设接口,是一种高速、全双工、同步的通信总线,常用于微控制器与各种外设(如传感器、存储器等)之间的通信。STM32 系列微控制器提供了多个 SPI 接口&a…...

滤波器:卡尔曼滤波

卡尔曼滤波(Kalman Filter)是一种高效的递归算法,主要用于动态系统的状态估计。它通过结合系统模型和噪声干扰的观测数据,实现对系统状态的最优估计(在最小均方误差意义下)。以下从原理、使用场景和特点三个…...

深度学习框架探秘|TensorFlow vs PyTorch:AI 框架的巅峰对决

在深度学习框架中,TensorFlow 和 PyTorch 无疑是两大明星框架。前面两篇文章我们分别介绍了 TensorFlow(点击查看) 和 PyTorch(点击查看)。它们引领着 AI 开发的潮流,吸引着无数开发者投身其中。但这两大框…...

Windows环境管理多个node版本

前言 在实际工作中,如果我们基于Windows系统开发,同时需要维护老项目,又要开发新项目,且不同项目依赖的node版本又不同时,那么就需要根据项目切换不同的版本。本文使用Node Version Manager(nvm&#xff0…...

opencascade 源码学习BRepBuilderAPI-BRepBuilderAPI

BRepBuilderAPI BRepBuilderAPI 是一个用于构建和操作 BRep(边界表示法,Boundary Representation)拓扑数据结构的工具类。它提供了高级接口,用于创建几何形状(如顶点、边、面、实体等)以及进行扫掠&#x…...

Vue 2 + Webpack 项目中集成 ESLint 和 Prettier

在 Vue 2 Webpack 项目中集成 ESLint 和 Prettier 可以帮助你规范代码风格并自动格式化代码。以下是详细的步骤: 1. 安装 ESLint 和 Prettier 相关依赖 在项目根目录下运行以下命令,安装 ESLint、Prettier 和相关插件: npm install --save…...

Renesas RH850 EEL库的优点

文章目录 1. 磨损均衡(Wear Leveling)2. 数据抽象与易用性3. 后台维护与自动刷新4. 多优先级操作5. ECC 错误处理与数据完整性EEL 与 FDL 的协作机制1. 分层架构2. 存储池划分3. 协作流程4. 同步与互斥5. 性能优化实际应用场景示例场景:车辆里程存储总结1. 磨损均衡(Wear L…...

torch导出ONNX模型报错:OnnxExporterError: Module onnx is not installed

问题: 使用torch 导出模型为onnx文件时报错:torch.onnx.OnnxExporterError: Module onnx is not installed! 环境: 操作系统 Win10 python运行环境 Anacoda3 torch 2.6.0 torchvision …...

LabVIEW 用户界面设计基础原则

在设计LabVIEW VI的用户界面时,前面板的外观和布局至关重要。良好的设计不仅提升用户体验,还能提升界面的易用性和可操作性。以下是设计用户界面时的一些关键要点: 1. 前面板设计原则 交互性:组合相关的输入控件和显示控件&#x…...

使用Python爬虫实时监控行业新闻案例

目录 背景环境准备请求网页数据解析网页数据定时任务综合代码使用代理IP提升稳定性运行截图与完整代码总结 在互联网时代,新闻的实时性和时效性变得尤为重要。很多行业、技术、商业等领域的新闻都可以为公司或者个人发展提供有价值的信息。如果你有一项需求是要实时…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...