基于 JSON 文件定位图片缺陷点并保存

基于JSON的图片缺陷处理流程
├── 1. 输入检查
│   ├── 验证图片文件是否存在
│   └── 验证JSON文件是否存在
│
├── 2. 数据加载
│   ├── 打开并加载图片
│   └── 读取并解析JSON文件
│
├── 3. 缺陷信息提取
│   ├── 检查JSON中是否存在shapes字段
│   └── 遍历每个缺陷形状
│       ├── 验证形状类型是否为矩形
│       ├── 提取缺陷坐标点
│       └── 计算边界框(左上角和右下角)
│
├── 4. 缺陷区域处理
│   ├── 从原图裁剪缺陷区域
│   ├── 保存缺陷区域为BMP文件
│   └── 在原图上标记缺陷位置
│
└── 5. 结果保存
    ├── 保存标记后的原图
    └── 输出处理结果信息

安装好包,修改好文件路径后,可直接使用的代码展示:

(注意,原图与Json文件要在同一目录下)

import json
import os
from PIL import Image, ImageDraw

# 在pycharm中通过josn文件定位图片缺陷点,并复制一份缺陷特征打印成bmp文件保存在该路径

def process_defects(image_path, json_path):
    """
    基于JSON文件中的坐标信息,处理图片中的缺陷
    :param image_path: 图片文件路径
    :param json_path: JSON文件路径,包含缺陷坐标
    """
    try:
        # 加载图片
        with Image.open(image_path) as img:
            # 读取JSON文件
            with open(json_path, 'r') as f:
                defect_data = json.load(f)

            # 从shapes字段获取缺陷信息(适配实际JSON结构)
            if 'shapes' not in defect_data or not defect_data['shapes']:
                print("JSON文件中未发现缺陷信息")
                return

            # 获取图片目录和基本名称
            img_dir = os.path.dirname(image_path)
            img_base_name = os.path.splitext(os.path.basename(image_path))[0]

            # 为每个缺陷创建子图像
            for i, shape in enumerate(defect_data['shapes']):
                # 检查是否为矩形
                if shape.get('shape_type') != 'rectangle':
                    print(f"缺陷 {i + 1} 不是矩形,跳过")
                    continue

                # 从points提取坐标(四个点转为两个点)
                points = shape.get('points')
                if not points or len(points) != 4:
                    print(f"缺陷 {i + 1} 的坐标格式不正确")
                    continue

                # 提取左上角和右下角坐标
                x_coords = [p[0] for p in points]
                y_coords = [p[1] for p in points]
                left = min(x_coords)
                top = min(y_coords)
                right = max(x_coords)
                bottom = max(y_coords)

                # 转换为整数
                left, top, right, bottom = map(int, [left, top, right, bottom])

                # 提取缺陷区域
                defect_region = img.crop((left, top, right, bottom))

                # 保存缺陷区域为BMP文件
                defect_filename = f"{img_base_name}_defect_{i + 1}.bmp"
                defect_filepath = os.path.join(img_dir, defect_filename)
                defect_region.save(defect_filepath, 'BMP')
                print(f"缺陷 {i + 1} 已保存至: {defect_filepath}")

                # 在原图上标记缺陷
                draw = ImageDraw.Draw(img)
                draw.rectangle([left, top, right, bottom], outline="red", width=2)

            # 保存标记后的原图(可选)
            marked_img_path = os.path.join(img_dir, f"{img_base_name}_marked.jpg")
            img.save(marked_img_path)
            print(f"标记后的图片已保存至: {marked_img_path}")

    except FileNotFoundError as e:
        print(f"错误:文件未找到 - {e}")
    except json.JSONDecodeError:
        print(f"错误:无法解析JSON文件 - {json_path}")
    except Exception as e:
        print(f"发生未知错误: {e}")


if __name__ == "__main__":
    # 使用实际文件路径
    image_file = r"pptt\0.bmp"
    json_file = r"pptt\0.json"

    # 检查文件是否存在
    if os.path.exists(image_file) and os.path.exists(json_file):
        process_defects(image_file, json_file)
    else:
        print("请提供有效的图片和JSON文件路径")

### 改进 YOLO 算法应用于钢材表面缺陷检测的研究 #### 背景介绍 近年来,随着计算机视觉技术的发展,基于卷积神经网络(CNN)的目标检测方法被广泛应用于工业领域中的质量控制环节。特别是对于钢材表面缺陷检测这一特定应用场景而言,YOLO系列算法因其高效性和实时性而备受关注。 #### 方法概述 为了提高传统YOLO模型在复杂背景下的鲁棒性和准确性,在原有基础上引入了Transformer机制来增强特征提取能力,针对具体问题进行了多项针对性调整: - **架构改良**:采用更深层次的骨干网结构以及多尺度融合策略,使得网络能够捕捉到不同层次的空间信息;同时利用自注意力机制替代部分标准卷积操作,从而更好地建模长距离依赖关系[^2]。 - **数据预处理**:考虑到实际采集过程中可能存在光照不均等问题,通过图像增强手段如随机裁剪、翻转等方式扩充训练样本数量提升泛化性能[^3]。 - **损失函数设计**:除了常规使用的交叉熵损失外,还加入了边界框回归项以精确估计目标位置坐标;另外设置了类别不平衡惩罚因子用来缓解正负样本比例失衡带来的影响[^4]。 #### 实验设置与实现细节 实验选用公开可用的数据集NEU-DET作为测试平台,该集合涵盖了六种典型的钢铁材料瑕疵类型:“crazing”,“inclusion”,“patches”,“pitted_surface”,“rolled-in_scale” 和 “scratches”。整个流程可以概括如下: ```bash # 下载解压 NEU-DET 数据集 wget http://www.neu.edu.cn/dataset/NEU-DET.zip unzip NEU-DET.zip -d ./datasets/ # 安装必要的 Python 库 pip install torch torchvision opencv-python matplotlib pyyaml tqdm # 开始训练过程 python train.py --img-size 640 \ --batch-size 16 \ --epochs 300 \ --cfg models/yolov5x_msft_transformer.yaml \ --weights '' \ --cache-images \ --device 0,1,2,3 ``` 上述命令展示了如何配置环境变量对改进后的YOLOv5进行定制化训练。其中`models/yolov5x_msft_transformer.yaml`文件定义了一个结合了Transformer组件的大规模版本YOLOv5模型配置。 #### 性能评估指标及结果分析 经过充分迭代后得到的最佳权重保存于`runs/train/msft_yolo_neu_det_x/weights/best.pt`路径下。验证阶段可通过执行以下脚本获取最终精度表现: ```python import os from pathlib import Path from utils.general import check_img_size from utils.torch_utils import select_device, time_synchronized from models.experimental import attempt_load from val import run_val if __name__ == '__main__': weights = 'runs/train/msft_yolo_neu_det_x/weights/best.pt' imgsz = 640 device = '' # Load model device = select_device(device) half = device.type != 'cpu' # half precision only supported on CUDA model = attempt_load(weights, map_location=device) # load FP32 model stride = int(model.stride.max()) # model stride imgsz = check_img_size(imgsz, s=stride) # check image size if half: model.half() # to FP16 with open('results.txt', 'w') as f: results = run_val( data='datasets/NEU-DET/data.yaml', task='val', batch_size=8, imgsz=imgsz, conf_thres=0.001, iou_thres=0.6, save_json=True, project='./evaluations/', name='msft_yolo_neu_det_x_results', exist_ok=False ) mAP_05, mAP_05_95 = results[-1], results[0] print(f'[email protected]: {mAP_05:.3f}, mAP@[0.5:0.95]: {mAP_05_95:.3f}', file=f) os.system('cat results.txt') ``` 此段Python代码片段实现了加载最优权值文件调用官方提供的验证接口完成定量评价的过程。结果显示所提出的改进方案有效提升了各类别平均准确率(mAP),特别是在小尺寸物体上的定位效果尤为显著。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值