0

每个人!

我正在尝试并行化使用来自 mexopencv ( KNearest.m, KNearest_.mexw32 ) 的 mex 文件的算法。

该程序基于 vlfeat (vlsift.mex32) + mexopencv (KNearest.m 和 KNearest_.mexw32)。我对从图像中获得的描述符进行分类。

所有代码都位于文件共享中

\\ LAB-07 \ untitled \ DISTRIB \ (this is the program code) 
\\ LAB-07 \ untitled \ + cv (mexopencv)

当我使用matlabpool close运行程序时,一切正常。

然后我打开 matlabpool(每台 2 核上的 2 台计算机。最终有 4 个工作人员,但现在我只用于测试计算机上的 2 个工作人员并运行程序) PathDependencises from fileshare -> \LAB-07\untitled\DISTRIB\ , \LAB-07\无标题+cv

在 parfor 循环之前,我在本地机器上训练分类器

classifiers = cv.KNearest
classifiers.train(Descriptors',Labels','MaxK',1)

然后运行 ​​parfor

descr=vlsift(img);
PredictClasses = classifiers.predict(descr');

错误

Error in ==> KNearest>KNearest.find_nearest at 173
Invalid MEX-file '\\LAB-07\untitled\+cv\private\KNearest_.mexw32': 
The specified module could not be found.

那是KNearest.m找到,但没有KNearest_.mexw32。因为 KNearest_.mexw32 位于私人文件夹中,所以我将代码 KNearest.m (它呼吁 KNearest_ () 的所有地方都更改为 cv.KNearest_ ()。示例:this.id = сv.KNearest_ ())并放置在一个文件夹中KNearest_.mexw32 KNearest.m。结果,得到同样的错误

在 matlabpool 上打开文件后立即对工作人员进行搜索

pctRunOnAll which ('KNearest.m')
'KNearest.m' not found.
'KNearest.m' not found.
'KNearest.m' not found.

pctRunOnAll which ('KNearest_.mexw32')
'KNearest_.mexw32' not found.
'KNearest_.mexw32' not found.
'KNearest_.mexw32' not found.

cd \LAB-07\untitled+cv 之后

 pctRunOnAll which ('KNearest.m')
\\LAB-07\untitled\+cv\KNearest.m
\\LAB-07\untitled\+cv\KNearest.m  % cv.KNearest constructor
\\LAB-07\untitled\+cv\KNearest.m

>> pctRunOnAll which ('KNearest_.mexw32')
\\LAB-07\untitled\+cv\KNearest_.mexw32
\\LAB-07\untitled\+cv\KNearest_.mexw32
\\LAB-07\untitled\+cv\KNearest_.mexw32

我跑了和 FileDependecies,但结果相同。

我不知道这是否相关,我 在训练之后和 parfor 之前执行程序分类器期间显示

classifiers = 

  cv.KNearest handle
  Package: cv

  Properties:
              id: 5
            MaxK: 1
        VarCount: 128
     SampleCount: 9162
    IsRegression: 0

  Methods, Events, Superclasses

在分类器之前的 parfor 中。预测

classifiers = 

  cv.KNearest handle
  Package: cv

  Properties:
    id: 5

我测试了文件 cvtColor.mexw32。我在一个文件夹中只留下了 2 个文件 cvtColor.mexw32 和 vl_sift

parfor i=1:2
 im1=imread('Copy_of_start40.png');
 im_vl = im2single(rgb2gray(im1));
 desc=vl_sift(im_vl);
 im1 = cvtColor(im1,'RGB2GRAY');
end

同样的错误,并且 vl_sift 工作,cvtColor 没有...

4

2 回答 2

0

埃德里克谢谢。parfor 的 PATH 存在问题。使用http://www.dependencywalker.com/查看丢失的文件并将它们放在文件夹 +cv 中。只有这种方法适用于 parfor。

但是在 parfor 中预测会出错

PredictClasses = classifiers.predict(descr');

??? Error using ==> parallel_function at 598
Error in ==> KNearest>KNearest.find_nearest at 173
Unexpected Standard exception from MEX file.

What() is:..\..\..\src\opencv\modules\ml\src\knearest.cpp:365: error: (-2) The search
tree must be constructed first using train method

我通过每次在 parfor train中调用来解决这个问题

classifiers = cv.KNearest
classifiers.train(Descriptors',Labels','MaxK',1)

但这是一个丑陋的解决方案:)

于 2014-05-17T06:42:56.867 回答
0

如果工作机器可以看到您共享文件系统中的代码,那么您应该不需要FileDependencies或根本不需要PathDependencies。看起来您正在使用 Windows。在我看来,最可能的问题是文件权限。默认情况下,在 Windows 上的作业管理器下运行的 MDCS 工作人员不使用您自己的帐户运行(我认为他们使用“LocalSystem”帐户运行),因此很可能根本无法访问共享文件系统上的文件。您可以尝试确保您的代码是世界可读的。

否则,您可以使用类似的方法将文件添加到池中

matlabpool('addfiledependencies', {'\\LAB-07\untitled\+cv'})

请注意,MATLAB 将带有+in 的目录解释为定义“包”,不确定在您的情况下这是否是故意的。

编辑

啊,重新阅读您的原始帖子以及您在下面的评论 - 我怀疑问题是工作人员看不到您的 MEX 文件所依赖的库。(这就是“无效的 MEX 文件”消息所指示的内容)。您可以使用http://www.dependencywalker.com/来确定您的 MEX 文件的依赖项是什么,并确保它们在工作人员上可用(我认为他们需要在 上%PATH%,或在当前目录中) .

于 2014-05-15T13:51:47.943 回答