pin脚的缺陷检测

news2024/11/16 1:26:22

忍不住

  • 我才是最大的缺陷
    • 首先应该学好表达
    • 头脑风暴
    • 分割
    • paddledetection小目标检测也不行
    • 缺陷检测
      • 1.缺陷标注
      • 修改代码为自己的数据集
      • 训练
      • 训练结果
      • 结果图片
  • 结论
  • 再次出发

我才是最大的缺陷

真的,我真的被整无语了。测测测测,测个鬼。一天天的净整些没用的。
在这里插入图片描述

首先应该学好表达

客户有个需求(缺陷检测)+数据(4个图片)-BD需求(缺陷检测)+数据(4个图片)-技术??????????????
1.什么是缺陷?
2.4个图片你确定是给我做测试,而不是让我写ppt?

经过一周的反馈和交流后
客户有个需求(缺陷检测)+数据(2T数据)-BD需求(缺陷检测)+数据(2T数据)-技术??????????????

直到现在我还是一头雾水。

头脑风暴

1.目标检测
2.缺陷检测

前提都是要分割图片,因为客户提供的是2000万像素的图片。然后检测的缺陷大概是50个像素
如果类比到我们常用的512*512的图片,大概就是0.65536。 一个像素都不到。真棒。

分割

这里提一下,参考paddledetection的小目标检测。
使用了sahi,但是他们提供的代码,需要先使用labelme标注,然后转成coco格式。最后在分割。
但是: 没有分割后的图片???
修改代码 slicing.py 中的320行

image_pil.save(slice_file_path, quality=100)

如果我不想标注,我就想分割图片呢

import os

from sahi.slicing import slice_image


img_path=r'G:\sick\ic\NG\2_NG_G7P3900905EA'
output_images_dir=r'G:\sick\ic\NG\split'
image_names=os.listdir(img_path)
for image_name in image_names:
    image_dir=os.path.join(img_path,image_name)
    slice_image(image=image_dir,
                output_file_name=image_name,
                output_dir=output_images_dir,
                slice_height=640,
                slice_width=640,
                min_area_ratio=0.1,
                overlap_height_ratio=0.25,
                overlap_width_ratio=0.25,
                out_ext=".jpg",
                verbose=False,
            )

paddledetection小目标检测也不行

不管是yolov几都不行,目标太小了。而且缺陷不是固定形状的。本身标注就很难

缺陷检测

“Mixed supervision for surface-defect detection: from weakly to fully supervised learning”

因为之前有人给我推荐这个论文,缺陷检测效果很好。
所以就去训练了。
训练的图片大概就是这样
在这里插入图片描述
在这里插入图片描述

1.缺陷标注

还是使用labelme标注,标注好以后,需要转为一个mask图片

这个是吧有缺陷的图片转化一个mask作为标签

#!/usr/bin/env python

from __future__ import print_function

import argparse
import glob
import os
import os.path as osp

import imgviz
import numpy as np

import labelme


def main():
    parser = argparse.ArgumentParser(
        formatter_class=argparse.ArgumentDefaultsHelpFormatter
    )
    parser.add_argument("--input_dir", default=r"G:\sick\ic\mixed-segdec-net-comind2021-master\cocome\dota_sliced\json", help="input annotated directory")
    parser.add_argument("--output_dir", default=r"G:\sick\ic\mixed-segdec-net-comind2021-master\cocome\dota_sliced", help="output dataset directory")
    parser.add_argument("--labels", default=r"G:\sick\ic\mixed-segdec-net-comind2021-master\zw\class_names.txt", help="labels file")
    args = parser.parse_args()
    args.noviz = False


    class_names = []
    class_name_to_id = {}
    for i, line in enumerate(open(args.labels).readlines()):
        class_id = i - 1  # starts with -1
        class_name = line.strip()
        class_name_to_id[class_name] = class_id
        if class_id == -1:
            assert class_name == "__ignore__"
            continue
        elif class_id == 0:
            assert class_name == "_background_"
        class_names.append(class_name)
    class_names = tuple(class_names)
    print("class_names:", class_names)
    out_class_names_file = osp.join(args.output_dir, "class_names.txt")
    with open(out_class_names_file, "w") as f:
        f.writelines("\n".join(class_names))
    print("Saved class_names:", out_class_names_file)

    for filename in glob.glob(osp.join(args.input_dir, "*.json")):
        print("Generating dataset from:", filename)

        label_file = labelme.LabelFile(filename=filename)

        base = osp.splitext(osp.basename(filename))[0]
        out_img_file = osp.join(args.output_dir, "JPEGImages", base + ".jpg")
        out_lbl_file = osp.join(
            args.output_dir, "SegmentationClass", base + ".npy"
        )
        out_png_file = osp.join(
            args.output_dir, "SegmentationClassPNG", base + ".png"
        )
        if not args.noviz:
            out_viz_file = osp.join(
                args.output_dir,
                "SegmentationClassVisualization",
                base + ".jpg",
            )

        with open(out_img_file, "wb") as f:
            f.write(label_file.imageData)
        img = labelme.utils.img_data_to_arr(label_file.imageData)

        lbl, _ = labelme.utils.shapes_to_label(
            img_shape=img.shape,
            shapes=label_file.shapes,
            label_name_to_value=class_name_to_id,
        )
        labelme.utils.lblsave(out_png_file, lbl)

        np.save(out_lbl_file, lbl)

        if not args.noviz:
            viz = imgviz.label2rgb(
                lbl,
                img,
                font_size=15,
                label_names=class_names,
                loc="rb",
            )
            imgviz.io.imsave(out_viz_file, viz)


if __name__ == "__main__":
    main()

在这里插入图片描述
如果是没有缺陷的图片呢

import cv2
import os
import numpy as np
import os.path as osp

file_path=r'G:\sick\ic\mixed-segdec-net-comind2021-master\datasets\tem'

file_name=os.listdir(file_path)

for name in file_name:
    if name.endswith('.png'):
        img_path=os.path.join(file_path,name)
        img=cv2.imread(img_path,0)
        mask=np.zeros_like(img)
        tem=osp.splitext(img_path)[0]+'_label.png'
        # print(1)
        cv2.imwrite(tem,mask)

在这里插入图片描述
最后把所有的图片放在一个文件夹下
在这里插入图片描述

修改代码为自己的数据集

在data中增加一个文件,叫做input_myself.py

import numpy as np
import os
from data.dataset import Dataset
from config import Config

class MyselfDataset(Dataset):
    def __init__(self, kind: str, cfg: Config):
        super(MyselfDataset, self).__init__(cfg.DATASET_PATH, cfg, kind)
        self.read_contents()

    def read_contents(self):
        pos_samples, neg_samples = [], []

        for sample in sorted(os.listdir(self.path)):
            if not sample.__contains__('label'):
                image_path = self.path +  sample
                seg_mask_path = f"{image_path[:-4]}_label.png"
                image = self.read_img_resize(image_path, self.grayscale, self.image_size)
                seg_mask, positive = self.read_label_resize(seg_mask_path, self.image_size, dilate=self.cfg.DILATE)
                sample_name = f"{sample}"[:-4]
                if positive:
                    image = self.to_tensor(image)
                    seg_loss_mask = self.distance_transform(seg_mask, self.cfg.WEIGHTED_SEG_LOSS_MAX, self.cfg.WEIGHTED_SEG_LOSS_P)
                    seg_loss_mask = self.to_tensor(self.downsize(seg_loss_mask))
                    seg_mask = self.to_tensor(self.downsize(seg_mask))
                    pos_samples.append((image, seg_mask, seg_loss_mask, True, image_path, seg_mask_path, sample_name))
                else:
                    image = self.to_tensor(image)
                    seg_loss_mask = self.to_tensor(self.downsize(np.ones_like(seg_mask)))
                    seg_mask = self.to_tensor(self.downsize(seg_mask))
                    neg_samples.append((image, seg_mask, seg_loss_mask, True, image_path, seg_mask_path, sample_name))

        self.pos_samples = pos_samples
        self.neg_samples = neg_samples

        self.num_pos = len(pos_samples)
        self.num_neg = len(neg_samples)
        self.len = 2 * len(pos_samples) if self.kind in ['TRAIN'] else len(pos_samples) + len(neg_samples)

        self.init_extra()

修改dataset_catalog.py

from .input_ksdd import KSDDDataset
from .input_dagm import DagmDataset
from .input_steel import SteelDataset
from .input_ksdd2 import KSDD2Dataset
from .input_myself import MyselfDataset
from config import Config
from torch.utils.data import DataLoader
from typing import Optional


def get_dataset(kind: str, cfg: Config) -> Optional[DataLoader]:
    if kind == "VAL" and not cfg.VALIDATE:
        return None
    if kind == "VAL" and cfg.VALIDATE_ON_TEST:
        kind = "TEST"
    if cfg.DATASET == "KSDD":
        ds = KSDDDataset(kind, cfg)
    elif cfg.DATASET == "DAGM":
        ds = DagmDataset(kind, cfg)
    elif cfg.DATASET == "STEEL":
        ds = SteelDataset(kind, cfg)
    elif cfg.DATASET == "KSDD2":
        ds = KSDD2Dataset(kind, cfg)
    elif cfg.DATASET == "myself":
        ds = MyselfDataset(kind, cfg)
    else:
        raise Exception(f"Unknown dataset {cfg.DATASET}")

    shuffle = kind == "TRAIN"
    batch_size = cfg.BATCH_SIZE if kind == "TRAIN" else 1
    num_workers = 0
    drop_last = kind == "TRAIN"
    pin_memory = False

    return DataLoader(dataset=ds, batch_size=batch_size, shuffle=shuffle, num_workers=num_workers, drop_last=drop_last, pin_memory=pin_memory)

训练

执行python train_net.py 增加参数如下

--GPU=0
--DATASET=myself
--RUN_NAME=RUN_NAME
--DATASET_PATH=datasets/yc/
--RESULTS_PATH=save/results
--SAVE_IMAGES=True
--DILATE=7
--EPOCHS=50
--LEARNING_RATE=1.0
--DELTA_CLS_LOSS=0.01
--BATCH_SIZE=1
--WEIGHTED_SEG_LOSS=True
--WEIGHTED_SEG_LOSS_P=2
--WEIGHTED_SEG_LOSS_MAX=1
--DYN_BALANCED_LOSS=True
--GRADIENT_ADJUSTMENT=True
--FREQUENCY_SAMPLING=True
--TRAIN_NUM=538
--NUM_SEGMENTED=538
--FOLD=0

训练结果

执行python join_folds_results.py 参数如下

--RUN_NAME=RUN_NAME
--RESULTS_PATH=save/results
--DATASET=myself
E:\miniconda\envs\hikvision\python.exe G:\sick\ic\mixed-segdec-net-comind2021-master\join_folds_results.py --RUN_NAME=RUN_NAME --RESULTS_PATH=save/results --DATASET=myself 
Running evaluation for RUN save/results\myself\RUN_NAME
RUN RUN_NAME: AP:1.00000, AUC:1.00000, FP=0, FN=0, FN@.5=1, FP@.5=0, FP@FN0=0

结果图片

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
效果是不是炸裂

结论

最后我又弄个新的图片去测试模型的泛化性
在这里插入图片描述
在这里插入图片描述
简直离谱他妈给离谱开门。这玩意怎么用啊

再次出发

https://github.com/openvinotoolkit/anomalib.git

在网上找了很久,发现有个现成的缺陷检测的库。不管咋样先拿来试一下

安装,数据准备,训练

# Import the required modules
from anomalib.data import Myself
from anomalib.models import Patchcore
from anomalib.engine import Engine

# Initialize the datamodule, model and engine
datamodule = Myself(num_workers=0)
model = Patchcore()
engine = Engine(image_metrics=["AUROC"],
    accelerator="auto",
    check_val_every_n_epoch=1,
    devices=1,
    max_epochs=1,
    num_sanity_val_steps=0,
    val_check_interval=1.0,
)
# Train the model
engine.fit(datamodule=datamodule, model=model)

在这里插入图片描述
好像不能直接训练啊。还是需要去研究一下。。。。。
难受!!!!!!!!!!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1548988.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

隐蔽处工程监管系统

随着科技的飞速发展,信息化、智能化已经成为各行各业发展的必然趋势。在工程建设领域,传统的监管方式已经难以满足现代工程管理的需求。为了提高工程监管的效率和精度,信鸥科技倾力打造了一款全新的工程监管系统,为工程建设行业带…

14:有效的符号

给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括…

XSS学习(cookie远程登录演示)

1.HTTP特点: 1.请求应答模式。 2.灵活可扩展 3.可靠传输 4.无状态。 这里给大家举一个例子: HTTP是无状态的,所按理来说我每进行一次会话,比如我在CSDN发一个帖子,好像按理来以说我都要进行一次重新登陆&#xff0…

3.4 CSS取值与单位

3.4.1 数字 数字取值是在CSS2中规定的&#xff0c;有三种取值形式如表3-3所示。 3.4.2 长度 长度取值<length>是在CSS2中规定的&#xff0c;表示方法为数值接长度单位。可用于描述文本、图像或其他各类元素的尺寸。 长度取值的单位可分为相对长度单位和绝对长度单位。相…

day5-QT

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QFontDialog> //字体对话框类 #include<QFont> //字体类 #include<QMessageBox> //消息对话框类 #include<QColorDialog> //颜色对话框类 #include<QColor> //颜…

静态路由表学习实验

实验要求&#xff1a;各个pc设备可以通信&#xff0c;并且可以访问外网&#xff0c;假设R1已连接外网 拓扑结构 思路&#xff1a;配置pc机ip地址&#xff0c;子网掩码&#xff0c;和网关&#xff08;网关地址是上层路由接口的地址&#xff09;&#xff0c;配置路由各个接口地址…

SpringBoot整合Swagger-UI实现在线API文档

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容:SpringBoot整合Swagger-UI实现在线API文档 📚个人知识库: Leo知识库,欢迎大…

STM32学习笔记(6_7)- TIM定时器的编码器接口原理

无人问津也好&#xff0c;技不如人也罢&#xff0c;都应静下心来&#xff0c;去做该做的事。 最近在学STM32&#xff0c;所以也开贴记录一下主要内容&#xff0c;省的过目即忘。视频教程为江科大&#xff08;改名江协科技&#xff09;&#xff0c;网站jiangxiekeji.com 现在开…

“Linux 三剑客”,通常指的是三个经典的命令行工具:grep、sed 和 awk

1、grep&#xff1a; 简介&#xff1a;grep 是一个强大的文本搜索工具&#xff0c;可以用于在文件中查找匹配特定模式的行。示例&#xff1a; 搜索包含特定关键词的行&#xff1a; grep "keyword" filename 递归搜索目录下所有文件&#xff1a; grep -r define zj…

聊聊多模态大模型处理的思考

多模态&#xff1a;文本、音频、视频、图像等多形态的展现形式。目前部门内业务要求领域大模型需要是多模态——支持音频/文本。从个人思考的角度来审视下&#xff0c;审视下多模态大模型的实现方式。首先就要区分输入与输出&#xff0c;即输入的模态与输出的模态。从目前来看&…

专项测试之「 性能测试」总结

1、性能测试概念 虚拟用户】模拟真实业务逻辑步骤的虚拟用户&#xff0c;其模拟的操作步骤都被记录再虚拟用户脚本中。 【事务】事务是性能测试脚本的一个重要特性&#xff0c;按照最小的http请求打包而成。 【TPS】每秒中系统处理的交易或者事务的数量。 【PV】用户浏览器…

SQLynx发布3.0.0版本:带来更流畅便捷的SQL开发体验

作为新一代的一站式数据库管理开发工具&#xff0c; SQLynx自发布上线以来&#xff0c;一直受到广大用户的好评与鼓励。 为了给用户提供更高效、更便捷、更可靠的数据库管理开发体验&#xff0c;SQLynx今日正式发布3.0.0版本&#xff0c;同步在麦聪软件官网上线&#xff0c;全…

大型网络游戏设计与AI赋能-3

接上文&#xff01;&#xff01;&#xff01;&#xff01; 先和大家互动一下 大家觉得架构设计包含了哪些东西&#xff1f; 大家可能会提起一些名词&#xff0c;比如框架、不同功能、工具集、软件体系结构、设计思想等。其实引擎是一种软件。我们说传统的软件设计的这个体系里…

搭建机器人产业发展重要展示平台“2024南京国际机器人展览会”

2024南京国际智能机器人展览会 2024 Nanjing Intelligent Robot Expo 时间:2024年11月22-24日 地点:南京国际博览中心 南京&#xff0c;这座历史悠久的文化名城&#xff0c;如今正站在机器人产业发展的前沿。随着全球科技的飞速进步&#xff0c;机器人产业已经成为推动经济社…

数据结构·二叉树(2)

目录 1 堆的概念 2 堆的实现 2.1 堆的初始化和销毁 2.2 获取堆顶数据和堆的判空 2.3 堆的向上调整算法 2.4 堆的向下调整算法 2.4 堆的插入 2.5 删除堆顶数据 2.6 建堆 3 建堆的时间复杂度 3.1 向上建堆的时间复杂度 3.2向下建堆的时间复杂度 4 堆的排序 前言&…

【C++语言】冲突-C语言:命名冲突(输入输出、缺省参数、引用、内联函数)

文章目录 前言正文2. C的输入与输出&#xff1a;3.缺省参数3.1 缺省参数的概念&#xff1a;3.2 缺省参数的分类&#xff1a;全缺省参数&#xff1a;半缺省参数&#xff1a; 4.函数重载4.1 函数重载的概念&#xff1a; 5.引用5.1 引用的基本概念&#xff1a;5.2 引用的特性&…

后端代码1

// 新增 public JsonResultVo<?> create(ApiIgnore RequestAttribute(ConstVal.REQ_USER) BaseUser baseUser,RequestBody IUTradeBuyPreserveVo iuTradeBuyPreserveVo) {//权限判断if (!baseCompanyService.dataPermission(baseUser, iuTradeBuyPreserveVo.getCompanyi…

Kimi和ChatGPT做古诗词阅读理解,谁更胜一筹?

前几天发过一篇Kimi整理会议的体验教程&#xff0c;没想到大家很感兴趣&#xff0c;这次再来拿Kimi做古诗词阅读理解看看&#xff0c;同时也对比下ChatGPT的效果。 ChatGPT是几乎家喻户晓的AI大模型&#xff0c;Kimi和它对比有哪些异同点呢&#xff1f; 首先它们都是基于对话…

【小沐学AI】智谱AI大模型的一点点学习(Python)

文章目录 1、简介1.1 大模型排行榜 2、智谱AI2.1 GLM2.1.1 模型简介2.1.2 开源代码2.1.2.1 GLM-130B 2.2 ChatGLM2.2.1 模型简介2.2.2 开源代码2.2.2.1 ChatGLM2.2.2.2 ChatGLM22.2.2.3 ChatGLM3 2.3 CodeGeeX2.3.1 模型简介2.3.2 开源代码 2.4 CogView2.4.1 模型简介2.4.2 开源…

【项目技术介绍篇】如何在本地运行若依项目

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…