1

我想初始化一个openose实例,将它保存为一个类字段,这个类实现了一些grpc相关的逻辑,将监听一个端口,我想从这个端口传递请求(一个图像)到保存的openpose实例进行检测,然后将检测结果返回到该端口。

谷歌搜索后,我找到了 PyOpenpose,并像这样实现我的设计:

  class PosingServer:
    def __init__(self, setting=PosingSetting):
        self.setting=setting
        self.initNetwork()

    def detect(self, req):
            #detect pose
            net.detectPose(req.image)
            #detect pose
           return net.getKeypoints(net.KeypointType.POSE)[0]

    def initNetwork(self):
        setting = self.setting
        self.net = OP.OpenPose(setting.poseSize, setting.faceHandSize, setting.outSize,\
                               setting.modelType, setting.modelFolder, setting.logLevel,\
                               setting.downloadHeatmaps)

   *****grpc related stuffs*******

PosingServer 运行后,它可以接收 rpc 请求并执行检测,但这一行:

return net.getKeypoints(net.KeypointType.POSE)[0]

给出错误:

The CPU/GPU pointer data cannot be accessed from a different thread.

Coming from:
- src/openpose/pose/poseExtractor.cpp:checkThread():341
- src/openpose/pose/poseExtractor.cpp:checkThread():345
- src/openpose/pose/poseExtractor.cpp:getPoseKeypoints():265
ERROR    Exception calling application: 
Error:
The CPU/GPU pointer data cannot be accessed from a different thread.

Coming from:
- src/openpose/pose/poseExtractor.cpp:checkThread():341
- src/openpose/pose/poseExtractor.cpp:checkThread():345
- src/openpose/pose/poseExtractor.cpp:getPoseKeypoints():265
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/grpc/_server.py", line 377, in _call_behavior
    return behavior(argument, context), True
  File "server/pose/PosingServer.py", line 81, in carryOut
    return self.detector.detect(req)
  File "server/pose/PosingServer.py", line 40, in detect
    return net.getKeypoints(net.KeypointType.POSE)[0])
RuntimeError: 
Error:
The CPU/GPU pointer data cannot be accessed from a different thread.

如何解决这个问题呢?

4

1 回答 1

0

在调用之前,您的PoseExtractor对象应该使用该函数进行初始化。我在开发自己的多线程应用程序时遇到了完全相同的错误,因为在我尝试从子线程获取姿势关键点时,从父线程调用了初始化。我通过确保在同一个线程中调用这两个函数来解决这个问题。PoseExtractor::initializationOnThread()getPoseKeypoints()

于 2019-03-18T06:49:49.523 回答