1

我正在尝试使用 ssd_mobilenet_v1_coco 模型检测对象。我自己训练的模型文件 .pb 文件用于检测。成功构建后,单击运行按钮,我收到以下错误。

 "Not found: Op type not registered 'NonMaxSuppressionV2' in binary running on IPhone. Make sure the Op and Kernel are registered in the binary running in this process. "

我可以在下面的链接中为已经训练好的 .pb 模型文件执行和启动 ios 应用程序。请给出解决上述问题并启动 ios 应用程序的解决方案。 https://github.com/JieHe96/iOS_Tensorflow_ObjectDetection_Example

4

1 回答 1

0

问题正是错误所说的 - 您正在使用的模型(.pb 文件)正在使用 NonMaxSuppressionV2 操作,但在为 iOS 平台编译时未向 tensorflow 库注册。这是因为张量流限制了 iOS/Android 平台上的很多操作(尤其是那些通常只用于训练的操作),因此编译库的大小更小。

要纠正上述问题,您可以执行以下操作 - 更新此处存在的 ops_to_register.h 文件。

"NonMaxSuppressionV2Op<CPUDevice>"(如果要在数组中间添加,请不要忘记添加 coma)到kNecessaryOpKernelClasses数组。像这样 -

constexpr const char* kNecessaryOpKernelClasses[] = { 
"BinaryOp< CPUDevice, functor::add<float>>",
"BinaryOp< CPUDevice, functor::add<int32>>",
"AddNOp< CPUDevice, float>",
"NonMaxSuppressionOp<CPUDevice>",
//Added NonMaxSuppressionV2Op
"NonMaxSuppressionV2Op<CPUDevice>",
...
//Other operations
...
};

而且isequal(op, "NonMaxSuppressionV2")还要constexpr inline bool ShouldRegisterOp(const char op[])

像这样 -

constexpr inline bool ShouldRegisterOp(const char op[]) {
  return false
     || isequal(op, "Add")
     || isequal(op, "NoOp")
     || isequal(op, "NonMaxSuppression")
     //Added NonMaxSuppressionV2
     || isequal(op, "NonMaxSuppressionV2")
     || isequal(op, "Pack")
     //other stuff
     ...
  ;

修改此文件后,按照 repo 自述文件的快速启动部分中所述从头开始重新运行所有内容。

如果您仍然丢失一些其他操作。对他们重复相同的程序也将起作用。

希望有帮助。

于 2018-02-28T10:29:10.777 回答