我想初始化一个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.
如何解决这个问题呢?