我试图找出 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
我想获取页面的 4 个角,我采取的步骤:
findContours但一路上我发现我的解决方案有时会失败,显然我的解决方案不够健壮(可能有点幼稚的解决方案)。
我认为纸角检测失败的一些原因是:
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) 我正在尝试使用 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) 我在填充图像的内部漏洞时遇到了一些困难,非常感谢您的帮助。
在分散方面:
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)
我想要这样的结果:
这些孔填充了一种颜色(黑色),周围的轮廓填充了另一种颜色(白色),但是,我不确定如何做到这一点。
我正在尝试将孩子的绘画数字化为 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) 我使用 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)
这是我得到的输出图像:
然而,我的问题是:如何只裁剪白色区域?