深度学习实现工业零件的缺陷检测

2023-05-16

介绍

工业零件在制造完成的时候,往往需要去检测其完整性和功能性。如下图所示,从左上到右下,分别是擦花、漏底、碰凹、凸粉。本篇博文主要讲解如何去识别这四类图像,所用框架为keras-2.1.6+tensorflow-1.7.0+GTX1060。

这里写图片描述

数据集

所获得的数据不是太多,一共250幅图像,其中擦花图像29幅、漏底图像140幅、碰凹图像20幅、凸粉图像61幅。可以发现,这样的数据对深度卷积网络来说是远远不够的,而且数据分布是极不对称的。而且对特征是否明显来说,擦花特征是最不明显的,在训练的时候更要进行关注。

这里写图片描述

图像增强

对每类图像进行增强,使其扩展到300幅左右。这里使用ImageDataGenerator来完成,主要包括图像的旋转、平移、错切等。

from keras.preprocessing.image import ImageDataGenerator
import numpy as np
import numpy as np
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.optimizers import SGD
import tensorflow as tf
from PIL import Image
from image_handle import *
import os
import cv2


batch_size=10
epoch_size=50
data = np.empty((250,800, 800,3), dtype="float32")
image_resize=[]
image_vector=[]
image_label=[]
image_label_list=['擦花','漏底','碰凹','凸粉']  #漏底占的比例太大了,导致后面的预测全部都偏向该物体
image_dir='F:/Data/guangdong_round1_train1_20180903/'
j=0
k=0

for fn in os.listdir(image_dir):
    image_name=get_image_name(fn)
    for i in range(0,4):
        if image_label_list[i]==image_name:
            image_name=i
    image = Image.open(image_dir+fn,'r')#原始图片过大
    image_down=image.resize((800, 800), Image.ANTIALIAS)
    arr = np.asarray(image_down, dtype="float32")
    data[j, :, :, :] = arr
    j=j+1
    image_label.append(image_name)

#准备好数据和标签送进VGG网络中
x_train=data[231:250]
y_train = keras.utils.to_categorical(image_label,4)[231:250]#转换成one-hot向量

print(len(x_train))
print(len(y_train))
print(image_label)

generator = ImageDataGenerator(
        rotation_range=20,
        width_shift_range=0.2,
        height_shift_range=0.2,
        shear_range=0.1,
        zoom_range=0.1,
        horizontal_flip=True,
    )

for batch in generator.flow(x_train,
                          batch_size=100,
                          save_to_dir='C:/Users/18301/Desktop/image_data',#生成后的图像保存路径
                          save_prefix='碰凹2018',
                          save_format='jpg'):
    k += 1
    if k > 10: #这个10指出要扩增多少个数据,最终的数据为x_train的大小与10的乘积,可根据要求自行更改
        break  # otherwise the generator would loop indefinitely

增强后的图像:

这里写图片描述

训练-Training

主程序,main.py

import numpy as np
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import BatchNormalization,Activation
from sklearn.model_selection import train_test_split
from keras.optimizers import SGD
import tensorflow as tf
from PIL import Image
from image_handle import *
from model import BuildModel
import os
import cv2
import keras.backend.tensorflow_backend as KTF

#进行配置,使用60%的GPU,这是为了保护GPU
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.6
session = tf.Session(config=config)
# 设置session
KTF.set_session(session )

batch_size=5
epoch_size=50
image_number=1451
resize_width=300
resize_height=300

image_vec=[]
image_resize=[]
image_vector=[]
image_label=[]
image_label_list=['擦花','漏底','碰凹','凸粉']  #漏底占的比例太大了,导致后面的预测全部都偏向该物体
data = np.empty((1429,300, 300,3), dtype="float32")
image_dir='F:/Data/guangdong_round1_train1_20180903/image_data/'

data,image_label,image_vec=get_image_data(image_dir,resize_width,resize_height,data,image_label,image_label_list)
#准备好数据和标签送进VGG网络中
X_train=data
Y_train = keras.utils.to_categorical(image_label,4) #转换成one-hot向量
#划分训练集和测试集
x_train, x_test,y_train, y_test = train_test_split(X_train, Y_train,test_size=0.1, random_state=None)
#开始建立序列模型
model=BuildModel(x_train,y_train,x_test,y_test,batch_size,epoch_size)
model.run_model()

model.py

import numpy as np
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten,Input
from keras.layers import Conv2D, MaxPooling2D,merge
from keras.layers import BatchNormalization,Activation
from sklearn.model_selection import train_test_split
from keras.optimizers import SGD
from keras import regularizers
from keras.models import Model
import tensorflow as tf
from PIL import Image
from image_handle import *
import os
import cv2


class BuildModel():

    def __init__(self,x_train,y_train,x_test,y_test,batch_size,epoch_size):
        self.x_train=x_train
        self.y_train = y_train
        self.x_test=x_test
        self.y_test=y_test
        self.batch_size=batch_size
        self.epoch_size=epoch_size

    def add_layer(self,X,channel_num):
        #借鉴残差网络的思想
        conv_1=Conv2D(channel_num, (3, 3),padding='same')(X)
        conv_1=BatchNormalization()(conv_1)
        conv_1= Activation('relu')(conv_1)
        # conv_1 = MaxPooling2D(pool_size=(3, 3),strides=(1,1),padding='same')(conv_1)
        conv_1 = Conv2D(channel_num, (3, 3),padding='same')(conv_1)
        conv_1 = BatchNormalization()(conv_1)
        merge_data = merge([conv_1, X], mode='sum')
        out = Activation('relu')(merge_data)
        return out

    def google_layer(self,X):
        #借鉴GoogleNet的思想,单层分支
        conv_1 = Conv2D(32,(1, 1), padding='same')(X)
        conv_1 = BatchNormalization()(conv_1)
        conv_1 = Activation('relu')(conv_1)
        conv_2 = Conv2D(32,(3, 3), padding='same')(X)
        conv_2 = BatchNormalization()(conv_2)
        conv_2 = Activation('relu')(conv_2)
        conv_3 = Conv2D(32,(5, 5), padding='same')(X)
        conv_3 = BatchNormalization()(conv_3)
        conv_3 = Activation('relu')(conv_3)
        pooling_1 = MaxPooling2D(pool_size=(2, 2), strides=(1, 1), padding='same')(X)
        out = merge([conv_1,conv_2,conv_3,pooling_1], mode='concat')
        return out

    def run_model(self):
        # input: 100x100 images with 3 channels -> (100, 100, 3) tensors.
        # this applies 32 convolution filters of size 3x3 each.
        #在这里采用函数式模型不采用序贯式模型
        #发现单纯使用残差网络比使用残差+GoogleNet效果要好,收敛速度更快
        inputs=Input(shape=(300,300,3))
        X=Conv2D(32, (3, 3))(inputs)
        X=BatchNormalization()(X)
        X=Activation('relu')(X)
        X=self.add_layer(X,32)
        # X=self.google_layer(X)
        X=MaxPooling2D(pool_size=(2, 2),strides=(2,2))(X)
        X=Conv2D(64, (3, 3),kernel_regularizer=regularizers.l2(0.01))(X)
        X=BatchNormalization()(X)
        X=Activation('relu')(X)
        X=self.add_layer(X,64)
        # X = self.google_layer(X)
        X = MaxPooling2D(pool_size=(2, 2), strides=(2, 2))(X)
        X=Conv2D(64, (3, 3))(X)
        X=BatchNormalization()(X)
        X=Activation('relu')(X)
        X=MaxPooling2D(pool_size=(2, 2),strides=(2,2))(X)
        X = self.add_layer(X, 64)
        # X = self.google_layer(X)
        X=Conv2D(32, (3, 3),kernel_regularizer=regularizers.l2(0.01))(X)
        X=BatchNormalization()(X)
        X=Activation('relu')(X)
        X=self.add_layer(X,32)
        # X = self.google_layer(X)
        X = MaxPooling2D(pool_size=(2, 2), strides=(2, 2))(X)
        X=Conv2D(64, (3, 3))(X)
        X=BatchNormalization()(X)
        X=Activation('relu')(X)
        X=self.add_layer(X,64)
        # X = self.google_layer(X)
        X=Flatten()(X)
        X=Dense(256, activation='relu')(X)
        X=Dropout(0.5)(X)
        predictions=Dense(4, activation='softmax')(X)
        model = Model(inputs=inputs, outputs=predictions)
        # sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
        model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
        model.fit(self.x_train, self.y_train, batch_size=self.batch_size, epochs=self.epoch_size, class_weight = 'auto',validation_split=0.1)
        model.save('model_google_layer.h5')
        score = model.evaluate(self.x_test, self.y_test, batch_size=self.batch_size)
        print(score)


image_handle.py

import numpy as np
from PIL import Image
import random
import re
import os

def get_image_name(image_name):
    image_name=re.split('.jpg', image_name)
    name=re.split('2018',image_name[0])
    return name[0]

def one_hot_vector(image_label,image_label_list):
    classes=len(image_label_list)
    one_hot_label = np.zeros(shape=(image_label.shape[0], classes+1))  ##生成全0矩阵
    one_hot_label[np.arange(0, image_label.shape[0]), image_label] = 1
    return one_hot_label

def batch_generate(x_train,y_train,batch_size):
    batch_x=[]
    batch_y=[]
    for i in range(batch_size):
        t = random.randint(0, 249)
        batch_x.append(x_train[t])
        batch_y.append(y_train[t])
    return batch_x,batch_y

def get_image_data(image_dir,resize_width,resize_height,data,image_label,image_label_list):
    j=0
    image_vec=[]
    for fn in os.listdir(image_dir):
        image_name = get_image_name(fn)
        for i in range(0, 4):
            if image_label_list[i] == image_name:
                image_name = i
        image = Image.open(image_dir + fn)  # 原始图片过大
        image_down = image.resize((resize_width,resize_height), Image.ANTIALIAS)
        image_vec.append(image_down)
        arr = np.asarray(image_down, dtype="float32")
        data[j, :, :, :] = arr
        j = j + 1
        image_label.append(image_name)
    return data,image_label,image_vec




训练中~

这里写图片描述

预测新的图像种类

model_test.py


import numpy as np
import keras
from keras.models import Sequential,load_model
from keras.layers import Dense, Dropout, Flatten,Input
from keras.layers import Conv2D, MaxPooling2D,merge
from keras.layers import BatchNormalization,Activation
from sklearn.model_selection import train_test_split
from keras.optimizers import SGD
from keras.models import Model
import tensorflow as tf
from PIL import Image,ImageDraw,ImageFont
from image_handle import *
import os
import cv2

from keras import backend as K
K.clear_session()

start=10
end=11
image_number=1451
resize_width=300
resize_height=300

image_resize=[]
image_vector=[]
image_label=[]
image_label_list=['擦花','漏底','碰凹','凸粉']  #漏底占的比例太大了,导致后面的预测全部都偏向该物体
data = np.empty((22,300, 300,3), dtype="float32")
image_dir='C:/Users/18301/Desktop/test_image/'

data,image_label,image_vec=get_image_data(image_dir,resize_width,resize_height,data,image_label,image_label_list)
#准备好数据和标签送进VGG网络中
X_train=data
Y_train = keras.utils.to_categorical(image_label,4) #转换成one-hot向量

# print(X_train)
print(Y_train)
x_train=X_train[start:end]
y_train=Y_train[start:end]

model = load_model('model_google_layer.h5')
preds = model.predict(x_train)

print(preds)
list_pre= preds[0].tolist()

object_index=list_pre.index(max(list_pre))


y_=Y_train[start:end][0]
y_=y_.tolist()
print(y_)

true_object_index=y_.index(max(y_))

print(object_index)
print(true_object_index)

s_pre=image_label_list[object_index]
s_true=image_label_list[true_object_index]

print(s_pre)
print(s_true)

image=image_vec[start]
draw = ImageDraw.Draw(image)
############注意:这里检测出来的物体种类,擦花由于特征不够明显,基本上被判断成凸粉,这一点需要改善#################
s_pre_out='检测出的缺陷种类为:'+s_pre
s_true_out='真实缺陷种类为:'+s_true

print(s_pre_out)
print(s_true_out)

ttfront = ImageFont.truetype('simhei.ttf', 20)#字体大小

draw.text((30,40),str(s_pre_out), fill = (255, 0 ,0), font=ttfront)
draw.text((50,60),str(s_true_out), fill = (255, 0 ,0), font=ttfront)

image.show()

from keras import backend as K
K.clear_session()

最终识别结果:

这里写图片描述

[[1.4585784e-34 0.0000000e+00 1.0000000e+00 0.0000000e+00]]
[0.0, 0.0, 1.0, 0.0]
检测出的缺陷种类为:碰凹
真实缺陷种类为:碰凹

[[1.3628840e-03 2.3904990e-18 5.2082274e-08 9.9863702e-01]]
[0.0, 0.0, 0.0, 1.0]
检测出的缺陷种类为:凸粉
真实缺陷种类为:凸粉

[[9.3814194e-01 1.4996887e-09 1.5372947e-04 6.1704315e-02]]
[1.0, 0.0, 0.0, 0.0]
检测出的缺陷种类为:擦花
真实缺陷种类为:擦花

[[0. 1. 0. 0.]]
[0.0, 1.0, 0.0, 0.0]
检测出的缺陷种类为:漏底
真实缺陷种类为:漏底

源代码

源代码请见:深度学习实现工业零件缺陷检测源代码
训练图像请见:工业零件缺陷图像

细节和技巧

  1. 对工业缺陷零件来说,由于特征不是太明显,往往只是一小块,在选择网络的时候,要考虑把浅层特征和深度特征进行融合,这样的话就不会造成主要特征丢失。关于网络,推荐使用ResNet、DenseNet、InceptionResNetV2这些,经过自己的测试,DenseNet效果要更好些,深度在22层左右。
  2. 可以选取不同的数据(数据最好不要完全相同)训练几个不同的模型,比如训练出三个模型分别对应:ResNet、DenseNet、InceptionResNetV2。训练完成后,把这三个模型的全连接层去掉,只用这三个模型的卷积层进行特征提取,然后把提取的特征进行拼接,可以在channel方向上(此时要求feature map的w和h必须相同),也可以在对应位置上进行特征相加(点加)。然后把这些特征进行汇总,重新建立三个网络,每个网络模型分别对应训练好的三个模型,提取训练好模型的参数,赋给新的模型,然后建立全连接层,这个时候只有一个全连接层。在训练的时候,新的网络只用来做特征提取,卷积层的参数不做训练,把这些网络参数冻结,只更新全连接层。
  3. 对于2中的特征融合,还有一种方法就是:用三个训练好的模型进行特征提取,然后建立一个mlp多层感知机类型的网络。训练好的模型去掉全连接层,只保存卷积层,做特征提取,并把产生的特征进行拼接,训练时只对全连接层进行更新。
  4. 如果整个场景图像特别大,缺陷特征比较局部化,对图像进行卷积操作后,特征基本上不存在,这时可以考虑把场景图像进行切分,比如一个场景图像被切分成四份,可以横向切分,也可以纵向切分。然后需要自己去做数据,赋以标签。在做数据上可能要花点时间,不过效果还不错。在预测的时候,只要场景图像的四个子图像有一个是缺陷图像,就认为其是缺陷图像。这在一定程度上避免了特征过于局部化。
  5. Focal Loss:用来解决数据不均衡问题。

最后,欢迎加入3D视觉工坊,一起交流学习~
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度学习实现工业零件的缺陷检测 的相关文章

  • FTP 530未登录

    提供一种思路 xff1a 如果说FTP服务器已开 xff0c 服务器也能ping通 就得考虑是不是我们在FTP服务器上设置的默认路径有问题 xff08 不符合我们的需求 xff09 Windows10下 xff0c FTP设置默认位置 xf
  • 开源个小demo

    https github com UnderADome epms 内部项目管理
  • LDAP的基本知识

    https zhuanlan zhihu com p 147768058 https www cnblogs com gaoyanbing p 13967860 html
  • 「权威发布」2019年电赛最全各类题目细节问题解答汇总

    点击上方 大鱼机器人 xff0c 选择 置顶 星标公众号 福利干货 xff0c 第一时间送达 xff01 各位朋友大家上午好 xff0c 今天是比赛的第二天 xff0c 许多朋友都给我发消息 xff0c 我不是不回 xff0c 我实在是回不
  • Unable to find explicit activity class

    做项目从一个activity逐渐转向到使用多个activity xff0c 这个时候新手就容易出现一个问题 xff0c 忘了给activity在AndroidManifest xml中注册 打开日志 xff0c 在遇到这个报错信息的时候 x
  • Errors running builder 'Maven Project Builder'

    由于第一次玩maven的时候 xff0c 很多东西都还是懵懵懂懂 xff0c 不是很清楚 xff0c 不知道怎么把Myeclipse中的maven配置弄坏了 xff0c 从外部导入maven项目的时候 xff0c 总会报一些错误 xff1a
  • Type handler was null on parameter mapping for property '__frch_id_0'

    1 Type handler was null on parameter mapping for property frch id 0 2 Type handler was null on parameter mapping or prop
  • 如何解决error: failed to push some refs to 'xxx(远程库)'

    在使用git 对源代码进行push到gitHub时可能会出错 xff0c 信息如下 此时很多人会尝试下面的命令把当前分支代码上传到master分支上 git push u origin master 但依然没能解决问题 出现错误的主要原因是
  • expected an indented block

    Python中没有分号 xff0c 用严格的缩进来表示上下级从属关系 导致excepted an indented block这个错误的原因一般有两个 xff1a 1 冒号后面是要写上一定的内容的 xff08 新手容易遗忘这一点 xff09
  • C 实现TCP服务端(select、poll、epoll)

    使用C简单的实现一个tcp server xff0c 包括常规server 多线程实现server select实现server poll实现server epoll实现server IO模型原理可以看上一篇文章 常规模式 define M
  • UART串口通信

    目录 一 通信特点二 通信应用三 接线示意图三 UART通信协议四 STM32F4 串口使用1 资源分布2 特性3 UART框图4 使用方法5 相关库函数6 函数实例 五 实战 上位机控制开发板小灯 一 通信特点 异步 串行 全双工 一般描
  • 项目:文件搜索助手(FileSeeker)

    目录 1 项目简介 2 项目源代码 3 相关技术 4 实现原理 5 项目架构图 6 项目功能 7 测试报告 7 1 测试用例 7 2 测试环境 7 3 测试结论 7 3 1 功能测试 7 3 2 性能测试 7 3 3 兼容性 7 3 4 容
  • cocos2d实现2D地图A*广度路径算法

    h ifndef HELLOWORLD SCENE H define HELLOWORLD SCENE H include 34 cocos2d h 34 USING NS CC enum PatchFront Uper 61 1 Down
  • Keil 中,仿真调试查看局部变量值总是显示<not in scope>

    原因 xff1a 编译器把代码优化掉了 xff0c 直接导致在仿真中变量根本没有分配内存 xff0c 也就无法查看变量值 以后调试中遇到这种情况的解决办法 xff1a 核心思想是 xff1a 让变量值在代码中被读取其内存值 1 把变量定义为
  • 联合体在串口通讯中的妙用

    背景 本文主要涉及到的是一种串口通讯的数据处理方法 xff0c 主要是为了解决浮点数在串口通讯中的传输问题 xff1b 通常而言 xff0c 整形的数据类型 xff0c 只需进行移位运算按位取出每个字节即可 xff0c 那么遇到浮点型的数据
  • Linux 平均负载

    本文首发自公众号 LinuxOK xff0c ID 为 xff1a Linux ok 关注公众号第一时间获取更新 xff0c 分享不仅技术文章 xff0c 还有关于职场生活的碎碎念 在 Linux 系统中 xff0c 所谓平均负载 xff0
  • Linux 进程状态

    Linux 进程状态是平时排查问题 程序稳定性测试的基础知识 xff0c 查看进程状态的常用工具有 top 和 ps 以 top 的输出为例 xff1a S 列 xff08 Status xff09 表示进程的状态 xff0c 图中可见 D
  • Docker 是什么

    本文首发自公众号 LinuxOK xff0c ID为 xff1a Linux ok xff0c 关注公众号第一时间获取更新 xff0c 分享记录职场开发过程中所见所感 Docker 是一个用 GO 语言实现的开源项目 xff0c 它可以将应
  • 哈希表示例

    哈希表的意义在于高效查找 对于查找来说 xff0c 如果数据量特别大 xff0c 二分查找和哈希表算法十分有用了 二分查找前面已经讲过 xff0c 现来讲讲哈希表算法 就像输入数据数组下标返回数组元素一样 xff0c 这样的查找方式是最高效

随机推荐

  • RS-485通讯协议

    1 硬件层协议 通讯协议主要是实现两个设备之间的数据交换功能 xff0c 通讯协议分硬件层协议和软件层协议 硬件层协议决定数据如何传输问题 xff0c 比如要在设备1向设备2发送0x63 xff0c 0x63的二进制数为0110 0011
  • udp通讯中的connect()和bind()函数

    本文收录于微信公众号 LinuxOK xff0c ID为 xff1a Linux ok xff0c 关注公众号第一时间获取更多技术学习文章 udp是一个基于无连接的通讯协议 xff0c 通讯基本模型如下 可以看出 xff0c 不论是在客户端
  • c语言和c++的相互调用

    本文收录于微信公众号 LinuxOK xff0c ID为 xff1a Linux ok xff0c 关注公众号第一时间获取更多技术学习文章 在实际项目开发中 xff0c c和c 43 43 代码的相互调用是常见的 xff0c c 43 43
  • MSVC 版本号对应

    MSVC 43 43 14 0 MSC VER 61 61 1900 Visual Studio 2015 MSVC 43 43 12 0 MSC VER 61 61 1800 Visual Studio 2013 MSVC 43 43 1
  • SPI通讯协议介绍

    来到SPI通讯协议了 废话两句 xff0c SPI很重要 xff0c 这是我在学校时候听那些单片机开发工程师说的 出来实习 xff0c 到后来工作 xff0c 确实如此 xff0c SPI的使用很常见 xff0c 那么自然重要咯 SPI S
  • Qt多线程中的信号与槽

    1 Qt对象的依附性和事务循环 QThread继承自QObject xff0c 自然拥有发射信号 定义槽函数的能力 QThread默认声明了以下几个关键信号 信号只能声明不能定义 xff1a 1 线程开始运行时发射的信号 span clas
  • TCP/IP协议四层模型

    本文收录于微信公众号 LinuxOK xff0c ID为 xff1a Linux ok xff0c 关注公众号第一时间获取更多技术学习文章 接下来的学习重心会放在Linux网络编程这一块 xff0c 我的博客也会随之更新 参照的书籍有 Li
  • 常见的DoS攻击

    本文收录于微信公众号 LinuxOK xff0c ID为 xff1a Linux ok xff0c 关注公众号第一时间获取更多技术学习文章 拒绝服务攻击DoS Denial of Service xff1a 使系统过于忙碌而不能执行有用的业
  • stm32的can总线理解及应用——程序对应stm32f103系列

    CAN 是Controller Area Network 的缩写 xff08 以下称为CAN xff09 xff0c 是ISO国际标准化的串行通信协议 它的通信速度较快 xff0c 通信距离远 xff0c 最高1Mbps xff08 距离小
  • 多视图几何三维重建实战系列之MVSNet

    点击上方 计算机视觉工坊 xff0c 选择 星标 干货第一时间送达 1 概述 MVS是一种从具有一定重叠度的多视图视角中恢复场景的稠密结构的技术 xff0c 传统方法利用几何 光学一致性构造匹配代价 xff0c 进行匹配代价累积 xff0c
  • LiLi-OM: 走向高性能固态激光雷达惯性里程计和建图系统

    点击上方 计算机视觉工坊 xff0c 选择 星标 干货第一时间送达 编辑丨当SLAM遇见小王同学 声明 本文只是个人学习记录 xff0c 侵权可删 论文版权与著作权等全归原作者所有 xff0c 小王自觉遵守 中华人民共和国著作权法 与 伯尔
  • LITv2来袭 | 使用HiLo Attention实现高精度、快速度的变形金刚,下游任务均实时

    点击上方 计算机视觉工坊 xff0c 选择 星标 干货第一时间送达 作者丨ChaucerG 来源丨集智书童 近两年来 xff0c ViT 在计算机视觉领域的取得了很多重大的突破 它们的高效设计主要受计算复杂度的间接度量 xff08 即 FL
  • 问答|多重曝光相关论文有哪些?

  • ECCV 2022 | 清华&腾讯AI Lab提出REALY: 重新思考3D人脸重建的评估方法

    作者丨人脸人体重建 来源丨人脸人体重建 编辑丨极市平台 极市导读 本文围绕3D人脸重建的评估方式进行了重新的思考和探索 作者团队通过构建新数据集RELAY xff0c 囊括了更丰富以及更高质量的脸部区域信息 xff0c 并借助新的流程对先前
  • Arduino for ESP32-----ESP-NOW介绍及使用

    ESP NOW ESP NOW介绍ESP NOW支持以下特性ESP NOW技术也存在以下局限性获取ESP32的MAC地址ESP NOW单向通信 One way communication ESP32单板间的双向通信一对多通信 xff08 一
  • CLIP还能做分割任务?哥廷根大学提出一个使用文本和图像prompt,能同时作三个分割任务的模型CLIPSeg,榨干CLIP能力...

    点击上方 计算机视觉工坊 xff0c 选择 星标 干货第一时间送达 作者丨小马 来源丨我爱计算机视觉 本篇分享 CVPR 2022 论文 Image Segmentation Using Text and Image Prompts xff
  • Faster RCNN算法解析(附源代码,可以直接运行)

    一 前言知识 1 基于Region Proposal xff08 候选区域 xff09 的深度学习目标检测算法 Region Proposal xff08 候选区域 xff09 xff0c 就是预先找出图中目标可能出现的位置 xff0c 通
  • CycleGAN算法原理(附源代码,可直接运行)

    前言 CycleGAN是在今年三月底放在arxiv xff08 论文地址CycleGAN xff09 的一篇文章 xff0c 文章名为Learning to Discover Cross Domain Relations with Gene
  • mask rcnn训练自己的数据集

    前言 最近迷上了mask rcnn xff0c 也是由于自己工作需要吧 xff0c 特意研究了其源代码 xff0c 并基于自己的数据进行训练 本博客参考https blog csdn net disiwei1012 article deta
  • 深度学习实现工业零件的缺陷检测

    介绍 工业零件在制造完成的时候 xff0c 往往需要去检测其完整性和功能性 如下图所示 xff0c 从左上到右下 xff0c 分别是擦花 漏底 碰凹 凸粉 本篇博文主要讲解如何去识别这四类图像 xff0c 所用框架为keras 2 1 6