小编sta*_*ine的帖子

tf.keras.layers.BatchNormalization 与 trainable=False 似乎没有更新其内部移动均值和方差

我试图找出 BatchNormalization 层在 TensorFlow 中的具体表现。我想出了以下一段代码,据我所知,它应该是一个完全有效的 keras 模型,但是 BatchNormalization 的均值和方差似乎没有更新。

来自文档https://www.tensorflow.org/api_docs/python/tf/keras/layers/BatchNormalization

对于 BatchNormalization 层,在该层上设置 trainable = False 意味着该层随后将在推理模式下运行(这意味着它将使用移动均值和移动方差来规范化当前批次,而不是使用均值和当前批次的方差)。

我希望模型在每次后续预测调用时返回不同的值。然而,我看到的是返回 10 次的完全相同的值。谁能向我解释为什么 BatchNormalization 层不更新其内部值?

import tensorflow as tf
import numpy as np

if __name__ == '__main__':

    np.random.seed(1)
    x = np.random.randn(3, 5) * 5 + 0.3

    bn = tf.keras.layers.BatchNormalization(trainable=False, epsilon=1e-9)
    z = input = tf.keras.layers.Input([5])
    z = bn(z)

    model = tf.keras.Model(inputs=input, outputs=z)

    for i in range(10):
        print(x)
        print(model.predict(x))
        print()
Run Code Online (Sandbox Code Playgroud)

我使用TensorFlow 2.1.0

python tensorflow batch-normalization tensorflow2.0

5
推荐指数
1
解决办法
7506
查看次数

使用openCV识别角落页面部分失败

我想获取页面的 4 个角,我采取的步骤:

  1. 转换为灰度
  2. 对图像应用阈值
  3. 应用Canny检测边缘
  4. 之后我用过findContours
  5. 为每个多边形绘制近似多边形,我的假设是相关多边形必须有 4 个顶点。

但一路上我发现我的解决方案有时会失败,显然我的解决方案不够健壮(可能有点幼稚的解决方案)。

在此输入图像描述

我认为纸角检测失败的一些原因是:

  • 手动选择阈值以进行精明检测。
  • epsilon 值相同approxPolyDP

我的代码

import cv2
import numpy as np
image = cv2.imread('page1.jpg') 

descalingFactor = 3
imgheight, imgwidth = image.shape[:2]
resizedImg = cv2.resize(image, (int(imgwidth / descalingFactor), int(imgheight / descalingFactor)),
                        interpolation=cv2.INTER_AREA)

cv2.imshow(winname="original", mat=resizedImg)
cv2.waitKey()

gray = cv2.cvtColor(resizedImg, cv2.COLOR_BGR2GRAY)
cv2.imshow(winname="gray", mat=gray)
cv2.waitKey()
img_blur = cv2.GaussianBlur(gray, (5, 5), 1)
cv2.imshow(winname="blur", mat=img_blur)
cv2.waitKey()

canny = cv2.Canny(gray,
                  threshold1=120,
                  threshold2=255,
                  edges=1)

cv2.imshow(winname="Canny", mat=canny)
cv2.waitKey()

contours, _ = cv2.findContours(image=canny, mode=cv2.RETR_EXTERNAL, method=cv2.CHAIN_APPROX_SIMPLE)

contours = …
Run Code Online (Sandbox Code Playgroud)

python opencv image-processing

4
推荐指数
1
解决办法
1829
查看次数

霍夫线检测到太多线

我正在尝试使用 opencv 中的霍夫线从织物图像中提取垂直线。我应用对比度增强来增强线条,并应用双边过滤来尝试去除其他织物纹理。但是,在应用粗糙线时,代码会检测整个图像上的线条。我尝试使用霍夫的参数,但结果是相同的。

应用直方图均衡和双边滤波器后的输入图像:

在此输入图像描述

这是应用霍夫线后的图像,红色代表检测到的线。显示霍夫检测的输出:

在此输入图像描述

我可以尝试的另一种方法是什么,以便霍夫不会开始将微小的织物图案也检测为线条?

这是我的代码:

`

    img1= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    img2 = cv2.equalizeHist(img1)
    img3 = cv2.equalizeHist(img2)
    img4 = cv2.equalizeHist(img3)
    img5 = cv2.bilateralFilter(img4, 9, 75,75)
    cv2.imshow("threshold",img5)
    edges = cv2.Canny(img4,50,127,apertureSize = 3)
    lines= cv2.HoughLines(edges, 1, math.pi/180.0, 200, np.array([]), 0, 0)
    a,b,c = lines.shape
    for i in range(a):
        rho = lines[i][0][0]
        theta = lines[i][0][1]
        a = math.cos(theta)
        b = math.sin(theta)
        x0, y0 = a*rho, b*rho
        pt1 = ( int(x0+1000*(-b)), int(y0+1000*(a)) )
        pt2 = ( int(x0-1000*(-b)), int(y0-1000*(a)) )
        cv2.line(img, pt1, pt2, (0, 0, 255), …
Run Code Online (Sandbox Code Playgroud)

python opencv image-processing hough-transform

2
推荐指数
1
解决办法
5160
查看次数

如何填充图像中的空洞

我在填充图像的内部漏洞时遇到了一些困难,非常感谢您的帮助。

在分散方面:

mlist_0 = movelist_porous[0]
rx = np.round(mlist_0[:,0])
ry = np.round(mlist_0[:,1])
fig, axs = plt.subplots(1,1,figsize=(12,8))
axs.scatter(mlist_0[:,0], mlist_0[:,1], color='black')
plt.axis('off')
# plt.savefig("test.png", bbox_inches='tight')
plt.show()
Run Code Online (Sandbox Code Playgroud)

在情节方面:

mlist_0 = movelist_porous[0]
rx = np.round(mlist_0[:,0])
ry = np.round(mlist_0[:,1])
fig, axs = plt.subplots(1,1,figsize=(12,8))
axs.plot(mlist_0[:,0], mlist_0[:,1], color='black')
plt.axis('off')
plt.savefig("test.png", bbox_inches='tight')
plt.show()
Run Code Online (Sandbox Code Playgroud)

我想要这样的结果:

这些孔填充了一种颜色(黑色),周围的轮廓填充了另一种颜色(白色),但是,我不确定如何做到这一点。

python opencv image

2
推荐指数
1
解决办法
188
查看次数

opencv:如何合并附近的轮廓以获得一个大的最外轮廓?

我正在尝试将孩子的绘画数字化为 SVG 或透明 png 文件格式,以便它们可以在 Scratch 中使用。白纸应替换为透明背景,并保留所有绘图部分。

我的计划是获取绘图的外部轮廓并生成蒙版,然后使用蒙版获得没有纸张背景的绘图部分。

问题是绘图可能不连续,这意味着可能存在一些小孔,导致整个绘图轮廓分解为许多小轮廓。

现在我想连接最近的最外轮廓以形成一个大的最外轮廓以进行遮蔽。

附上原图和处理后的结果。

在此输入图像描述

代码:

from __future__ import print_function
import cv2 as cv
import numpy as np
import argparse
import random as rng
rng.seed(12345)
def thresh_callback(val):
    threshold = val
    # Detect edges using Canny
    canny_output = cv.Canny(src_gray, threshold, threshold * 2)
    # Find contours
    contours, hierarchy = cv.findContours(canny_output, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    # Draw contours
    drawing = np.zeros((canny_output.shape[0], canny_output.shape[1], 3), dtype=np.uint8)
    for i in range(len(contours)):
        color = (rng.randint(0,256), rng.randint(0,256), rng.randint(0,256))
        cv.drawContours(drawing, contours, i, color, 2, …
Run Code Online (Sandbox Code Playgroud)

python opencv image-processing

2
推荐指数
1
解决办法
1989
查看次数

如何使用 OpenCV Python 在图像中仅保留黑色文本?

我有以下图像:

这个图片

我想只保留黑色文本 0790 并从图片中删除所有文本。这个 stackoverflow 问题教我们如何去除颜色。但是,我需要保留颜色,而不是删除它。

python opencv colors

1
推荐指数
1
解决办法
7116
查看次数

仅裁剪白色像素

我使用 OpenCV 和 Python 编写了以下代码:

import cv2    

cap = cv2.VideoCapture(1)

cv2.namedWindow('Original')
cv2.namedWindow('Captured')
cv2.namedWindow('Deffects')

while True:

    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow('frame', frame)

    if cv2.waitKey(1) == ord('c'):
        cv2.imshow('Captured', gray)
        cv2.imwrite('tswira.jpg', frame)

    if cv2.waitKey(1) == ord('s'):
        img1 = cv2.imread('carte1.jpg', 0)
        img2 = cv2.imread('tswira.JPG', 0)

        img1 = cv2.resize(img1, (250, 250))
        img2 = cv2.resize(img2, (250, 250))

        sub = img1 - img2

        cv2.imshow('Original', img1)
        cv2.imshow('Captured', img2)
        cv2.imshow('Deffects', sub)

    if cv2.waitKey(1) == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出图像:

![在此输入图像描述

然而,我的问题是:如何只裁剪白色区域?

python opencv

0
推荐指数
1
解决办法
1632
查看次数