https://m.blog.naver.com/rhrkdfus/221531159811
참고한 사이트
실패한 글임 실패한 글임
(안돌아가 안돌아가
포기해야함
이거 때문에 내 노트북을 포멧했어요)
CUDA랑 CUDNN의 문제때문에
그걸 맞출 자신이 있다면 진행을 하는게 맞아요
그 관련자료가 너무 오래된 감도 있고,
사용하는 사람도 적어서
텐서플로우에서 제작한
Mediapipe를 갈아타는게 좋음
(근데, ㄱmediapip는 gpu설정을 모르겠음)
https://github.com/CMU-Perceptual-Computing-Lab/openpose
우선 깃 클론으로 사용하자.
나는 폴더를 만들었는데, 굳이 안해도 되는듯 하다.
추가로 폴더에서
git submodule update --init --recursive --remote
이거를 해주고
cd models
./getModels.sh
설치를 진행한다
설치를 진행하면 두 개의 파일이 다운로드 되는데
models에 pose 폴더를 들어가면
mpi 에 접속한다.
이 두개의 파일을 사용할 것이니까
이 두 파일의 위치 정보를 복사하자.
/home/du/openPose/openpose/models/pose/mpi/pose_iter_160000.caffemodel
/home/du/openPose/openpose/models/pose/mpi/pose_deploy_linevec_faster_4_stages.prototxt
필요에 따라서 간단한 경로로 옮길 수 있다.
이제 ws 폴더로 이동하고
opencv 가상환경을 접속한다.
즉.. OpenCV가 다운로드 되어 있어야한다.
이제 비주얼 코드를 열어서 다음 코드를 입력하자
코드의 출처는
https://m.blog.naver.com/rhrkdfus/221531159811
조금 내 입맛대로 수정하면
# fashion_pose.py : MPII를 사용한 신체부위 검출
import cv2
# MPII에서 각 파트 번호, 선으로 연결될 POSE_PAIRS
BODY_PARTS = { "Head": 0, "Neck": 1, "RShoulder": 2, "RElbow": 3, "RWrist": 4,
"LShoulder": 5, "LElbow": 6, "LWrist": 7, "RHip": 8, "RKnee": 9,
"RAnkle": 10, "LHip": 11, "LKnee": 12, "LAnkle": 13, "Chest": 14,
"Background": 15 }
POSE_PAIRS = [ ["Head", "Neck"], ["Neck", "RShoulder"], ["RShoulder", "RElbow"],
["RElbow", "RWrist"], ["Neck", "LShoulder"], ["LShoulder", "LElbow"],
["LElbow", "LWrist"], ["Neck", "Chest"], ["Chest", "RHip"], ["RHip", "RKnee"],
["RKnee", "RAnkle"], ["Chest", "LHip"], ["LHip", "LKnee"], ["LKnee", "LAnkle"] ]
# 각 파일 path
# 자신에 맞게 수정하세요.
protoFile = "/home/du/openPose/openpose/models/pose/mpi/pose_deploy_linevec.prototxt"
weightsFile = "/home/du/openPose/openpose/models/pose/mpi/pose_deploy_linevec_faster_4_stages.prototxt"
# 위의 path에 있는 network 불러오기
net = cv2.dnn.readNetFromCaffe(protoFile, weightsFile)
# 이미지 읽어오기
image = cv2.imread("./new.png")
# frame.shape = 불러온 이미지에서 height, width, color 받아옴
imageHeight, imageWidth, _ = image.shape
# network에 넣기위해 전처리
inpBlob = cv2.dnn.blobFromImage(image, 1.0 / 255, (imageWidth, imageHeight), (0, 0, 0), swapRB=False, crop=False)
# network에 넣어주기
net.setInput(inpBlob)
# 결과 받아오기
output = net.forward()
# output.shape[0] = 이미지 ID, [1] = 출력 맵의 높이, [2] = 너비
H = output.shape[2]
W = output.shape[3]
print("이미지 ID : ", len(output[0]), ", H : ", output.shape[2], ", W : ",output.shape[3]) # 이미지 ID
# 키포인트 검출시 이미지에 그려줌
points = []
for i in range(0,15):
# 해당 신체부위 신뢰도 얻음.
probMap = output[0, i, :, :]
# global 최대값 찾기
minVal, prob, minLoc, point = cv2.minMaxLoc(probMap)
# 원래 이미지에 맞게 점 위치 변경
x = (imageWidth * point[0]) / W
y = (imageHeight * point[1]) / H
# 키포인트 검출한 결과가 0.1보다 크면(검출한곳이 위 BODY_PARTS랑 맞는 부위면) points에 추가, 검출했는데 부위가 없으면 None으로
if prob > 0.1 :
cv2.circle(image, (int(x), int(y)), 3, (0, 255, 255), thickness=-1, lineType=cv2.FILLED) # circle(그릴곳, 원의 중심, 반지름, 색)
cv2.putText(image, "{}".format(i), (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1, lineType=cv2.LINE_AA)
points.append((int(x), int(y)))
else :
points.append(None)
cv2.imshow("Output-Keypoints",image)
cv2.waitKey(0)
# 이미지 복사
imageCopy = image
# 각 POSE_PAIRS별로 선 그어줌 (머리 - 목, 목 - 왼쪽어깨, ...)
for pair in POSE_PAIRS:
partA = pair[0] # Head
partA = BODY_PARTS[partA] # 0
partB = pair[1] # Neck
partB = BODY_PARTS[partB] # 1
#print(partA," 와 ", partB, " 연결\n")
if points[partA] and points[partB]:
cv2.line(imageCopy, points[partA], points[partB], (0, 255, 0), 2)
cv2.imshow("Output-Keypoints",imageCopy)
cv2.waitKey(0)
cv2.destroyAllWindows()
일단 코드 해석은 나중에 생각하자.
이미지의 출처
<a href="https://kr.freepik.com/free-photo/full-length-side-view-of-a-athlete-woman-doing-squats_7796946.htm#query=squats&position=2&from_view=keyword">작가 drobotdean</a> 출처 Freepik
해당 사진의 pose estimation해보자
사진의 크기가 너무 크다.
코드에 사진의 크기를 리사이징 해줄 코드를 넣어야한다.
잠시 쥬피터가 필요할듯
import matplotlib.pyplot as plt
import cv2
pic = cv2.imread('./sq.jpg', )
plt.imshow(pic)
용량이 엄청 크면 에러가 발생한다.
그래서 사진의 리사이징 작업이 필요하다.
pic = cv2.resize(pic, (700, 500))
plt.imshow(pic)
이 부분을 코드에 추가해주었다.
# fashion_pose.py : MPII를 사용한 신체부위 검출
import cv2
# MPII에서 각 파트 번호, 선으로 연결될 POSE_PAIRS
BODY_PARTS = { "Head": 0, "Neck": 1, "RShoulder": 2, "RElbow": 3, "RWrist": 4,
"LShoulder": 5, "LElbow": 6, "LWrist": 7, "RHip": 8, "RKnee": 9,
"RAnkle": 10, "LHip": 11, "LKnee": 12, "LAnkle": 13, "Chest": 14,
"Background": 15 }
POSE_PAIRS = [ ["Head", "Neck"], ["Neck", "RShoulder"], ["RShoulder", "RElbow"],
["RElbow", "RWrist"], ["Neck", "LShoulder"], ["LShoulder", "LElbow"],
["LElbow", "LWrist"], ["Neck", "Chest"], ["Chest", "RHip"], ["RHip", "RKnee"],
["RKnee", "RAnkle"], ["Chest", "LHip"], ["LHip", "LKnee"], ["LKnee", "LAnkle"] ]
# 각 파일 path
# 자신에 맞게 수정하세요.
protoFile = "/home/du/openPose/openpose/models/pose/mpi/pose_deploy_linevec_faster_4_stages.prototxt"
weightsFile = "/home/du/openPose/openpose/models/pose/mpi/pose_iter_160000.caffemodel"
# 위의 path에 있는 network 불러오기
net = cv2.dnn.readNetFromCaffe(protoFile, weightsFile)
# 이미지 읽어오기
image = cv2.imread("./sq.jpg")
image = cv2.resize(image, (700, 500))
# frame.shape = 불러온 이미지에서 height, width, color 받아옴
imageHeight, imageWidth, _ = image.shape
# network에 넣기위해 전처리
inpBlob = cv2.dnn.blobFromImage(image, 1.0 / 255, (imageWidth, imageHeight), (0, 0, 0), swapRB=False, crop=False)
# network에 넣어주기
net.setInput(inpBlob)
# 결과 받아오기
output = net.forward()
# output.shape[0] = 이미지 ID, [1] = 출력 맵의 높이, [2] = 너비
H = output.shape[2]
W = output.shape[3]
print("이미지 ID : ", len(output[0]), ", H : ", output.shape[2], ", W : ",output.shape[3]) # 이미지 ID
# 키포인트 검출시 이미지에 그려줌
points = []
for i in range(0,15):
# 해당 신체부위 신뢰도 얻음.
probMap = output[0, i, :, :]
# global 최대값 찾기
minVal, prob, minLoc, point = cv2.minMaxLoc(probMap)
# 원래 이미지에 맞게 점 위치 변경
x = (imageWidth * point[0]) / W
y = (imageHeight * point[1]) / H
# 키포인트 검출한 결과가 0.1보다 크면(검출한곳이 위 BODY_PARTS랑 맞는 부위면) points에 추가, 검출했는데 부위가 없으면 None으로
if prob > 0.1 :
cv2.circle(image, (int(x), int(y)), 3, (0, 255, 255), thickness=-1, lineType=cv2.FILLED) # circle(그릴곳, 원의 중심, 반지름, 색)
cv2.putText(image, "{}".format(i), (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1, lineType=cv2.LINE_AA)
points.append((int(x), int(y)))
else :
points.append(None)
cv2.imshow("Output-Keypoints",image)
cv2.waitKey(0)
# 이미지 복사
imageCopy = image
# 각 POSE_PAIRS별로 선 그어줌 (머리 - 목, 목 - 왼쪽어깨, ...)
for pair in POSE_PAIRS:
partA = pair[0] # Head
partA = BODY_PARTS[partA] # 0
partB = pair[1] # Neck
partB = BODY_PARTS[partB] # 1
#print(partA," 와 ", partB, " 연결\n")
if points[partA] and points[partB]:
cv2.line(imageCopy, points[partA], points[partB], (0, 255, 0), 2)
cv2.imshow("Output-Keypoints",imageCopy)
cv2.waitKey(0)
cv2.destroyAllWindows()
생각보다 멍청하다.
이걸 어떻게 잘 올리지?
뭔가 빼먹은거 같은데
도큐먼트를 확인해야할듯
https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/installation/0_index.md
아 중간에 cmake를 설치해야하는 것으로 보인다.
cd {OpenPose_folder}
mkdir build/
cd build/
cmake-gui ..
다시 pose 폴더로 들어가자
거기서 위의 코드를 실행하면 다음같은 오류가 발생한다.
대충 문제가 많이 발생할건데 괜찮아? 이런느낌쓰
그러면 혹시모르니까 아래 명령어로 진행을 해보자.
이런 창이 하나 나온다.
위에 폴더 설정이 잘되어있는지 확인하고
우분투에서는 Unix로 설정하고
이런 창이 나온다.
여기서 build python을 체크하고
다시 configure를 클릭한다.
엔비디아 GPU가 있다면 GPU_MODE를 건들면 된다.
그리고 쿠다가 필요하니 꼭 설치해야한다. 그게 아니면 CPU 모드로 설정해야한다.
아마 텐서플로우를 했다면 깔려있을 것임
그러면 이제 generate 를 누르고, open Project를 클릭한다.
그러면 설정이 완료되었다.
실행을 하고 싶다면
터미널에
cd build/
make -j`nproc`
다음을 입력해보자.
오류난다.
sudo apt-get install libhdf5-serial-dev hdf5-tools
이거를 설치해서 해결하라고 하는데
https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/installation/0_index.md
일단
https://apincan.tistory.com/5
이분이 설치하라는것도 다 설치했다.
./build/examples/openpose/openpose.bin --video examples/media/video.avi
이제 이거를 돌리는데
쿠다가 out of memory가 나온다.
싯발
돌리는 애들은 다 1050 인데
이건 3060이다..
https://9521ljh.medium.com/pose-estimation-feat-openpose-6607f2092b26
일단 도큐먼트 상에서 해결법을 찾았따.
여기에 들어가면 찾을 수 있더라
https://dagshub.com/Dean/openpose/src/master/doc/quick_start.md#quick-start
./build/examples/openpose/openpose.bin --net_resolution "640x320" --scale_number 4 --scale_gap 0.25
스케일을 낮췄다 그러니 뜨는게
CUDNN_STATUS_NOT_INITIALIZED
./build/examples/openpose/openpose.bin --net_resolution "640x320" --scale_number 4 --scale_gap 0.25 --hand --hand_scale_number 6 --hand_scale_range 0.4 --face
cudnn을 다운받으라는거 같은데
재부팅~~~
안된다.
'ㅇ 프로젝트 > TEAM_운동보조프로그램' 카테고리의 다른 글
2. 딥러닝 프로젝트 설계 구체화 (0) | 2023.01.15 |
---|---|
1. 미디어 파이프에서 배경없이 Pose만 추출하기 (0) | 2023.01.15 |
0. 딥러닝 팀프로젝트 설계 (0) | 2023.01.15 |
미디어파이프(media pipe)를 우분투에 설치 해보자. (0) | 2023.01.12 |
딥러닝 프로젝트 주제 구상 (0) | 2023.01.09 |