我想初始化一个openose实例,将它保存为一个class字段,这个类实现了一些与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.如何解决这个问题?
发布于 2019-03-18 14:49:50
在调用getPoseKeypoints()之前,应该使用函数PoseExtractor::initializationOnThread()对PoseExtractor对象进行初始化。我在开发自己的多线程应用程序时遇到了完全相同的错误,因为初始化是从父线程调用的,而我试图从子线程获取姿势关键点。我通过确保在同一线程中调用这两个函数解决了这个问题。
https://stackoverflow.com/questions/48345744
复制相似问题