是否有任何工业计算机视觉相机附带Python接口,或者有一个完善的第三方解决方案?
我一直在使用网络摄像头做一些工作,可以通过OpenCV轻松访问.但是,现在我需要一款更坚固,更灵活的相机.我需要能够设置某些参数,如曝光和增益.我希望尽可能避免使用其他语言而不是Python,因为Python是我最熟悉的.
我已经看过uuye相机的插件,如pyueye,看起来很好,除了这在Windows中不能很好地工作.
我有一个像这样工作的生成器函数(Python)
def Mygenerator(x, y, z, ...):
while True:
# code that makes two matrices based on sequences of input arrays
yield (matrix1, matrix2)
Run Code Online (Sandbox Code Playgroud)
我想要做的是添加此生成器的输出.这条线完成了这项工作:
M1, M2 = reduce(lambda x, y: x[0] + y[0], x[1] + y[1], Mygenerator(x, y, z, ...))
Run Code Online (Sandbox Code Playgroud)
我想将其并行化以加速计算.重要的是Mygenerator的输出会随着它的产生而减少,因为它list(Mygenerator(...))会占用太多内存.
我正在做一个基本上归结为求解矩阵方程的项目
A.dot(x) = d
Run Code Online (Sandbox Code Playgroud)
其中A是一个到 2000 年尺寸大约为 10 000 000 的矩阵(我最终希望在两个方向上都增加它)。
A显然不适合内存,所以这必须并行化。我通过解决A.T.dot(A).dot(x) = A.T.dot(d)来做到这一点。A.T将有 2000 到 2000 年的维度。它可以通过将A和d分成块来计算,A_i然后d_i沿着行计算A_i.T.dot(A_i)和A_i.T.dot(d_i),然后对这些进行求和。完美的并行化。我已经能够使用多处理模块来实现这一点,但是 1)A由于内存使用,难以进一步扩展(在两个维度上都增加),以及 2)不漂亮(因此不容易维护)。
Dask 似乎是解决这两个问题的非常有前途的库,我也做了一些尝试。我的A矩阵计算起来很复杂:它基于大约 15 个不同的数组(大小等于 中的行数A),其中一些用于迭代算法来评估相关的勒让德函数。当 chunk 很小(10000 行)时,构建任务图需要很长时间,并且需要大量内存(内存增加与调用迭代算法相吻合)。当块较大(50000 行)时,计算前的内存消耗要小很多,但在计算时会迅速耗尽A.T.dot(A)。我尝试过cache.Chest,但它显着减慢了计算速度。
任务图必须非常大和复杂——调用A._visualize()崩溃。使用更简单的A矩阵,它可以直接执行此操作(请参阅@MRocklin 的响应)。有没有办法让我简化它?
任何关于如何解决这个问题的建议将不胜感激。
作为一个玩具的例子,我试过
A = da.ones((2e3, 1e7), chunks = (2e3, 1e3))
(A.T.dot(A)).compute()
Run Code Online (Sandbox Code Playgroud)
这也失败了,用尽了所有内存,只有一个核心处于活动状态。使用chunks = (2e3, 1e5) …
如果我们有一个3 x 3旋转矩阵R,它可以乘以v一个3 x N数组 - 一个N列向量数组- 来产生一个新3 x N的旋转向量数组,如下所示:
v_rotated = R.dot(v)
Run Code Online (Sandbox Code Playgroud)
现在假设我们有一个N x M x 3数组,N时间M向量,我想用N不同的3 x 3旋转矩阵旋转(向量的每个"行"一个旋转矩阵).这对循环来说很简单,但是有一种更快,更紧凑(矢量化)的方法,例如使用numpy's dot或tensorproduct?
循环实现的示例代码:
from numpy import cos, sin, array, pi, linspace, random
# 100 different rotation matrices:
R = [array([[1, 0, 0], [0, cos(theta), -sin(theta)], [0, sin(theta), cos(theta)]]) for theta in linspace(0, pi, 100)] …Run Code Online (Sandbox Code Playgroud)