我在Python中编写了一个自适应颜色阈值函数(因为OpenCV的cv2.adaptiveThreshold不符合我的需要)而且它太慢了.我已尽可能高效,但在1280x720图像上仍需要近500毫秒.
我将非常感谢任何能使这项功能更有效的建议!
这是函数的作用:它使用一个像素厚度的十字形作为结构元素.对于图像中的每个像素,它计算的平均值ksize相邻的像素在四个方向上独立地(即,平均的ksize同一行中的像素的左侧,在同一列的上方,在同一行的右边中,并在下面的同一栏).我以四个平均值结束,每个方向一个.如果像素比左右平均值或者顶部和底部平均值(加上一些常数C)更亮,则该像素仅满足阈值标准.
我使用同时为所有像素逐步计算这些平均值numpy.roll(),但我仍然需要这样做ksize.在ksize通常是20-50.
这是代码,相关部分实际上就是for循环中发生的事情:
def bilateral_adaptive_threshold(img, ksize=20, C=0, mode='floor', true_value=255, false_value=0):
mask = np.full(img.shape, false_value, dtype=np.int16)
left_thresh = np.zeros_like(img, dtype=np.float32) #Store the right-side average of each pixel here
right_thresh = np.zeros_like(img, dtype=np.float32) #Store the left-side average of each pixel here
up_thresh = np.zeros_like(img, dtype=np.float32) #Store the top-side average of each pixel here
down_thresh = np.zeros_like(img, dtype=np.float32) #Store the bottom-side average of each pixel here
for …Run Code Online (Sandbox Code Playgroud) 我有一个名为tensorshape的 3 级张量,[batch_size, axis_1, axis_2]并希望将它batch_size沿第一个轴分成多个切片,如下所示:
batch_size = tf.shape(tensor)[0]
batch_items = tf.split(tensor, num_or_size_splits=batch_size, axis=0)
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用,因为batch_size在构建图形期间尚不知道的值。
我该如何解决这个问题?
我收到此错误:
TypeError: Expected int for argument 'num_split' not <tf.Tensor 'decoded_predictions/strided_slice_15:0' shape=() dtype=int32>.
Run Code Online (Sandbox Code Playgroud)
奇怪的是,尝试batch_size在其他 TensorFlow 函数中使用似乎有效:
tensor = tf.reshape(tensor, [batch_size, -1])
Run Code Online (Sandbox Code Playgroud)
尽管batch_size在图形构建过程中的值未知,但工作正常。
问题是特别多tf.split()吗?
注意:用于重现我的问题的独立示例的所有代码都可以在下面找到。
我有一个 tf.keras.models.Model() 实例,希望使用自定义低级 TensorFlow API 训练循环对其进行训练。作为此训练循环的一部分,我需要确保我的自定义训练循环更新来自图层类型(例如tf.keras.layers.BatchNormalization. 为了实现这一点,我从Francois Chollet 的回答中了解到,我需要model.updates在每个训练步骤中进行评估。
问题是:当您使用 向模型提供训练数据时,这有效feed_dict,但当您使用对象时,它不起作用tf.data.Dataset。
考虑以下抽象示例(您可以在下面找到一个具体示例来重现问题):
model = tf.keras.models.Model(...) # Some tf.keras model
dataset = tf.data.Dataset.from_tensor_slices(...) # Some tf.data.Dataset
iterator = dataset.make_one_shot_iterator()
features, labels = iterator.get_next()
model_output = model(features)
with tf.Session() as sess:
ret = sess.run(model.updates)
Run Code Online (Sandbox Code Playgroud)
这个sess.run()调用会抛出错误
InvalidArgumentError: You must feed a value for placeholder tensor 'input_1' with dtype float and shape [?,224,224,3]
Run Code Online (Sandbox Code Playgroud)
这个错误显然不应该被提出。我不需要为占位符提供值input_1,因为我在 a 上调用我的模型tf.data.Dataset,而不是通过 向占位符提供输入数据 …
Hydrogen for Atom 中的“run cell”语法是如何使用的?我放置了多个
# %%
在我的代码中按照官方手册进行标记,但是当我在任意两个标记之间按 Shift+Enter 时,它仍然只执行该行,而不是整个单元格块。我还尝试了手册描述的其他语法格式,但它们都没有执行整个单元格。
标题包含以下问题:在Python HDF5库中h5py,我flush()之前需要一个文件close()吗?
或者关闭文件是否已确保可能仍在缓冲区中的任何数据都将写入磁盘?
什么是冲洗点?什么时候需要冲洗?
我正在尝试创建一个std::vector可以std::function使用std::variant.
为什么以下代码无法编译:
#include <functional>
#include <variant>
#include <vector>
int main()
{
std::vector<std::variant<
std::function< int (const std::vector<float>&, int) >,
std::function< float (const std::vector<float>&, int) >
>> func_vector;
func_vector.emplace_back( [] (const std::vector<float>& ret, int index) { return ret.size(); });
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题发生在emplace_back(). 编译这个会给出一长串错误,列出的第一个是:
error: no matching function for call to ‘std::variant<std::function<int(const std::vector<float, std::allocator<float> >&, int)>, std::function<float(const std::vector<float, std::allocator<float> >&, int)> >::variant(main()::<lambda(const std::vector<float>&, int)>)’
{ ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
它说它找不到匹配的函数,但是究竟是什么调用呢?
我试图放置的 lambda 恰好具有我在变体中指定的类型之一的签名,所以一切都应该没问题,不是吗?
我有一个Anaconda虚拟环境,其中多次安装了许多Python软件包,通常安装在不同版本中,例如:
$ conda list
...
singledispatch 3.4.0.3 py35_0
sip 4.18 py35_0
six 1.10.0 <pip>
six 1.11.0 <pip>
six 1.10.0 py35_0
snowballstemmer 1.2.1 py35_0
sockjs-tornado 1.0.3 py35_0
sphinx 1.5.4 py35_0
spyder 3.1.3 py35_0
sqlalchemy 1.1.9 py35_0
sqlite 3.13.0 0
statsmodels 0.8.0 np111py35_0
sympy 1.0 py35_0
tensorflow-gpu 1.3.0 <pip>
tensorflow-gpu 1.0.1 <pip>
tensorflow-tensorboard 0.1.6 <pip>
terminado 0.6 py35_0
testpath 0.3 py35_0
Theano 0.9.0 <pip>
tk 8.5.18 0
toolz 0.8.2 py35_0
tornado 4.4.2 py35_0
tqdm 4.11.2 <pip>
tqdm 4.15.0 py35_0
traitlets 4.3.2 py35_0 …Run Code Online (Sandbox Code Playgroud) 我想编写一个纯 Numpy 函数来更改 RGB 图像(表示为 Numpy uint8 数组)的对比度,但是,我编写的函数不起作用,我不明白为什么。
这是一个示例图像:
这是一个使用 PIL 且工作正常的函数:
def change_contrast(img, factor):
def contrast(pixel):
return 128 + factor * (pixel - 128)
return img.point(contrast)
from PIL import Image
img = Image.fromarray(img.astype(np.uint8))
img1 = change_contrast(img, factor=2.0)
Run Code Online (Sandbox Code Playgroud)
输出:
现在这是一个纯 Numpy 函数,在我看来,它与上面的其他函数执行完全相同的操作,但它根本不起作用:
def change_contrast2(img, factor):
return 128 + factor * (img - 128)
img1 = change_contrast2(img, factor=2.0)
Run Code Online (Sandbox Code Playgroud)
其中img是 Numpy 数组。输出是这样的:
我不明白发生了什么事,如果有任何提示我会很高兴!
我想在完整的加权二分图中找到最佳的最大匹配,其中两组顶点的大小差异很大,即一组顶点非常大,另一组非常小。
匈牙利算法不是解决此问题的好方法,因为它将虚拟顶点添加到较小的集合中,使得两个集合具有相同的大小,因此我失去了其中一个顶点集合非常小的所有潜在效率增益。
我已将对象(边界框)分为两组,并且有一个相似性度量(杰卡德重叠)来衡量任意两个对象的相似程度。我想产生两个集合之间的匹配,使得所有单独匹配的相似度之和最大。
问题在于,其中一组仅包含很少的对象,例如 10 个,而第二组非常大,例如 10,000 个对象。第一组中的 10 个对象中的每一个都需要与第二组中的 10,000 个对象中的一个进行匹配。
两组大小的不对称让我想知道如何有效地做到这一点。我无法使用匈牙利算法生成 10,000 x 10,000 矩阵。
过滤器的 和 方法均setMin采用an作为参数。setMaxpcl::CropBoxEigen::Vector4f
为什么是 4f 而不是 3f?第四维度有什么用?
python ×5
numpy ×2
tensorflow ×2
algorithm ×1
anaconda ×1
atom-editor ×1
bipartite ×1
c++ ×1
c++17 ×1
graph-theory ×1
h5py ×1
hydrogen ×1
keras ×1
matching ×1
opencv ×1
performance ×1
variant ×1