Fazhong Liu commited on
Commit
40bae10
·
1 Parent(s): 16617b2
.gitattributes CHANGED
@@ -1,35 +1,35 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
- *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
- *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
1
+ # *.7z filter=lfs diff=lfs merge=lfs -text
2
+ # *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ # *.bin filter=lfs diff=lfs merge=lfs -text
4
+ # *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ # *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ # *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ # *.gz filter=lfs diff=lfs merge=lfs -text
8
+ # *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ # *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ # *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ # *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ # *.model filter=lfs diff=lfs merge=lfs -text
13
+ # *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ # *.npy filter=lfs diff=lfs merge=lfs -text
15
+ # *.npz filter=lfs diff=lfs merge=lfs -text
16
+ # *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ # *.ot filter=lfs diff=lfs merge=lfs -text
18
+ # *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ # *.pb filter=lfs diff=lfs merge=lfs -text
20
+ # *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ # *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ # *.pt filter=lfs diff=lfs merge=lfs -text
23
+ # *.pth filter=lfs diff=lfs merge=lfs -text
24
+ # *.rar filter=lfs diff=lfs merge=lfs -text
25
+ # *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ # saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ # *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ # *.tar filter=lfs diff=lfs merge=lfs -text
29
+ # *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ # *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ # *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ # *.xz filter=lfs diff=lfs merge=lfs -text
33
+ # *.zip filter=lfs diff=lfs merge=lfs -text
34
+ # *.zst filter=lfs diff=lfs merge=lfs -text
35
+ # *tfevents* filter=lfs diff=lfs merge=lfs -text
.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ *.caffemodel
2
+ *.pth
OIP.jpg ADDED
app.py ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import cv2
2
+ import matplotlib.pyplot as plt
3
+ import copy
4
+ import numpy as np
5
+ import gradio as gr
6
+ from src import model
7
+ from src import util
8
+ from src.body import Body
9
+ from src.hand import Hand
10
+
11
+
12
+ def pose_estimation(test_image):
13
+ bgr_image_path = './test.png'
14
+ with open(bgr_image_path, 'wb') as bgr_file:
15
+ bgr_file.write(test_image)
16
+ # 加载估计模型
17
+ body_estimation = Body('model/body_pose_model.pth')
18
+ hand_estimation = Hand('model/hand_pose_model.pth')
19
+
20
+ test_image = bgr_image_path
21
+ oriImg = cv2.imread(test_image) # B,G,R order
22
+
23
+ # oriImg = test_image
24
+
25
+ # 姿态估计
26
+ candidate, subset = body_estimation(oriImg)
27
+ canvas = copy.deepcopy(oriImg)
28
+ # 绘制身体姿态
29
+ canvas = util.draw_bodypose(canvas, candidate, subset)
30
+ # print(candidate)
31
+ # print(subset)
32
+ # detect hand
33
+ hands_list = util.handDetect(candidate, subset, oriImg)
34
+
35
+ all_hand_peaks = []
36
+ for x, y, w, is_left in hands_list:
37
+ # cv2.rectangle(canvas, (x, y), (x+w, y+w), (0, 255, 0), 2, lineType=cv2.LINE_AA)
38
+ # cv2.putText(canvas, 'left' if is_left else 'right', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
39
+
40
+ # if is_left:
41
+ # plt.imshow(oriImg[y:y+w, x:x+w, :][:, :, [2, 1, 0]])
42
+ # plt.show()
43
+ peaks = hand_estimation(oriImg[y:y+w, x:x+w, :])
44
+ peaks[:, 0] = np.where(peaks[:, 0]==0, peaks[:, 0], peaks[:, 0]+x)
45
+ peaks[:, 1] = np.where(peaks[:, 1]==0, peaks[:, 1], peaks[:, 1]+y)
46
+ # else:
47
+ # peaks = hand_estimation(cv2.flip(oriImg[y:y+w, x:x+w, :], 1))
48
+ # peaks[:, 0] = np.where(peaks[:, 0]==0, peaks[:, 0], w-peaks[:, 0]-1+x)
49
+ # peaks[:, 1] = np.where(peaks[:, 1]==0, peaks[:, 1], peaks[:, 1]+y)
50
+ # print(peaks)
51
+ all_hand_peaks.append(peaks)
52
+
53
+ canvas = util.draw_handpose(canvas, all_hand_peaks)
54
+
55
+ plt.imshow(canvas[:, :, [2, 1, 0]])
56
+ plt.axis('off')
57
+ plt.savefig('./out.jpg')
58
+ # plt.show()
59
+ return './out.jpg'
60
+
61
+ # Convert the image path to bytes for Gradio to display
62
+ def convert_image_to_bytes(image_path):
63
+ with open(image_path, "rb") as image_file:
64
+ return image_file.read()
65
+
66
+ # Gradio interface
67
+ with gr.Blocks() as demo:
68
+ gr.Markdown("# Pose Estimation")
69
+ with gr.Row():
70
+ image = gr.File(label="Upload Image", type="binary")
71
+ output_image = gr.Image(label="Estimation Result")
72
+ submit_button = gr.Button("Start Estimation")
73
+
74
+ # Run pose estimation and display results when the button is clicked
75
+ submit_button.click(
76
+ pose_estimation,
77
+ inputs=[image],
78
+ outputs=[output_image]
79
+ )
80
+
81
+ # Clear the results
82
+ clear_button = gr.Button("Clear")
83
+ def clear_outputs():
84
+ output_image.clear()
85
+ clear_button.click(
86
+ clear_outputs,
87
+ inputs=[],
88
+ outputs=[output_image]
89
+ )
90
+
91
+ if __name__ == "__main__":
92
+ demo.launch(debug=True)
model/body_pose_deploy.prototxt ADDED
@@ -0,0 +1,2976 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ input: "image"
2
+ input_dim: 1
3
+ input_dim: 3
4
+ input_dim: 1 # This value will be defined at runtime
5
+ input_dim: 1 # This value will be defined at runtime
6
+ layer {
7
+ name: "conv1_1"
8
+ type: "Convolution"
9
+ bottom: "image"
10
+ top: "conv1_1"
11
+ param {
12
+ lr_mult: 1.0
13
+ decay_mult: 1
14
+ }
15
+ param {
16
+ lr_mult: 2.0
17
+ decay_mult: 0
18
+ }
19
+ convolution_param {
20
+ num_output: 64
21
+ pad: 1
22
+ kernel_size: 3
23
+ weight_filler {
24
+ type: "gaussian"
25
+ std: 0.01
26
+ }
27
+ bias_filler {
28
+ type: "constant"
29
+ }
30
+ }
31
+ }
32
+ layer {
33
+ name: "relu1_1"
34
+ type: "ReLU"
35
+ bottom: "conv1_1"
36
+ top: "conv1_1"
37
+ }
38
+ layer {
39
+ name: "conv1_2"
40
+ type: "Convolution"
41
+ bottom: "conv1_1"
42
+ top: "conv1_2"
43
+ param {
44
+ lr_mult: 1.0
45
+ decay_mult: 1
46
+ }
47
+ param {
48
+ lr_mult: 2.0
49
+ decay_mult: 0
50
+ }
51
+ convolution_param {
52
+ num_output: 64
53
+ pad: 1
54
+ kernel_size: 3
55
+ weight_filler {
56
+ type: "gaussian"
57
+ std: 0.01
58
+ }
59
+ bias_filler {
60
+ type: "constant"
61
+ }
62
+ }
63
+ }
64
+ layer {
65
+ name: "relu1_2"
66
+ type: "ReLU"
67
+ bottom: "conv1_2"
68
+ top: "conv1_2"
69
+ }
70
+ layer {
71
+ name: "pool1_stage1"
72
+ type: "Pooling"
73
+ bottom: "conv1_2"
74
+ top: "pool1_stage1"
75
+ pooling_param {
76
+ pool: MAX
77
+ kernel_size: 2
78
+ stride: 2
79
+ }
80
+ }
81
+ layer {
82
+ name: "conv2_1"
83
+ type: "Convolution"
84
+ bottom: "pool1_stage1"
85
+ top: "conv2_1"
86
+ param {
87
+ lr_mult: 1.0
88
+ decay_mult: 1
89
+ }
90
+ param {
91
+ lr_mult: 2.0
92
+ decay_mult: 0
93
+ }
94
+ convolution_param {
95
+ num_output: 128
96
+ pad: 1
97
+ kernel_size: 3
98
+ weight_filler {
99
+ type: "gaussian"
100
+ std: 0.01
101
+ }
102
+ bias_filler {
103
+ type: "constant"
104
+ }
105
+ }
106
+ }
107
+ layer {
108
+ name: "relu2_1"
109
+ type: "ReLU"
110
+ bottom: "conv2_1"
111
+ top: "conv2_1"
112
+ }
113
+ layer {
114
+ name: "conv2_2"
115
+ type: "Convolution"
116
+ bottom: "conv2_1"
117
+ top: "conv2_2"
118
+ param {
119
+ lr_mult: 1.0
120
+ decay_mult: 1
121
+ }
122
+ param {
123
+ lr_mult: 2.0
124
+ decay_mult: 0
125
+ }
126
+ convolution_param {
127
+ num_output: 128
128
+ pad: 1
129
+ kernel_size: 3
130
+ weight_filler {
131
+ type: "gaussian"
132
+ std: 0.01
133
+ }
134
+ bias_filler {
135
+ type: "constant"
136
+ }
137
+ }
138
+ }
139
+ layer {
140
+ name: "relu2_2"
141
+ type: "ReLU"
142
+ bottom: "conv2_2"
143
+ top: "conv2_2"
144
+ }
145
+ layer {
146
+ name: "pool2_stage1"
147
+ type: "Pooling"
148
+ bottom: "conv2_2"
149
+ top: "pool2_stage1"
150
+ pooling_param {
151
+ pool: MAX
152
+ kernel_size: 2
153
+ stride: 2
154
+ }
155
+ }
156
+ layer {
157
+ name: "conv3_1"
158
+ type: "Convolution"
159
+ bottom: "pool2_stage1"
160
+ top: "conv3_1"
161
+ param {
162
+ lr_mult: 1.0
163
+ decay_mult: 1
164
+ }
165
+ param {
166
+ lr_mult: 2.0
167
+ decay_mult: 0
168
+ }
169
+ convolution_param {
170
+ num_output: 256
171
+ pad: 1
172
+ kernel_size: 3
173
+ weight_filler {
174
+ type: "gaussian"
175
+ std: 0.01
176
+ }
177
+ bias_filler {
178
+ type: "constant"
179
+ }
180
+ }
181
+ }
182
+ layer {
183
+ name: "relu3_1"
184
+ type: "ReLU"
185
+ bottom: "conv3_1"
186
+ top: "conv3_1"
187
+ }
188
+ layer {
189
+ name: "conv3_2"
190
+ type: "Convolution"
191
+ bottom: "conv3_1"
192
+ top: "conv3_2"
193
+ param {
194
+ lr_mult: 1.0
195
+ decay_mult: 1
196
+ }
197
+ param {
198
+ lr_mult: 2.0
199
+ decay_mult: 0
200
+ }
201
+ convolution_param {
202
+ num_output: 256
203
+ pad: 1
204
+ kernel_size: 3
205
+ weight_filler {
206
+ type: "gaussian"
207
+ std: 0.01
208
+ }
209
+ bias_filler {
210
+ type: "constant"
211
+ }
212
+ }
213
+ }
214
+ layer {
215
+ name: "relu3_2"
216
+ type: "ReLU"
217
+ bottom: "conv3_2"
218
+ top: "conv3_2"
219
+ }
220
+ layer {
221
+ name: "conv3_3"
222
+ type: "Convolution"
223
+ bottom: "conv3_2"
224
+ top: "conv3_3"
225
+ param {
226
+ lr_mult: 1.0
227
+ decay_mult: 1
228
+ }
229
+ param {
230
+ lr_mult: 2.0
231
+ decay_mult: 0
232
+ }
233
+ convolution_param {
234
+ num_output: 256
235
+ pad: 1
236
+ kernel_size: 3
237
+ weight_filler {
238
+ type: "gaussian"
239
+ std: 0.01
240
+ }
241
+ bias_filler {
242
+ type: "constant"
243
+ }
244
+ }
245
+ }
246
+ layer {
247
+ name: "relu3_3"
248
+ type: "ReLU"
249
+ bottom: "conv3_3"
250
+ top: "conv3_3"
251
+ }
252
+ layer {
253
+ name: "conv3_4"
254
+ type: "Convolution"
255
+ bottom: "conv3_3"
256
+ top: "conv3_4"
257
+ param {
258
+ lr_mult: 1.0
259
+ decay_mult: 1
260
+ }
261
+ param {
262
+ lr_mult: 2.0
263
+ decay_mult: 0
264
+ }
265
+ convolution_param {
266
+ num_output: 256
267
+ pad: 1
268
+ kernel_size: 3
269
+ weight_filler {
270
+ type: "gaussian"
271
+ std: 0.01
272
+ }
273
+ bias_filler {
274
+ type: "constant"
275
+ }
276
+ }
277
+ }
278
+ layer {
279
+ name: "relu3_4"
280
+ type: "ReLU"
281
+ bottom: "conv3_4"
282
+ top: "conv3_4"
283
+ }
284
+ layer {
285
+ name: "pool3_stage1"
286
+ type: "Pooling"
287
+ bottom: "conv3_4"
288
+ top: "pool3_stage1"
289
+ pooling_param {
290
+ pool: MAX
291
+ kernel_size: 2
292
+ stride: 2
293
+ }
294
+ }
295
+ layer {
296
+ name: "conv4_1"
297
+ type: "Convolution"
298
+ bottom: "pool3_stage1"
299
+ top: "conv4_1"
300
+ param {
301
+ lr_mult: 1.0
302
+ decay_mult: 1
303
+ }
304
+ param {
305
+ lr_mult: 2.0
306
+ decay_mult: 0
307
+ }
308
+ convolution_param {
309
+ num_output: 512
310
+ pad: 1
311
+ kernel_size: 3
312
+ weight_filler {
313
+ type: "gaussian"
314
+ std: 0.01
315
+ }
316
+ bias_filler {
317
+ type: "constant"
318
+ }
319
+ }
320
+ }
321
+ layer {
322
+ name: "relu4_1"
323
+ type: "ReLU"
324
+ bottom: "conv4_1"
325
+ top: "conv4_1"
326
+ }
327
+ layer {
328
+ name: "conv4_2"
329
+ type: "Convolution"
330
+ bottom: "conv4_1"
331
+ top: "conv4_2"
332
+ param {
333
+ lr_mult: 1.0
334
+ decay_mult: 1
335
+ }
336
+ param {
337
+ lr_mult: 2.0
338
+ decay_mult: 0
339
+ }
340
+ convolution_param {
341
+ num_output: 512
342
+ pad: 1
343
+ kernel_size: 3
344
+ weight_filler {
345
+ type: "gaussian"
346
+ std: 0.01
347
+ }
348
+ bias_filler {
349
+ type: "constant"
350
+ }
351
+ }
352
+ }
353
+ layer {
354
+ name: "relu4_2"
355
+ type: "ReLU"
356
+ bottom: "conv4_2"
357
+ top: "conv4_2"
358
+ }
359
+ layer {
360
+ name: "conv4_3_CPM"
361
+ type: "Convolution"
362
+ bottom: "conv4_2"
363
+ top: "conv4_3_CPM"
364
+ param {
365
+ lr_mult: 1.0
366
+ decay_mult: 1
367
+ }
368
+ param {
369
+ lr_mult: 2.0
370
+ decay_mult: 0
371
+ }
372
+ convolution_param {
373
+ num_output: 256
374
+ pad: 1
375
+ kernel_size: 3
376
+ weight_filler {
377
+ type: "gaussian"
378
+ std: 0.01
379
+ }
380
+ bias_filler {
381
+ type: "constant"
382
+ }
383
+ }
384
+ }
385
+ layer {
386
+ name: "relu4_3_CPM"
387
+ type: "ReLU"
388
+ bottom: "conv4_3_CPM"
389
+ top: "conv4_3_CPM"
390
+ }
391
+ layer {
392
+ name: "conv4_4_CPM"
393
+ type: "Convolution"
394
+ bottom: "conv4_3_CPM"
395
+ top: "conv4_4_CPM"
396
+ param {
397
+ lr_mult: 1.0
398
+ decay_mult: 1
399
+ }
400
+ param {
401
+ lr_mult: 2.0
402
+ decay_mult: 0
403
+ }
404
+ convolution_param {
405
+ num_output: 128
406
+ pad: 1
407
+ kernel_size: 3
408
+ weight_filler {
409
+ type: "gaussian"
410
+ std: 0.01
411
+ }
412
+ bias_filler {
413
+ type: "constant"
414
+ }
415
+ }
416
+ }
417
+ layer {
418
+ name: "relu4_4_CPM"
419
+ type: "ReLU"
420
+ bottom: "conv4_4_CPM"
421
+ top: "conv4_4_CPM"
422
+ }
423
+ layer {
424
+ name: "conv5_1_CPM_L1"
425
+ type: "Convolution"
426
+ bottom: "conv4_4_CPM"
427
+ top: "conv5_1_CPM_L1"
428
+ param {
429
+ lr_mult: 1.0
430
+ decay_mult: 1
431
+ }
432
+ param {
433
+ lr_mult: 2.0
434
+ decay_mult: 0
435
+ }
436
+ convolution_param {
437
+ num_output: 128
438
+ pad: 1
439
+ kernel_size: 3
440
+ weight_filler {
441
+ type: "gaussian"
442
+ std: 0.01
443
+ }
444
+ bias_filler {
445
+ type: "constant"
446
+ }
447
+ }
448
+ }
449
+ layer {
450
+ name: "relu5_1_CPM_L1"
451
+ type: "ReLU"
452
+ bottom: "conv5_1_CPM_L1"
453
+ top: "conv5_1_CPM_L1"
454
+ }
455
+ layer {
456
+ name: "conv5_1_CPM_L2"
457
+ type: "Convolution"
458
+ bottom: "conv4_4_CPM"
459
+ top: "conv5_1_CPM_L2"
460
+ param {
461
+ lr_mult: 1.0
462
+ decay_mult: 1
463
+ }
464
+ param {
465
+ lr_mult: 2.0
466
+ decay_mult: 0
467
+ }
468
+ convolution_param {
469
+ num_output: 128
470
+ pad: 1
471
+ kernel_size: 3
472
+ weight_filler {
473
+ type: "gaussian"
474
+ std: 0.01
475
+ }
476
+ bias_filler {
477
+ type: "constant"
478
+ }
479
+ }
480
+ }
481
+ layer {
482
+ name: "relu5_1_CPM_L2"
483
+ type: "ReLU"
484
+ bottom: "conv5_1_CPM_L2"
485
+ top: "conv5_1_CPM_L2"
486
+ }
487
+ layer {
488
+ name: "conv5_2_CPM_L1"
489
+ type: "Convolution"
490
+ bottom: "conv5_1_CPM_L1"
491
+ top: "conv5_2_CPM_L1"
492
+ param {
493
+ lr_mult: 1.0
494
+ decay_mult: 1
495
+ }
496
+ param {
497
+ lr_mult: 2.0
498
+ decay_mult: 0
499
+ }
500
+ convolution_param {
501
+ num_output: 128
502
+ pad: 1
503
+ kernel_size: 3
504
+ weight_filler {
505
+ type: "gaussian"
506
+ std: 0.01
507
+ }
508
+ bias_filler {
509
+ type: "constant"
510
+ }
511
+ }
512
+ }
513
+ layer {
514
+ name: "relu5_2_CPM_L1"
515
+ type: "ReLU"
516
+ bottom: "conv5_2_CPM_L1"
517
+ top: "conv5_2_CPM_L1"
518
+ }
519
+ layer {
520
+ name: "conv5_2_CPM_L2"
521
+ type: "Convolution"
522
+ bottom: "conv5_1_CPM_L2"
523
+ top: "conv5_2_CPM_L2"
524
+ param {
525
+ lr_mult: 1.0
526
+ decay_mult: 1
527
+ }
528
+ param {
529
+ lr_mult: 2.0
530
+ decay_mult: 0
531
+ }
532
+ convolution_param {
533
+ num_output: 128
534
+ pad: 1
535
+ kernel_size: 3
536
+ weight_filler {
537
+ type: "gaussian"
538
+ std: 0.01
539
+ }
540
+ bias_filler {
541
+ type: "constant"
542
+ }
543
+ }
544
+ }
545
+ layer {
546
+ name: "relu5_2_CPM_L2"
547
+ type: "ReLU"
548
+ bottom: "conv5_2_CPM_L2"
549
+ top: "conv5_2_CPM_L2"
550
+ }
551
+ layer {
552
+ name: "conv5_3_CPM_L1"
553
+ type: "Convolution"
554
+ bottom: "conv5_2_CPM_L1"
555
+ top: "conv5_3_CPM_L1"
556
+ param {
557
+ lr_mult: 1.0
558
+ decay_mult: 1
559
+ }
560
+ param {
561
+ lr_mult: 2.0
562
+ decay_mult: 0
563
+ }
564
+ convolution_param {
565
+ num_output: 128
566
+ pad: 1
567
+ kernel_size: 3
568
+ weight_filler {
569
+ type: "gaussian"
570
+ std: 0.01
571
+ }
572
+ bias_filler {
573
+ type: "constant"
574
+ }
575
+ }
576
+ }
577
+ layer {
578
+ name: "relu5_3_CPM_L1"
579
+ type: "ReLU"
580
+ bottom: "conv5_3_CPM_L1"
581
+ top: "conv5_3_CPM_L1"
582
+ }
583
+ layer {
584
+ name: "conv5_3_CPM_L2"
585
+ type: "Convolution"
586
+ bottom: "conv5_2_CPM_L2"
587
+ top: "conv5_3_CPM_L2"
588
+ param {
589
+ lr_mult: 1.0
590
+ decay_mult: 1
591
+ }
592
+ param {
593
+ lr_mult: 2.0
594
+ decay_mult: 0
595
+ }
596
+ convolution_param {
597
+ num_output: 128
598
+ pad: 1
599
+ kernel_size: 3
600
+ weight_filler {
601
+ type: "gaussian"
602
+ std: 0.01
603
+ }
604
+ bias_filler {
605
+ type: "constant"
606
+ }
607
+ }
608
+ }
609
+ layer {
610
+ name: "relu5_3_CPM_L2"
611
+ type: "ReLU"
612
+ bottom: "conv5_3_CPM_L2"
613
+ top: "conv5_3_CPM_L2"
614
+ }
615
+ layer {
616
+ name: "conv5_4_CPM_L1"
617
+ type: "Convolution"
618
+ bottom: "conv5_3_CPM_L1"
619
+ top: "conv5_4_CPM_L1"
620
+ param {
621
+ lr_mult: 1.0
622
+ decay_mult: 1
623
+ }
624
+ param {
625
+ lr_mult: 2.0
626
+ decay_mult: 0
627
+ }
628
+ convolution_param {
629
+ num_output: 512
630
+ pad: 0
631
+ kernel_size: 1
632
+ weight_filler {
633
+ type: "gaussian"
634
+ std: 0.01
635
+ }
636
+ bias_filler {
637
+ type: "constant"
638
+ }
639
+ }
640
+ }
641
+ layer {
642
+ name: "relu5_4_CPM_L1"
643
+ type: "ReLU"
644
+ bottom: "conv5_4_CPM_L1"
645
+ top: "conv5_4_CPM_L1"
646
+ }
647
+ layer {
648
+ name: "conv5_4_CPM_L2"
649
+ type: "Convolution"
650
+ bottom: "conv5_3_CPM_L2"
651
+ top: "conv5_4_CPM_L2"
652
+ param {
653
+ lr_mult: 1.0
654
+ decay_mult: 1
655
+ }
656
+ param {
657
+ lr_mult: 2.0
658
+ decay_mult: 0
659
+ }
660
+ convolution_param {
661
+ num_output: 512
662
+ pad: 0
663
+ kernel_size: 1
664
+ weight_filler {
665
+ type: "gaussian"
666
+ std: 0.01
667
+ }
668
+ bias_filler {
669
+ type: "constant"
670
+ }
671
+ }
672
+ }
673
+ layer {
674
+ name: "relu5_4_CPM_L2"
675
+ type: "ReLU"
676
+ bottom: "conv5_4_CPM_L2"
677
+ top: "conv5_4_CPM_L2"
678
+ }
679
+ layer {
680
+ name: "conv5_5_CPM_L1"
681
+ type: "Convolution"
682
+ bottom: "conv5_4_CPM_L1"
683
+ top: "conv5_5_CPM_L1"
684
+ param {
685
+ lr_mult: 1.0
686
+ decay_mult: 1
687
+ }
688
+ param {
689
+ lr_mult: 2.0
690
+ decay_mult: 0
691
+ }
692
+ convolution_param {
693
+ num_output: 38
694
+ pad: 0
695
+ kernel_size: 1
696
+ weight_filler {
697
+ type: "gaussian"
698
+ std: 0.01
699
+ }
700
+ bias_filler {
701
+ type: "constant"
702
+ }
703
+ }
704
+ }
705
+ layer {
706
+ name: "conv5_5_CPM_L2"
707
+ type: "Convolution"
708
+ bottom: "conv5_4_CPM_L2"
709
+ top: "conv5_5_CPM_L2"
710
+ param {
711
+ lr_mult: 1.0
712
+ decay_mult: 1
713
+ }
714
+ param {
715
+ lr_mult: 2.0
716
+ decay_mult: 0
717
+ }
718
+ convolution_param {
719
+ num_output: 19
720
+ pad: 0
721
+ kernel_size: 1
722
+ weight_filler {
723
+ type: "gaussian"
724
+ std: 0.01
725
+ }
726
+ bias_filler {
727
+ type: "constant"
728
+ }
729
+ }
730
+ }
731
+ layer {
732
+ name: "concat_stage2"
733
+ type: "Concat"
734
+ bottom: "conv5_5_CPM_L1"
735
+ bottom: "conv5_5_CPM_L2"
736
+ bottom: "conv4_4_CPM"
737
+ top: "concat_stage2"
738
+ concat_param {
739
+ axis: 1
740
+ }
741
+ }
742
+ layer {
743
+ name: "Mconv1_stage2_L1"
744
+ type: "Convolution"
745
+ bottom: "concat_stage2"
746
+ top: "Mconv1_stage2_L1"
747
+ param {
748
+ lr_mult: 4.0
749
+ decay_mult: 1
750
+ }
751
+ param {
752
+ lr_mult: 8.0
753
+ decay_mult: 0
754
+ }
755
+ convolution_param {
756
+ num_output: 128
757
+ pad: 3
758
+ kernel_size: 7
759
+ weight_filler {
760
+ type: "gaussian"
761
+ std: 0.01
762
+ }
763
+ bias_filler {
764
+ type: "constant"
765
+ }
766
+ }
767
+ }
768
+ layer {
769
+ name: "Mrelu1_stage2_L1"
770
+ type: "ReLU"
771
+ bottom: "Mconv1_stage2_L1"
772
+ top: "Mconv1_stage2_L1"
773
+ }
774
+ layer {
775
+ name: "Mconv1_stage2_L2"
776
+ type: "Convolution"
777
+ bottom: "concat_stage2"
778
+ top: "Mconv1_stage2_L2"
779
+ param {
780
+ lr_mult: 4.0
781
+ decay_mult: 1
782
+ }
783
+ param {
784
+ lr_mult: 8.0
785
+ decay_mult: 0
786
+ }
787
+ convolution_param {
788
+ num_output: 128
789
+ pad: 3
790
+ kernel_size: 7
791
+ weight_filler {
792
+ type: "gaussian"
793
+ std: 0.01
794
+ }
795
+ bias_filler {
796
+ type: "constant"
797
+ }
798
+ }
799
+ }
800
+ layer {
801
+ name: "Mrelu1_stage2_L2"
802
+ type: "ReLU"
803
+ bottom: "Mconv1_stage2_L2"
804
+ top: "Mconv1_stage2_L2"
805
+ }
806
+ layer {
807
+ name: "Mconv2_stage2_L1"
808
+ type: "Convolution"
809
+ bottom: "Mconv1_stage2_L1"
810
+ top: "Mconv2_stage2_L1"
811
+ param {
812
+ lr_mult: 4.0
813
+ decay_mult: 1
814
+ }
815
+ param {
816
+ lr_mult: 8.0
817
+ decay_mult: 0
818
+ }
819
+ convolution_param {
820
+ num_output: 128
821
+ pad: 3
822
+ kernel_size: 7
823
+ weight_filler {
824
+ type: "gaussian"
825
+ std: 0.01
826
+ }
827
+ bias_filler {
828
+ type: "constant"
829
+ }
830
+ }
831
+ }
832
+ layer {
833
+ name: "Mrelu2_stage2_L1"
834
+ type: "ReLU"
835
+ bottom: "Mconv2_stage2_L1"
836
+ top: "Mconv2_stage2_L1"
837
+ }
838
+ layer {
839
+ name: "Mconv2_stage2_L2"
840
+ type: "Convolution"
841
+ bottom: "Mconv1_stage2_L2"
842
+ top: "Mconv2_stage2_L2"
843
+ param {
844
+ lr_mult: 4.0
845
+ decay_mult: 1
846
+ }
847
+ param {
848
+ lr_mult: 8.0
849
+ decay_mult: 0
850
+ }
851
+ convolution_param {
852
+ num_output: 128
853
+ pad: 3
854
+ kernel_size: 7
855
+ weight_filler {
856
+ type: "gaussian"
857
+ std: 0.01
858
+ }
859
+ bias_filler {
860
+ type: "constant"
861
+ }
862
+ }
863
+ }
864
+ layer {
865
+ name: "Mrelu2_stage2_L2"
866
+ type: "ReLU"
867
+ bottom: "Mconv2_stage2_L2"
868
+ top: "Mconv2_stage2_L2"
869
+ }
870
+ layer {
871
+ name: "Mconv3_stage2_L1"
872
+ type: "Convolution"
873
+ bottom: "Mconv2_stage2_L1"
874
+ top: "Mconv3_stage2_L1"
875
+ param {
876
+ lr_mult: 4.0
877
+ decay_mult: 1
878
+ }
879
+ param {
880
+ lr_mult: 8.0
881
+ decay_mult: 0
882
+ }
883
+ convolution_param {
884
+ num_output: 128
885
+ pad: 3
886
+ kernel_size: 7
887
+ weight_filler {
888
+ type: "gaussian"
889
+ std: 0.01
890
+ }
891
+ bias_filler {
892
+ type: "constant"
893
+ }
894
+ }
895
+ }
896
+ layer {
897
+ name: "Mrelu3_stage2_L1"
898
+ type: "ReLU"
899
+ bottom: "Mconv3_stage2_L1"
900
+ top: "Mconv3_stage2_L1"
901
+ }
902
+ layer {
903
+ name: "Mconv3_stage2_L2"
904
+ type: "Convolution"
905
+ bottom: "Mconv2_stage2_L2"
906
+ top: "Mconv3_stage2_L2"
907
+ param {
908
+ lr_mult: 4.0
909
+ decay_mult: 1
910
+ }
911
+ param {
912
+ lr_mult: 8.0
913
+ decay_mult: 0
914
+ }
915
+ convolution_param {
916
+ num_output: 128
917
+ pad: 3
918
+ kernel_size: 7
919
+ weight_filler {
920
+ type: "gaussian"
921
+ std: 0.01
922
+ }
923
+ bias_filler {
924
+ type: "constant"
925
+ }
926
+ }
927
+ }
928
+ layer {
929
+ name: "Mrelu3_stage2_L2"
930
+ type: "ReLU"
931
+ bottom: "Mconv3_stage2_L2"
932
+ top: "Mconv3_stage2_L2"
933
+ }
934
+ layer {
935
+ name: "Mconv4_stage2_L1"
936
+ type: "Convolution"
937
+ bottom: "Mconv3_stage2_L1"
938
+ top: "Mconv4_stage2_L1"
939
+ param {
940
+ lr_mult: 4.0
941
+ decay_mult: 1
942
+ }
943
+ param {
944
+ lr_mult: 8.0
945
+ decay_mult: 0
946
+ }
947
+ convolution_param {
948
+ num_output: 128
949
+ pad: 3
950
+ kernel_size: 7
951
+ weight_filler {
952
+ type: "gaussian"
953
+ std: 0.01
954
+ }
955
+ bias_filler {
956
+ type: "constant"
957
+ }
958
+ }
959
+ }
960
+ layer {
961
+ name: "Mrelu4_stage2_L1"
962
+ type: "ReLU"
963
+ bottom: "Mconv4_stage2_L1"
964
+ top: "Mconv4_stage2_L1"
965
+ }
966
+ layer {
967
+ name: "Mconv4_stage2_L2"
968
+ type: "Convolution"
969
+ bottom: "Mconv3_stage2_L2"
970
+ top: "Mconv4_stage2_L2"
971
+ param {
972
+ lr_mult: 4.0
973
+ decay_mult: 1
974
+ }
975
+ param {
976
+ lr_mult: 8.0
977
+ decay_mult: 0
978
+ }
979
+ convolution_param {
980
+ num_output: 128
981
+ pad: 3
982
+ kernel_size: 7
983
+ weight_filler {
984
+ type: "gaussian"
985
+ std: 0.01
986
+ }
987
+ bias_filler {
988
+ type: "constant"
989
+ }
990
+ }
991
+ }
992
+ layer {
993
+ name: "Mrelu4_stage2_L2"
994
+ type: "ReLU"
995
+ bottom: "Mconv4_stage2_L2"
996
+ top: "Mconv4_stage2_L2"
997
+ }
998
+ layer {
999
+ name: "Mconv5_stage2_L1"
1000
+ type: "Convolution"
1001
+ bottom: "Mconv4_stage2_L1"
1002
+ top: "Mconv5_stage2_L1"
1003
+ param {
1004
+ lr_mult: 4.0
1005
+ decay_mult: 1
1006
+ }
1007
+ param {
1008
+ lr_mult: 8.0
1009
+ decay_mult: 0
1010
+ }
1011
+ convolution_param {
1012
+ num_output: 128
1013
+ pad: 3
1014
+ kernel_size: 7
1015
+ weight_filler {
1016
+ type: "gaussian"
1017
+ std: 0.01
1018
+ }
1019
+ bias_filler {
1020
+ type: "constant"
1021
+ }
1022
+ }
1023
+ }
1024
+ layer {
1025
+ name: "Mrelu5_stage2_L1"
1026
+ type: "ReLU"
1027
+ bottom: "Mconv5_stage2_L1"
1028
+ top: "Mconv5_stage2_L1"
1029
+ }
1030
+ layer {
1031
+ name: "Mconv5_stage2_L2"
1032
+ type: "Convolution"
1033
+ bottom: "Mconv4_stage2_L2"
1034
+ top: "Mconv5_stage2_L2"
1035
+ param {
1036
+ lr_mult: 4.0
1037
+ decay_mult: 1
1038
+ }
1039
+ param {
1040
+ lr_mult: 8.0
1041
+ decay_mult: 0
1042
+ }
1043
+ convolution_param {
1044
+ num_output: 128
1045
+ pad: 3
1046
+ kernel_size: 7
1047
+ weight_filler {
1048
+ type: "gaussian"
1049
+ std: 0.01
1050
+ }
1051
+ bias_filler {
1052
+ type: "constant"
1053
+ }
1054
+ }
1055
+ }
1056
+ layer {
1057
+ name: "Mrelu5_stage2_L2"
1058
+ type: "ReLU"
1059
+ bottom: "Mconv5_stage2_L2"
1060
+ top: "Mconv5_stage2_L2"
1061
+ }
1062
+ layer {
1063
+ name: "Mconv6_stage2_L1"
1064
+ type: "Convolution"
1065
+ bottom: "Mconv5_stage2_L1"
1066
+ top: "Mconv6_stage2_L1"
1067
+ param {
1068
+ lr_mult: 4.0
1069
+ decay_mult: 1
1070
+ }
1071
+ param {
1072
+ lr_mult: 8.0
1073
+ decay_mult: 0
1074
+ }
1075
+ convolution_param {
1076
+ num_output: 128
1077
+ pad: 0
1078
+ kernel_size: 1
1079
+ weight_filler {
1080
+ type: "gaussian"
1081
+ std: 0.01
1082
+ }
1083
+ bias_filler {
1084
+ type: "constant"
1085
+ }
1086
+ }
1087
+ }
1088
+ layer {
1089
+ name: "Mrelu6_stage2_L1"
1090
+ type: "ReLU"
1091
+ bottom: "Mconv6_stage2_L1"
1092
+ top: "Mconv6_stage2_L1"
1093
+ }
1094
+ layer {
1095
+ name: "Mconv6_stage2_L2"
1096
+ type: "Convolution"
1097
+ bottom: "Mconv5_stage2_L2"
1098
+ top: "Mconv6_stage2_L2"
1099
+ param {
1100
+ lr_mult: 4.0
1101
+ decay_mult: 1
1102
+ }
1103
+ param {
1104
+ lr_mult: 8.0
1105
+ decay_mult: 0
1106
+ }
1107
+ convolution_param {
1108
+ num_output: 128
1109
+ pad: 0
1110
+ kernel_size: 1
1111
+ weight_filler {
1112
+ type: "gaussian"
1113
+ std: 0.01
1114
+ }
1115
+ bias_filler {
1116
+ type: "constant"
1117
+ }
1118
+ }
1119
+ }
1120
+ layer {
1121
+ name: "Mrelu6_stage2_L2"
1122
+ type: "ReLU"
1123
+ bottom: "Mconv6_stage2_L2"
1124
+ top: "Mconv6_stage2_L2"
1125
+ }
1126
+ layer {
1127
+ name: "Mconv7_stage2_L1"
1128
+ type: "Convolution"
1129
+ bottom: "Mconv6_stage2_L1"
1130
+ top: "Mconv7_stage2_L1"
1131
+ param {
1132
+ lr_mult: 4.0
1133
+ decay_mult: 1
1134
+ }
1135
+ param {
1136
+ lr_mult: 8.0
1137
+ decay_mult: 0
1138
+ }
1139
+ convolution_param {
1140
+ num_output: 38
1141
+ pad: 0
1142
+ kernel_size: 1
1143
+ weight_filler {
1144
+ type: "gaussian"
1145
+ std: 0.01
1146
+ }
1147
+ bias_filler {
1148
+ type: "constant"
1149
+ }
1150
+ }
1151
+ }
1152
+ layer {
1153
+ name: "Mconv7_stage2_L2"
1154
+ type: "Convolution"
1155
+ bottom: "Mconv6_stage2_L2"
1156
+ top: "Mconv7_stage2_L2"
1157
+ param {
1158
+ lr_mult: 4.0
1159
+ decay_mult: 1
1160
+ }
1161
+ param {
1162
+ lr_mult: 8.0
1163
+ decay_mult: 0
1164
+ }
1165
+ convolution_param {
1166
+ num_output: 19
1167
+ pad: 0
1168
+ kernel_size: 1
1169
+ weight_filler {
1170
+ type: "gaussian"
1171
+ std: 0.01
1172
+ }
1173
+ bias_filler {
1174
+ type: "constant"
1175
+ }
1176
+ }
1177
+ }
1178
+ layer {
1179
+ name: "concat_stage3"
1180
+ type: "Concat"
1181
+ bottom: "Mconv7_stage2_L1"
1182
+ bottom: "Mconv7_stage2_L2"
1183
+ bottom: "conv4_4_CPM"
1184
+ top: "concat_stage3"
1185
+ concat_param {
1186
+ axis: 1
1187
+ }
1188
+ }
1189
+ layer {
1190
+ name: "Mconv1_stage3_L1"
1191
+ type: "Convolution"
1192
+ bottom: "concat_stage3"
1193
+ top: "Mconv1_stage3_L1"
1194
+ param {
1195
+ lr_mult: 4.0
1196
+ decay_mult: 1
1197
+ }
1198
+ param {
1199
+ lr_mult: 8.0
1200
+ decay_mult: 0
1201
+ }
1202
+ convolution_param {
1203
+ num_output: 128
1204
+ pad: 3
1205
+ kernel_size: 7
1206
+ weight_filler {
1207
+ type: "gaussian"
1208
+ std: 0.01
1209
+ }
1210
+ bias_filler {
1211
+ type: "constant"
1212
+ }
1213
+ }
1214
+ }
1215
+ layer {
1216
+ name: "Mrelu1_stage3_L1"
1217
+ type: "ReLU"
1218
+ bottom: "Mconv1_stage3_L1"
1219
+ top: "Mconv1_stage3_L1"
1220
+ }
1221
+ layer {
1222
+ name: "Mconv1_stage3_L2"
1223
+ type: "Convolution"
1224
+ bottom: "concat_stage3"
1225
+ top: "Mconv1_stage3_L2"
1226
+ param {
1227
+ lr_mult: 4.0
1228
+ decay_mult: 1
1229
+ }
1230
+ param {
1231
+ lr_mult: 8.0
1232
+ decay_mult: 0
1233
+ }
1234
+ convolution_param {
1235
+ num_output: 128
1236
+ pad: 3
1237
+ kernel_size: 7
1238
+ weight_filler {
1239
+ type: "gaussian"
1240
+ std: 0.01
1241
+ }
1242
+ bias_filler {
1243
+ type: "constant"
1244
+ }
1245
+ }
1246
+ }
1247
+ layer {
1248
+ name: "Mrelu1_stage3_L2"
1249
+ type: "ReLU"
1250
+ bottom: "Mconv1_stage3_L2"
1251
+ top: "Mconv1_stage3_L2"
1252
+ }
1253
+ layer {
1254
+ name: "Mconv2_stage3_L1"
1255
+ type: "Convolution"
1256
+ bottom: "Mconv1_stage3_L1"
1257
+ top: "Mconv2_stage3_L1"
1258
+ param {
1259
+ lr_mult: 4.0
1260
+ decay_mult: 1
1261
+ }
1262
+ param {
1263
+ lr_mult: 8.0
1264
+ decay_mult: 0
1265
+ }
1266
+ convolution_param {
1267
+ num_output: 128
1268
+ pad: 3
1269
+ kernel_size: 7
1270
+ weight_filler {
1271
+ type: "gaussian"
1272
+ std: 0.01
1273
+ }
1274
+ bias_filler {
1275
+ type: "constant"
1276
+ }
1277
+ }
1278
+ }
1279
+ layer {
1280
+ name: "Mrelu2_stage3_L1"
1281
+ type: "ReLU"
1282
+ bottom: "Mconv2_stage3_L1"
1283
+ top: "Mconv2_stage3_L1"
1284
+ }
1285
+ layer {
1286
+ name: "Mconv2_stage3_L2"
1287
+ type: "Convolution"
1288
+ bottom: "Mconv1_stage3_L2"
1289
+ top: "Mconv2_stage3_L2"
1290
+ param {
1291
+ lr_mult: 4.0
1292
+ decay_mult: 1
1293
+ }
1294
+ param {
1295
+ lr_mult: 8.0
1296
+ decay_mult: 0
1297
+ }
1298
+ convolution_param {
1299
+ num_output: 128
1300
+ pad: 3
1301
+ kernel_size: 7
1302
+ weight_filler {
1303
+ type: "gaussian"
1304
+ std: 0.01
1305
+ }
1306
+ bias_filler {
1307
+ type: "constant"
1308
+ }
1309
+ }
1310
+ }
1311
+ layer {
1312
+ name: "Mrelu2_stage3_L2"
1313
+ type: "ReLU"
1314
+ bottom: "Mconv2_stage3_L2"
1315
+ top: "Mconv2_stage3_L2"
1316
+ }
1317
+ layer {
1318
+ name: "Mconv3_stage3_L1"
1319
+ type: "Convolution"
1320
+ bottom: "Mconv2_stage3_L1"
1321
+ top: "Mconv3_stage3_L1"
1322
+ param {
1323
+ lr_mult: 4.0
1324
+ decay_mult: 1
1325
+ }
1326
+ param {
1327
+ lr_mult: 8.0
1328
+ decay_mult: 0
1329
+ }
1330
+ convolution_param {
1331
+ num_output: 128
1332
+ pad: 3
1333
+ kernel_size: 7
1334
+ weight_filler {
1335
+ type: "gaussian"
1336
+ std: 0.01
1337
+ }
1338
+ bias_filler {
1339
+ type: "constant"
1340
+ }
1341
+ }
1342
+ }
1343
+ layer {
1344
+ name: "Mrelu3_stage3_L1"
1345
+ type: "ReLU"
1346
+ bottom: "Mconv3_stage3_L1"
1347
+ top: "Mconv3_stage3_L1"
1348
+ }
1349
+ layer {
1350
+ name: "Mconv3_stage3_L2"
1351
+ type: "Convolution"
1352
+ bottom: "Mconv2_stage3_L2"
1353
+ top: "Mconv3_stage3_L2"
1354
+ param {
1355
+ lr_mult: 4.0
1356
+ decay_mult: 1
1357
+ }
1358
+ param {
1359
+ lr_mult: 8.0
1360
+ decay_mult: 0
1361
+ }
1362
+ convolution_param {
1363
+ num_output: 128
1364
+ pad: 3
1365
+ kernel_size: 7
1366
+ weight_filler {
1367
+ type: "gaussian"
1368
+ std: 0.01
1369
+ }
1370
+ bias_filler {
1371
+ type: "constant"
1372
+ }
1373
+ }
1374
+ }
1375
+ layer {
1376
+ name: "Mrelu3_stage3_L2"
1377
+ type: "ReLU"
1378
+ bottom: "Mconv3_stage3_L2"
1379
+ top: "Mconv3_stage3_L2"
1380
+ }
1381
+ layer {
1382
+ name: "Mconv4_stage3_L1"
1383
+ type: "Convolution"
1384
+ bottom: "Mconv3_stage3_L1"
1385
+ top: "Mconv4_stage3_L1"
1386
+ param {
1387
+ lr_mult: 4.0
1388
+ decay_mult: 1
1389
+ }
1390
+ param {
1391
+ lr_mult: 8.0
1392
+ decay_mult: 0
1393
+ }
1394
+ convolution_param {
1395
+ num_output: 128
1396
+ pad: 3
1397
+ kernel_size: 7
1398
+ weight_filler {
1399
+ type: "gaussian"
1400
+ std: 0.01
1401
+ }
1402
+ bias_filler {
1403
+ type: "constant"
1404
+ }
1405
+ }
1406
+ }
1407
+ layer {
1408
+ name: "Mrelu4_stage3_L1"
1409
+ type: "ReLU"
1410
+ bottom: "Mconv4_stage3_L1"
1411
+ top: "Mconv4_stage3_L1"
1412
+ }
1413
+ layer {
1414
+ name: "Mconv4_stage3_L2"
1415
+ type: "Convolution"
1416
+ bottom: "Mconv3_stage3_L2"
1417
+ top: "Mconv4_stage3_L2"
1418
+ param {
1419
+ lr_mult: 4.0
1420
+ decay_mult: 1
1421
+ }
1422
+ param {
1423
+ lr_mult: 8.0
1424
+ decay_mult: 0
1425
+ }
1426
+ convolution_param {
1427
+ num_output: 128
1428
+ pad: 3
1429
+ kernel_size: 7
1430
+ weight_filler {
1431
+ type: "gaussian"
1432
+ std: 0.01
1433
+ }
1434
+ bias_filler {
1435
+ type: "constant"
1436
+ }
1437
+ }
1438
+ }
1439
+ layer {
1440
+ name: "Mrelu4_stage3_L2"
1441
+ type: "ReLU"
1442
+ bottom: "Mconv4_stage3_L2"
1443
+ top: "Mconv4_stage3_L2"
1444
+ }
1445
+ layer {
1446
+ name: "Mconv5_stage3_L1"
1447
+ type: "Convolution"
1448
+ bottom: "Mconv4_stage3_L1"
1449
+ top: "Mconv5_stage3_L1"
1450
+ param {
1451
+ lr_mult: 4.0
1452
+ decay_mult: 1
1453
+ }
1454
+ param {
1455
+ lr_mult: 8.0
1456
+ decay_mult: 0
1457
+ }
1458
+ convolution_param {
1459
+ num_output: 128
1460
+ pad: 3
1461
+ kernel_size: 7
1462
+ weight_filler {
1463
+ type: "gaussian"
1464
+ std: 0.01
1465
+ }
1466
+ bias_filler {
1467
+ type: "constant"
1468
+ }
1469
+ }
1470
+ }
1471
+ layer {
1472
+ name: "Mrelu5_stage3_L1"
1473
+ type: "ReLU"
1474
+ bottom: "Mconv5_stage3_L1"
1475
+ top: "Mconv5_stage3_L1"
1476
+ }
1477
+ layer {
1478
+ name: "Mconv5_stage3_L2"
1479
+ type: "Convolution"
1480
+ bottom: "Mconv4_stage3_L2"
1481
+ top: "Mconv5_stage3_L2"
1482
+ param {
1483
+ lr_mult: 4.0
1484
+ decay_mult: 1
1485
+ }
1486
+ param {
1487
+ lr_mult: 8.0
1488
+ decay_mult: 0
1489
+ }
1490
+ convolution_param {
1491
+ num_output: 128
1492
+ pad: 3
1493
+ kernel_size: 7
1494
+ weight_filler {
1495
+ type: "gaussian"
1496
+ std: 0.01
1497
+ }
1498
+ bias_filler {
1499
+ type: "constant"
1500
+ }
1501
+ }
1502
+ }
1503
+ layer {
1504
+ name: "Mrelu5_stage3_L2"
1505
+ type: "ReLU"
1506
+ bottom: "Mconv5_stage3_L2"
1507
+ top: "Mconv5_stage3_L2"
1508
+ }
1509
+ layer {
1510
+ name: "Mconv6_stage3_L1"
1511
+ type: "Convolution"
1512
+ bottom: "Mconv5_stage3_L1"
1513
+ top: "Mconv6_stage3_L1"
1514
+ param {
1515
+ lr_mult: 4.0
1516
+ decay_mult: 1
1517
+ }
1518
+ param {
1519
+ lr_mult: 8.0
1520
+ decay_mult: 0
1521
+ }
1522
+ convolution_param {
1523
+ num_output: 128
1524
+ pad: 0
1525
+ kernel_size: 1
1526
+ weight_filler {
1527
+ type: "gaussian"
1528
+ std: 0.01
1529
+ }
1530
+ bias_filler {
1531
+ type: "constant"
1532
+ }
1533
+ }
1534
+ }
1535
+ layer {
1536
+ name: "Mrelu6_stage3_L1"
1537
+ type: "ReLU"
1538
+ bottom: "Mconv6_stage3_L1"
1539
+ top: "Mconv6_stage3_L1"
1540
+ }
1541
+ layer {
1542
+ name: "Mconv6_stage3_L2"
1543
+ type: "Convolution"
1544
+ bottom: "Mconv5_stage3_L2"
1545
+ top: "Mconv6_stage3_L2"
1546
+ param {
1547
+ lr_mult: 4.0
1548
+ decay_mult: 1
1549
+ }
1550
+ param {
1551
+ lr_mult: 8.0
1552
+ decay_mult: 0
1553
+ }
1554
+ convolution_param {
1555
+ num_output: 128
1556
+ pad: 0
1557
+ kernel_size: 1
1558
+ weight_filler {
1559
+ type: "gaussian"
1560
+ std: 0.01
1561
+ }
1562
+ bias_filler {
1563
+ type: "constant"
1564
+ }
1565
+ }
1566
+ }
1567
+ layer {
1568
+ name: "Mrelu6_stage3_L2"
1569
+ type: "ReLU"
1570
+ bottom: "Mconv6_stage3_L2"
1571
+ top: "Mconv6_stage3_L2"
1572
+ }
1573
+ layer {
1574
+ name: "Mconv7_stage3_L1"
1575
+ type: "Convolution"
1576
+ bottom: "Mconv6_stage3_L1"
1577
+ top: "Mconv7_stage3_L1"
1578
+ param {
1579
+ lr_mult: 4.0
1580
+ decay_mult: 1
1581
+ }
1582
+ param {
1583
+ lr_mult: 8.0
1584
+ decay_mult: 0
1585
+ }
1586
+ convolution_param {
1587
+ num_output: 38
1588
+ pad: 0
1589
+ kernel_size: 1
1590
+ weight_filler {
1591
+ type: "gaussian"
1592
+ std: 0.01
1593
+ }
1594
+ bias_filler {
1595
+ type: "constant"
1596
+ }
1597
+ }
1598
+ }
1599
+ layer {
1600
+ name: "Mconv7_stage3_L2"
1601
+ type: "Convolution"
1602
+ bottom: "Mconv6_stage3_L2"
1603
+ top: "Mconv7_stage3_L2"
1604
+ param {
1605
+ lr_mult: 4.0
1606
+ decay_mult: 1
1607
+ }
1608
+ param {
1609
+ lr_mult: 8.0
1610
+ decay_mult: 0
1611
+ }
1612
+ convolution_param {
1613
+ num_output: 19
1614
+ pad: 0
1615
+ kernel_size: 1
1616
+ weight_filler {
1617
+ type: "gaussian"
1618
+ std: 0.01
1619
+ }
1620
+ bias_filler {
1621
+ type: "constant"
1622
+ }
1623
+ }
1624
+ }
1625
+ layer {
1626
+ name: "concat_stage4"
1627
+ type: "Concat"
1628
+ bottom: "Mconv7_stage3_L1"
1629
+ bottom: "Mconv7_stage3_L2"
1630
+ bottom: "conv4_4_CPM"
1631
+ top: "concat_stage4"
1632
+ concat_param {
1633
+ axis: 1
1634
+ }
1635
+ }
1636
+ layer {
1637
+ name: "Mconv1_stage4_L1"
1638
+ type: "Convolution"
1639
+ bottom: "concat_stage4"
1640
+ top: "Mconv1_stage4_L1"
1641
+ param {
1642
+ lr_mult: 4.0
1643
+ decay_mult: 1
1644
+ }
1645
+ param {
1646
+ lr_mult: 8.0
1647
+ decay_mult: 0
1648
+ }
1649
+ convolution_param {
1650
+ num_output: 128
1651
+ pad: 3
1652
+ kernel_size: 7
1653
+ weight_filler {
1654
+ type: "gaussian"
1655
+ std: 0.01
1656
+ }
1657
+ bias_filler {
1658
+ type: "constant"
1659
+ }
1660
+ }
1661
+ }
1662
+ layer {
1663
+ name: "Mrelu1_stage4_L1"
1664
+ type: "ReLU"
1665
+ bottom: "Mconv1_stage4_L1"
1666
+ top: "Mconv1_stage4_L1"
1667
+ }
1668
+ layer {
1669
+ name: "Mconv1_stage4_L2"
1670
+ type: "Convolution"
1671
+ bottom: "concat_stage4"
1672
+ top: "Mconv1_stage4_L2"
1673
+ param {
1674
+ lr_mult: 4.0
1675
+ decay_mult: 1
1676
+ }
1677
+ param {
1678
+ lr_mult: 8.0
1679
+ decay_mult: 0
1680
+ }
1681
+ convolution_param {
1682
+ num_output: 128
1683
+ pad: 3
1684
+ kernel_size: 7
1685
+ weight_filler {
1686
+ type: "gaussian"
1687
+ std: 0.01
1688
+ }
1689
+ bias_filler {
1690
+ type: "constant"
1691
+ }
1692
+ }
1693
+ }
1694
+ layer {
1695
+ name: "Mrelu1_stage4_L2"
1696
+ type: "ReLU"
1697
+ bottom: "Mconv1_stage4_L2"
1698
+ top: "Mconv1_stage4_L2"
1699
+ }
1700
+ layer {
1701
+ name: "Mconv2_stage4_L1"
1702
+ type: "Convolution"
1703
+ bottom: "Mconv1_stage4_L1"
1704
+ top: "Mconv2_stage4_L1"
1705
+ param {
1706
+ lr_mult: 4.0
1707
+ decay_mult: 1
1708
+ }
1709
+ param {
1710
+ lr_mult: 8.0
1711
+ decay_mult: 0
1712
+ }
1713
+ convolution_param {
1714
+ num_output: 128
1715
+ pad: 3
1716
+ kernel_size: 7
1717
+ weight_filler {
1718
+ type: "gaussian"
1719
+ std: 0.01
1720
+ }
1721
+ bias_filler {
1722
+ type: "constant"
1723
+ }
1724
+ }
1725
+ }
1726
+ layer {
1727
+ name: "Mrelu2_stage4_L1"
1728
+ type: "ReLU"
1729
+ bottom: "Mconv2_stage4_L1"
1730
+ top: "Mconv2_stage4_L1"
1731
+ }
1732
+ layer {
1733
+ name: "Mconv2_stage4_L2"
1734
+ type: "Convolution"
1735
+ bottom: "Mconv1_stage4_L2"
1736
+ top: "Mconv2_stage4_L2"
1737
+ param {
1738
+ lr_mult: 4.0
1739
+ decay_mult: 1
1740
+ }
1741
+ param {
1742
+ lr_mult: 8.0
1743
+ decay_mult: 0
1744
+ }
1745
+ convolution_param {
1746
+ num_output: 128
1747
+ pad: 3
1748
+ kernel_size: 7
1749
+ weight_filler {
1750
+ type: "gaussian"
1751
+ std: 0.01
1752
+ }
1753
+ bias_filler {
1754
+ type: "constant"
1755
+ }
1756
+ }
1757
+ }
1758
+ layer {
1759
+ name: "Mrelu2_stage4_L2"
1760
+ type: "ReLU"
1761
+ bottom: "Mconv2_stage4_L2"
1762
+ top: "Mconv2_stage4_L2"
1763
+ }
1764
+ layer {
1765
+ name: "Mconv3_stage4_L1"
1766
+ type: "Convolution"
1767
+ bottom: "Mconv2_stage4_L1"
1768
+ top: "Mconv3_stage4_L1"
1769
+ param {
1770
+ lr_mult: 4.0
1771
+ decay_mult: 1
1772
+ }
1773
+ param {
1774
+ lr_mult: 8.0
1775
+ decay_mult: 0
1776
+ }
1777
+ convolution_param {
1778
+ num_output: 128
1779
+ pad: 3
1780
+ kernel_size: 7
1781
+ weight_filler {
1782
+ type: "gaussian"
1783
+ std: 0.01
1784
+ }
1785
+ bias_filler {
1786
+ type: "constant"
1787
+ }
1788
+ }
1789
+ }
1790
+ layer {
1791
+ name: "Mrelu3_stage4_L1"
1792
+ type: "ReLU"
1793
+ bottom: "Mconv3_stage4_L1"
1794
+ top: "Mconv3_stage4_L1"
1795
+ }
1796
+ layer {
1797
+ name: "Mconv3_stage4_L2"
1798
+ type: "Convolution"
1799
+ bottom: "Mconv2_stage4_L2"
1800
+ top: "Mconv3_stage4_L2"
1801
+ param {
1802
+ lr_mult: 4.0
1803
+ decay_mult: 1
1804
+ }
1805
+ param {
1806
+ lr_mult: 8.0
1807
+ decay_mult: 0
1808
+ }
1809
+ convolution_param {
1810
+ num_output: 128
1811
+ pad: 3
1812
+ kernel_size: 7
1813
+ weight_filler {
1814
+ type: "gaussian"
1815
+ std: 0.01
1816
+ }
1817
+ bias_filler {
1818
+ type: "constant"
1819
+ }
1820
+ }
1821
+ }
1822
+ layer {
1823
+ name: "Mrelu3_stage4_L2"
1824
+ type: "ReLU"
1825
+ bottom: "Mconv3_stage4_L2"
1826
+ top: "Mconv3_stage4_L2"
1827
+ }
1828
+ layer {
1829
+ name: "Mconv4_stage4_L1"
1830
+ type: "Convolution"
1831
+ bottom: "Mconv3_stage4_L1"
1832
+ top: "Mconv4_stage4_L1"
1833
+ param {
1834
+ lr_mult: 4.0
1835
+ decay_mult: 1
1836
+ }
1837
+ param {
1838
+ lr_mult: 8.0
1839
+ decay_mult: 0
1840
+ }
1841
+ convolution_param {
1842
+ num_output: 128
1843
+ pad: 3
1844
+ kernel_size: 7
1845
+ weight_filler {
1846
+ type: "gaussian"
1847
+ std: 0.01
1848
+ }
1849
+ bias_filler {
1850
+ type: "constant"
1851
+ }
1852
+ }
1853
+ }
1854
+ layer {
1855
+ name: "Mrelu4_stage4_L1"
1856
+ type: "ReLU"
1857
+ bottom: "Mconv4_stage4_L1"
1858
+ top: "Mconv4_stage4_L1"
1859
+ }
1860
+ layer {
1861
+ name: "Mconv4_stage4_L2"
1862
+ type: "Convolution"
1863
+ bottom: "Mconv3_stage4_L2"
1864
+ top: "Mconv4_stage4_L2"
1865
+ param {
1866
+ lr_mult: 4.0
1867
+ decay_mult: 1
1868
+ }
1869
+ param {
1870
+ lr_mult: 8.0
1871
+ decay_mult: 0
1872
+ }
1873
+ convolution_param {
1874
+ num_output: 128
1875
+ pad: 3
1876
+ kernel_size: 7
1877
+ weight_filler {
1878
+ type: "gaussian"
1879
+ std: 0.01
1880
+ }
1881
+ bias_filler {
1882
+ type: "constant"
1883
+ }
1884
+ }
1885
+ }
1886
+ layer {
1887
+ name: "Mrelu4_stage4_L2"
1888
+ type: "ReLU"
1889
+ bottom: "Mconv4_stage4_L2"
1890
+ top: "Mconv4_stage4_L2"
1891
+ }
1892
+ layer {
1893
+ name: "Mconv5_stage4_L1"
1894
+ type: "Convolution"
1895
+ bottom: "Mconv4_stage4_L1"
1896
+ top: "Mconv5_stage4_L1"
1897
+ param {
1898
+ lr_mult: 4.0
1899
+ decay_mult: 1
1900
+ }
1901
+ param {
1902
+ lr_mult: 8.0
1903
+ decay_mult: 0
1904
+ }
1905
+ convolution_param {
1906
+ num_output: 128
1907
+ pad: 3
1908
+ kernel_size: 7
1909
+ weight_filler {
1910
+ type: "gaussian"
1911
+ std: 0.01
1912
+ }
1913
+ bias_filler {
1914
+ type: "constant"
1915
+ }
1916
+ }
1917
+ }
1918
+ layer {
1919
+ name: "Mrelu5_stage4_L1"
1920
+ type: "ReLU"
1921
+ bottom: "Mconv5_stage4_L1"
1922
+ top: "Mconv5_stage4_L1"
1923
+ }
1924
+ layer {
1925
+ name: "Mconv5_stage4_L2"
1926
+ type: "Convolution"
1927
+ bottom: "Mconv4_stage4_L2"
1928
+ top: "Mconv5_stage4_L2"
1929
+ param {
1930
+ lr_mult: 4.0
1931
+ decay_mult: 1
1932
+ }
1933
+ param {
1934
+ lr_mult: 8.0
1935
+ decay_mult: 0
1936
+ }
1937
+ convolution_param {
1938
+ num_output: 128
1939
+ pad: 3
1940
+ kernel_size: 7
1941
+ weight_filler {
1942
+ type: "gaussian"
1943
+ std: 0.01
1944
+ }
1945
+ bias_filler {
1946
+ type: "constant"
1947
+ }
1948
+ }
1949
+ }
1950
+ layer {
1951
+ name: "Mrelu5_stage4_L2"
1952
+ type: "ReLU"
1953
+ bottom: "Mconv5_stage4_L2"
1954
+ top: "Mconv5_stage4_L2"
1955
+ }
1956
+ layer {
1957
+ name: "Mconv6_stage4_L1"
1958
+ type: "Convolution"
1959
+ bottom: "Mconv5_stage4_L1"
1960
+ top: "Mconv6_stage4_L1"
1961
+ param {
1962
+ lr_mult: 4.0
1963
+ decay_mult: 1
1964
+ }
1965
+ param {
1966
+ lr_mult: 8.0
1967
+ decay_mult: 0
1968
+ }
1969
+ convolution_param {
1970
+ num_output: 128
1971
+ pad: 0
1972
+ kernel_size: 1
1973
+ weight_filler {
1974
+ type: "gaussian"
1975
+ std: 0.01
1976
+ }
1977
+ bias_filler {
1978
+ type: "constant"
1979
+ }
1980
+ }
1981
+ }
1982
+ layer {
1983
+ name: "Mrelu6_stage4_L1"
1984
+ type: "ReLU"
1985
+ bottom: "Mconv6_stage4_L1"
1986
+ top: "Mconv6_stage4_L1"
1987
+ }
1988
+ layer {
1989
+ name: "Mconv6_stage4_L2"
1990
+ type: "Convolution"
1991
+ bottom: "Mconv5_stage4_L2"
1992
+ top: "Mconv6_stage4_L2"
1993
+ param {
1994
+ lr_mult: 4.0
1995
+ decay_mult: 1
1996
+ }
1997
+ param {
1998
+ lr_mult: 8.0
1999
+ decay_mult: 0
2000
+ }
2001
+ convolution_param {
2002
+ num_output: 128
2003
+ pad: 0
2004
+ kernel_size: 1
2005
+ weight_filler {
2006
+ type: "gaussian"
2007
+ std: 0.01
2008
+ }
2009
+ bias_filler {
2010
+ type: "constant"
2011
+ }
2012
+ }
2013
+ }
2014
+ layer {
2015
+ name: "Mrelu6_stage4_L2"
2016
+ type: "ReLU"
2017
+ bottom: "Mconv6_stage4_L2"
2018
+ top: "Mconv6_stage4_L2"
2019
+ }
2020
+ layer {
2021
+ name: "Mconv7_stage4_L1"
2022
+ type: "Convolution"
2023
+ bottom: "Mconv6_stage4_L1"
2024
+ top: "Mconv7_stage4_L1"
2025
+ param {
2026
+ lr_mult: 4.0
2027
+ decay_mult: 1
2028
+ }
2029
+ param {
2030
+ lr_mult: 8.0
2031
+ decay_mult: 0
2032
+ }
2033
+ convolution_param {
2034
+ num_output: 38
2035
+ pad: 0
2036
+ kernel_size: 1
2037
+ weight_filler {
2038
+ type: "gaussian"
2039
+ std: 0.01
2040
+ }
2041
+ bias_filler {
2042
+ type: "constant"
2043
+ }
2044
+ }
2045
+ }
2046
+ layer {
2047
+ name: "Mconv7_stage4_L2"
2048
+ type: "Convolution"
2049
+ bottom: "Mconv6_stage4_L2"
2050
+ top: "Mconv7_stage4_L2"
2051
+ param {
2052
+ lr_mult: 4.0
2053
+ decay_mult: 1
2054
+ }
2055
+ param {
2056
+ lr_mult: 8.0
2057
+ decay_mult: 0
2058
+ }
2059
+ convolution_param {
2060
+ num_output: 19
2061
+ pad: 0
2062
+ kernel_size: 1
2063
+ weight_filler {
2064
+ type: "gaussian"
2065
+ std: 0.01
2066
+ }
2067
+ bias_filler {
2068
+ type: "constant"
2069
+ }
2070
+ }
2071
+ }
2072
+ layer {
2073
+ name: "concat_stage5"
2074
+ type: "Concat"
2075
+ bottom: "Mconv7_stage4_L1"
2076
+ bottom: "Mconv7_stage4_L2"
2077
+ bottom: "conv4_4_CPM"
2078
+ top: "concat_stage5"
2079
+ concat_param {
2080
+ axis: 1
2081
+ }
2082
+ }
2083
+ layer {
2084
+ name: "Mconv1_stage5_L1"
2085
+ type: "Convolution"
2086
+ bottom: "concat_stage5"
2087
+ top: "Mconv1_stage5_L1"
2088
+ param {
2089
+ lr_mult: 4.0
2090
+ decay_mult: 1
2091
+ }
2092
+ param {
2093
+ lr_mult: 8.0
2094
+ decay_mult: 0
2095
+ }
2096
+ convolution_param {
2097
+ num_output: 128
2098
+ pad: 3
2099
+ kernel_size: 7
2100
+ weight_filler {
2101
+ type: "gaussian"
2102
+ std: 0.01
2103
+ }
2104
+ bias_filler {
2105
+ type: "constant"
2106
+ }
2107
+ }
2108
+ }
2109
+ layer {
2110
+ name: "Mrelu1_stage5_L1"
2111
+ type: "ReLU"
2112
+ bottom: "Mconv1_stage5_L1"
2113
+ top: "Mconv1_stage5_L1"
2114
+ }
2115
+ layer {
2116
+ name: "Mconv1_stage5_L2"
2117
+ type: "Convolution"
2118
+ bottom: "concat_stage5"
2119
+ top: "Mconv1_stage5_L2"
2120
+ param {
2121
+ lr_mult: 4.0
2122
+ decay_mult: 1
2123
+ }
2124
+ param {
2125
+ lr_mult: 8.0
2126
+ decay_mult: 0
2127
+ }
2128
+ convolution_param {
2129
+ num_output: 128
2130
+ pad: 3
2131
+ kernel_size: 7
2132
+ weight_filler {
2133
+ type: "gaussian"
2134
+ std: 0.01
2135
+ }
2136
+ bias_filler {
2137
+ type: "constant"
2138
+ }
2139
+ }
2140
+ }
2141
+ layer {
2142
+ name: "Mrelu1_stage5_L2"
2143
+ type: "ReLU"
2144
+ bottom: "Mconv1_stage5_L2"
2145
+ top: "Mconv1_stage5_L2"
2146
+ }
2147
+ layer {
2148
+ name: "Mconv2_stage5_L1"
2149
+ type: "Convolution"
2150
+ bottom: "Mconv1_stage5_L1"
2151
+ top: "Mconv2_stage5_L1"
2152
+ param {
2153
+ lr_mult: 4.0
2154
+ decay_mult: 1
2155
+ }
2156
+ param {
2157
+ lr_mult: 8.0
2158
+ decay_mult: 0
2159
+ }
2160
+ convolution_param {
2161
+ num_output: 128
2162
+ pad: 3
2163
+ kernel_size: 7
2164
+ weight_filler {
2165
+ type: "gaussian"
2166
+ std: 0.01
2167
+ }
2168
+ bias_filler {
2169
+ type: "constant"
2170
+ }
2171
+ }
2172
+ }
2173
+ layer {
2174
+ name: "Mrelu2_stage5_L1"
2175
+ type: "ReLU"
2176
+ bottom: "Mconv2_stage5_L1"
2177
+ top: "Mconv2_stage5_L1"
2178
+ }
2179
+ layer {
2180
+ name: "Mconv2_stage5_L2"
2181
+ type: "Convolution"
2182
+ bottom: "Mconv1_stage5_L2"
2183
+ top: "Mconv2_stage5_L2"
2184
+ param {
2185
+ lr_mult: 4.0
2186
+ decay_mult: 1
2187
+ }
2188
+ param {
2189
+ lr_mult: 8.0
2190
+ decay_mult: 0
2191
+ }
2192
+ convolution_param {
2193
+ num_output: 128
2194
+ pad: 3
2195
+ kernel_size: 7
2196
+ weight_filler {
2197
+ type: "gaussian"
2198
+ std: 0.01
2199
+ }
2200
+ bias_filler {
2201
+ type: "constant"
2202
+ }
2203
+ }
2204
+ }
2205
+ layer {
2206
+ name: "Mrelu2_stage5_L2"
2207
+ type: "ReLU"
2208
+ bottom: "Mconv2_stage5_L2"
2209
+ top: "Mconv2_stage5_L2"
2210
+ }
2211
+ layer {
2212
+ name: "Mconv3_stage5_L1"
2213
+ type: "Convolution"
2214
+ bottom: "Mconv2_stage5_L1"
2215
+ top: "Mconv3_stage5_L1"
2216
+ param {
2217
+ lr_mult: 4.0
2218
+ decay_mult: 1
2219
+ }
2220
+ param {
2221
+ lr_mult: 8.0
2222
+ decay_mult: 0
2223
+ }
2224
+ convolution_param {
2225
+ num_output: 128
2226
+ pad: 3
2227
+ kernel_size: 7
2228
+ weight_filler {
2229
+ type: "gaussian"
2230
+ std: 0.01
2231
+ }
2232
+ bias_filler {
2233
+ type: "constant"
2234
+ }
2235
+ }
2236
+ }
2237
+ layer {
2238
+ name: "Mrelu3_stage5_L1"
2239
+ type: "ReLU"
2240
+ bottom: "Mconv3_stage5_L1"
2241
+ top: "Mconv3_stage5_L1"
2242
+ }
2243
+ layer {
2244
+ name: "Mconv3_stage5_L2"
2245
+ type: "Convolution"
2246
+ bottom: "Mconv2_stage5_L2"
2247
+ top: "Mconv3_stage5_L2"
2248
+ param {
2249
+ lr_mult: 4.0
2250
+ decay_mult: 1
2251
+ }
2252
+ param {
2253
+ lr_mult: 8.0
2254
+ decay_mult: 0
2255
+ }
2256
+ convolution_param {
2257
+ num_output: 128
2258
+ pad: 3
2259
+ kernel_size: 7
2260
+ weight_filler {
2261
+ type: "gaussian"
2262
+ std: 0.01
2263
+ }
2264
+ bias_filler {
2265
+ type: "constant"
2266
+ }
2267
+ }
2268
+ }
2269
+ layer {
2270
+ name: "Mrelu3_stage5_L2"
2271
+ type: "ReLU"
2272
+ bottom: "Mconv3_stage5_L2"
2273
+ top: "Mconv3_stage5_L2"
2274
+ }
2275
+ layer {
2276
+ name: "Mconv4_stage5_L1"
2277
+ type: "Convolution"
2278
+ bottom: "Mconv3_stage5_L1"
2279
+ top: "Mconv4_stage5_L1"
2280
+ param {
2281
+ lr_mult: 4.0
2282
+ decay_mult: 1
2283
+ }
2284
+ param {
2285
+ lr_mult: 8.0
2286
+ decay_mult: 0
2287
+ }
2288
+ convolution_param {
2289
+ num_output: 128
2290
+ pad: 3
2291
+ kernel_size: 7
2292
+ weight_filler {
2293
+ type: "gaussian"
2294
+ std: 0.01
2295
+ }
2296
+ bias_filler {
2297
+ type: "constant"
2298
+ }
2299
+ }
2300
+ }
2301
+ layer {
2302
+ name: "Mrelu4_stage5_L1"
2303
+ type: "ReLU"
2304
+ bottom: "Mconv4_stage5_L1"
2305
+ top: "Mconv4_stage5_L1"
2306
+ }
2307
+ layer {
2308
+ name: "Mconv4_stage5_L2"
2309
+ type: "Convolution"
2310
+ bottom: "Mconv3_stage5_L2"
2311
+ top: "Mconv4_stage5_L2"
2312
+ param {
2313
+ lr_mult: 4.0
2314
+ decay_mult: 1
2315
+ }
2316
+ param {
2317
+ lr_mult: 8.0
2318
+ decay_mult: 0
2319
+ }
2320
+ convolution_param {
2321
+ num_output: 128
2322
+ pad: 3
2323
+ kernel_size: 7
2324
+ weight_filler {
2325
+ type: "gaussian"
2326
+ std: 0.01
2327
+ }
2328
+ bias_filler {
2329
+ type: "constant"
2330
+ }
2331
+ }
2332
+ }
2333
+ layer {
2334
+ name: "Mrelu4_stage5_L2"
2335
+ type: "ReLU"
2336
+ bottom: "Mconv4_stage5_L2"
2337
+ top: "Mconv4_stage5_L2"
2338
+ }
2339
+ layer {
2340
+ name: "Mconv5_stage5_L1"
2341
+ type: "Convolution"
2342
+ bottom: "Mconv4_stage5_L1"
2343
+ top: "Mconv5_stage5_L1"
2344
+ param {
2345
+ lr_mult: 4.0
2346
+ decay_mult: 1
2347
+ }
2348
+ param {
2349
+ lr_mult: 8.0
2350
+ decay_mult: 0
2351
+ }
2352
+ convolution_param {
2353
+ num_output: 128
2354
+ pad: 3
2355
+ kernel_size: 7
2356
+ weight_filler {
2357
+ type: "gaussian"
2358
+ std: 0.01
2359
+ }
2360
+ bias_filler {
2361
+ type: "constant"
2362
+ }
2363
+ }
2364
+ }
2365
+ layer {
2366
+ name: "Mrelu5_stage5_L1"
2367
+ type: "ReLU"
2368
+ bottom: "Mconv5_stage5_L1"
2369
+ top: "Mconv5_stage5_L1"
2370
+ }
2371
+ layer {
2372
+ name: "Mconv5_stage5_L2"
2373
+ type: "Convolution"
2374
+ bottom: "Mconv4_stage5_L2"
2375
+ top: "Mconv5_stage5_L2"
2376
+ param {
2377
+ lr_mult: 4.0
2378
+ decay_mult: 1
2379
+ }
2380
+ param {
2381
+ lr_mult: 8.0
2382
+ decay_mult: 0
2383
+ }
2384
+ convolution_param {
2385
+ num_output: 128
2386
+ pad: 3
2387
+ kernel_size: 7
2388
+ weight_filler {
2389
+ type: "gaussian"
2390
+ std: 0.01
2391
+ }
2392
+ bias_filler {
2393
+ type: "constant"
2394
+ }
2395
+ }
2396
+ }
2397
+ layer {
2398
+ name: "Mrelu5_stage5_L2"
2399
+ type: "ReLU"
2400
+ bottom: "Mconv5_stage5_L2"
2401
+ top: "Mconv5_stage5_L2"
2402
+ }
2403
+ layer {
2404
+ name: "Mconv6_stage5_L1"
2405
+ type: "Convolution"
2406
+ bottom: "Mconv5_stage5_L1"
2407
+ top: "Mconv6_stage5_L1"
2408
+ param {
2409
+ lr_mult: 4.0
2410
+ decay_mult: 1
2411
+ }
2412
+ param {
2413
+ lr_mult: 8.0
2414
+ decay_mult: 0
2415
+ }
2416
+ convolution_param {
2417
+ num_output: 128
2418
+ pad: 0
2419
+ kernel_size: 1
2420
+ weight_filler {
2421
+ type: "gaussian"
2422
+ std: 0.01
2423
+ }
2424
+ bias_filler {
2425
+ type: "constant"
2426
+ }
2427
+ }
2428
+ }
2429
+ layer {
2430
+ name: "Mrelu6_stage5_L1"
2431
+ type: "ReLU"
2432
+ bottom: "Mconv6_stage5_L1"
2433
+ top: "Mconv6_stage5_L1"
2434
+ }
2435
+ layer {
2436
+ name: "Mconv6_stage5_L2"
2437
+ type: "Convolution"
2438
+ bottom: "Mconv5_stage5_L2"
2439
+ top: "Mconv6_stage5_L2"
2440
+ param {
2441
+ lr_mult: 4.0
2442
+ decay_mult: 1
2443
+ }
2444
+ param {
2445
+ lr_mult: 8.0
2446
+ decay_mult: 0
2447
+ }
2448
+ convolution_param {
2449
+ num_output: 128
2450
+ pad: 0
2451
+ kernel_size: 1
2452
+ weight_filler {
2453
+ type: "gaussian"
2454
+ std: 0.01
2455
+ }
2456
+ bias_filler {
2457
+ type: "constant"
2458
+ }
2459
+ }
2460
+ }
2461
+ layer {
2462
+ name: "Mrelu6_stage5_L2"
2463
+ type: "ReLU"
2464
+ bottom: "Mconv6_stage5_L2"
2465
+ top: "Mconv6_stage5_L2"
2466
+ }
2467
+ layer {
2468
+ name: "Mconv7_stage5_L1"
2469
+ type: "Convolution"
2470
+ bottom: "Mconv6_stage5_L1"
2471
+ top: "Mconv7_stage5_L1"
2472
+ param {
2473
+ lr_mult: 4.0
2474
+ decay_mult: 1
2475
+ }
2476
+ param {
2477
+ lr_mult: 8.0
2478
+ decay_mult: 0
2479
+ }
2480
+ convolution_param {
2481
+ num_output: 38
2482
+ pad: 0
2483
+ kernel_size: 1
2484
+ weight_filler {
2485
+ type: "gaussian"
2486
+ std: 0.01
2487
+ }
2488
+ bias_filler {
2489
+ type: "constant"
2490
+ }
2491
+ }
2492
+ }
2493
+ layer {
2494
+ name: "Mconv7_stage5_L2"
2495
+ type: "Convolution"
2496
+ bottom: "Mconv6_stage5_L2"
2497
+ top: "Mconv7_stage5_L2"
2498
+ param {
2499
+ lr_mult: 4.0
2500
+ decay_mult: 1
2501
+ }
2502
+ param {
2503
+ lr_mult: 8.0
2504
+ decay_mult: 0
2505
+ }
2506
+ convolution_param {
2507
+ num_output: 19
2508
+ pad: 0
2509
+ kernel_size: 1
2510
+ weight_filler {
2511
+ type: "gaussian"
2512
+ std: 0.01
2513
+ }
2514
+ bias_filler {
2515
+ type: "constant"
2516
+ }
2517
+ }
2518
+ }
2519
+ layer {
2520
+ name: "concat_stage6"
2521
+ type: "Concat"
2522
+ bottom: "Mconv7_stage5_L1"
2523
+ bottom: "Mconv7_stage5_L2"
2524
+ bottom: "conv4_4_CPM"
2525
+ top: "concat_stage6"
2526
+ concat_param {
2527
+ axis: 1
2528
+ }
2529
+ }
2530
+ layer {
2531
+ name: "Mconv1_stage6_L1"
2532
+ type: "Convolution"
2533
+ bottom: "concat_stage6"
2534
+ top: "Mconv1_stage6_L1"
2535
+ param {
2536
+ lr_mult: 4.0
2537
+ decay_mult: 1
2538
+ }
2539
+ param {
2540
+ lr_mult: 8.0
2541
+ decay_mult: 0
2542
+ }
2543
+ convolution_param {
2544
+ num_output: 128
2545
+ pad: 3
2546
+ kernel_size: 7
2547
+ weight_filler {
2548
+ type: "gaussian"
2549
+ std: 0.01
2550
+ }
2551
+ bias_filler {
2552
+ type: "constant"
2553
+ }
2554
+ }
2555
+ }
2556
+ layer {
2557
+ name: "Mrelu1_stage6_L1"
2558
+ type: "ReLU"
2559
+ bottom: "Mconv1_stage6_L1"
2560
+ top: "Mconv1_stage6_L1"
2561
+ }
2562
+ layer {
2563
+ name: "Mconv1_stage6_L2"
2564
+ type: "Convolution"
2565
+ bottom: "concat_stage6"
2566
+ top: "Mconv1_stage6_L2"
2567
+ param {
2568
+ lr_mult: 4.0
2569
+ decay_mult: 1
2570
+ }
2571
+ param {
2572
+ lr_mult: 8.0
2573
+ decay_mult: 0
2574
+ }
2575
+ convolution_param {
2576
+ num_output: 128
2577
+ pad: 3
2578
+ kernel_size: 7
2579
+ weight_filler {
2580
+ type: "gaussian"
2581
+ std: 0.01
2582
+ }
2583
+ bias_filler {
2584
+ type: "constant"
2585
+ }
2586
+ }
2587
+ }
2588
+ layer {
2589
+ name: "Mrelu1_stage6_L2"
2590
+ type: "ReLU"
2591
+ bottom: "Mconv1_stage6_L2"
2592
+ top: "Mconv1_stage6_L2"
2593
+ }
2594
+ layer {
2595
+ name: "Mconv2_stage6_L1"
2596
+ type: "Convolution"
2597
+ bottom: "Mconv1_stage6_L1"
2598
+ top: "Mconv2_stage6_L1"
2599
+ param {
2600
+ lr_mult: 4.0
2601
+ decay_mult: 1
2602
+ }
2603
+ param {
2604
+ lr_mult: 8.0
2605
+ decay_mult: 0
2606
+ }
2607
+ convolution_param {
2608
+ num_output: 128
2609
+ pad: 3
2610
+ kernel_size: 7
2611
+ weight_filler {
2612
+ type: "gaussian"
2613
+ std: 0.01
2614
+ }
2615
+ bias_filler {
2616
+ type: "constant"
2617
+ }
2618
+ }
2619
+ }
2620
+ layer {
2621
+ name: "Mrelu2_stage6_L1"
2622
+ type: "ReLU"
2623
+ bottom: "Mconv2_stage6_L1"
2624
+ top: "Mconv2_stage6_L1"
2625
+ }
2626
+ layer {
2627
+ name: "Mconv2_stage6_L2"
2628
+ type: "Convolution"
2629
+ bottom: "Mconv1_stage6_L2"
2630
+ top: "Mconv2_stage6_L2"
2631
+ param {
2632
+ lr_mult: 4.0
2633
+ decay_mult: 1
2634
+ }
2635
+ param {
2636
+ lr_mult: 8.0
2637
+ decay_mult: 0
2638
+ }
2639
+ convolution_param {
2640
+ num_output: 128
2641
+ pad: 3
2642
+ kernel_size: 7
2643
+ weight_filler {
2644
+ type: "gaussian"
2645
+ std: 0.01
2646
+ }
2647
+ bias_filler {
2648
+ type: "constant"
2649
+ }
2650
+ }
2651
+ }
2652
+ layer {
2653
+ name: "Mrelu2_stage6_L2"
2654
+ type: "ReLU"
2655
+ bottom: "Mconv2_stage6_L2"
2656
+ top: "Mconv2_stage6_L2"
2657
+ }
2658
+ layer {
2659
+ name: "Mconv3_stage6_L1"
2660
+ type: "Convolution"
2661
+ bottom: "Mconv2_stage6_L1"
2662
+ top: "Mconv3_stage6_L1"
2663
+ param {
2664
+ lr_mult: 4.0
2665
+ decay_mult: 1
2666
+ }
2667
+ param {
2668
+ lr_mult: 8.0
2669
+ decay_mult: 0
2670
+ }
2671
+ convolution_param {
2672
+ num_output: 128
2673
+ pad: 3
2674
+ kernel_size: 7
2675
+ weight_filler {
2676
+ type: "gaussian"
2677
+ std: 0.01
2678
+ }
2679
+ bias_filler {
2680
+ type: "constant"
2681
+ }
2682
+ }
2683
+ }
2684
+ layer {
2685
+ name: "Mrelu3_stage6_L1"
2686
+ type: "ReLU"
2687
+ bottom: "Mconv3_stage6_L1"
2688
+ top: "Mconv3_stage6_L1"
2689
+ }
2690
+ layer {
2691
+ name: "Mconv3_stage6_L2"
2692
+ type: "Convolution"
2693
+ bottom: "Mconv2_stage6_L2"
2694
+ top: "Mconv3_stage6_L2"
2695
+ param {
2696
+ lr_mult: 4.0
2697
+ decay_mult: 1
2698
+ }
2699
+ param {
2700
+ lr_mult: 8.0
2701
+ decay_mult: 0
2702
+ }
2703
+ convolution_param {
2704
+ num_output: 128
2705
+ pad: 3
2706
+ kernel_size: 7
2707
+ weight_filler {
2708
+ type: "gaussian"
2709
+ std: 0.01
2710
+ }
2711
+ bias_filler {
2712
+ type: "constant"
2713
+ }
2714
+ }
2715
+ }
2716
+ layer {
2717
+ name: "Mrelu3_stage6_L2"
2718
+ type: "ReLU"
2719
+ bottom: "Mconv3_stage6_L2"
2720
+ top: "Mconv3_stage6_L2"
2721
+ }
2722
+ layer {
2723
+ name: "Mconv4_stage6_L1"
2724
+ type: "Convolution"
2725
+ bottom: "Mconv3_stage6_L1"
2726
+ top: "Mconv4_stage6_L1"
2727
+ param {
2728
+ lr_mult: 4.0
2729
+ decay_mult: 1
2730
+ }
2731
+ param {
2732
+ lr_mult: 8.0
2733
+ decay_mult: 0
2734
+ }
2735
+ convolution_param {
2736
+ num_output: 128
2737
+ pad: 3
2738
+ kernel_size: 7
2739
+ weight_filler {
2740
+ type: "gaussian"
2741
+ std: 0.01
2742
+ }
2743
+ bias_filler {
2744
+ type: "constant"
2745
+ }
2746
+ }
2747
+ }
2748
+ layer {
2749
+ name: "Mrelu4_stage6_L1"
2750
+ type: "ReLU"
2751
+ bottom: "Mconv4_stage6_L1"
2752
+ top: "Mconv4_stage6_L1"
2753
+ }
2754
+ layer {
2755
+ name: "Mconv4_stage6_L2"
2756
+ type: "Convolution"
2757
+ bottom: "Mconv3_stage6_L2"
2758
+ top: "Mconv4_stage6_L2"
2759
+ param {
2760
+ lr_mult: 4.0
2761
+ decay_mult: 1
2762
+ }
2763
+ param {
2764
+ lr_mult: 8.0
2765
+ decay_mult: 0
2766
+ }
2767
+ convolution_param {
2768
+ num_output: 128
2769
+ pad: 3
2770
+ kernel_size: 7
2771
+ weight_filler {
2772
+ type: "gaussian"
2773
+ std: 0.01
2774
+ }
2775
+ bias_filler {
2776
+ type: "constant"
2777
+ }
2778
+ }
2779
+ }
2780
+ layer {
2781
+ name: "Mrelu4_stage6_L2"
2782
+ type: "ReLU"
2783
+ bottom: "Mconv4_stage6_L2"
2784
+ top: "Mconv4_stage6_L2"
2785
+ }
2786
+ layer {
2787
+ name: "Mconv5_stage6_L1"
2788
+ type: "Convolution"
2789
+ bottom: "Mconv4_stage6_L1"
2790
+ top: "Mconv5_stage6_L1"
2791
+ param {
2792
+ lr_mult: 4.0
2793
+ decay_mult: 1
2794
+ }
2795
+ param {
2796
+ lr_mult: 8.0
2797
+ decay_mult: 0
2798
+ }
2799
+ convolution_param {
2800
+ num_output: 128
2801
+ pad: 3
2802
+ kernel_size: 7
2803
+ weight_filler {
2804
+ type: "gaussian"
2805
+ std: 0.01
2806
+ }
2807
+ bias_filler {
2808
+ type: "constant"
2809
+ }
2810
+ }
2811
+ }
2812
+ layer {
2813
+ name: "Mrelu5_stage6_L1"
2814
+ type: "ReLU"
2815
+ bottom: "Mconv5_stage6_L1"
2816
+ top: "Mconv5_stage6_L1"
2817
+ }
2818
+ layer {
2819
+ name: "Mconv5_stage6_L2"
2820
+ type: "Convolution"
2821
+ bottom: "Mconv4_stage6_L2"
2822
+ top: "Mconv5_stage6_L2"
2823
+ param {
2824
+ lr_mult: 4.0
2825
+ decay_mult: 1
2826
+ }
2827
+ param {
2828
+ lr_mult: 8.0
2829
+ decay_mult: 0
2830
+ }
2831
+ convolution_param {
2832
+ num_output: 128
2833
+ pad: 3
2834
+ kernel_size: 7
2835
+ weight_filler {
2836
+ type: "gaussian"
2837
+ std: 0.01
2838
+ }
2839
+ bias_filler {
2840
+ type: "constant"
2841
+ }
2842
+ }
2843
+ }
2844
+ layer {
2845
+ name: "Mrelu5_stage6_L2"
2846
+ type: "ReLU"
2847
+ bottom: "Mconv5_stage6_L2"
2848
+ top: "Mconv5_stage6_L2"
2849
+ }
2850
+ layer {
2851
+ name: "Mconv6_stage6_L1"
2852
+ type: "Convolution"
2853
+ bottom: "Mconv5_stage6_L1"
2854
+ top: "Mconv6_stage6_L1"
2855
+ param {
2856
+ lr_mult: 4.0
2857
+ decay_mult: 1
2858
+ }
2859
+ param {
2860
+ lr_mult: 8.0
2861
+ decay_mult: 0
2862
+ }
2863
+ convolution_param {
2864
+ num_output: 128
2865
+ pad: 0
2866
+ kernel_size: 1
2867
+ weight_filler {
2868
+ type: "gaussian"
2869
+ std: 0.01
2870
+ }
2871
+ bias_filler {
2872
+ type: "constant"
2873
+ }
2874
+ }
2875
+ }
2876
+ layer {
2877
+ name: "Mrelu6_stage6_L1"
2878
+ type: "ReLU"
2879
+ bottom: "Mconv6_stage6_L1"
2880
+ top: "Mconv6_stage6_L1"
2881
+ }
2882
+ layer {
2883
+ name: "Mconv6_stage6_L2"
2884
+ type: "Convolution"
2885
+ bottom: "Mconv5_stage6_L2"
2886
+ top: "Mconv6_stage6_L2"
2887
+ param {
2888
+ lr_mult: 4.0
2889
+ decay_mult: 1
2890
+ }
2891
+ param {
2892
+ lr_mult: 8.0
2893
+ decay_mult: 0
2894
+ }
2895
+ convolution_param {
2896
+ num_output: 128
2897
+ pad: 0
2898
+ kernel_size: 1
2899
+ weight_filler {
2900
+ type: "gaussian"
2901
+ std: 0.01
2902
+ }
2903
+ bias_filler {
2904
+ type: "constant"
2905
+ }
2906
+ }
2907
+ }
2908
+ layer {
2909
+ name: "Mrelu6_stage6_L2"
2910
+ type: "ReLU"
2911
+ bottom: "Mconv6_stage6_L2"
2912
+ top: "Mconv6_stage6_L2"
2913
+ }
2914
+ layer {
2915
+ name: "Mconv7_stage6_L1"
2916
+ type: "Convolution"
2917
+ bottom: "Mconv6_stage6_L1"
2918
+ top: "Mconv7_stage6_L1"
2919
+ param {
2920
+ lr_mult: 4.0
2921
+ decay_mult: 1
2922
+ }
2923
+ param {
2924
+ lr_mult: 8.0
2925
+ decay_mult: 0
2926
+ }
2927
+ convolution_param {
2928
+ num_output: 38
2929
+ pad: 0
2930
+ kernel_size: 1
2931
+ weight_filler {
2932
+ type: "gaussian"
2933
+ std: 0.01
2934
+ }
2935
+ bias_filler {
2936
+ type: "constant"
2937
+ }
2938
+ }
2939
+ }
2940
+ layer {
2941
+ name: "Mconv7_stage6_L2"
2942
+ type: "Convolution"
2943
+ bottom: "Mconv6_stage6_L2"
2944
+ top: "Mconv7_stage6_L2"
2945
+ param {
2946
+ lr_mult: 4.0
2947
+ decay_mult: 1
2948
+ }
2949
+ param {
2950
+ lr_mult: 8.0
2951
+ decay_mult: 0
2952
+ }
2953
+ convolution_param {
2954
+ num_output: 19
2955
+ pad: 0
2956
+ kernel_size: 1
2957
+ weight_filler {
2958
+ type: "gaussian"
2959
+ std: 0.01
2960
+ }
2961
+ bias_filler {
2962
+ type: "constant"
2963
+ }
2964
+ }
2965
+ }
2966
+ layer {
2967
+ name: "concat_stage7"
2968
+ type: "Concat"
2969
+ bottom: "Mconv7_stage6_L2"
2970
+ bottom: "Mconv7_stage6_L1"
2971
+ # top: "concat_stage7"
2972
+ top: "net_output"
2973
+ concat_param {
2974
+ axis: 1
2975
+ }
2976
+ }
model/hand_pose_deploy.prototxt ADDED
@@ -0,0 +1,1756 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ input: "image"
2
+ input_dim: 1 # Original: 2
3
+ input_dim: 3 # It crashes if not left to 3
4
+ input_dim: 1 # Original: 368
5
+ input_dim: 1 # Original: 368
6
+ layer {
7
+ name: "conv1_1"
8
+ type: "Convolution"
9
+ bottom: "image"
10
+ top: "conv1_1"
11
+ param {
12
+ lr_mult: 1.0
13
+ decay_mult: 1
14
+ }
15
+ param {
16
+ lr_mult: 2.0
17
+ decay_mult: 0
18
+ }
19
+ convolution_param {
20
+ num_output: 64
21
+ pad: 1
22
+ kernel_size: 3
23
+ weight_filler {
24
+ type: "xavier"
25
+ }
26
+ bias_filler {
27
+ type: "constant"
28
+ }
29
+ dilation: 1
30
+ }
31
+ }
32
+ layer {
33
+ name: "relu1_1"
34
+ type: "ReLU"
35
+ bottom: "conv1_1"
36
+ top: "conv1_1"
37
+ }
38
+ layer {
39
+ name: "conv1_2"
40
+ type: "Convolution"
41
+ bottom: "conv1_1"
42
+ top: "conv1_2"
43
+ param {
44
+ lr_mult: 1.0
45
+ decay_mult: 1
46
+ }
47
+ param {
48
+ lr_mult: 2.0
49
+ decay_mult: 0
50
+ }
51
+ convolution_param {
52
+ num_output: 64
53
+ pad: 1
54
+ kernel_size: 3
55
+ weight_filler {
56
+ type: "xavier"
57
+ }
58
+ bias_filler {
59
+ type: "constant"
60
+ }
61
+ dilation: 1
62
+ }
63
+ }
64
+ layer {
65
+ name: "relu1_2"
66
+ type: "ReLU"
67
+ bottom: "conv1_2"
68
+ top: "conv1_2"
69
+ }
70
+ layer {
71
+ name: "pool1_stage1"
72
+ type: "Pooling"
73
+ bottom: "conv1_2"
74
+ top: "pool1_stage1"
75
+ pooling_param {
76
+ pool: MAX
77
+ kernel_size: 2
78
+ stride: 2
79
+ }
80
+ }
81
+ layer {
82
+ name: "conv2_1"
83
+ type: "Convolution"
84
+ bottom: "pool1_stage1"
85
+ top: "conv2_1"
86
+ param {
87
+ lr_mult: 1.0
88
+ decay_mult: 1
89
+ }
90
+ param {
91
+ lr_mult: 2.0
92
+ decay_mult: 0
93
+ }
94
+ convolution_param {
95
+ num_output: 128
96
+ pad: 1
97
+ kernel_size: 3
98
+ weight_filler {
99
+ type: "xavier"
100
+ }
101
+ bias_filler {
102
+ type: "constant"
103
+ }
104
+ dilation: 1
105
+ }
106
+ }
107
+ layer {
108
+ name: "relu2_1"
109
+ type: "ReLU"
110
+ bottom: "conv2_1"
111
+ top: "conv2_1"
112
+ }
113
+ layer {
114
+ name: "conv2_2"
115
+ type: "Convolution"
116
+ bottom: "conv2_1"
117
+ top: "conv2_2"
118
+ param {
119
+ lr_mult: 1.0
120
+ decay_mult: 1
121
+ }
122
+ param {
123
+ lr_mult: 2.0
124
+ decay_mult: 0
125
+ }
126
+ convolution_param {
127
+ num_output: 128
128
+ pad: 1
129
+ kernel_size: 3
130
+ weight_filler {
131
+ type: "xavier"
132
+ }
133
+ bias_filler {
134
+ type: "constant"
135
+ }
136
+ dilation: 1
137
+ }
138
+ }
139
+ layer {
140
+ name: "relu2_2"
141
+ type: "ReLU"
142
+ bottom: "conv2_2"
143
+ top: "conv2_2"
144
+ }
145
+ layer {
146
+ name: "pool2_stage1"
147
+ type: "Pooling"
148
+ bottom: "conv2_2"
149
+ top: "pool2_stage1"
150
+ pooling_param {
151
+ pool: MAX
152
+ kernel_size: 2
153
+ stride: 2
154
+ }
155
+ }
156
+ layer {
157
+ name: "conv3_1"
158
+ type: "Convolution"
159
+ bottom: "pool2_stage1"
160
+ top: "conv3_1"
161
+ param {
162
+ lr_mult: 1.0
163
+ decay_mult: 1
164
+ }
165
+ param {
166
+ lr_mult: 2.0
167
+ decay_mult: 0
168
+ }
169
+ convolution_param {
170
+ num_output: 256
171
+ pad: 1
172
+ kernel_size: 3
173
+ weight_filler {
174
+ type: "xavier"
175
+ }
176
+ bias_filler {
177
+ type: "constant"
178
+ }
179
+ dilation: 1
180
+ }
181
+ }
182
+ layer {
183
+ name: "relu3_1"
184
+ type: "ReLU"
185
+ bottom: "conv3_1"
186
+ top: "conv3_1"
187
+ }
188
+ layer {
189
+ name: "conv3_2"
190
+ type: "Convolution"
191
+ bottom: "conv3_1"
192
+ top: "conv3_2"
193
+ param {
194
+ lr_mult: 1.0
195
+ decay_mult: 1
196
+ }
197
+ param {
198
+ lr_mult: 2.0
199
+ decay_mult: 0
200
+ }
201
+ convolution_param {
202
+ num_output: 256
203
+ pad: 1
204
+ kernel_size: 3
205
+ weight_filler {
206
+ type: "xavier"
207
+ }
208
+ bias_filler {
209
+ type: "constant"
210
+ }
211
+ dilation: 1
212
+ }
213
+ }
214
+ layer {
215
+ name: "relu3_2"
216
+ type: "ReLU"
217
+ bottom: "conv3_2"
218
+ top: "conv3_2"
219
+ }
220
+ layer {
221
+ name: "conv3_3"
222
+ type: "Convolution"
223
+ bottom: "conv3_2"
224
+ top: "conv3_3"
225
+ param {
226
+ lr_mult: 1.0
227
+ decay_mult: 1
228
+ }
229
+ param {
230
+ lr_mult: 2.0
231
+ decay_mult: 0
232
+ }
233
+ convolution_param {
234
+ num_output: 256
235
+ pad: 1
236
+ kernel_size: 3
237
+ weight_filler {
238
+ type: "xavier"
239
+ }
240
+ bias_filler {
241
+ type: "constant"
242
+ }
243
+ dilation: 1
244
+ }
245
+ }
246
+ layer {
247
+ name: "relu3_3"
248
+ type: "ReLU"
249
+ bottom: "conv3_3"
250
+ top: "conv3_3"
251
+ }
252
+ layer {
253
+ name: "conv3_4"
254
+ type: "Convolution"
255
+ bottom: "conv3_3"
256
+ top: "conv3_4"
257
+ param {
258
+ lr_mult: 1.0
259
+ decay_mult: 1
260
+ }
261
+ param {
262
+ lr_mult: 2.0
263
+ decay_mult: 0
264
+ }
265
+ convolution_param {
266
+ num_output: 256
267
+ pad: 1
268
+ kernel_size: 3
269
+ weight_filler {
270
+ type: "xavier"
271
+ }
272
+ bias_filler {
273
+ type: "constant"
274
+ }
275
+ dilation: 1
276
+ }
277
+ }
278
+ layer {
279
+ name: "relu3_4"
280
+ type: "ReLU"
281
+ bottom: "conv3_4"
282
+ top: "conv3_4"
283
+ }
284
+ layer {
285
+ name: "pool3_stage1"
286
+ type: "Pooling"
287
+ bottom: "conv3_4"
288
+ top: "pool3_stage1"
289
+ pooling_param {
290
+ pool: MAX
291
+ kernel_size: 2
292
+ stride: 2
293
+ }
294
+ }
295
+ layer {
296
+ name: "conv4_1"
297
+ type: "Convolution"
298
+ bottom: "pool3_stage1"
299
+ top: "conv4_1"
300
+ param {
301
+ lr_mult: 1.0
302
+ decay_mult: 1
303
+ }
304
+ param {
305
+ lr_mult: 2.0
306
+ decay_mult: 0
307
+ }
308
+ convolution_param {
309
+ num_output: 512
310
+ pad: 1
311
+ kernel_size: 3
312
+ weight_filler {
313
+ type: "xavier"
314
+ }
315
+ bias_filler {
316
+ type: "constant"
317
+ }
318
+ dilation: 1
319
+ }
320
+ }
321
+ layer {
322
+ name: "relu4_1"
323
+ type: "ReLU"
324
+ bottom: "conv4_1"
325
+ top: "conv4_1"
326
+ }
327
+ layer {
328
+ name: "conv4_2"
329
+ type: "Convolution"
330
+ bottom: "conv4_1"
331
+ top: "conv4_2"
332
+ param {
333
+ lr_mult: 1.0
334
+ decay_mult: 1
335
+ }
336
+ param {
337
+ lr_mult: 2.0
338
+ decay_mult: 0
339
+ }
340
+ convolution_param {
341
+ num_output: 512
342
+ pad: 1
343
+ kernel_size: 3
344
+ weight_filler {
345
+ type: "xavier"
346
+ }
347
+ bias_filler {
348
+ type: "constant"
349
+ }
350
+ dilation: 1
351
+ }
352
+ }
353
+ layer {
354
+ name: "relu4_2"
355
+ type: "ReLU"
356
+ bottom: "conv4_2"
357
+ top: "conv4_2"
358
+ }
359
+ layer {
360
+ name: "conv4_3"
361
+ type: "Convolution"
362
+ bottom: "conv4_2"
363
+ top: "conv4_3"
364
+ param {
365
+ lr_mult: 1.0
366
+ decay_mult: 1
367
+ }
368
+ param {
369
+ lr_mult: 2.0
370
+ decay_mult: 0
371
+ }
372
+ convolution_param {
373
+ num_output: 512
374
+ pad: 1
375
+ kernel_size: 3
376
+ weight_filler {
377
+ type: "xavier"
378
+ }
379
+ bias_filler {
380
+ type: "constant"
381
+ }
382
+ dilation: 1
383
+ }
384
+ }
385
+ layer {
386
+ name: "relu4_3"
387
+ type: "ReLU"
388
+ bottom: "conv4_3"
389
+ top: "conv4_3"
390
+ }
391
+ layer {
392
+ name: "conv4_4"
393
+ type: "Convolution"
394
+ bottom: "conv4_3"
395
+ top: "conv4_4"
396
+ param {
397
+ lr_mult: 1.0
398
+ decay_mult: 1
399
+ }
400
+ param {
401
+ lr_mult: 2.0
402
+ decay_mult: 0
403
+ }
404
+ convolution_param {
405
+ num_output: 512
406
+ pad: 1
407
+ kernel_size: 3
408
+ weight_filler {
409
+ type: "xavier"
410
+ }
411
+ bias_filler {
412
+ type: "constant"
413
+ }
414
+ dilation: 1
415
+ }
416
+ }
417
+ layer {
418
+ name: "relu4_4"
419
+ type: "ReLU"
420
+ bottom: "conv4_4"
421
+ top: "conv4_4"
422
+ }
423
+ layer {
424
+ name: "conv5_1"
425
+ type: "Convolution"
426
+ bottom: "conv4_4"
427
+ top: "conv5_1"
428
+ param {
429
+ lr_mult: 1.0
430
+ decay_mult: 1
431
+ }
432
+ param {
433
+ lr_mult: 2.0
434
+ decay_mult: 0
435
+ }
436
+ convolution_param {
437
+ num_output: 512
438
+ pad: 1
439
+ kernel_size: 3
440
+ weight_filler {
441
+ type: "xavier"
442
+ }
443
+ bias_filler {
444
+ type: "constant"
445
+ }
446
+ dilation: 1
447
+ }
448
+ }
449
+ layer {
450
+ name: "relu5_1"
451
+ type: "ReLU"
452
+ bottom: "conv5_1"
453
+ top: "conv5_1"
454
+ }
455
+ layer {
456
+ name: "conv5_2"
457
+ type: "Convolution"
458
+ bottom: "conv5_1"
459
+ top: "conv5_2"
460
+ param {
461
+ lr_mult: 1.0
462
+ decay_mult: 1
463
+ }
464
+ param {
465
+ lr_mult: 2.0
466
+ decay_mult: 0
467
+ }
468
+ convolution_param {
469
+ num_output: 512
470
+ pad: 1
471
+ kernel_size: 3
472
+ weight_filler {
473
+ type: "xavier"
474
+ }
475
+ bias_filler {
476
+ type: "constant"
477
+ }
478
+ dilation: 1
479
+ }
480
+ }
481
+ layer {
482
+ name: "relu5_2"
483
+ type: "ReLU"
484
+ bottom: "conv5_2"
485
+ top: "conv5_2"
486
+ }
487
+ layer {
488
+ name: "conv5_3_CPM"
489
+ type: "Convolution"
490
+ bottom: "conv5_2"
491
+ top: "conv5_3_CPM"
492
+ param {
493
+ lr_mult: 1.0
494
+ decay_mult: 1
495
+ }
496
+ param {
497
+ lr_mult: 2.0
498
+ decay_mult: 0
499
+ }
500
+ convolution_param {
501
+ num_output: 128
502
+ pad: 1
503
+ kernel_size: 3
504
+ weight_filler {
505
+ type: "gaussian"
506
+ std: 0.01
507
+ }
508
+ bias_filler {
509
+ type: "constant"
510
+ }
511
+ dilation: 1
512
+ }
513
+ }
514
+ layer {
515
+ name: "relu5_4_stage1_3"
516
+ type: "ReLU"
517
+ bottom: "conv5_3_CPM"
518
+ top: "conv5_3_CPM"
519
+ }
520
+ layer {
521
+ name: "conv6_1_CPM"
522
+ type: "Convolution"
523
+ bottom: "conv5_3_CPM"
524
+ top: "conv6_1_CPM"
525
+ param {
526
+ lr_mult: 1.0
527
+ decay_mult: 1
528
+ }
529
+ param {
530
+ lr_mult: 2.0
531
+ decay_mult: 0
532
+ }
533
+ convolution_param {
534
+ num_output: 512
535
+ pad: 0
536
+ kernel_size: 1
537
+ weight_filler {
538
+ type: "gaussian"
539
+ std: 0.01
540
+ }
541
+ bias_filler {
542
+ type: "constant"
543
+ }
544
+ dilation: 1
545
+ }
546
+ }
547
+ layer {
548
+ name: "relu6_4_stage1_1"
549
+ type: "ReLU"
550
+ bottom: "conv6_1_CPM"
551
+ top: "conv6_1_CPM"
552
+ }
553
+ layer {
554
+ name: "conv6_2_CPM"
555
+ type: "Convolution"
556
+ bottom: "conv6_1_CPM"
557
+ top: "conv6_2_CPM"
558
+ param {
559
+ lr_mult: 1.0
560
+ decay_mult: 1
561
+ }
562
+ param {
563
+ lr_mult: 2.0
564
+ decay_mult: 0
565
+ }
566
+ convolution_param {
567
+ num_output: 22
568
+ pad: 0
569
+ kernel_size: 1
570
+ weight_filler {
571
+ type: "gaussian"
572
+ std: 0.01
573
+ }
574
+ bias_filler {
575
+ type: "constant"
576
+ }
577
+ dilation: 1
578
+ }
579
+ }
580
+ layer {
581
+ name: "concat_stage2"
582
+ type: "Concat"
583
+ bottom: "conv6_2_CPM"
584
+ bottom: "conv5_3_CPM"
585
+ top: "concat_stage2"
586
+ concat_param {
587
+ axis: 1
588
+ }
589
+ }
590
+ layer {
591
+ name: "Mconv1_stage2"
592
+ type: "Convolution"
593
+ bottom: "concat_stage2"
594
+ top: "Mconv1_stage2"
595
+ param {
596
+ lr_mult: 4.0
597
+ decay_mult: 1
598
+ }
599
+ param {
600
+ lr_mult: 8.0
601
+ decay_mult: 0
602
+ }
603
+ convolution_param {
604
+ num_output: 128
605
+ pad: 3
606
+ kernel_size: 7
607
+ weight_filler {
608
+ type: "gaussian"
609
+ std: 0.01
610
+ }
611
+ bias_filler {
612
+ type: "constant"
613
+ }
614
+ dilation: 1
615
+ }
616
+ }
617
+ layer {
618
+ name: "Mrelu1_2_stage2_1"
619
+ type: "ReLU"
620
+ bottom: "Mconv1_stage2"
621
+ top: "Mconv1_stage2"
622
+ }
623
+ layer {
624
+ name: "Mconv2_stage2"
625
+ type: "Convolution"
626
+ bottom: "Mconv1_stage2"
627
+ top: "Mconv2_stage2"
628
+ param {
629
+ lr_mult: 4.0
630
+ decay_mult: 1
631
+ }
632
+ param {
633
+ lr_mult: 8.0
634
+ decay_mult: 0
635
+ }
636
+ convolution_param {
637
+ num_output: 128
638
+ pad: 3
639
+ kernel_size: 7
640
+ weight_filler {
641
+ type: "gaussian"
642
+ std: 0.01
643
+ }
644
+ bias_filler {
645
+ type: "constant"
646
+ }
647
+ dilation: 1
648
+ }
649
+ }
650
+ layer {
651
+ name: "Mrelu1_3_stage2_2"
652
+ type: "ReLU"
653
+ bottom: "Mconv2_stage2"
654
+ top: "Mconv2_stage2"
655
+ }
656
+ layer {
657
+ name: "Mconv3_stage2"
658
+ type: "Convolution"
659
+ bottom: "Mconv2_stage2"
660
+ top: "Mconv3_stage2"
661
+ param {
662
+ lr_mult: 4.0
663
+ decay_mult: 1
664
+ }
665
+ param {
666
+ lr_mult: 8.0
667
+ decay_mult: 0
668
+ }
669
+ convolution_param {
670
+ num_output: 128
671
+ pad: 3
672
+ kernel_size: 7
673
+ weight_filler {
674
+ type: "gaussian"
675
+ std: 0.01
676
+ }
677
+ bias_filler {
678
+ type: "constant"
679
+ }
680
+ dilation: 1
681
+ }
682
+ }
683
+ layer {
684
+ name: "Mrelu1_4_stage2_3"
685
+ type: "ReLU"
686
+ bottom: "Mconv3_stage2"
687
+ top: "Mconv3_stage2"
688
+ }
689
+ layer {
690
+ name: "Mconv4_stage2"
691
+ type: "Convolution"
692
+ bottom: "Mconv3_stage2"
693
+ top: "Mconv4_stage2"
694
+ param {
695
+ lr_mult: 4.0
696
+ decay_mult: 1
697
+ }
698
+ param {
699
+ lr_mult: 8.0
700
+ decay_mult: 0
701
+ }
702
+ convolution_param {
703
+ num_output: 128
704
+ pad: 3
705
+ kernel_size: 7
706
+ weight_filler {
707
+ type: "gaussian"
708
+ std: 0.01
709
+ }
710
+ bias_filler {
711
+ type: "constant"
712
+ }
713
+ dilation: 1
714
+ }
715
+ }
716
+ layer {
717
+ name: "Mrelu1_5_stage2_4"
718
+ type: "ReLU"
719
+ bottom: "Mconv4_stage2"
720
+ top: "Mconv4_stage2"
721
+ }
722
+ layer {
723
+ name: "Mconv5_stage2"
724
+ type: "Convolution"
725
+ bottom: "Mconv4_stage2"
726
+ top: "Mconv5_stage2"
727
+ param {
728
+ lr_mult: 4.0
729
+ decay_mult: 1
730
+ }
731
+ param {
732
+ lr_mult: 8.0
733
+ decay_mult: 0
734
+ }
735
+ convolution_param {
736
+ num_output: 128
737
+ pad: 3
738
+ kernel_size: 7
739
+ weight_filler {
740
+ type: "gaussian"
741
+ std: 0.01
742
+ }
743
+ bias_filler {
744
+ type: "constant"
745
+ }
746
+ dilation: 1
747
+ }
748
+ }
749
+ layer {
750
+ name: "Mrelu1_6_stage2_5"
751
+ type: "ReLU"
752
+ bottom: "Mconv5_stage2"
753
+ top: "Mconv5_stage2"
754
+ }
755
+ layer {
756
+ name: "Mconv6_stage2"
757
+ type: "Convolution"
758
+ bottom: "Mconv5_stage2"
759
+ top: "Mconv6_stage2"
760
+ param {
761
+ lr_mult: 4.0
762
+ decay_mult: 1
763
+ }
764
+ param {
765
+ lr_mult: 8.0
766
+ decay_mult: 0
767
+ }
768
+ convolution_param {
769
+ num_output: 128
770
+ pad: 0
771
+ kernel_size: 1
772
+ weight_filler {
773
+ type: "gaussian"
774
+ std: 0.01
775
+ }
776
+ bias_filler {
777
+ type: "constant"
778
+ }
779
+ dilation: 1
780
+ }
781
+ }
782
+ layer {
783
+ name: "Mrelu1_7_stage2_6"
784
+ type: "ReLU"
785
+ bottom: "Mconv6_stage2"
786
+ top: "Mconv6_stage2"
787
+ }
788
+ layer {
789
+ name: "Mconv7_stage2"
790
+ type: "Convolution"
791
+ bottom: "Mconv6_stage2"
792
+ top: "Mconv7_stage2"
793
+ param {
794
+ lr_mult: 4.0
795
+ decay_mult: 1
796
+ }
797
+ param {
798
+ lr_mult: 8.0
799
+ decay_mult: 0
800
+ }
801
+ convolution_param {
802
+ num_output: 22
803
+ pad: 0
804
+ kernel_size: 1
805
+ weight_filler {
806
+ type: "gaussian"
807
+ std: 0.01
808
+ }
809
+ bias_filler {
810
+ type: "constant"
811
+ }
812
+ dilation: 1
813
+ }
814
+ }
815
+ layer {
816
+ name: "concat_stage3"
817
+ type: "Concat"
818
+ bottom: "Mconv7_stage2"
819
+ bottom: "conv5_3_CPM"
820
+ top: "concat_stage3"
821
+ concat_param {
822
+ axis: 1
823
+ }
824
+ }
825
+ layer {
826
+ name: "Mconv1_stage3"
827
+ type: "Convolution"
828
+ bottom: "concat_stage3"
829
+ top: "Mconv1_stage3"
830
+ param {
831
+ lr_mult: 4.0
832
+ decay_mult: 1
833
+ }
834
+ param {
835
+ lr_mult: 8.0
836
+ decay_mult: 0
837
+ }
838
+ convolution_param {
839
+ num_output: 128
840
+ pad: 3
841
+ kernel_size: 7
842
+ weight_filler {
843
+ type: "gaussian"
844
+ std: 0.01
845
+ }
846
+ bias_filler {
847
+ type: "constant"
848
+ }
849
+ dilation: 1
850
+ }
851
+ }
852
+ layer {
853
+ name: "Mrelu1_2_stage3_1"
854
+ type: "ReLU"
855
+ bottom: "Mconv1_stage3"
856
+ top: "Mconv1_stage3"
857
+ }
858
+ layer {
859
+ name: "Mconv2_stage3"
860
+ type: "Convolution"
861
+ bottom: "Mconv1_stage3"
862
+ top: "Mconv2_stage3"
863
+ param {
864
+ lr_mult: 4.0
865
+ decay_mult: 1
866
+ }
867
+ param {
868
+ lr_mult: 8.0
869
+ decay_mult: 0
870
+ }
871
+ convolution_param {
872
+ num_output: 128
873
+ pad: 3
874
+ kernel_size: 7
875
+ weight_filler {
876
+ type: "gaussian"
877
+ std: 0.01
878
+ }
879
+ bias_filler {
880
+ type: "constant"
881
+ }
882
+ dilation: 1
883
+ }
884
+ }
885
+ layer {
886
+ name: "Mrelu1_3_stage3_2"
887
+ type: "ReLU"
888
+ bottom: "Mconv2_stage3"
889
+ top: "Mconv2_stage3"
890
+ }
891
+ layer {
892
+ name: "Mconv3_stage3"
893
+ type: "Convolution"
894
+ bottom: "Mconv2_stage3"
895
+ top: "Mconv3_stage3"
896
+ param {
897
+ lr_mult: 4.0
898
+ decay_mult: 1
899
+ }
900
+ param {
901
+ lr_mult: 8.0
902
+ decay_mult: 0
903
+ }
904
+ convolution_param {
905
+ num_output: 128
906
+ pad: 3
907
+ kernel_size: 7
908
+ weight_filler {
909
+ type: "gaussian"
910
+ std: 0.01
911
+ }
912
+ bias_filler {
913
+ type: "constant"
914
+ }
915
+ dilation: 1
916
+ }
917
+ }
918
+ layer {
919
+ name: "Mrelu1_4_stage3_3"
920
+ type: "ReLU"
921
+ bottom: "Mconv3_stage3"
922
+ top: "Mconv3_stage3"
923
+ }
924
+ layer {
925
+ name: "Mconv4_stage3"
926
+ type: "Convolution"
927
+ bottom: "Mconv3_stage3"
928
+ top: "Mconv4_stage3"
929
+ param {
930
+ lr_mult: 4.0
931
+ decay_mult: 1
932
+ }
933
+ param {
934
+ lr_mult: 8.0
935
+ decay_mult: 0
936
+ }
937
+ convolution_param {
938
+ num_output: 128
939
+ pad: 3
940
+ kernel_size: 7
941
+ weight_filler {
942
+ type: "gaussian"
943
+ std: 0.01
944
+ }
945
+ bias_filler {
946
+ type: "constant"
947
+ }
948
+ dilation: 1
949
+ }
950
+ }
951
+ layer {
952
+ name: "Mrelu1_5_stage3_4"
953
+ type: "ReLU"
954
+ bottom: "Mconv4_stage3"
955
+ top: "Mconv4_stage3"
956
+ }
957
+ layer {
958
+ name: "Mconv5_stage3"
959
+ type: "Convolution"
960
+ bottom: "Mconv4_stage3"
961
+ top: "Mconv5_stage3"
962
+ param {
963
+ lr_mult: 4.0
964
+ decay_mult: 1
965
+ }
966
+ param {
967
+ lr_mult: 8.0
968
+ decay_mult: 0
969
+ }
970
+ convolution_param {
971
+ num_output: 128
972
+ pad: 3
973
+ kernel_size: 7
974
+ weight_filler {
975
+ type: "gaussian"
976
+ std: 0.01
977
+ }
978
+ bias_filler {
979
+ type: "constant"
980
+ }
981
+ dilation: 1
982
+ }
983
+ }
984
+ layer {
985
+ name: "Mrelu1_6_stage3_5"
986
+ type: "ReLU"
987
+ bottom: "Mconv5_stage3"
988
+ top: "Mconv5_stage3"
989
+ }
990
+ layer {
991
+ name: "Mconv6_stage3"
992
+ type: "Convolution"
993
+ bottom: "Mconv5_stage3"
994
+ top: "Mconv6_stage3"
995
+ param {
996
+ lr_mult: 4.0
997
+ decay_mult: 1
998
+ }
999
+ param {
1000
+ lr_mult: 8.0
1001
+ decay_mult: 0
1002
+ }
1003
+ convolution_param {
1004
+ num_output: 128
1005
+ pad: 0
1006
+ kernel_size: 1
1007
+ weight_filler {
1008
+ type: "gaussian"
1009
+ std: 0.01
1010
+ }
1011
+ bias_filler {
1012
+ type: "constant"
1013
+ }
1014
+ dilation: 1
1015
+ }
1016
+ }
1017
+ layer {
1018
+ name: "Mrelu1_7_stage3_6"
1019
+ type: "ReLU"
1020
+ bottom: "Mconv6_stage3"
1021
+ top: "Mconv6_stage3"
1022
+ }
1023
+ layer {
1024
+ name: "Mconv7_stage3"
1025
+ type: "Convolution"
1026
+ bottom: "Mconv6_stage3"
1027
+ top: "Mconv7_stage3"
1028
+ param {
1029
+ lr_mult: 4.0
1030
+ decay_mult: 1
1031
+ }
1032
+ param {
1033
+ lr_mult: 8.0
1034
+ decay_mult: 0
1035
+ }
1036
+ convolution_param {
1037
+ num_output: 22
1038
+ pad: 0
1039
+ kernel_size: 1
1040
+ weight_filler {
1041
+ type: "gaussian"
1042
+ std: 0.01
1043
+ }
1044
+ bias_filler {
1045
+ type: "constant"
1046
+ }
1047
+ dilation: 1
1048
+ }
1049
+ }
1050
+ layer {
1051
+ name: "concat_stage4"
1052
+ type: "Concat"
1053
+ bottom: "Mconv7_stage3"
1054
+ bottom: "conv5_3_CPM"
1055
+ top: "concat_stage4"
1056
+ concat_param {
1057
+ axis: 1
1058
+ }
1059
+ }
1060
+ layer {
1061
+ name: "Mconv1_stage4"
1062
+ type: "Convolution"
1063
+ bottom: "concat_stage4"
1064
+ top: "Mconv1_stage4"
1065
+ param {
1066
+ lr_mult: 4.0
1067
+ decay_mult: 1
1068
+ }
1069
+ param {
1070
+ lr_mult: 8.0
1071
+ decay_mult: 0
1072
+ }
1073
+ convolution_param {
1074
+ num_output: 128
1075
+ pad: 3
1076
+ kernel_size: 7
1077
+ weight_filler {
1078
+ type: "gaussian"
1079
+ std: 0.01
1080
+ }
1081
+ bias_filler {
1082
+ type: "constant"
1083
+ }
1084
+ dilation: 1
1085
+ }
1086
+ }
1087
+ layer {
1088
+ name: "Mrelu1_2_stage4_1"
1089
+ type: "ReLU"
1090
+ bottom: "Mconv1_stage4"
1091
+ top: "Mconv1_stage4"
1092
+ }
1093
+ layer {
1094
+ name: "Mconv2_stage4"
1095
+ type: "Convolution"
1096
+ bottom: "Mconv1_stage4"
1097
+ top: "Mconv2_stage4"
1098
+ param {
1099
+ lr_mult: 4.0
1100
+ decay_mult: 1
1101
+ }
1102
+ param {
1103
+ lr_mult: 8.0
1104
+ decay_mult: 0
1105
+ }
1106
+ convolution_param {
1107
+ num_output: 128
1108
+ pad: 3
1109
+ kernel_size: 7
1110
+ weight_filler {
1111
+ type: "gaussian"
1112
+ std: 0.01
1113
+ }
1114
+ bias_filler {
1115
+ type: "constant"
1116
+ }
1117
+ dilation: 1
1118
+ }
1119
+ }
1120
+ layer {
1121
+ name: "Mrelu1_3_stage4_2"
1122
+ type: "ReLU"
1123
+ bottom: "Mconv2_stage4"
1124
+ top: "Mconv2_stage4"
1125
+ }
1126
+ layer {
1127
+ name: "Mconv3_stage4"
1128
+ type: "Convolution"
1129
+ bottom: "Mconv2_stage4"
1130
+ top: "Mconv3_stage4"
1131
+ param {
1132
+ lr_mult: 4.0
1133
+ decay_mult: 1
1134
+ }
1135
+ param {
1136
+ lr_mult: 8.0
1137
+ decay_mult: 0
1138
+ }
1139
+ convolution_param {
1140
+ num_output: 128
1141
+ pad: 3
1142
+ kernel_size: 7
1143
+ weight_filler {
1144
+ type: "gaussian"
1145
+ std: 0.01
1146
+ }
1147
+ bias_filler {
1148
+ type: "constant"
1149
+ }
1150
+ dilation: 1
1151
+ }
1152
+ }
1153
+ layer {
1154
+ name: "Mrelu1_4_stage4_3"
1155
+ type: "ReLU"
1156
+ bottom: "Mconv3_stage4"
1157
+ top: "Mconv3_stage4"
1158
+ }
1159
+ layer {
1160
+ name: "Mconv4_stage4"
1161
+ type: "Convolution"
1162
+ bottom: "Mconv3_stage4"
1163
+ top: "Mconv4_stage4"
1164
+ param {
1165
+ lr_mult: 4.0
1166
+ decay_mult: 1
1167
+ }
1168
+ param {
1169
+ lr_mult: 8.0
1170
+ decay_mult: 0
1171
+ }
1172
+ convolution_param {
1173
+ num_output: 128
1174
+ pad: 3
1175
+ kernel_size: 7
1176
+ weight_filler {
1177
+ type: "gaussian"
1178
+ std: 0.01
1179
+ }
1180
+ bias_filler {
1181
+ type: "constant"
1182
+ }
1183
+ dilation: 1
1184
+ }
1185
+ }
1186
+ layer {
1187
+ name: "Mrelu1_5_stage4_4"
1188
+ type: "ReLU"
1189
+ bottom: "Mconv4_stage4"
1190
+ top: "Mconv4_stage4"
1191
+ }
1192
+ layer {
1193
+ name: "Mconv5_stage4"
1194
+ type: "Convolution"
1195
+ bottom: "Mconv4_stage4"
1196
+ top: "Mconv5_stage4"
1197
+ param {
1198
+ lr_mult: 4.0
1199
+ decay_mult: 1
1200
+ }
1201
+ param {
1202
+ lr_mult: 8.0
1203
+ decay_mult: 0
1204
+ }
1205
+ convolution_param {
1206
+ num_output: 128
1207
+ pad: 3
1208
+ kernel_size: 7
1209
+ weight_filler {
1210
+ type: "gaussian"
1211
+ std: 0.01
1212
+ }
1213
+ bias_filler {
1214
+ type: "constant"
1215
+ }
1216
+ dilation: 1
1217
+ }
1218
+ }
1219
+ layer {
1220
+ name: "Mrelu1_6_stage4_5"
1221
+ type: "ReLU"
1222
+ bottom: "Mconv5_stage4"
1223
+ top: "Mconv5_stage4"
1224
+ }
1225
+ layer {
1226
+ name: "Mconv6_stage4"
1227
+ type: "Convolution"
1228
+ bottom: "Mconv5_stage4"
1229
+ top: "Mconv6_stage4"
1230
+ param {
1231
+ lr_mult: 4.0
1232
+ decay_mult: 1
1233
+ }
1234
+ param {
1235
+ lr_mult: 8.0
1236
+ decay_mult: 0
1237
+ }
1238
+ convolution_param {
1239
+ num_output: 128
1240
+ pad: 0
1241
+ kernel_size: 1
1242
+ weight_filler {
1243
+ type: "gaussian"
1244
+ std: 0.01
1245
+ }
1246
+ bias_filler {
1247
+ type: "constant"
1248
+ }
1249
+ dilation: 1
1250
+ }
1251
+ }
1252
+ layer {
1253
+ name: "Mrelu1_7_stage4_6"
1254
+ type: "ReLU"
1255
+ bottom: "Mconv6_stage4"
1256
+ top: "Mconv6_stage4"
1257
+ }
1258
+ layer {
1259
+ name: "Mconv7_stage4"
1260
+ type: "Convolution"
1261
+ bottom: "Mconv6_stage4"
1262
+ top: "Mconv7_stage4"
1263
+ param {
1264
+ lr_mult: 4.0
1265
+ decay_mult: 1
1266
+ }
1267
+ param {
1268
+ lr_mult: 8.0
1269
+ decay_mult: 0
1270
+ }
1271
+ convolution_param {
1272
+ num_output: 22
1273
+ pad: 0
1274
+ kernel_size: 1
1275
+ weight_filler {
1276
+ type: "gaussian"
1277
+ std: 0.01
1278
+ }
1279
+ bias_filler {
1280
+ type: "constant"
1281
+ }
1282
+ dilation: 1
1283
+ }
1284
+ }
1285
+ layer {
1286
+ name: "concat_stage5"
1287
+ type: "Concat"
1288
+ bottom: "Mconv7_stage4"
1289
+ bottom: "conv5_3_CPM"
1290
+ top: "concat_stage5"
1291
+ concat_param {
1292
+ axis: 1
1293
+ }
1294
+ }
1295
+ layer {
1296
+ name: "Mconv1_stage5"
1297
+ type: "Convolution"
1298
+ bottom: "concat_stage5"
1299
+ top: "Mconv1_stage5"
1300
+ param {
1301
+ lr_mult: 4.0
1302
+ decay_mult: 1
1303
+ }
1304
+ param {
1305
+ lr_mult: 8.0
1306
+ decay_mult: 0
1307
+ }
1308
+ convolution_param {
1309
+ num_output: 128
1310
+ pad: 3
1311
+ kernel_size: 7
1312
+ weight_filler {
1313
+ type: "gaussian"
1314
+ std: 0.01
1315
+ }
1316
+ bias_filler {
1317
+ type: "constant"
1318
+ }
1319
+ dilation: 1
1320
+ }
1321
+ }
1322
+ layer {
1323
+ name: "Mrelu1_2_stage5_1"
1324
+ type: "ReLU"
1325
+ bottom: "Mconv1_stage5"
1326
+ top: "Mconv1_stage5"
1327
+ }
1328
+ layer {
1329
+ name: "Mconv2_stage5"
1330
+ type: "Convolution"
1331
+ bottom: "Mconv1_stage5"
1332
+ top: "Mconv2_stage5"
1333
+ param {
1334
+ lr_mult: 4.0
1335
+ decay_mult: 1
1336
+ }
1337
+ param {
1338
+ lr_mult: 8.0
1339
+ decay_mult: 0
1340
+ }
1341
+ convolution_param {
1342
+ num_output: 128
1343
+ pad: 3
1344
+ kernel_size: 7
1345
+ weight_filler {
1346
+ type: "gaussian"
1347
+ std: 0.01
1348
+ }
1349
+ bias_filler {
1350
+ type: "constant"
1351
+ }
1352
+ dilation: 1
1353
+ }
1354
+ }
1355
+ layer {
1356
+ name: "Mrelu1_3_stage5_2"
1357
+ type: "ReLU"
1358
+ bottom: "Mconv2_stage5"
1359
+ top: "Mconv2_stage5"
1360
+ }
1361
+ layer {
1362
+ name: "Mconv3_stage5"
1363
+ type: "Convolution"
1364
+ bottom: "Mconv2_stage5"
1365
+ top: "Mconv3_stage5"
1366
+ param {
1367
+ lr_mult: 4.0
1368
+ decay_mult: 1
1369
+ }
1370
+ param {
1371
+ lr_mult: 8.0
1372
+ decay_mult: 0
1373
+ }
1374
+ convolution_param {
1375
+ num_output: 128
1376
+ pad: 3
1377
+ kernel_size: 7
1378
+ weight_filler {
1379
+ type: "gaussian"
1380
+ std: 0.01
1381
+ }
1382
+ bias_filler {
1383
+ type: "constant"
1384
+ }
1385
+ dilation: 1
1386
+ }
1387
+ }
1388
+ layer {
1389
+ name: "Mrelu1_4_stage5_3"
1390
+ type: "ReLU"
1391
+ bottom: "Mconv3_stage5"
1392
+ top: "Mconv3_stage5"
1393
+ }
1394
+ layer {
1395
+ name: "Mconv4_stage5"
1396
+ type: "Convolution"
1397
+ bottom: "Mconv3_stage5"
1398
+ top: "Mconv4_stage5"
1399
+ param {
1400
+ lr_mult: 4.0
1401
+ decay_mult: 1
1402
+ }
1403
+ param {
1404
+ lr_mult: 8.0
1405
+ decay_mult: 0
1406
+ }
1407
+ convolution_param {
1408
+ num_output: 128
1409
+ pad: 3
1410
+ kernel_size: 7
1411
+ weight_filler {
1412
+ type: "gaussian"
1413
+ std: 0.01
1414
+ }
1415
+ bias_filler {
1416
+ type: "constant"
1417
+ }
1418
+ dilation: 1
1419
+ }
1420
+ }
1421
+ layer {
1422
+ name: "Mrelu1_5_stage5_4"
1423
+ type: "ReLU"
1424
+ bottom: "Mconv4_stage5"
1425
+ top: "Mconv4_stage5"
1426
+ }
1427
+ layer {
1428
+ name: "Mconv5_stage5"
1429
+ type: "Convolution"
1430
+ bottom: "Mconv4_stage5"
1431
+ top: "Mconv5_stage5"
1432
+ param {
1433
+ lr_mult: 4.0
1434
+ decay_mult: 1
1435
+ }
1436
+ param {
1437
+ lr_mult: 8.0
1438
+ decay_mult: 0
1439
+ }
1440
+ convolution_param {
1441
+ num_output: 128
1442
+ pad: 3
1443
+ kernel_size: 7
1444
+ weight_filler {
1445
+ type: "gaussian"
1446
+ std: 0.01
1447
+ }
1448
+ bias_filler {
1449
+ type: "constant"
1450
+ }
1451
+ dilation: 1
1452
+ }
1453
+ }
1454
+ layer {
1455
+ name: "Mrelu1_6_stage5_5"
1456
+ type: "ReLU"
1457
+ bottom: "Mconv5_stage5"
1458
+ top: "Mconv5_stage5"
1459
+ }
1460
+ layer {
1461
+ name: "Mconv6_stage5"
1462
+ type: "Convolution"
1463
+ bottom: "Mconv5_stage5"
1464
+ top: "Mconv6_stage5"
1465
+ param {
1466
+ lr_mult: 4.0
1467
+ decay_mult: 1
1468
+ }
1469
+ param {
1470
+ lr_mult: 8.0
1471
+ decay_mult: 0
1472
+ }
1473
+ convolution_param {
1474
+ num_output: 128
1475
+ pad: 0
1476
+ kernel_size: 1
1477
+ weight_filler {
1478
+ type: "gaussian"
1479
+ std: 0.01
1480
+ }
1481
+ bias_filler {
1482
+ type: "constant"
1483
+ }
1484
+ dilation: 1
1485
+ }
1486
+ }
1487
+ layer {
1488
+ name: "Mrelu1_7_stage5_6"
1489
+ type: "ReLU"
1490
+ bottom: "Mconv6_stage5"
1491
+ top: "Mconv6_stage5"
1492
+ }
1493
+ layer {
1494
+ name: "Mconv7_stage5"
1495
+ type: "Convolution"
1496
+ bottom: "Mconv6_stage5"
1497
+ top: "Mconv7_stage5"
1498
+ param {
1499
+ lr_mult: 4.0
1500
+ decay_mult: 1
1501
+ }
1502
+ param {
1503
+ lr_mult: 8.0
1504
+ decay_mult: 0
1505
+ }
1506
+ convolution_param {
1507
+ num_output: 22
1508
+ pad: 0
1509
+ kernel_size: 1
1510
+ weight_filler {
1511
+ type: "gaussian"
1512
+ std: 0.01
1513
+ }
1514
+ bias_filler {
1515
+ type: "constant"
1516
+ }
1517
+ dilation: 1
1518
+ }
1519
+ }
1520
+ layer {
1521
+ name: "concat_stage6"
1522
+ type: "Concat"
1523
+ bottom: "Mconv7_stage5"
1524
+ bottom: "conv5_3_CPM"
1525
+ top: "concat_stage6"
1526
+ concat_param {
1527
+ axis: 1
1528
+ }
1529
+ }
1530
+ layer {
1531
+ name: "Mconv1_stage6"
1532
+ type: "Convolution"
1533
+ bottom: "concat_stage6"
1534
+ top: "Mconv1_stage6"
1535
+ param {
1536
+ lr_mult: 4.0
1537
+ decay_mult: 1
1538
+ }
1539
+ param {
1540
+ lr_mult: 8.0
1541
+ decay_mult: 0
1542
+ }
1543
+ convolution_param {
1544
+ num_output: 128
1545
+ pad: 3
1546
+ kernel_size: 7
1547
+ weight_filler {
1548
+ type: "gaussian"
1549
+ std: 0.01
1550
+ }
1551
+ bias_filler {
1552
+ type: "constant"
1553
+ }
1554
+ dilation: 1
1555
+ }
1556
+ }
1557
+ layer {
1558
+ name: "Mrelu1_2_stage6_1"
1559
+ type: "ReLU"
1560
+ bottom: "Mconv1_stage6"
1561
+ top: "Mconv1_stage6"
1562
+ }
1563
+ layer {
1564
+ name: "Mconv2_stage6"
1565
+ type: "Convolution"
1566
+ bottom: "Mconv1_stage6"
1567
+ top: "Mconv2_stage6"
1568
+ param {
1569
+ lr_mult: 4.0
1570
+ decay_mult: 1
1571
+ }
1572
+ param {
1573
+ lr_mult: 8.0
1574
+ decay_mult: 0
1575
+ }
1576
+ convolution_param {
1577
+ num_output: 128
1578
+ pad: 3
1579
+ kernel_size: 7
1580
+ weight_filler {
1581
+ type: "gaussian"
1582
+ std: 0.01
1583
+ }
1584
+ bias_filler {
1585
+ type: "constant"
1586
+ }
1587
+ dilation: 1
1588
+ }
1589
+ }
1590
+ layer {
1591
+ name: "Mrelu1_3_stage6_2"
1592
+ type: "ReLU"
1593
+ bottom: "Mconv2_stage6"
1594
+ top: "Mconv2_stage6"
1595
+ }
1596
+ layer {
1597
+ name: "Mconv3_stage6"
1598
+ type: "Convolution"
1599
+ bottom: "Mconv2_stage6"
1600
+ top: "Mconv3_stage6"
1601
+ param {
1602
+ lr_mult: 4.0
1603
+ decay_mult: 1
1604
+ }
1605
+ param {
1606
+ lr_mult: 8.0
1607
+ decay_mult: 0
1608
+ }
1609
+ convolution_param {
1610
+ num_output: 128
1611
+ pad: 3
1612
+ kernel_size: 7
1613
+ weight_filler {
1614
+ type: "gaussian"
1615
+ std: 0.01
1616
+ }
1617
+ bias_filler {
1618
+ type: "constant"
1619
+ }
1620
+ dilation: 1
1621
+ }
1622
+ }
1623
+ layer {
1624
+ name: "Mrelu1_4_stage6_3"
1625
+ type: "ReLU"
1626
+ bottom: "Mconv3_stage6"
1627
+ top: "Mconv3_stage6"
1628
+ }
1629
+ layer {
1630
+ name: "Mconv4_stage6"
1631
+ type: "Convolution"
1632
+ bottom: "Mconv3_stage6"
1633
+ top: "Mconv4_stage6"
1634
+ param {
1635
+ lr_mult: 4.0
1636
+ decay_mult: 1
1637
+ }
1638
+ param {
1639
+ lr_mult: 8.0
1640
+ decay_mult: 0
1641
+ }
1642
+ convolution_param {
1643
+ num_output: 128
1644
+ pad: 3
1645
+ kernel_size: 7
1646
+ weight_filler {
1647
+ type: "gaussian"
1648
+ std: 0.01
1649
+ }
1650
+ bias_filler {
1651
+ type: "constant"
1652
+ }
1653
+ dilation: 1
1654
+ }
1655
+ }
1656
+ layer {
1657
+ name: "Mrelu1_5_stage6_4"
1658
+ type: "ReLU"
1659
+ bottom: "Mconv4_stage6"
1660
+ top: "Mconv4_stage6"
1661
+ }
1662
+ layer {
1663
+ name: "Mconv5_stage6"
1664
+ type: "Convolution"
1665
+ bottom: "Mconv4_stage6"
1666
+ top: "Mconv5_stage6"
1667
+ param {
1668
+ lr_mult: 4.0
1669
+ decay_mult: 1
1670
+ }
1671
+ param {
1672
+ lr_mult: 8.0
1673
+ decay_mult: 0
1674
+ }
1675
+ convolution_param {
1676
+ num_output: 128
1677
+ pad: 3
1678
+ kernel_size: 7
1679
+ weight_filler {
1680
+ type: "gaussian"
1681
+ std: 0.01
1682
+ }
1683
+ bias_filler {
1684
+ type: "constant"
1685
+ }
1686
+ dilation: 1
1687
+ }
1688
+ }
1689
+ layer {
1690
+ name: "Mrelu1_6_stage6_5"
1691
+ type: "ReLU"
1692
+ bottom: "Mconv5_stage6"
1693
+ top: "Mconv5_stage6"
1694
+ }
1695
+ layer {
1696
+ name: "Mconv6_stage6"
1697
+ type: "Convolution"
1698
+ bottom: "Mconv5_stage6"
1699
+ top: "Mconv6_stage6"
1700
+ param {
1701
+ lr_mult: 4.0
1702
+ decay_mult: 1
1703
+ }
1704
+ param {
1705
+ lr_mult: 8.0
1706
+ decay_mult: 0
1707
+ }
1708
+ convolution_param {
1709
+ num_output: 128
1710
+ pad: 0
1711
+ kernel_size: 1
1712
+ weight_filler {
1713
+ type: "gaussian"
1714
+ std: 0.01
1715
+ }
1716
+ bias_filler {
1717
+ type: "constant"
1718
+ }
1719
+ dilation: 1
1720
+ }
1721
+ }
1722
+ layer {
1723
+ name: "Mrelu1_7_stage6_6"
1724
+ type: "ReLU"
1725
+ bottom: "Mconv6_stage6"
1726
+ top: "Mconv6_stage6"
1727
+ }
1728
+ layer {
1729
+ name: "Mconv7_stage6"
1730
+ type: "Convolution"
1731
+ bottom: "Mconv6_stage6"
1732
+ # top: "Mconv7_stage6"
1733
+ top: "net_output"
1734
+ param {
1735
+ lr_mult: 4.0
1736
+ decay_mult: 1
1737
+ }
1738
+ param {
1739
+ lr_mult: 8.0
1740
+ decay_mult: 0
1741
+ }
1742
+ convolution_param {
1743
+ num_output: 22
1744
+ pad: 0
1745
+ kernel_size: 1
1746
+ weight_filler {
1747
+ type: "gaussian"
1748
+ std: 0.01
1749
+ }
1750
+ bias_filler {
1751
+ type: "constant"
1752
+ }
1753
+ dilation: 1
1754
+ }
1755
+ }
1756
+
out.jpg ADDED
requirements.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ numpy
2
+ matplotlib
3
+ opencv-python
4
+ scipy
5
+ scikit-image
6
+ tqdm
src/__init__.py ADDED
File without changes
src/__pycache__/__init__.cpython-37.pyc ADDED
Binary file (140 Bytes). View file
 
src/__pycache__/__init__.cpython-38.pyc ADDED
Binary file (144 Bytes). View file
 
src/__pycache__/body.cpython-37.pyc ADDED
Binary file (7.3 kB). View file
 
src/__pycache__/body.cpython-38.pyc ADDED
Binary file (7.32 kB). View file
 
src/__pycache__/hand.cpython-37.pyc ADDED
Binary file (3.04 kB). View file
 
src/__pycache__/hand.cpython-38.pyc ADDED
Binary file (3.05 kB). View file
 
src/__pycache__/model.cpython-37.pyc ADDED
Binary file (6.03 kB). View file
 
src/__pycache__/model.cpython-38.pyc ADDED
Binary file (6.05 kB). View file
 
src/__pycache__/util.cpython-37.pyc ADDED
Binary file (6.19 kB). View file
 
src/__pycache__/util.cpython-38.pyc ADDED
Binary file (6.24 kB). View file
 
src/body.py ADDED
@@ -0,0 +1,218 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import cv2
2
+ import numpy as np
3
+ import math
4
+ import time
5
+ from scipy.ndimage.filters import gaussian_filter
6
+ import matplotlib.pyplot as plt
7
+ import matplotlib
8
+ import torch
9
+ from torchvision import transforms
10
+
11
+ from src import util
12
+ from src.model import bodypose_model
13
+
14
+ class Body(object):
15
+ def __init__(self, model_path):
16
+ self.model = bodypose_model()
17
+ if torch.cuda.is_available():
18
+ self.model = self.model.cuda()
19
+ model_dict = util.transfer(self.model, torch.load(model_path))
20
+ self.model.load_state_dict(model_dict)
21
+ self.model.eval()
22
+
23
+ def __call__(self, oriImg):
24
+ # scale_search = [0.5, 1.0, 1.5, 2.0]
25
+ scale_search = [0.5]
26
+ boxsize = 368
27
+ stride = 8
28
+ padValue = 128
29
+ thre1 = 0.1
30
+ thre2 = 0.05
31
+ multiplier = [x * boxsize / oriImg.shape[0] for x in scale_search]
32
+ heatmap_avg = np.zeros((oriImg.shape[0], oriImg.shape[1], 19))
33
+ paf_avg = np.zeros((oriImg.shape[0], oriImg.shape[1], 38))
34
+
35
+ for m in range(len(multiplier)):
36
+ scale = multiplier[m]
37
+ imageToTest = cv2.resize(oriImg, (0, 0), fx=scale, fy=scale, interpolation=cv2.INTER_CUBIC)
38
+ imageToTest_padded, pad = util.padRightDownCorner(imageToTest, stride, padValue)
39
+ im = np.transpose(np.float32(imageToTest_padded[:, :, :, np.newaxis]), (3, 2, 0, 1)) / 256 - 0.5
40
+ im = np.ascontiguousarray(im)
41
+
42
+ data = torch.from_numpy(im).float()
43
+ if torch.cuda.is_available():
44
+ data = data.cuda()
45
+ # data = data.permute([2, 0, 1]).unsqueeze(0).float()
46
+ with torch.no_grad():
47
+ Mconv7_stage6_L1, Mconv7_stage6_L2 = self.model(data)
48
+ Mconv7_stage6_L1 = Mconv7_stage6_L1.cpu().numpy()
49
+ Mconv7_stage6_L2 = Mconv7_stage6_L2.cpu().numpy()
50
+
51
+ # extract outputs, resize, and remove padding
52
+ # heatmap = np.transpose(np.squeeze(net.blobs[output_blobs.keys()[1]].data), (1, 2, 0)) # output 1 is heatmaps
53
+ heatmap = np.transpose(np.squeeze(Mconv7_stage6_L2), (1, 2, 0)) # output 1 is heatmaps
54
+ heatmap = cv2.resize(heatmap, (0, 0), fx=stride, fy=stride, interpolation=cv2.INTER_CUBIC)
55
+ heatmap = heatmap[:imageToTest_padded.shape[0] - pad[2], :imageToTest_padded.shape[1] - pad[3], :]
56
+ heatmap = cv2.resize(heatmap, (oriImg.shape[1], oriImg.shape[0]), interpolation=cv2.INTER_CUBIC)
57
+
58
+ # paf = np.transpose(np.squeeze(net.blobs[output_blobs.keys()[0]].data), (1, 2, 0)) # output 0 is PAFs
59
+ paf = np.transpose(np.squeeze(Mconv7_stage6_L1), (1, 2, 0)) # output 0 is PAFs
60
+ paf = cv2.resize(paf, (0, 0), fx=stride, fy=stride, interpolation=cv2.INTER_CUBIC)
61
+ paf = paf[:imageToTest_padded.shape[0] - pad[2], :imageToTest_padded.shape[1] - pad[3], :]
62
+ paf = cv2.resize(paf, (oriImg.shape[1], oriImg.shape[0]), interpolation=cv2.INTER_CUBIC)
63
+
64
+ heatmap_avg += heatmap_avg + heatmap / len(multiplier)
65
+ paf_avg += + paf / len(multiplier)
66
+
67
+ all_peaks = []
68
+ peak_counter = 0
69
+
70
+ for part in range(18):
71
+ map_ori = heatmap_avg[:, :, part]
72
+ one_heatmap = gaussian_filter(map_ori, sigma=3)
73
+
74
+ map_left = np.zeros(one_heatmap.shape)
75
+ map_left[1:, :] = one_heatmap[:-1, :]
76
+ map_right = np.zeros(one_heatmap.shape)
77
+ map_right[:-1, :] = one_heatmap[1:, :]
78
+ map_up = np.zeros(one_heatmap.shape)
79
+ map_up[:, 1:] = one_heatmap[:, :-1]
80
+ map_down = np.zeros(one_heatmap.shape)
81
+ map_down[:, :-1] = one_heatmap[:, 1:]
82
+
83
+ peaks_binary = np.logical_and.reduce(
84
+ (one_heatmap >= map_left, one_heatmap >= map_right, one_heatmap >= map_up, one_heatmap >= map_down, one_heatmap > thre1))
85
+ peaks = list(zip(np.nonzero(peaks_binary)[1], np.nonzero(peaks_binary)[0])) # note reverse
86
+ peaks_with_score = [x + (map_ori[x[1], x[0]],) for x in peaks]
87
+ peak_id = range(peak_counter, peak_counter + len(peaks))
88
+ peaks_with_score_and_id = [peaks_with_score[i] + (peak_id[i],) for i in range(len(peak_id))]
89
+
90
+ all_peaks.append(peaks_with_score_and_id)
91
+ peak_counter += len(peaks)
92
+
93
+ # find connection in the specified sequence, center 29 is in the position 15
94
+ limbSeq = [[2, 3], [2, 6], [3, 4], [4, 5], [6, 7], [7, 8], [2, 9], [9, 10], \
95
+ [10, 11], [2, 12], [12, 13], [13, 14], [2, 1], [1, 15], [15, 17], \
96
+ [1, 16], [16, 18], [3, 17], [6, 18]]
97
+ # the middle joints heatmap correpondence
98
+ mapIdx = [[31, 32], [39, 40], [33, 34], [35, 36], [41, 42], [43, 44], [19, 20], [21, 22], \
99
+ [23, 24], [25, 26], [27, 28], [29, 30], [47, 48], [49, 50], [53, 54], [51, 52], \
100
+ [55, 56], [37, 38], [45, 46]]
101
+
102
+ connection_all = []
103
+ special_k = []
104
+ mid_num = 10
105
+
106
+ for k in range(len(mapIdx)):
107
+ score_mid = paf_avg[:, :, [x - 19 for x in mapIdx[k]]]
108
+ candA = all_peaks[limbSeq[k][0] - 1]
109
+ candB = all_peaks[limbSeq[k][1] - 1]
110
+ nA = len(candA)
111
+ nB = len(candB)
112
+ indexA, indexB = limbSeq[k]
113
+ if (nA != 0 and nB != 0):
114
+ connection_candidate = []
115
+ for i in range(nA):
116
+ for j in range(nB):
117
+ vec = np.subtract(candB[j][:2], candA[i][:2])
118
+ norm = math.sqrt(vec[0] * vec[0] + vec[1] * vec[1])
119
+ norm = max(0.001, norm)
120
+ vec = np.divide(vec, norm)
121
+
122
+ startend = list(zip(np.linspace(candA[i][0], candB[j][0], num=mid_num), \
123
+ np.linspace(candA[i][1], candB[j][1], num=mid_num)))
124
+
125
+ vec_x = np.array([score_mid[int(round(startend[I][1])), int(round(startend[I][0])), 0] \
126
+ for I in range(len(startend))])
127
+ vec_y = np.array([score_mid[int(round(startend[I][1])), int(round(startend[I][0])), 1] \
128
+ for I in range(len(startend))])
129
+
130
+ score_midpts = np.multiply(vec_x, vec[0]) + np.multiply(vec_y, vec[1])
131
+ score_with_dist_prior = sum(score_midpts) / len(score_midpts) + min(
132
+ 0.5 * oriImg.shape[0] / norm - 1, 0)
133
+ criterion1 = len(np.nonzero(score_midpts > thre2)[0]) > 0.8 * len(score_midpts)
134
+ criterion2 = score_with_dist_prior > 0
135
+ if criterion1 and criterion2:
136
+ connection_candidate.append(
137
+ [i, j, score_with_dist_prior, score_with_dist_prior + candA[i][2] + candB[j][2]])
138
+
139
+ connection_candidate = sorted(connection_candidate, key=lambda x: x[2], reverse=True)
140
+ connection = np.zeros((0, 5))
141
+ for c in range(len(connection_candidate)):
142
+ i, j, s = connection_candidate[c][0:3]
143
+ if (i not in connection[:, 3] and j not in connection[:, 4]):
144
+ connection = np.vstack([connection, [candA[i][3], candB[j][3], s, i, j]])
145
+ if (len(connection) >= min(nA, nB)):
146
+ break
147
+
148
+ connection_all.append(connection)
149
+ else:
150
+ special_k.append(k)
151
+ connection_all.append([])
152
+
153
+ # last number in each row is the total parts number of that person
154
+ # the second last number in each row is the score of the overall configuration
155
+ subset = -1 * np.ones((0, 20))
156
+ candidate = np.array([item for sublist in all_peaks for item in sublist])
157
+
158
+ for k in range(len(mapIdx)):
159
+ if k not in special_k:
160
+ partAs = connection_all[k][:, 0]
161
+ partBs = connection_all[k][:, 1]
162
+ indexA, indexB = np.array(limbSeq[k]) - 1
163
+
164
+ for i in range(len(connection_all[k])): # = 1:size(temp,1)
165
+ found = 0
166
+ subset_idx = [-1, -1]
167
+ for j in range(len(subset)): # 1:size(subset,1):
168
+ if subset[j][indexA] == partAs[i] or subset[j][indexB] == partBs[i]:
169
+ subset_idx[found] = j
170
+ found += 1
171
+
172
+ if found == 1:
173
+ j = subset_idx[0]
174
+ if subset[j][indexB] != partBs[i]:
175
+ subset[j][indexB] = partBs[i]
176
+ subset[j][-1] += 1
177
+ subset[j][-2] += candidate[partBs[i].astype(int), 2] + connection_all[k][i][2]
178
+ elif found == 2: # if found 2 and disjoint, merge them
179
+ j1, j2 = subset_idx
180
+ membership = ((subset[j1] >= 0).astype(int) + (subset[j2] >= 0).astype(int))[:-2]
181
+ if len(np.nonzero(membership == 2)[0]) == 0: # merge
182
+ subset[j1][:-2] += (subset[j2][:-2] + 1)
183
+ subset[j1][-2:] += subset[j2][-2:]
184
+ subset[j1][-2] += connection_all[k][i][2]
185
+ subset = np.delete(subset, j2, 0)
186
+ else: # as like found == 1
187
+ subset[j1][indexB] = partBs[i]
188
+ subset[j1][-1] += 1
189
+ subset[j1][-2] += candidate[partBs[i].astype(int), 2] + connection_all[k][i][2]
190
+
191
+ # if find no partA in the subset, create a new subset
192
+ elif not found and k < 17:
193
+ row = -1 * np.ones(20)
194
+ row[indexA] = partAs[i]
195
+ row[indexB] = partBs[i]
196
+ row[-1] = 2
197
+ row[-2] = sum(candidate[connection_all[k][i, :2].astype(int), 2]) + connection_all[k][i][2]
198
+ subset = np.vstack([subset, row])
199
+ # delete some rows of subset which has few parts occur
200
+ deleteIdx = []
201
+ for i in range(len(subset)):
202
+ if subset[i][-1] < 4 or subset[i][-2] / subset[i][-1] < 0.4:
203
+ deleteIdx.append(i)
204
+ subset = np.delete(subset, deleteIdx, axis=0)
205
+
206
+ # subset: n*20 array, 0-17 is the index in candidate, 18 is the total score, 19 is the total parts
207
+ # candidate: x, y, score, id
208
+ return candidate, subset
209
+
210
+ if __name__ == "__main__":
211
+ body_estimation = Body('../model/body_pose_model.pth')
212
+
213
+ test_image = '../images/ski.jpg'
214
+ oriImg = cv2.imread(test_image) # B,G,R order
215
+ candidate, subset = body_estimation(oriImg)
216
+ canvas = util.draw_bodypose(oriImg, candidate, subset)
217
+ plt.imshow(canvas[:, :, [2, 1, 0]])
218
+ plt.show()
src/hand.py ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import cv2
2
+ import json
3
+ import numpy as np
4
+ import math
5
+ import time
6
+ from scipy.ndimage.filters import gaussian_filter
7
+ import matplotlib.pyplot as plt
8
+ import matplotlib
9
+ import torch
10
+ from skimage.measure import label
11
+
12
+ from src.model import handpose_model
13
+ from src import util
14
+
15
+ class Hand(object):
16
+ def __init__(self, model_path):
17
+ self.model = handpose_model()
18
+ if torch.cuda.is_available():
19
+ self.model = self.model.cuda()
20
+ model_dict = util.transfer(self.model, torch.load(model_path))
21
+ self.model.load_state_dict(model_dict)
22
+ self.model.eval()
23
+
24
+ def __call__(self, oriImg):
25
+ scale_search = [0.5, 1.0, 1.5, 2.0]
26
+ # scale_search = [0.5]
27
+ boxsize = 368
28
+ stride = 8
29
+ padValue = 128
30
+ thre = 0.05
31
+ multiplier = [x * boxsize / oriImg.shape[0] for x in scale_search]
32
+ heatmap_avg = np.zeros((oriImg.shape[0], oriImg.shape[1], 22))
33
+ # paf_avg = np.zeros((oriImg.shape[0], oriImg.shape[1], 38))
34
+
35
+ for m in range(len(multiplier)):
36
+ scale = multiplier[m]
37
+ imageToTest = cv2.resize(oriImg, (0, 0), fx=scale, fy=scale, interpolation=cv2.INTER_CUBIC)
38
+ imageToTest_padded, pad = util.padRightDownCorner(imageToTest, stride, padValue)
39
+ im = np.transpose(np.float32(imageToTest_padded[:, :, :, np.newaxis]), (3, 2, 0, 1)) / 256 - 0.5
40
+ im = np.ascontiguousarray(im)
41
+
42
+ data = torch.from_numpy(im).float()
43
+ if torch.cuda.is_available():
44
+ data = data.cuda()
45
+ # data = data.permute([2, 0, 1]).unsqueeze(0).float()
46
+ with torch.no_grad():
47
+ output = self.model(data).cpu().numpy()
48
+ # output = self.model(data).numpy()q
49
+
50
+ # extract outputs, resize, and remove padding
51
+ heatmap = np.transpose(np.squeeze(output), (1, 2, 0)) # output 1 is heatmaps
52
+ heatmap = cv2.resize(heatmap, (0, 0), fx=stride, fy=stride, interpolation=cv2.INTER_CUBIC)
53
+ heatmap = heatmap[:imageToTest_padded.shape[0] - pad[2], :imageToTest_padded.shape[1] - pad[3], :]
54
+ heatmap = cv2.resize(heatmap, (oriImg.shape[1], oriImg.shape[0]), interpolation=cv2.INTER_CUBIC)
55
+
56
+ heatmap_avg += heatmap / len(multiplier)
57
+
58
+ all_peaks = []
59
+ for part in range(21):
60
+ map_ori = heatmap_avg[:, :, part]
61
+ one_heatmap = gaussian_filter(map_ori, sigma=3)
62
+ binary = np.ascontiguousarray(one_heatmap > thre, dtype=np.uint8)
63
+ # 全部小于阈值
64
+ if np.sum(binary) == 0:
65
+ all_peaks.append([0, 0])
66
+ continue
67
+ label_img, label_numbers = label(binary, return_num=True, connectivity=binary.ndim)
68
+ max_index = np.argmax([np.sum(map_ori[label_img == i]) for i in range(1, label_numbers + 1)]) + 1
69
+ label_img[label_img != max_index] = 0
70
+ map_ori[label_img == 0] = 0
71
+
72
+ y, x = util.npmax(map_ori)
73
+ all_peaks.append([x, y])
74
+ return np.array(all_peaks)
75
+
76
+ if __name__ == "__main__":
77
+ hand_estimation = Hand('../model/hand_pose_model.pth')
78
+
79
+ # test_image = '../images/hand.jpg'
80
+ test_image = '../images/hand.jpg'
81
+ oriImg = cv2.imread(test_image) # B,G,R order
82
+ peaks = hand_estimation(oriImg)
83
+ canvas = util.draw_handpose(oriImg, peaks, True)
84
+ cv2.imshow('', canvas)
85
+ cv2.waitKey(0)
src/hand_model_output_size.json ADDED
@@ -0,0 +1,992 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "10":1,
3
+ "11":1,
4
+ "12":1,
5
+ "13":1,
6
+ "14":1,
7
+ "15":1,
8
+ "16":2,
9
+ "17":2,
10
+ "18":2,
11
+ "19":2,
12
+ "20":2,
13
+ "21":2,
14
+ "22":2,
15
+ "23":2,
16
+ "24":3,
17
+ "25":3,
18
+ "26":3,
19
+ "27":3,
20
+ "28":3,
21
+ "29":3,
22
+ "30":3,
23
+ "31":3,
24
+ "32":4,
25
+ "33":4,
26
+ "34":4,
27
+ "35":4,
28
+ "36":4,
29
+ "37":4,
30
+ "38":4,
31
+ "39":4,
32
+ "40":5,
33
+ "41":5,
34
+ "42":5,
35
+ "43":5,
36
+ "44":5,
37
+ "45":5,
38
+ "46":5,
39
+ "47":5,
40
+ "48":6,
41
+ "49":6,
42
+ "50":6,
43
+ "51":6,
44
+ "52":6,
45
+ "53":6,
46
+ "54":6,
47
+ "55":6,
48
+ "56":7,
49
+ "57":7,
50
+ "58":7,
51
+ "59":7,
52
+ "60":7,
53
+ "61":7,
54
+ "62":7,
55
+ "63":7,
56
+ "64":8,
57
+ "65":8,
58
+ "66":8,
59
+ "67":8,
60
+ "68":8,
61
+ "69":8,
62
+ "70":8,
63
+ "71":8,
64
+ "72":9,
65
+ "73":9,
66
+ "74":9,
67
+ "75":9,
68
+ "76":9,
69
+ "77":9,
70
+ "78":9,
71
+ "79":9,
72
+ "80":10,
73
+ "81":10,
74
+ "82":10,
75
+ "83":10,
76
+ "84":10,
77
+ "85":10,
78
+ "86":10,
79
+ "87":10,
80
+ "88":11,
81
+ "89":11,
82
+ "90":11,
83
+ "91":11,
84
+ "92":11,
85
+ "93":11,
86
+ "94":11,
87
+ "95":11,
88
+ "96":12,
89
+ "97":12,
90
+ "98":12,
91
+ "99":12,
92
+ "100":12,
93
+ "101":12,
94
+ "102":12,
95
+ "103":12,
96
+ "104":13,
97
+ "105":13,
98
+ "106":13,
99
+ "107":13,
100
+ "108":13,
101
+ "109":13,
102
+ "110":13,
103
+ "111":13,
104
+ "112":14,
105
+ "113":14,
106
+ "114":14,
107
+ "115":14,
108
+ "116":14,
109
+ "117":14,
110
+ "118":14,
111
+ "119":14,
112
+ "120":15,
113
+ "121":15,
114
+ "122":15,
115
+ "123":15,
116
+ "124":15,
117
+ "125":15,
118
+ "126":15,
119
+ "127":15,
120
+ "128":16,
121
+ "129":16,
122
+ "130":16,
123
+ "131":16,
124
+ "132":16,
125
+ "133":16,
126
+ "134":16,
127
+ "135":16,
128
+ "136":17,
129
+ "137":17,
130
+ "138":17,
131
+ "139":17,
132
+ "140":17,
133
+ "141":17,
134
+ "142":17,
135
+ "143":17,
136
+ "144":18,
137
+ "145":18,
138
+ "146":18,
139
+ "147":18,
140
+ "148":18,
141
+ "149":18,
142
+ "150":18,
143
+ "151":18,
144
+ "152":19,
145
+ "153":19,
146
+ "154":19,
147
+ "155":19,
148
+ "156":19,
149
+ "157":19,
150
+ "158":19,
151
+ "159":19,
152
+ "160":20,
153
+ "161":20,
154
+ "162":20,
155
+ "163":20,
156
+ "164":20,
157
+ "165":20,
158
+ "166":20,
159
+ "167":20,
160
+ "168":21,
161
+ "169":21,
162
+ "170":21,
163
+ "171":21,
164
+ "172":21,
165
+ "173":21,
166
+ "174":21,
167
+ "175":21,
168
+ "176":22,
169
+ "177":22,
170
+ "178":22,
171
+ "179":22,
172
+ "180":22,
173
+ "181":22,
174
+ "182":22,
175
+ "183":22,
176
+ "184":23,
177
+ "185":23,
178
+ "186":23,
179
+ "187":23,
180
+ "188":23,
181
+ "189":23,
182
+ "190":23,
183
+ "191":23,
184
+ "192":24,
185
+ "193":24,
186
+ "194":24,
187
+ "195":24,
188
+ "196":24,
189
+ "197":24,
190
+ "198":24,
191
+ "199":24,
192
+ "200":25,
193
+ "201":25,
194
+ "202":25,
195
+ "203":25,
196
+ "204":25,
197
+ "205":25,
198
+ "206":25,
199
+ "207":25,
200
+ "208":26,
201
+ "209":26,
202
+ "210":26,
203
+ "211":26,
204
+ "212":26,
205
+ "213":26,
206
+ "214":26,
207
+ "215":26,
208
+ "216":27,
209
+ "217":27,
210
+ "218":27,
211
+ "219":27,
212
+ "220":27,
213
+ "221":27,
214
+ "222":27,
215
+ "223":27,
216
+ "224":28,
217
+ "225":28,
218
+ "226":28,
219
+ "227":28,
220
+ "228":28,
221
+ "229":28,
222
+ "230":28,
223
+ "231":28,
224
+ "232":29,
225
+ "233":29,
226
+ "234":29,
227
+ "235":29,
228
+ "236":29,
229
+ "237":29,
230
+ "238":29,
231
+ "239":29,
232
+ "240":30,
233
+ "241":30,
234
+ "242":30,
235
+ "243":30,
236
+ "244":30,
237
+ "245":30,
238
+ "246":30,
239
+ "247":30,
240
+ "248":31,
241
+ "249":31,
242
+ "250":31,
243
+ "251":31,
244
+ "252":31,
245
+ "253":31,
246
+ "254":31,
247
+ "255":31,
248
+ "256":32,
249
+ "257":32,
250
+ "258":32,
251
+ "259":32,
252
+ "260":32,
253
+ "261":32,
254
+ "262":32,
255
+ "263":32,
256
+ "264":33,
257
+ "265":33,
258
+ "266":33,
259
+ "267":33,
260
+ "268":33,
261
+ "269":33,
262
+ "270":33,
263
+ "271":33,
264
+ "272":34,
265
+ "273":34,
266
+ "274":34,
267
+ "275":34,
268
+ "276":34,
269
+ "277":34,
270
+ "278":34,
271
+ "279":34,
272
+ "280":35,
273
+ "281":35,
274
+ "282":35,
275
+ "283":35,
276
+ "284":35,
277
+ "285":35,
278
+ "286":35,
279
+ "287":35,
280
+ "288":36,
281
+ "289":36,
282
+ "290":36,
283
+ "291":36,
284
+ "292":36,
285
+ "293":36,
286
+ "294":36,
287
+ "295":36,
288
+ "296":37,
289
+ "297":37,
290
+ "298":37,
291
+ "299":37,
292
+ "300":37,
293
+ "301":37,
294
+ "302":37,
295
+ "303":37,
296
+ "304":38,
297
+ "305":38,
298
+ "306":38,
299
+ "307":38,
300
+ "308":38,
301
+ "309":38,
302
+ "310":38,
303
+ "311":38,
304
+ "312":39,
305
+ "313":39,
306
+ "314":39,
307
+ "315":39,
308
+ "316":39,
309
+ "317":39,
310
+ "318":39,
311
+ "319":39,
312
+ "320":40,
313
+ "321":40,
314
+ "322":40,
315
+ "323":40,
316
+ "324":40,
317
+ "325":40,
318
+ "326":40,
319
+ "327":40,
320
+ "328":41,
321
+ "329":41,
322
+ "330":41,
323
+ "331":41,
324
+ "332":41,
325
+ "333":41,
326
+ "334":41,
327
+ "335":41,
328
+ "336":42,
329
+ "337":42,
330
+ "338":42,
331
+ "339":42,
332
+ "340":42,
333
+ "341":42,
334
+ "342":42,
335
+ "343":42,
336
+ "344":43,
337
+ "345":43,
338
+ "346":43,
339
+ "347":43,
340
+ "348":43,
341
+ "349":43,
342
+ "350":43,
343
+ "351":43,
344
+ "352":44,
345
+ "353":44,
346
+ "354":44,
347
+ "355":44,
348
+ "356":44,
349
+ "357":44,
350
+ "358":44,
351
+ "359":44,
352
+ "360":45,
353
+ "361":45,
354
+ "362":45,
355
+ "363":45,
356
+ "364":45,
357
+ "365":45,
358
+ "366":45,
359
+ "367":45,
360
+ "368":46,
361
+ "369":46,
362
+ "370":46,
363
+ "371":46,
364
+ "372":46,
365
+ "373":46,
366
+ "374":46,
367
+ "375":46,
368
+ "376":47,
369
+ "377":47,
370
+ "378":47,
371
+ "379":47,
372
+ "380":47,
373
+ "381":47,
374
+ "382":47,
375
+ "383":47,
376
+ "384":48,
377
+ "385":48,
378
+ "386":48,
379
+ "387":48,
380
+ "388":48,
381
+ "389":48,
382
+ "390":48,
383
+ "391":48,
384
+ "392":49,
385
+ "393":49,
386
+ "394":49,
387
+ "395":49,
388
+ "396":49,
389
+ "397":49,
390
+ "398":49,
391
+ "399":49,
392
+ "400":50,
393
+ "401":50,
394
+ "402":50,
395
+ "403":50,
396
+ "404":50,
397
+ "405":50,
398
+ "406":50,
399
+ "407":50,
400
+ "408":51,
401
+ "409":51,
402
+ "410":51,
403
+ "411":51,
404
+ "412":51,
405
+ "413":51,
406
+ "414":51,
407
+ "415":51,
408
+ "416":52,
409
+ "417":52,
410
+ "418":52,
411
+ "419":52,
412
+ "420":52,
413
+ "421":52,
414
+ "422":52,
415
+ "423":52,
416
+ "424":53,
417
+ "425":53,
418
+ "426":53,
419
+ "427":53,
420
+ "428":53,
421
+ "429":53,
422
+ "430":53,
423
+ "431":53,
424
+ "432":54,
425
+ "433":54,
426
+ "434":54,
427
+ "435":54,
428
+ "436":54,
429
+ "437":54,
430
+ "438":54,
431
+ "439":54,
432
+ "440":55,
433
+ "441":55,
434
+ "442":55,
435
+ "443":55,
436
+ "444":55,
437
+ "445":55,
438
+ "446":55,
439
+ "447":55,
440
+ "448":56,
441
+ "449":56,
442
+ "450":56,
443
+ "451":56,
444
+ "452":56,
445
+ "453":56,
446
+ "454":56,
447
+ "455":56,
448
+ "456":57,
449
+ "457":57,
450
+ "458":57,
451
+ "459":57,
452
+ "460":57,
453
+ "461":57,
454
+ "462":57,
455
+ "463":57,
456
+ "464":58,
457
+ "465":58,
458
+ "466":58,
459
+ "467":58,
460
+ "468":58,
461
+ "469":58,
462
+ "470":58,
463
+ "471":58,
464
+ "472":59,
465
+ "473":59,
466
+ "474":59,
467
+ "475":59,
468
+ "476":59,
469
+ "477":59,
470
+ "478":59,
471
+ "479":59,
472
+ "480":60,
473
+ "481":60,
474
+ "482":60,
475
+ "483":60,
476
+ "484":60,
477
+ "485":60,
478
+ "486":60,
479
+ "487":60,
480
+ "488":61,
481
+ "489":61,
482
+ "490":61,
483
+ "491":61,
484
+ "492":61,
485
+ "493":61,
486
+ "494":61,
487
+ "495":61,
488
+ "496":62,
489
+ "497":62,
490
+ "498":62,
491
+ "499":62,
492
+ "500":62,
493
+ "501":62,
494
+ "502":62,
495
+ "503":62,
496
+ "504":63,
497
+ "505":63,
498
+ "506":63,
499
+ "507":63,
500
+ "508":63,
501
+ "509":63,
502
+ "510":63,
503
+ "511":63,
504
+ "512":64,
505
+ "513":64,
506
+ "514":64,
507
+ "515":64,
508
+ "516":64,
509
+ "517":64,
510
+ "518":64,
511
+ "519":64,
512
+ "520":65,
513
+ "521":65,
514
+ "522":65,
515
+ "523":65,
516
+ "524":65,
517
+ "525":65,
518
+ "526":65,
519
+ "527":65,
520
+ "528":66,
521
+ "529":66,
522
+ "530":66,
523
+ "531":66,
524
+ "532":66,
525
+ "533":66,
526
+ "534":66,
527
+ "535":66,
528
+ "536":67,
529
+ "537":67,
530
+ "538":67,
531
+ "539":67,
532
+ "540":67,
533
+ "541":67,
534
+ "542":67,
535
+ "543":67,
536
+ "544":68,
537
+ "545":68,
538
+ "546":68,
539
+ "547":68,
540
+ "548":68,
541
+ "549":68,
542
+ "550":68,
543
+ "551":68,
544
+ "552":69,
545
+ "553":69,
546
+ "554":69,
547
+ "555":69,
548
+ "556":69,
549
+ "557":69,
550
+ "558":69,
551
+ "559":69,
552
+ "560":70,
553
+ "561":70,
554
+ "562":70,
555
+ "563":70,
556
+ "564":70,
557
+ "565":70,
558
+ "566":70,
559
+ "567":70,
560
+ "568":71,
561
+ "569":71,
562
+ "570":71,
563
+ "571":71,
564
+ "572":71,
565
+ "573":71,
566
+ "574":71,
567
+ "575":71,
568
+ "576":72,
569
+ "577":72,
570
+ "578":72,
571
+ "579":72,
572
+ "580":72,
573
+ "581":72,
574
+ "582":72,
575
+ "583":72,
576
+ "584":73,
577
+ "585":73,
578
+ "586":73,
579
+ "587":73,
580
+ "588":73,
581
+ "589":73,
582
+ "590":73,
583
+ "591":73,
584
+ "592":74,
585
+ "593":74,
586
+ "594":74,
587
+ "595":74,
588
+ "596":74,
589
+ "597":74,
590
+ "598":74,
591
+ "599":74,
592
+ "600":75,
593
+ "601":75,
594
+ "602":75,
595
+ "603":75,
596
+ "604":75,
597
+ "605":75,
598
+ "606":75,
599
+ "607":75,
600
+ "608":76,
601
+ "609":76,
602
+ "610":76,
603
+ "611":76,
604
+ "612":76,
605
+ "613":76,
606
+ "614":76,
607
+ "615":76,
608
+ "616":77,
609
+ "617":77,
610
+ "618":77,
611
+ "619":77,
612
+ "620":77,
613
+ "621":77,
614
+ "622":77,
615
+ "623":77,
616
+ "624":78,
617
+ "625":78,
618
+ "626":78,
619
+ "627":78,
620
+ "628":78,
621
+ "629":78,
622
+ "630":78,
623
+ "631":78,
624
+ "632":79,
625
+ "633":79,
626
+ "634":79,
627
+ "635":79,
628
+ "636":79,
629
+ "637":79,
630
+ "638":79,
631
+ "639":79,
632
+ "640":80,
633
+ "641":80,
634
+ "642":80,
635
+ "643":80,
636
+ "644":80,
637
+ "645":80,
638
+ "646":80,
639
+ "647":80,
640
+ "648":81,
641
+ "649":81,
642
+ "650":81,
643
+ "651":81,
644
+ "652":81,
645
+ "653":81,
646
+ "654":81,
647
+ "655":81,
648
+ "656":82,
649
+ "657":82,
650
+ "658":82,
651
+ "659":82,
652
+ "660":82,
653
+ "661":82,
654
+ "662":82,
655
+ "663":82,
656
+ "664":83,
657
+ "665":83,
658
+ "666":83,
659
+ "667":83,
660
+ "668":83,
661
+ "669":83,
662
+ "670":83,
663
+ "671":83,
664
+ "672":84,
665
+ "673":84,
666
+ "674":84,
667
+ "675":84,
668
+ "676":84,
669
+ "677":84,
670
+ "678":84,
671
+ "679":84,
672
+ "680":85,
673
+ "681":85,
674
+ "682":85,
675
+ "683":85,
676
+ "684":85,
677
+ "685":85,
678
+ "686":85,
679
+ "687":85,
680
+ "688":86,
681
+ "689":86,
682
+ "690":86,
683
+ "691":86,
684
+ "692":86,
685
+ "693":86,
686
+ "694":86,
687
+ "695":86,
688
+ "696":87,
689
+ "697":87,
690
+ "698":87,
691
+ "699":87,
692
+ "700":87,
693
+ "701":87,
694
+ "702":87,
695
+ "703":87,
696
+ "704":88,
697
+ "705":88,
698
+ "706":88,
699
+ "707":88,
700
+ "708":88,
701
+ "709":88,
702
+ "710":88,
703
+ "711":88,
704
+ "712":89,
705
+ "713":89,
706
+ "714":89,
707
+ "715":89,
708
+ "716":89,
709
+ "717":89,
710
+ "718":89,
711
+ "719":89,
712
+ "720":90,
713
+ "721":90,
714
+ "722":90,
715
+ "723":90,
716
+ "724":90,
717
+ "725":90,
718
+ "726":90,
719
+ "727":90,
720
+ "728":91,
721
+ "729":91,
722
+ "730":91,
723
+ "731":91,
724
+ "732":91,
725
+ "733":91,
726
+ "734":91,
727
+ "735":91,
728
+ "736":92,
729
+ "737":92,
730
+ "738":92,
731
+ "739":92,
732
+ "740":92,
733
+ "741":92,
734
+ "742":92,
735
+ "743":92,
736
+ "744":93,
737
+ "745":93,
738
+ "746":93,
739
+ "747":93,
740
+ "748":93,
741
+ "749":93,
742
+ "750":93,
743
+ "751":93,
744
+ "752":94,
745
+ "753":94,
746
+ "754":94,
747
+ "755":94,
748
+ "756":94,
749
+ "757":94,
750
+ "758":94,
751
+ "759":94,
752
+ "760":95,
753
+ "761":95,
754
+ "762":95,
755
+ "763":95,
756
+ "764":95,
757
+ "765":95,
758
+ "766":95,
759
+ "767":95,
760
+ "768":96,
761
+ "769":96,
762
+ "770":96,
763
+ "771":96,
764
+ "772":96,
765
+ "773":96,
766
+ "774":96,
767
+ "775":96,
768
+ "776":97,
769
+ "777":97,
770
+ "778":97,
771
+ "779":97,
772
+ "780":97,
773
+ "781":97,
774
+ "782":97,
775
+ "783":97,
776
+ "784":98,
777
+ "785":98,
778
+ "786":98,
779
+ "787":98,
780
+ "788":98,
781
+ "789":98,
782
+ "790":98,
783
+ "791":98,
784
+ "792":99,
785
+ "793":99,
786
+ "794":99,
787
+ "795":99,
788
+ "796":99,
789
+ "797":99,
790
+ "798":99,
791
+ "799":99,
792
+ "800":100,
793
+ "801":100,
794
+ "802":100,
795
+ "803":100,
796
+ "804":100,
797
+ "805":100,
798
+ "806":100,
799
+ "807":100,
800
+ "808":101,
801
+ "809":101,
802
+ "810":101,
803
+ "811":101,
804
+ "812":101,
805
+ "813":101,
806
+ "814":101,
807
+ "815":101,
808
+ "816":102,
809
+ "817":102,
810
+ "818":102,
811
+ "819":102,
812
+ "820":102,
813
+ "821":102,
814
+ "822":102,
815
+ "823":102,
816
+ "824":103,
817
+ "825":103,
818
+ "826":103,
819
+ "827":103,
820
+ "828":103,
821
+ "829":103,
822
+ "830":103,
823
+ "831":103,
824
+ "832":104,
825
+ "833":104,
826
+ "834":104,
827
+ "835":104,
828
+ "836":104,
829
+ "837":104,
830
+ "838":104,
831
+ "839":104,
832
+ "840":105,
833
+ "841":105,
834
+ "842":105,
835
+ "843":105,
836
+ "844":105,
837
+ "845":105,
838
+ "846":105,
839
+ "847":105,
840
+ "848":106,
841
+ "849":106,
842
+ "850":106,
843
+ "851":106,
844
+ "852":106,
845
+ "853":106,
846
+ "854":106,
847
+ "855":106,
848
+ "856":107,
849
+ "857":107,
850
+ "858":107,
851
+ "859":107,
852
+ "860":107,
853
+ "861":107,
854
+ "862":107,
855
+ "863":107,
856
+ "864":108,
857
+ "865":108,
858
+ "866":108,
859
+ "867":108,
860
+ "868":108,
861
+ "869":108,
862
+ "870":108,
863
+ "871":108,
864
+ "872":109,
865
+ "873":109,
866
+ "874":109,
867
+ "875":109,
868
+ "876":109,
869
+ "877":109,
870
+ "878":109,
871
+ "879":109,
872
+ "880":110,
873
+ "881":110,
874
+ "882":110,
875
+ "883":110,
876
+ "884":110,
877
+ "885":110,
878
+ "886":110,
879
+ "887":110,
880
+ "888":111,
881
+ "889":111,
882
+ "890":111,
883
+ "891":111,
884
+ "892":111,
885
+ "893":111,
886
+ "894":111,
887
+ "895":111,
888
+ "896":112,
889
+ "897":112,
890
+ "898":112,
891
+ "899":112,
892
+ "900":112,
893
+ "901":112,
894
+ "902":112,
895
+ "903":112,
896
+ "904":113,
897
+ "905":113,
898
+ "906":113,
899
+ "907":113,
900
+ "908":113,
901
+ "909":113,
902
+ "910":113,
903
+ "911":113,
904
+ "912":114,
905
+ "913":114,
906
+ "914":114,
907
+ "915":114,
908
+ "916":114,
909
+ "917":114,
910
+ "918":114,
911
+ "919":114,
912
+ "920":115,
913
+ "921":115,
914
+ "922":115,
915
+ "923":115,
916
+ "924":115,
917
+ "925":115,
918
+ "926":115,
919
+ "927":115,
920
+ "928":116,
921
+ "929":116,
922
+ "930":116,
923
+ "931":116,
924
+ "932":116,
925
+ "933":116,
926
+ "934":116,
927
+ "935":116,
928
+ "936":117,
929
+ "937":117,
930
+ "938":117,
931
+ "939":117,
932
+ "940":117,
933
+ "941":117,
934
+ "942":117,
935
+ "943":117,
936
+ "944":118,
937
+ "945":118,
938
+ "946":118,
939
+ "947":118,
940
+ "948":118,
941
+ "949":118,
942
+ "950":118,
943
+ "951":118,
944
+ "952":119,
945
+ "953":119,
946
+ "954":119,
947
+ "955":119,
948
+ "956":119,
949
+ "957":119,
950
+ "958":119,
951
+ "959":119,
952
+ "960":120,
953
+ "961":120,
954
+ "962":120,
955
+ "963":120,
956
+ "964":120,
957
+ "965":120,
958
+ "966":120,
959
+ "967":120,
960
+ "968":121,
961
+ "969":121,
962
+ "970":121,
963
+ "971":121,
964
+ "972":121,
965
+ "973":121,
966
+ "974":121,
967
+ "975":121,
968
+ "976":122,
969
+ "977":122,
970
+ "978":122,
971
+ "979":122,
972
+ "980":122,
973
+ "981":122,
974
+ "982":122,
975
+ "983":122,
976
+ "984":123,
977
+ "985":123,
978
+ "986":123,
979
+ "987":123,
980
+ "988":123,
981
+ "989":123,
982
+ "990":123,
983
+ "991":123,
984
+ "992":124,
985
+ "993":124,
986
+ "994":124,
987
+ "995":124,
988
+ "996":124,
989
+ "997":124,
990
+ "998":124,
991
+ "999":124
992
+ }
src/hand_model_outputsize.py ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ from tqdm import tqdm
3
+ import json
4
+
5
+ from src.model import handpose_model
6
+
7
+ model = handpose_model()
8
+
9
+ size = {}
10
+ for i in tqdm(range(10, 1000)):
11
+ data = torch.randn(1, 3, i, i)
12
+ if torch.cuda.is_available():
13
+ data = data.cuda()
14
+ size[i] = model(data).size(2)
15
+
16
+ with open('hand_model_output_size.json') as f:
17
+ json.dump(size, f)
src/model.py ADDED
@@ -0,0 +1,219 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ from collections import OrderedDict
3
+
4
+ import torch
5
+ import torch.nn as nn
6
+
7
+ def make_layers(block, no_relu_layers):
8
+ layers = []
9
+ for layer_name, v in block.items():
10
+ if 'pool' in layer_name:
11
+ layer = nn.MaxPool2d(kernel_size=v[0], stride=v[1],
12
+ padding=v[2])
13
+ layers.append((layer_name, layer))
14
+ else:
15
+ conv2d = nn.Conv2d(in_channels=v[0], out_channels=v[1],
16
+ kernel_size=v[2], stride=v[3],
17
+ padding=v[4])
18
+ layers.append((layer_name, conv2d))
19
+ if layer_name not in no_relu_layers:
20
+ layers.append(('relu_'+layer_name, nn.ReLU(inplace=True)))
21
+
22
+ return nn.Sequential(OrderedDict(layers))
23
+
24
+ class bodypose_model(nn.Module):
25
+ def __init__(self):
26
+ super(bodypose_model, self).__init__()
27
+
28
+ # these layers have no relu layer
29
+ no_relu_layers = ['conv5_5_CPM_L1', 'conv5_5_CPM_L2', 'Mconv7_stage2_L1',\
30
+ 'Mconv7_stage2_L2', 'Mconv7_stage3_L1', 'Mconv7_stage3_L2',\
31
+ 'Mconv7_stage4_L1', 'Mconv7_stage4_L2', 'Mconv7_stage5_L1',\
32
+ 'Mconv7_stage5_L2', 'Mconv7_stage6_L1', 'Mconv7_stage6_L1']
33
+ blocks = {}
34
+ block0 = OrderedDict([
35
+ ('conv1_1', [3, 64, 3, 1, 1]),
36
+ ('conv1_2', [64, 64, 3, 1, 1]),
37
+ ('pool1_stage1', [2, 2, 0]),
38
+ ('conv2_1', [64, 128, 3, 1, 1]),
39
+ ('conv2_2', [128, 128, 3, 1, 1]),
40
+ ('pool2_stage1', [2, 2, 0]),
41
+ ('conv3_1', [128, 256, 3, 1, 1]),
42
+ ('conv3_2', [256, 256, 3, 1, 1]),
43
+ ('conv3_3', [256, 256, 3, 1, 1]),
44
+ ('conv3_4', [256, 256, 3, 1, 1]),
45
+ ('pool3_stage1', [2, 2, 0]),
46
+ ('conv4_1', [256, 512, 3, 1, 1]),
47
+ ('conv4_2', [512, 512, 3, 1, 1]),
48
+ ('conv4_3_CPM', [512, 256, 3, 1, 1]),
49
+ ('conv4_4_CPM', [256, 128, 3, 1, 1])
50
+ ])
51
+
52
+
53
+ # Stage 1
54
+ block1_1 = OrderedDict([
55
+ ('conv5_1_CPM_L1', [128, 128, 3, 1, 1]),
56
+ ('conv5_2_CPM_L1', [128, 128, 3, 1, 1]),
57
+ ('conv5_3_CPM_L1', [128, 128, 3, 1, 1]),
58
+ ('conv5_4_CPM_L1', [128, 512, 1, 1, 0]),
59
+ ('conv5_5_CPM_L1', [512, 38, 1, 1, 0])
60
+ ])
61
+
62
+ block1_2 = OrderedDict([
63
+ ('conv5_1_CPM_L2', [128, 128, 3, 1, 1]),
64
+ ('conv5_2_CPM_L2', [128, 128, 3, 1, 1]),
65
+ ('conv5_3_CPM_L2', [128, 128, 3, 1, 1]),
66
+ ('conv5_4_CPM_L2', [128, 512, 1, 1, 0]),
67
+ ('conv5_5_CPM_L2', [512, 19, 1, 1, 0])
68
+ ])
69
+ blocks['block1_1'] = block1_1
70
+ blocks['block1_2'] = block1_2
71
+
72
+ self.model0 = make_layers(block0, no_relu_layers)
73
+
74
+ # Stages 2 - 6
75
+ for i in range(2, 7):
76
+ blocks['block%d_1' % i] = OrderedDict([
77
+ ('Mconv1_stage%d_L1' % i, [185, 128, 7, 1, 3]),
78
+ ('Mconv2_stage%d_L1' % i, [128, 128, 7, 1, 3]),
79
+ ('Mconv3_stage%d_L1' % i, [128, 128, 7, 1, 3]),
80
+ ('Mconv4_stage%d_L1' % i, [128, 128, 7, 1, 3]),
81
+ ('Mconv5_stage%d_L1' % i, [128, 128, 7, 1, 3]),
82
+ ('Mconv6_stage%d_L1' % i, [128, 128, 1, 1, 0]),
83
+ ('Mconv7_stage%d_L1' % i, [128, 38, 1, 1, 0])
84
+ ])
85
+
86
+ blocks['block%d_2' % i] = OrderedDict([
87
+ ('Mconv1_stage%d_L2' % i, [185, 128, 7, 1, 3]),
88
+ ('Mconv2_stage%d_L2' % i, [128, 128, 7, 1, 3]),
89
+ ('Mconv3_stage%d_L2' % i, [128, 128, 7, 1, 3]),
90
+ ('Mconv4_stage%d_L2' % i, [128, 128, 7, 1, 3]),
91
+ ('Mconv5_stage%d_L2' % i, [128, 128, 7, 1, 3]),
92
+ ('Mconv6_stage%d_L2' % i, [128, 128, 1, 1, 0]),
93
+ ('Mconv7_stage%d_L2' % i, [128, 19, 1, 1, 0])
94
+ ])
95
+
96
+ for k in blocks.keys():
97
+ blocks[k] = make_layers(blocks[k], no_relu_layers)
98
+
99
+ self.model1_1 = blocks['block1_1']
100
+ self.model2_1 = blocks['block2_1']
101
+ self.model3_1 = blocks['block3_1']
102
+ self.model4_1 = blocks['block4_1']
103
+ self.model5_1 = blocks['block5_1']
104
+ self.model6_1 = blocks['block6_1']
105
+
106
+ self.model1_2 = blocks['block1_2']
107
+ self.model2_2 = blocks['block2_2']
108
+ self.model3_2 = blocks['block3_2']
109
+ self.model4_2 = blocks['block4_2']
110
+ self.model5_2 = blocks['block5_2']
111
+ self.model6_2 = blocks['block6_2']
112
+
113
+
114
+ def forward(self, x):
115
+
116
+ out1 = self.model0(x)
117
+
118
+ out1_1 = self.model1_1(out1)
119
+ out1_2 = self.model1_2(out1)
120
+ out2 = torch.cat([out1_1, out1_2, out1], 1)
121
+
122
+ out2_1 = self.model2_1(out2)
123
+ out2_2 = self.model2_2(out2)
124
+ out3 = torch.cat([out2_1, out2_2, out1], 1)
125
+
126
+ out3_1 = self.model3_1(out3)
127
+ out3_2 = self.model3_2(out3)
128
+ out4 = torch.cat([out3_1, out3_2, out1], 1)
129
+
130
+ out4_1 = self.model4_1(out4)
131
+ out4_2 = self.model4_2(out4)
132
+ out5 = torch.cat([out4_1, out4_2, out1], 1)
133
+
134
+ out5_1 = self.model5_1(out5)
135
+ out5_2 = self.model5_2(out5)
136
+ out6 = torch.cat([out5_1, out5_2, out1], 1)
137
+
138
+ out6_1 = self.model6_1(out6)
139
+ out6_2 = self.model6_2(out6)
140
+
141
+ return out6_1, out6_2
142
+
143
+ class handpose_model(nn.Module):
144
+ def __init__(self):
145
+ super(handpose_model, self).__init__()
146
+
147
+ # these layers have no relu layer
148
+ no_relu_layers = ['conv6_2_CPM', 'Mconv7_stage2', 'Mconv7_stage3',\
149
+ 'Mconv7_stage4', 'Mconv7_stage5', 'Mconv7_stage6']
150
+ # stage 1
151
+ block1_0 = OrderedDict([
152
+ ('conv1_1', [3, 64, 3, 1, 1]),
153
+ ('conv1_2', [64, 64, 3, 1, 1]),
154
+ ('pool1_stage1', [2, 2, 0]),
155
+ ('conv2_1', [64, 128, 3, 1, 1]),
156
+ ('conv2_2', [128, 128, 3, 1, 1]),
157
+ ('pool2_stage1', [2, 2, 0]),
158
+ ('conv3_1', [128, 256, 3, 1, 1]),
159
+ ('conv3_2', [256, 256, 3, 1, 1]),
160
+ ('conv3_3', [256, 256, 3, 1, 1]),
161
+ ('conv3_4', [256, 256, 3, 1, 1]),
162
+ ('pool3_stage1', [2, 2, 0]),
163
+ ('conv4_1', [256, 512, 3, 1, 1]),
164
+ ('conv4_2', [512, 512, 3, 1, 1]),
165
+ ('conv4_3', [512, 512, 3, 1, 1]),
166
+ ('conv4_4', [512, 512, 3, 1, 1]),
167
+ ('conv5_1', [512, 512, 3, 1, 1]),
168
+ ('conv5_2', [512, 512, 3, 1, 1]),
169
+ ('conv5_3_CPM', [512, 128, 3, 1, 1])
170
+ ])
171
+
172
+ block1_1 = OrderedDict([
173
+ ('conv6_1_CPM', [128, 512, 1, 1, 0]),
174
+ ('conv6_2_CPM', [512, 22, 1, 1, 0])
175
+ ])
176
+
177
+ blocks = {}
178
+ blocks['block1_0'] = block1_0
179
+ blocks['block1_1'] = block1_1
180
+
181
+ # stage 2-6
182
+ for i in range(2, 7):
183
+ blocks['block%d' % i] = OrderedDict([
184
+ ('Mconv1_stage%d' % i, [150, 128, 7, 1, 3]),
185
+ ('Mconv2_stage%d' % i, [128, 128, 7, 1, 3]),
186
+ ('Mconv3_stage%d' % i, [128, 128, 7, 1, 3]),
187
+ ('Mconv4_stage%d' % i, [128, 128, 7, 1, 3]),
188
+ ('Mconv5_stage%d' % i, [128, 128, 7, 1, 3]),
189
+ ('Mconv6_stage%d' % i, [128, 128, 1, 1, 0]),
190
+ ('Mconv7_stage%d' % i, [128, 22, 1, 1, 0])
191
+ ])
192
+
193
+ for k in blocks.keys():
194
+ blocks[k] = make_layers(blocks[k], no_relu_layers)
195
+
196
+ self.model1_0 = blocks['block1_0']
197
+ self.model1_1 = blocks['block1_1']
198
+ self.model2 = blocks['block2']
199
+ self.model3 = blocks['block3']
200
+ self.model4 = blocks['block4']
201
+ self.model5 = blocks['block5']
202
+ self.model6 = blocks['block6']
203
+
204
+ def forward(self, x):
205
+ out1_0 = self.model1_0(x)
206
+ out1_1 = self.model1_1(out1_0)
207
+ concat_stage2 = torch.cat([out1_1, out1_0], 1)
208
+ out_stage2 = self.model2(concat_stage2)
209
+ concat_stage3 = torch.cat([out_stage2, out1_0], 1)
210
+ out_stage3 = self.model3(concat_stage3)
211
+ concat_stage4 = torch.cat([out_stage3, out1_0], 1)
212
+ out_stage4 = self.model4(concat_stage4)
213
+ concat_stage5 = torch.cat([out_stage4, out1_0], 1)
214
+ out_stage5 = self.model5(concat_stage5)
215
+ concat_stage6 = torch.cat([out_stage5, out1_0], 1)
216
+ out_stage6 = self.model6(concat_stage6)
217
+ return out_stage6
218
+
219
+
src/util.py ADDED
@@ -0,0 +1,198 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import math
3
+ import cv2
4
+ import matplotlib
5
+ from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
6
+ from matplotlib.figure import Figure
7
+ import numpy as np
8
+ import matplotlib.pyplot as plt
9
+ import cv2
10
+
11
+
12
+ def padRightDownCorner(img, stride, padValue):
13
+ h = img.shape[0]
14
+ w = img.shape[1]
15
+
16
+ pad = 4 * [None]
17
+ pad[0] = 0 # up
18
+ pad[1] = 0 # left
19
+ pad[2] = 0 if (h % stride == 0) else stride - (h % stride) # down
20
+ pad[3] = 0 if (w % stride == 0) else stride - (w % stride) # right
21
+
22
+ img_padded = img
23
+ pad_up = np.tile(img_padded[0:1, :, :]*0 + padValue, (pad[0], 1, 1))
24
+ img_padded = np.concatenate((pad_up, img_padded), axis=0)
25
+ pad_left = np.tile(img_padded[:, 0:1, :]*0 + padValue, (1, pad[1], 1))
26
+ img_padded = np.concatenate((pad_left, img_padded), axis=1)
27
+ pad_down = np.tile(img_padded[-2:-1, :, :]*0 + padValue, (pad[2], 1, 1))
28
+ img_padded = np.concatenate((img_padded, pad_down), axis=0)
29
+ pad_right = np.tile(img_padded[:, -2:-1, :]*0 + padValue, (1, pad[3], 1))
30
+ img_padded = np.concatenate((img_padded, pad_right), axis=1)
31
+
32
+ return img_padded, pad
33
+
34
+ # transfer caffe model to pytorch which will match the layer name
35
+ def transfer(model, model_weights):
36
+ transfered_model_weights = {}
37
+ for weights_name in model.state_dict().keys():
38
+ transfered_model_weights[weights_name] = model_weights['.'.join(weights_name.split('.')[1:])]
39
+ return transfered_model_weights
40
+
41
+ # draw the body keypoint and lims
42
+ def draw_bodypose(canvas, candidate, subset):
43
+ stickwidth = 4
44
+ limbSeq = [[2, 3], [2, 6], [3, 4], [4, 5], [6, 7], [7, 8], [2, 9], [9, 10], \
45
+ [10, 11], [2, 12], [12, 13], [13, 14], [2, 1], [1, 15], [15, 17], \
46
+ [1, 16], [16, 18], [3, 17], [6, 18]]
47
+
48
+ colors = [[255, 0, 0], [255, 85, 0], [255, 170, 0], [255, 255, 0], [170, 255, 0], [85, 255, 0], [0, 255, 0], \
49
+ [0, 255, 85], [0, 255, 170], [0, 255, 255], [0, 170, 255], [0, 85, 255], [0, 0, 255], [85, 0, 255], \
50
+ [170, 0, 255], [255, 0, 255], [255, 0, 170], [255, 0, 85]]
51
+ for i in range(18):
52
+ for n in range(len(subset)):
53
+ index = int(subset[n][i])
54
+ if index == -1:
55
+ continue
56
+ x, y = candidate[index][0:2]
57
+ cv2.circle(canvas, (int(x), int(y)), 4, colors[i], thickness=-1)
58
+ for i in range(17):
59
+ for n in range(len(subset)):
60
+ index = subset[n][np.array(limbSeq[i]) - 1]
61
+ if -1 in index:
62
+ continue
63
+ cur_canvas = canvas.copy()
64
+ Y = candidate[index.astype(int), 0]
65
+ X = candidate[index.astype(int), 1]
66
+ mX = np.mean(X)
67
+ mY = np.mean(Y)
68
+ length = ((X[0] - X[1]) ** 2 + (Y[0] - Y[1]) ** 2) ** 0.5
69
+ angle = math.degrees(math.atan2(X[0] - X[1], Y[0] - Y[1]))
70
+ polygon = cv2.ellipse2Poly((int(mY), int(mX)), (int(length / 2), stickwidth), int(angle), 0, 360, 1)
71
+ cv2.fillConvexPoly(cur_canvas, polygon, colors[i])
72
+ canvas = cv2.addWeighted(canvas, 0.4, cur_canvas, 0.6, 0)
73
+ # plt.imsave("preview.jpg", canvas[:, :, [2, 1, 0]])
74
+ # plt.imshow(canvas[:, :, [2, 1, 0]])
75
+ return canvas
76
+
77
+ def draw_handpose(canvas, all_hand_peaks, show_number=False):
78
+ edges = [[0, 1], [1, 2], [2, 3], [3, 4], [0, 5], [5, 6], [6, 7], [7, 8], [0, 9], [9, 10], \
79
+ [10, 11], [11, 12], [0, 13], [13, 14], [14, 15], [15, 16], [0, 17], [17, 18], [18, 19], [19, 20]]
80
+ fig = Figure(figsize=plt.figaspect(canvas))
81
+
82
+ fig.subplots_adjust(0, 0, 1, 1)
83
+ fig.subplots_adjust(bottom=0, top=1, left=0, right=1)
84
+ bg = FigureCanvas(fig)
85
+ ax = fig.subplots()
86
+ ax.axis('off')
87
+ ax.imshow(canvas)
88
+
89
+ width, height = ax.figure.get_size_inches() * ax.figure.get_dpi()
90
+
91
+ for peaks in all_hand_peaks:
92
+ for ie, e in enumerate(edges):
93
+ if np.sum(np.all(peaks[e], axis=1)==0)==0:
94
+ x1, y1 = peaks[e[0]]
95
+ x2, y2 = peaks[e[1]]
96
+ ax.plot([x1, x2], [y1, y2], color=matplotlib.colors.hsv_to_rgb([ie/float(len(edges)), 1.0, 1.0]))
97
+
98
+ for i, keyponit in enumerate(peaks):
99
+ x, y = keyponit
100
+ ax.plot(x, y, 'r.')
101
+ if show_number:
102
+ ax.text(x, y, str(i))
103
+ bg.draw()
104
+ canvas = np.fromstring(bg.tostring_rgb(), dtype='uint8').reshape(int(height), int(width), 3)
105
+ return canvas
106
+
107
+ # image drawed by opencv is not good.
108
+ def draw_handpose_by_opencv(canvas, peaks, show_number=False):
109
+ edges = [[0, 1], [1, 2], [2, 3], [3, 4], [0, 5], [5, 6], [6, 7], [7, 8], [0, 9], [9, 10], \
110
+ [10, 11], [11, 12], [0, 13], [13, 14], [14, 15], [15, 16], [0, 17], [17, 18], [18, 19], [19, 20]]
111
+ # cv2.rectangle(canvas, (x, y), (x+w, y+w), (0, 255, 0), 2, lineType=cv2.LINE_AA)
112
+ # cv2.putText(canvas, 'left' if is_left else 'right', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
113
+ for ie, e in enumerate(edges):
114
+ if np.sum(np.all(peaks[e], axis=1)==0)==0:
115
+ x1, y1 = peaks[e[0]]
116
+ x2, y2 = peaks[e[1]]
117
+ cv2.line(canvas, (x1, y1), (x2, y2), matplotlib.colors.hsv_to_rgb([ie/float(len(edges)), 1.0, 1.0])*255, thickness=2)
118
+
119
+ for i, keyponit in enumerate(peaks):
120
+ x, y = keyponit
121
+ cv2.circle(canvas, (x, y), 4, (0, 0, 255), thickness=-1)
122
+ if show_number:
123
+ cv2.putText(canvas, str(i), (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.3, (0, 0, 0), lineType=cv2.LINE_AA)
124
+ return canvas
125
+
126
+ # detect hand according to body pose keypoints
127
+ # please refer to https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/src/openpose/hand/handDetector.cpp
128
+ def handDetect(candidate, subset, oriImg):
129
+ # right hand: wrist 4, elbow 3, shoulder 2
130
+ # left hand: wrist 7, elbow 6, shoulder 5
131
+ ratioWristElbow = 0.33
132
+ detect_result = []
133
+ image_height, image_width = oriImg.shape[0:2]
134
+ for person in subset.astype(int):
135
+ # if any of three not detected
136
+ has_left = np.sum(person[[5, 6, 7]] == -1) == 0
137
+ has_right = np.sum(person[[2, 3, 4]] == -1) == 0
138
+ if not (has_left or has_right):
139
+ continue
140
+ hands = []
141
+ #left hand
142
+ if has_left:
143
+ left_shoulder_index, left_elbow_index, left_wrist_index = person[[5, 6, 7]]
144
+ x1, y1 = candidate[left_shoulder_index][:2]
145
+ x2, y2 = candidate[left_elbow_index][:2]
146
+ x3, y3 = candidate[left_wrist_index][:2]
147
+ hands.append([x1, y1, x2, y2, x3, y3, True])
148
+ # right hand
149
+ if has_right:
150
+ right_shoulder_index, right_elbow_index, right_wrist_index = person[[2, 3, 4]]
151
+ x1, y1 = candidate[right_shoulder_index][:2]
152
+ x2, y2 = candidate[right_elbow_index][:2]
153
+ x3, y3 = candidate[right_wrist_index][:2]
154
+ hands.append([x1, y1, x2, y2, x3, y3, False])
155
+
156
+ for x1, y1, x2, y2, x3, y3, is_left in hands:
157
+ # pos_hand = pos_wrist + ratio * (pos_wrist - pos_elbox) = (1 + ratio) * pos_wrist - ratio * pos_elbox
158
+ # handRectangle.x = posePtr[wrist*3] + ratioWristElbow * (posePtr[wrist*3] - posePtr[elbow*3]);
159
+ # handRectangle.y = posePtr[wrist*3+1] + ratioWristElbow * (posePtr[wrist*3+1] - posePtr[elbow*3+1]);
160
+ # const auto distanceWristElbow = getDistance(poseKeypoints, person, wrist, elbow);
161
+ # const auto distanceElbowShoulder = getDistance(poseKeypoints, person, elbow, shoulder);
162
+ # handRectangle.width = 1.5f * fastMax(distanceWristElbow, 0.9f * distanceElbowShoulder);
163
+ x = x3 + ratioWristElbow * (x3 - x2)
164
+ y = y3 + ratioWristElbow * (y3 - y2)
165
+ distanceWristElbow = math.sqrt((x3 - x2) ** 2 + (y3 - y2) ** 2)
166
+ distanceElbowShoulder = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
167
+ width = 1.5 * max(distanceWristElbow, 0.9 * distanceElbowShoulder)
168
+ # x-y refers to the center --> offset to topLeft point
169
+ # handRectangle.x -= handRectangle.width / 2.f;
170
+ # handRectangle.y -= handRectangle.height / 2.f;
171
+ x -= width / 2
172
+ y -= width / 2 # width = height
173
+ # overflow the image
174
+ if x < 0: x = 0
175
+ if y < 0: y = 0
176
+ width1 = width
177
+ width2 = width
178
+ if x + width > image_width: width1 = image_width - x
179
+ if y + width > image_height: width2 = image_height - y
180
+ width = min(width1, width2)
181
+ # the max hand box value is 20 pixels
182
+ if width >= 20:
183
+ detect_result.append([int(x), int(y), int(width), is_left])
184
+
185
+ '''
186
+ return value: [[x, y, w, True if left hand else False]].
187
+ width=height since the network require squared input.
188
+ x, y is the coordinate of top left
189
+ '''
190
+ return detect_result
191
+
192
+ # get max index of 2d array
193
+ def npmax(array):
194
+ arrayindex = array.argmax(1)
195
+ arrayvalue = array.max(1)
196
+ i = arrayvalue.argmax()
197
+ j = arrayindex[i]
198
+ return i, j
test.png ADDED
test_full2.jpg ADDED