AttributeError: module ‘tensorflow.keras.utils‘ has no attribute image_dataset_from_directory——解决方法

人工智能66

在树莓派中,为python3.7搭建好tensorflow2.4(搭建的简要过程)的环境之后,跑代码时出现如题的问题
首先,利用:

import tensorflow as tf
print(tf.keras.utils.__file__)

来查找tf.keras.utils模块的__init__.py文件的路径:
AttributeError: module ‘tensorflow.keras.utils‘ has no attribute image_dataset_from_directory——解决方法

然后,打开此 tensorflow/keras/utils/__init__.py文件,发现tensorflow.keras.utils中的函数和类都是从tensorflow.python.keras中import过来的,之后与windows下tensorflow 2.7的__init__.py进行对比。

windows的__init__.py文件如下:
AttributeError: module ‘tensorflow.keras.utils‘ has no attribute image_dataset_from_directory——解决方法
在树莓派上按照:

from tensorflow.python.keras.preprocessing.image_dataset import image_dataset_from_directory

的路径找到了image_dataset_from_directory:

AttributeError: module ‘tensorflow.keras.utils‘ has no attribute image_dataset_from_directory——解决方法
说明树莓派的tf是有这个函数的,只是 tensorflow/keras/utils/__init__.py文件没有import这个函数,所以在运行时没有在__init__.py文件中找到此函数而报错。

可以看到, tensorflow/keras/utils/__init__.py文件是自动生成的,不一定完整:

AttributeError: module ‘tensorflow.keras.utils‘ has no attribute image_dataset_from_directory——解决方法
所以在其中添加上对image_dataset_from_directory函数的引用即可

之后在测试代码中添加:

from tensorflow.python.keras.preprocessing.image_dataset import image_dataset_from_directory

或者,直接在 tensorflow/keras/utils/__init__.py文件中添加上:

from tensorflow.python.keras.preprocessing.image_dataset import image_dataset_from_directory

之后,就可以在代码中正常使用 tf.keras.utils.image_dataset_from_directory

注:类似的问题经过这种查看源代码的方法也许也能得到解决。
比如,相同版本的tensorflow的tf.lite的下一级有funcA这个函数,但是在新环境中出现了AttributeError,那可以先:

import tensorflow as tf
print(tf.lite.__file__)

看一下tf.lite的__init__.py文件的路径:
AttributeError: module ‘tensorflow.keras.utils‘ has no attribute image_dataset_from_directory——解决方法
然后类似上述方法,与能正常引用funcA函数的tensorflow的__init__.py进行对比,在新环境的__init__.py文件中添加上funcA函数相关的引用就可以了

Original: https://blog.csdn.net/weixin_43698781/article/details/123518877
Author: alphanoblaker
Title: AttributeError: module ‘tensorflow.keras.utils‘ has no attribute image_dataset_from_directory——解决方法



相关阅读1

Title: Tensorflow 1.x 和 Pytorch 中 Conv2d Padding的区别

Tensorflow 和 Pytorch 中 Conv2d Padding的区别

Pytorch中Conv2d的Padding

AttributeError: module ‘tensorflow.keras.utils‘ has no attribute image_dataset_from_directory——解决方法

可以是整数,二元组,字符串三种形式。

  1. 整数(int)。如果输入的padding为整数则代表在 上,下,左,右 四个方向都充填一样数量的0或者由 padding_mode 确定的padding类型。
  2. 二元组(tuple)。如果输入的padding 为二元组(padding[0],padding[1]),则padding[0]代表上下两个方向的padding大小,padding[1]则代表左右两个方向的padding大小。
  3. 字符串(str)。字符串模式可选参数为 validsamevalid模式表示不充填, same模式表示输入与输出的形状大小保持一致(但是仅仅适用于stride=1的情况!!!)

可以看出pytorch都是对称的进行padding,要么是四个方向都是一样的padding,要么上下或左右做一样的padding。

最后的输出形状计算公式如下:
H o u t = ⌊ H i n + 2 × padding [ 0 ] − dilation [ 0 ] × ( kernel_size [ 0 ] − 1 ) − 1 stride [ 0 ] + 1 ⌋ H_{out} = \left\lfloor\frac{H_{in} + 2 \times \text{padding}[0] - \text{dilation}[0] \times (\text{kernel_size}[0] - 1) - 1}{\text{stride}[0]} + 1\right\rfloor H o u t ​=⌊stride [0 ]H i n ​+2 ×padding [0 ]−dilation [0 ]×(kernel_size [0 ]−1 )−1 ​+1 ⌋

W o u t = ⌊ W i n + 2 × padding [ 1 ] − dilation [ 1 ] × ( kernel_size [ 1 ] − 1 ) − 1 stride [ 1 ] + 1 ⌋ W_{out} = \left\lfloor\frac{W_{in} + 2 \times \text{padding}[1] - \text{dilation}[1] \times (\text{kernel_size}[1] - 1) - 1}{\text{stride}[1]} + 1\right\rfloor W o u t ​=⌊stride [1 ]W i n ​+2 ×padding [1 ]−dilation [1 ]×(kernel_size [1 ]−1 )−1 ​+1 ⌋

; Tensorflow 中 Conv2d的padding

AttributeError: module ‘tensorflow.keras.utils‘ has no attribute image_dataset_from_directory——解决方法

可以是 字符串和列表两种形式:

  1. 字符串。 字符串是可选 SAMEVALIDSAME模式下,根据以下公式计算各方向的padding:

P a d H = m a x ( f i l t e r H − ( I n H % s t r i d e H ) , 0 ) Pad_{H} = max(filter_H - (In_H \space \% \space stride_H),0)P a d H ​=m a x (f i l t e r H ​−(I n H ​%s t r i d e H ​),0 )

P a d W = m a x ( f i l t e r W − ( I n W % s t r i d e W ) , 0 ) Pad_{W} = max(filter_W - (In_W \space \% \space stride_W),0)P a d W ​=m a x (f i l t e r W ​−(I n W ​%s t r i d e W ​),0 )

P a d t o p = ⌊ P a d H 2 ⌋ Pad_{top} =\left\lfloor \frac{Pad_{H}}{2} \right\rfloor P a d t o p ​=⌊2 P a d H ​​⌋

P a d b o t t o m = P a d H − P a d t o p Pad_{bottom} = Pad_{H} - Pad_{top}P a d b o t t o m ​=P a d H ​−P a d t o p ​

P a d l e f t = ⌊ P a d W 2 ⌋ Pad_{left} = \left\lfloor \frac{Pad_{W}}{2} \right\rfloor P a d l e f t ​=⌊2 P a d W ​​⌋

P a d r i g h t = P a d W − P a d l e f t Pad_{right} = Pad_{W} - Pad_{left}P a d r i g h t ​=P a d W ​−P a d l e f t ​

不同于pytorch,tensorflow的 SAME模式适用于任何的Stride时的padding,输出的形状为:
O u t H = I n H s t r i d e Out_{H} = \frac{In_{H}}{stride}O u t H ​=s t r i d e I n H ​​

O u t W = I n W s t r i d e Out_{W} = \frac{In_{W}}{stride}O u t W ​=s t r i d e I n W ​​

可以看出,tensorflow的padding不要求是对称的,上下左右的padding大小都可以不一样,而且优先进行右边和下边的padding(因为 SAME模式设计的初衷就是为了应对输出形状无法整除卷积核大小,而导致的最右边或最下边无法卷积的情况),当你不关心padding的方向和大小,只关心输出的形状是不是原来形状的整数倍时,就可以无脑使用 SAMEpadding 模式,tensorflow会自动帮你计算好要padding的大小。

VALID模式下,与pytorch一样,直接不padding 。当输入形状不能整除卷积核大小,滑动窗口滑到最右边发现无法满足卷积条件时,多出来的那部分直接会被舍弃掉,输出的形状为:
O u t H = I n H − f i l t e r H + 1 s t r i d e H Out_{H} = \frac{In_H - filter_H + 1}{stride_{H}}O u t H ​=s t r i d e H ​I n H ​−f i l t e r H ​+1 ​

O u t W = I n W − f i l t e r W + 1 s t r i d e W Out_{W} = \frac{In_W - filter_W + 1}{stride_{W}}O u t W ​=s t r i d e W ​I n W ​−f i l t e r W ​+1 ​

  1. 列表(list)。Tensor格式为默认的"NHWC" 时, padding list的格式为 [[0,0],[pad_top,pad_bottom],[pad_left,pad_right],[0,0]];采用的"NCHW"格式存储的Tensor时,padding list 的格式为 [[0,0],[0,0],[pad_top,pad_bottom],[pad_left,pad_right]]。输出的形状为:

O u t H = I n H + pad t o p + pad b o t t o m − dilation H × ( filter H − 1 ) − 1 stride H Out_{H} = \frac{In_{H} + \text{pad}{top}+\text{pad}{bottom} - \text{dilation}{H} \times (\text{filter}{H}- 1) - 1}{\text{stride}_{H}}O u t H ​=stride H ​I n H ​+pad t o p ​+pad b o t t o m ​−dilation H ​×(filter H ​−1 )−1 ​

O u t W = I n W + pad r i g h t + pad l e f t − dilation W × ( filter W − 1 ) − 1 stride W Out_{W} = \frac{In_{W} + \text{pad}{right}+\text{pad}{left} - \text{dilation}{W} \times (\text{filter}{W}- 1) - 1}{\text{stride}_{W}}O u t W ​=stride W ​I n W ​+pad r i g h t ​+pad l e f t ​−dilation W ​×(filter W ​−1 )−1 ​

注意: Tensorflow 和 Pytorch 中Conv2D 对输出的形状大小的小数部分处理不一样。Pytorch中都是做 截断处理 ,或者说 向下取整 ,例如 输出若为 117.5 则直接取 117;而Tensorflow中对小数的处理采用的则是 向上取整 ,输出若为117.5,则取128

参考

https://www.tensorflow.org/api_docs/python/tf/nn#notes_on_padding_2

https://www.tensorflow.org/api_docs/python/tf/nn/conv2d

https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html

Original: https://blog.csdn.net/daimashiren/article/details/123708688
Author: daimashiren
Title: Tensorflow 1.x 和 Pytorch 中 Conv2d Padding的区别

相关阅读2

Title: 云知声-AI离线语音识别芯片&模块系列方案介绍

云知声(Unisound)作为行业内领先的人工智能企业,拥有全栈式的语音技术,将语音识别、语义理解、自然语言处理、语音合成、声音降噪算法、海量语音数据、专用芯片开发 等技术融合实现"云端芯"一体化布局,针对AI语音芯片各个不同的细分市场,共发布5款离线语音识别芯片,芯片及模块出货量已达10KK以上。
下面介绍这5款针对不同细分市场的离线语音识别芯片各自的特色:

一、蜂鸟M(US516P6):性价比之王
特点:
1、单mic,识别距离:0~8米(一般环境下);
2、支持10条离线唤醒词,离线唤醒词支持自定义;
3、支持150条离线命令词,离线命令词与离线回复语支持自定义;
4、支持10条免唤醒的命令词,无需唤醒,说出命令词即可控制设备;
5、识别语言支持:中文、英文;其中中文支持类普通话(比如:四川话、东北话、重庆话等),支持粤语定制;
6、语音效果好:识别率高达90%以上,误唤醒率48小时/1次以内;
7、支持云知声开发者平台:
(1)简洁友好的界面,可自由定制唤醒词、命令词、回复语等;
(2)芯片Pin脚功能配置:简单配置pin脚的具体功能,实现GPIO、PWM、UART等端口根据语音指令输出自定义信号,无需代码开发即可控制外部设备。
(3)多种发音人音色:提供标准女声、甜美女声、可爱女声、台湾女声、标准男声、女童声、男童声七种音色可选
(4)支持二次开发:可下载SDK、技术文档、烧录工具等,支持深度二次开发。
特色功能8、稳态降噪:支持固定频率的噪声降噪处理,比如:风扇的风噪、抽油烟机的噪声;
特色功能9、消费者自学习功能:消费者可以不使用默认固化的唤醒词或命令词,自己按照步骤进行定制唤醒词或命令词;
特色功能10、支持AEC功能(回声消除):可应用音箱类产品上;

缺点:工作时功耗60mA左右,睡眠模块无法通过语音唤醒。
胜任市场:常上电类产品(比如:取暖桌、电动窗帘、晾衣架、智能马桶、灯等)、音箱类市场;

二、蜂鸟L(US513U61):低功耗之王
特点:
1、单mic,识别距离:0~5米(一般环境下);
2、支持5条离线唤醒词,离线唤醒词支持自定义;
3、支持50条离线命令词,离线命令词与离线回复语支持自定义;
4、支持5条免唤醒的命令词,无需唤醒,说出命令词即可控制设备;
5、识别语言支持:中文;其中中文支持类普通话(比如:四川话、东北话、重庆话等),支持粤语定制;
6、语音效果好:识别率高达87%以上,误唤醒率24小时/1次以内;
7、支持云知声开发者平台:
特色功能8、功耗低:睡眠功耗约200uA(可语音唤醒)、工作功耗约4mA;

胜任市场:电池类产品上,功耗要求低的市场:比如 单火线面板、遥控器等;

三、蜂鸟(US527U5):高性能之王
1、双mic,识别距离:0~8米;
2、支持10条离线唤醒词,离线唤醒词支持自定义;
3、支持150条离线命令词,离线命令词与离线回复语支持自定义;
4、识别语言支持:中文、英文;其中中文支持类普通话(比如:四川话、东北话、重庆话等),支持粤语定制;
5、语音效果好:识别率高达95%以上,误唤醒率48小时/1次以内;
6、支持云知声开发者平台;
特色功能:7、支持降噪算法:支持消除环境噪声算法,在噪声场景下效果也好;
特色功能:8、支持AEC功能(回声消除):可应用音箱类产品上;

胜任市场:对识别性能要求高、或工作环境噪声大的产品:抽油烟机、音箱、空调等

四、蜂鸟W(US615U6):离在线之王
1、单mic,识别距离:0~8米(一般环境下);
2、支持10条离线唤醒词,离线唤醒词支持自定义;
3、支持100条离线命令词,离线命令词与离线回复语支持自定义;
4、识别语言支持:中文;其中中文支持类普通话(比如:四川话、东北话、重庆话等),支持粤语定制;
5、语音效果好:识别率高达90%以上,误唤醒率48小时/1次以内;
6、支持云知声开发者平台:
特色功能7、支持WiFi&BT功能
特色功能8、支持阿里AIOT在线平台:飞燕IOT平台、天猫精灵IOT平台

胜任市场:需要离线语音识别及在线IOT功能的产品;

五、蜂鸟B(US665P3):离线语音与BLE混合控制
1、单mic,识别距离:0~5米(一般环境下);
2、支持5条离线唤醒词,离线唤醒词支持自定义;
3、支持50条离线命令词,离线命令词与离线回复语支持自定义;
4、识别语言支持:中文;其中中文支持类普通话(比如:四川话、东北话、重庆话等),支持粤语定制;
5、语音效果好:识别率高达87%以上,误唤醒率24小时/1次以内;
6、支持云知声开发者平台:
特色功能7、支持BLE功能,可用于微信小程序控制;
胜任市场:需要离线语音识别功能及微信小程序BLE控制功能的产品;

有感兴趣的欢迎咨询交流:云知声原厂 高级销售经理 刘先生 18503058393(微信)LiuJiansheng@Unisound.com

Original: https://blog.csdn.net/weixin_49598076/article/details/122862550
Author: 云知声-刘健生_Jason
Title: 云知声-AI离线语音识别芯片&模块系列方案介绍

相关阅读3

Title: [工业相机] 分辨率、精度和公差之间的关系

  • 📢博客主页:https://blog.csdn.net/weixin_43197380
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Loewen丶原创,首发于 CSDN,转载注明出处🙉
  • 📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨

文章预览:

*
-
+ 一. 分辨率(Resolution)
+
* 1、工业相机的分辨率是如何定义的?
* 2、工业相机的分辨率是如何选择的?
+ 二. 精度(Accuracy)
+
* 1、像素精度(Pixel Accuracy)
* 2、定位精度和重复定位精度(Repeat Precision)
+ 三. 公差(Tolerance)
+ 四. 课后作业( Post-Class Exercises)

视觉行业的初学者,甚至是做了1~2年的销售也许还会困惑这样的事情——在拿到检测要求后,不知道根据图纸上的公差,应该选用多少万像素的相机。同时还不明确为什么要三个类似的专有名词来描述同一个事情。

这一期内容就是为了讲明白这一件事情: 分辨率,精度,公差的关系 。从而指导相机的选型。

一. 分辨率(Resolution)

「分辨率」,又称解析度、解像度,可以细分为屏幕分辨率、图像分辨率、打印分辨率和扫描分辨率等。它决定了图像的精细程度,通常表示成每英寸像素(Pixel per inch, ppi)和每英寸点(Dot per inch, dpi),从技术角度说,"像素"(p)只存在于计算机显示领域,而"点"(d)只出现于打印或印刷领域。 摘抄:知乎:分辨率和像素是什么关系?

1、工业相机的分辨率是如何定义的?

区别与上面介绍的分辨率,我们这里所介绍的是「工业相机的分辨率」,它由工业相机所采用的芯片分辨率决定,是芯片靶面排列的像元数量,即表示相机每次采集图像的像素点数(Pixels),下面以 Basler acA2440-75um型号的相机为例:

AttributeError: module ‘tensorflow.keras.utils‘ has no attribute image_dataset_from_directory——解决方法
图中相机芯片的水平/垂直分辨率指的是相机采集到的图像水平方向有2448个像素,垂直方向有2048个像素,那么相机的分辨率为2448(px)×2048(px),得到相机的分辨率为500w像素(5MP)。

知识拓展:相机的总像素和有效像素

现在市场上的工业相机像素标识大部分是相机的「总像素」而不是「有效像素」。「总像素」就指的是相机的CCD或CMOS感光芯片出厂时靶面排列的像元总数(是相机理论上所能达到的最大像素)。「有效像素」是指相机拍摄过程中那些用来感光成像的像素。很多情况下,相机CCD或CMOS感光芯片中有一部分像素是并不参与感光成像的(有用来降噪的、用来做全黑的这部分像素),所以有效像素要低于总像素(最大像素)。 上图中的分辨率5MP指的是相机的总像素而不是有效像素。

; 2、工业相机的分辨率是如何选择的?

拿到一个项目,我们首先需要确定的两个指标就是:

  1. 相机视野: 通过实际检测物体的大小去 确定相机的视野大小;
  2. 像素精度: 客户有明确要求(指的是图像上的像素实际大小);

上面两项指标确定之后,通过公式可求出该选用多大分辨率的相机:

分 辨 率 ( P i x e l ) = 相 机 视 野 ( m m ) ÷ 像 素 精 度 ( m m / P i x e l ) 分辨率(Pixel) = { 相机视野(mm)}÷ { 像素精度(mm /Pixel)}分辨率(P i x e l )=相机视野(m m )÷像素精度(m m /P i x e l )

比如,产品规格是 20mm×20mm大小,要求像素精度 0.014mm/pix,那么我选择的相机视野可以是 28mm×28mm,通过 28mm÷14μm/pix = 2000pix。可以选用 500w分辨率的相机(2448×2048)。

二. 精度(Accuracy)

1、像素精度(Pixel Accuracy)

通过上面选择多大分辨率的相机时,我们使用到了「像素精度」,它表示一个像素在真实世界代表的距离,即一个像素的实际物理尺寸,和分辨率的关系如下:

像 素 精 度 ( m m / p i x ) = 相 机 视 野 ( m m ) ÷ 分 辨 率 ( p i x e l ) 像素精度(mm/pix) = { 相机视野(mm)}÷ { 分辨率(pixel) }像素精度(m m /p i x )=相机视野(m m )÷分辨率(p i x e l )

ps:这里计算的像素精度使用的分辨率是相机上标识的分辨率计算的,也就是上面相机参数图中的水平/垂直分辨率: 2448×2048。如果用上面要求的像素精度值 0.014mm/pix当做测量精度值,肯定不准确,因为一个像素在大多数情况下无法代表被测物特征。

如下图所示,我们用相机拍摄到一条看似"黑白分明"的边缘,那么这条边是否就是最真实的边缘呢?往往把图像放大并仔细观察就可以发现," 边缘"其实是由一些过渡的像素组成,也就是通常我们说的"边缘"很糊。

AttributeError: module ‘tensorflow.keras.utils‘ has no attribute image_dataset_from_directory——解决方法
如果光源和结构的比较良好,成像质量比较高,成像比较"锐利",那么"边缘"就更接近真实边缘;反之,如果成像不好,受帧率、曝光、增益以及其它因素影响,找到的"边缘"可能和真实边缘相差很多个像素。

知识拓展:图像像素精度和芯片像元尺寸的关系

  • 「像素精度」由视野大小和相机分辨率决定的。视野一定,相机分辨率越大,像素精度越小,那么检测精度会越高。
  • 「像元尺寸」由感光芯片大小和相机分辨率决定的。相机分辨率一定,感光芯片越大,像元尺寸越大,单位像元受光面积越大,采集的光信号越多,转为电信号时抗干扰性越好,图像噪点越少。

; 2、定位精度和重复定位精度(Repeat Precision)

  • 👤 定位精度:指的是你的机器设备停止时,实际到达的位置,和你要求到达位置的误差;
  • 👤 重复定位精度:指的是同一个位置,多次定位过去产生的误差。

重复定位精度比定位精度要大得多,一般是 2~3倍,最多不超过 10倍。它介于定位精度和像素精度(分辨率)之间。一般在项目评估时,我习惯将 定位精度按照 1/61/8 个像素精度来计算,重复定位精度按照 1/31/4 个像素精度来计算

重复定位精度越高表明系统定位产品的稳定性越强,反之稳定性越差。获取重复定位精度需要相机重复多次地完成同一变化过程所对应测量结果的最大偏差值。

以向靶子上射箭为例,中心是10环。在相同条件下,有ABC三个人练习射击,射击结果如下图所示:

AttributeError: module ‘tensorflow.keras.utils‘ has no attribute image_dataset_from_directory——解决方法

看图可知:

A的射击结果波动很大,但是离10环相差较近;B的射击结果波动很小,但是离10环相差很大。如果我们把这两人分别看作 两种视觉系统,那么A的精度相对较高,但是重复精度差;B的精度差,但是重复精度高。

而最好的结果则是C,就是重复精度高、精度也高,但是大部分时候我们无法得到C那样的结果。那么如果相同的条件下,只能得到A或B这样的结果,我们应该怎么去取舍呢?

对于射手B的结果而言,如果我们把最终的射击区域整体向左上角移动,当区域中心移动到靶心位置时,B的结果就会非常接近C。

AttributeError: module ‘tensorflow.keras.utils‘ has no attribute image_dataset_from_directory——解决方法
类似的情形是,战争时期优秀的炮手在第一发炮弹射击后,会依据弹着点的实际偏离情况(固定差值)和自身经验(重复精度)对弹道做一个固定值的补偿修正计算,在接下来的射击中能确保大多数炮弹击中预定

那么在视觉检测中,可能因为材质或机构安装导致一些相对固定的数据差异,我们可以通过对含有准确数据的标准品(如:经过三次元测量的产品)进行检测,对检测结果中的固定差异进行补偿,来让"射击区域"转移到靶心的位置。

而对于射手A的结果,无论如何调整靶心位置,都无法从根本上解决因重复精度太差导致的数据误差。

由此可见,对于工业视觉检测而言,重复定位精度更为重要。

三. 公差(Tolerance)

在机器视觉检测中,一般情况下,相机的「像素精度」和「公差」之间关系的两种常规评估策略(像素精度: 0.014mm/pix):

  • 👤 外观检测:检测精度 = 4倍像素精度,即:检测精度可达 0.056mm(±0.028mm)—— 最小可检测的瑕疵或者污点大小为 0.056mm
  • 👤 尺寸测量:测量精度 = 10倍像素精度,即:测量精度可达 0.14mm(±0.007mm)

对一个项目来讲,我们是先从图纸上读到公差(检测精度)的要求。然后再根据上述关系,反推得出我们需要多少像素的相机。

条件:Field of View × 30mm

Camera Types1 Pixel Resoluiton3 Pixel Resoluiton5 Pixel Resoluiton10 Pixel Resoluiton21M pixel 5120×40960.006 mm0.018 mm0.029 mm0.059 mm5M pixel 2432×20500.012 mm0.037 mm0.062 mm0.123 mm2M pixel 1600×12000.019 mm0.056 mm0.094 mm0.188 mm0.3M Pixel 640×4800.047 mm0.141 mm0.234 mm0.469 mm

四. 课后作业( Post-Class Exercises)

项目要求: 相机视野20mm*20mm、污点检测误差正负0.015mm。 需要选择多大分辨率的相机?

① 污点检测误差正负0.015mm——》检测精度可达0.03mm

② 由外观检测精度 = 4 × 像素精度,选择的相机像素精度为:0.03mm ÷ 4 = 0.0075mm/pix

③ 通过20mm ÷ 0.0075mm/pix = 267pix,即相机的分辨率应满足 267pix × 267pix = 713万像素。当然,实际测量或检测时需要考虑的还有很多,例如帧率、曝光、增益等。

如果觉得这篇文章对你有小小的帮助的话,记得帮忙点赞收藏一波哦,博主在此感谢!

Original: https://blog.csdn.net/weixin_43197380/article/details/123346348
Author: 丶布布
Title: [工业相机] 分辨率、精度和公差之间的关系