Browse Source

change dir.

lyc8503 4 years ago
parent
commit
7444ba49d8
32 changed files with 747 additions and 749 deletions
  1. 0 0
      backend_refactor/pool/thread_pool.py
  2. 0 0
      backend_refactor/service/ai/__init__.py
  3. 0 0
      backend_refactor/service/ai/photo/__init__.py
  4. 330 0
      backend_refactor/service/ai/photo/standing_photo.py
  5. 0 0
      backend_refactor/service/ai/util/__init__.py
  6. 2 2
      backend_refactor/service/ai/util/body.py
  7. 15 15
      backend_refactor/service/ai/util/breakout25.py
  8. 380 0
      backend_refactor/service/ai/util/model.py
  9. 0 0
      backend_refactor/service/ai/util/torch_openpose.py
  10. 0 0
      backend_refactor/service/ai/util/util.py
  11. 0 0
      backend_refactor/service/ai/util/util2.py
  12. 0 0
      backend_refactor/service/ai/video/__init__.py
  13. 0 0
      backend_refactor/service/ai/video/classify/__init__.py
  14. 0 0
      backend_refactor/service/ai/video/classify/gaotaitui.py
  15. 0 0
      backend_refactor/service/ai/video/classify/juanfu.py
  16. 0 0
      backend_refactor/service/ai/video/classify/shendun.py
  17. 1 3
      backend_refactor/service/ai/video/inner_analyze.py
  18. 0 0
      backend_refactor/service/ai/video/video_score/__init__.py
  19. 0 0
      backend_refactor/service/ai/video/video_score/balancebeam.py
  20. 0 0
      backend_refactor/service/ai/video/video_score/gaotaitui.py
  21. 0 0
      backend_refactor/service/ai/video/video_score/juanfu.py
  22. 0 0
      backend_refactor/service/ai/video/video_score/jump.py
  23. 0 0
      backend_refactor/service/ai/video/video_score/jumpwithboth.py
  24. 0 0
      backend_refactor/service/ai/video/video_score/pingban.py
  25. 0 0
      backend_refactor/service/ai/video/video_score/shendun.py
  26. 0 0
      backend_refactor/service/ai/video/video_score/sitforward.py
  27. 0 0
      backend_refactor/service/ai/video/video_score/standing.py
  28. 0 0
      backend_refactor/service/ai/video/video_score/tennisthrow.py
  29. 0 0
      backend_refactor/service/ai/video/video_score/turnaround.py
  30. 0 382
      backend_refactor/service/aiutil/model.py
  31. 4 332
      backend_refactor/service/photo_analyzer.py
  32. 15 15
      backend_refactor/service/video_analyzer.py

+ 0 - 0
backend_refactor/worker/thread_pool.py → backend_refactor/pool/thread_pool.py


+ 0 - 0
backend_refactor/service/analyze/__init__.py → backend_refactor/service/ai/__init__.py


+ 0 - 0
backend_refactor/service/classify/__init__.py → backend_refactor/service/ai/photo/__init__.py


+ 330 - 0
backend_refactor/service/ai/photo/standing_photo.py

@@ -0,0 +1,330 @@
+import math
+
+
+def angle(v1, v2):
+    dx1 = v1[2] - v1[0]
+    dy1 = v1[3] - v1[1]
+    dx2 = v2[2] - v2[0]
+    dy2 = v2[3] - v2[1]
+    angle1 = math.atan2(dy1, dx1)
+    angle1 = round(angle1 * 180.0 / math.pi, 2)
+    angle2 = math.atan2(dy2, dx2)
+    angle2 = round(angle2 * 180.0 / math.pi, 2)
+    if angle1 * angle2 >= 0:
+        included_angle = abs(angle1 - angle2)
+    else:
+        included_angle = abs(angle1) + abs(angle2)
+        if included_angle > 180:
+            included_angle = 360 - included_angle
+    return included_angle
+
+
+def angle_for_xo(v1, v2):
+    dx1 = v1[2] - v1[0]
+    dy1 = v1[3] - v1[1]
+    dx2 = v2[2] - v2[0]
+    dy2 = v2[3] - v2[1]
+    angle1 = math.atan2(dy1, dx1)
+    angle1 = round(angle1 * 180.0 / math.pi, 2)
+    angle2 = math.atan2(dy2, dx2)
+    angle2 = round(angle2 * 180.0 / math.pi, 2)
+    return angle1 - angle2
+
+
+def cal_head_extra_stress(angle):
+    HEAD_STRESS_ARGUMENT_0 = 11
+    HEAD_STRESS_ARGUMENT_1 = 1.02777777777769
+    HEAD_STRESS_ARGUMENT_2 = 0.00981481481482367
+    HEAD_STRESS_ARGUMENT_3 = -0.000567901234568158
+    HEAD_STRESS_ARGUMENT_4 = 0.00000576131687243021
+    return (HEAD_STRESS_ARGUMENT_1 * angle + HEAD_STRESS_ARGUMENT_2 * pow(angle, 2)
+            + HEAD_STRESS_ARGUMENT_3 * pow(angle, 3) + HEAD_STRESS_ARGUMENT_4 * pow(angle, 4)) / HEAD_STRESS_ARGUMENT_0
+
+
+def analyse_npy_front(npy_front, height):
+    levels = {
+        # (level, threshold)
+        "head_angle": [
+            (0, 4), (1, 10), (2, 20)
+        ],
+        "shoulder_angle": [
+            (0, 2.8), (1, 8), (2, 15)
+        ],
+        "shoulder_offset": [
+            (0, 3), (1, 8), (2, 15)
+        ],
+        "hip_angle": [
+            (0, 2.19), (1, 8), (2, 15)
+        ],
+        "hip_offset": [
+            (0, 2.19), (1, 8), (2, 15)
+        ],
+        "leg_angle": 4
+    }
+
+    result = []
+    data = npy_front[0]
+
+    result.append("------------------")
+    result.append("正面分析内容如下:")
+
+    # h-eye - h-elbow
+    h_pixel_eye2elbow = abs(data[15][1] - data[3][1])
+
+    h_real_eye2elbow = float(height) * 0.333
+
+    # body mid x
+    ankle_mid_x = (data[14][0] + data[11][0]) / 2
+
+    # for head
+    ear_r_x = data[17][0]
+    ear_r_y = data[17][1]
+    ear_l_x = data[18][0]
+    ear_l_y = data[18][1]
+
+    head_angle = angle([ear_r_x, ear_r_y, ear_l_x, ear_l_y], [0, 0, 1, 0])
+    head_front_level = 0
+    for level in levels["head_angle"]:
+        head_front_level = level[0]
+        if head_angle <= level[1]:
+            break
+
+    head_direction = None
+    if ear_l_y < ear_l_y:
+        head_direction = "左"
+    elif ear_l_y > ear_r_y:
+        head_direction = "右"
+    if head_front_level > 0 and head_direction:
+        result.append("头部分析:头部{}部高,向右倾斜,角度为{}度".format(head_direction, round(head_angle, 2)))
+    else:
+        result.append("头部分析:头部保持较好平衡")
+    result.append(head_front_level)
+
+    # for shoulder
+    shoulder_r_x = data[2][0]
+    shoulder_r_y = data[2][1]
+    shoulder_l_x = data[5][0]
+    shoulder_l_y = data[5][1]
+    shoulder_mid_x = (shoulder_l_x + shoulder_r_x) / 2
+    neck_x = data[1][0] - 2
+    shoulder_offset = (shoulder_mid_x - neck_x) * h_real_eye2elbow / h_pixel_eye2elbow
+    shoulder_angle = angle([shoulder_r_x, shoulder_r_y, shoulder_l_x, shoulder_l_y], [0, 0, 1, 0])
+    shoulder_angle = min(shoulder_angle, abs(shoulder_angle - 3))
+    shoulder_angle_level = 0
+    shoulder_offset_level = 0
+    for level in levels["shoulder_angle"]:
+        shoulder_angle_level = level[0]
+        if shoulder_angle <= level[1]:
+            break
+    for level in levels["shoulder_offset"]:
+        shoulder_offset_level = level[0]
+        if shoulder_offset <= level[1]:
+            break
+    if shoulder_offset_level == 0:
+        shoulder_level = shoulder_angle_level
+    elif shoulder_angle_level == 0:
+        shoulder_level = shoulder_offset_level
+    else:
+        shoulder_level = round(0.6 * shoulder_angle_level + 0.4 * shoulder_offset_level)
+
+    result.append("肩部分析:")
+    shoulder_offset_direction = None
+    if shoulder_offset > 0:
+        shoulder_offset_direction = "左"
+    elif shoulder_offset < 0:
+        shoulder_offset_direction = "右"
+    shoulder_angle_direction = None
+    if shoulder_l_y < shoulder_r_y:
+        shoulder_angle_direction = "右"
+    elif shoulder_l_y > shoulder_r_y:
+        shoulder_angle_direction = "左"
+    if shoulder_offset_direction:
+        result.append("肩部向{}横移,距离为{}cm".format(shoulder_offset_direction, round(abs(shoulder_offset), 2)))
+    else:
+        result.append("肩部中心位居中轴,位置良好")
+
+    if shoulder_angle_direction:
+        result.append("肩部向{}倾斜角度为{}度".format(shoulder_angle_direction, round(shoulder_angle, 2)))
+    else:
+        result.append("肩部无左右倾斜")
+    result.append(shoulder_level)
+
+    # for hip
+    hip_r_x = data[9][0]
+    hip_r_y = data[9][1]
+    hip_l_x = data[12][0]
+    hip_l_y = data[12][1]
+    hip_mid_x = (hip_r_x + hip_l_x) / 2
+    hip_offset = (hip_mid_x - ankle_mid_x) * h_real_eye2elbow / h_pixel_eye2elbow
+    hd_hip = abs(data[12][1] - data[9][1])
+    d_hip = math.sqrt((hip_l_x - hip_r_x) ** 2 + (hip_l_y - hip_r_y) ** 2)
+    rate_hip = hd_hip / d_hip
+    hip_angle = angle([hip_r_x, hip_r_y, hip_l_x, hip_l_y], [0, 0, 1, 0])
+    hip_angle_level = 0
+    hip_offset_level = 0
+    for level in levels["hip_angle"]:
+        hip_angle_level = level[0]
+        if hip_angle <= level[1]:
+            break
+    for level in levels["hip_offset"]:
+        hip_offset_level = level[0]
+        if hip_offset <= level[1]:
+            break
+    result.append("髋部分析:")
+    hip_offset_direction = None
+    if hip_offset > 0:
+        hip_offset_direction = "左"
+    elif hip_offset < 0:
+        hip_offset_direction = "右"
+    hip_angle_direction = None
+    if hip_l_y < hip_r_y:
+        hip_angle_direction = "右"
+    elif hip_l_y > hip_r_y:
+        hip_angle_direction = "左"
+    if hip_offset_direction:
+        result.append("髋部向{}横移,距离为{}cm".format(hip_offset_direction, round(abs(hip_offset), 2)))
+    else:
+        result.append("髋部中心位居中轴,位置良好")
+
+    if hip_angle_direction:
+        result.append("髋部向{}倾斜角度为{}度".format(hip_angle_direction, round(hip_angle, 2)))
+    else:
+        result.append("髋部角度保持较好平衡")
+    hip_level = round(0.6 * hip_offset_level + 0.4 * hip_angle_level)
+    result.append(hip_level)
+
+    result.append("腿型分析:")
+
+    # for knee distance
+    knee_r_x = data[10][0]
+    knee_r_y = data[10][1]
+    knee_l_x = data[13][0]
+    knee_l_y = data[13][1]
+
+    ankle_r_x = data[11][0]
+    ankle_r_y = data[11][1]
+    ankle_l_x = data[14][0]
+    ankle_l_y = data[14][1]
+
+    xo_l_angle = angle_for_xo([hip_l_x, hip_l_y, knee_l_x, knee_l_y], [hip_l_x, hip_l_y, ankle_l_x, ankle_l_y])
+    xo_r_angle = angle_for_xo([hip_r_x, hip_r_y, knee_r_x, knee_r_y], [hip_r_x, hip_r_y, ankle_r_x, ankle_r_y])
+    xo_angle = max(abs(xo_l_angle), abs(xo_r_angle))
+    if xo_angle > levels["leg_angle"]:
+        xo_direction = "X" if xo_l_angle < 0 and xo_l_angle + xo_r_angle < 0 else "O"
+        result.append("腿型可能为{}型腿".format(xo_direction))
+    else:
+        result.append("腿型基本正常,非X、O型腿")
+    return result
+
+
+def analyse_npy_side(npy_side, height):
+    levels = {
+        "head_forward_angle": [
+            (0, 4.57), (1, 8), (2, 15)
+        ],
+        "up_forward_angle": [
+            (0, 5), (1, 10), (2, 15)
+        ],
+        "hip_forward_offset": [
+            (0, 3), (1, 5), (2, 8)
+        ],
+        "knee_forward_angle": [
+            (0, 3.86), (1, 8), (2, 13)
+        ]
+    }
+
+    result = []
+    data = npy_side[0]
+    h_pixel_eye2elbow = abs(data[15][1] - data[3][1])
+
+    h_real_eye2elbow = float(height) * 0.333
+    result.append(" ")
+    result.append("------------------")
+    result.append("侧面分析内容如下:")
+
+    # for head
+    ear_r_x = data[17][0]
+    ear_r_y = data[17][1]
+    shoulder_r_x = data[2][0]
+    shoulder_r_y = data[2][1]
+    head_forward_angle = angle([shoulder_r_x, shoulder_r_y, ear_r_x, ear_r_y, ], [0, 0, 0, -1])
+    head_forward_level = 0
+    head_extra_stress = round(cal_head_extra_stress(head_forward_angle), 2) if 0 < head_forward_angle < 90 else 0
+    for level in levels["head_forward_angle"]:
+        head_forward_level = level[0]
+        if head_forward_angle <= level[1]:
+            break
+    head_forward_direction = None
+    if ear_r_x > shoulder_r_x:
+        head_forward_direction = "前倾"
+    elif ear_r_x < shoulder_r_x:
+        head_forward_direction = "后仰"
+    if head_forward_direction:
+        result.append("头部{}角度为{}度,颈椎额外承受压力为头部重量{}倍".format(head_forward_direction,
+                                                                               round(head_forward_angle, 2),
+                                                                               round(head_extra_stress, 2)))
+    else:
+        result.append("无头部前倾问题")
+    result.append(head_forward_level)
+
+    # upper part of body
+    neck_x = data[1][0]
+    neck_y = data[1][1]
+
+    ankle_r_x = data[11][0]
+    ankle_r_y = data[11][1]
+    up_angle = round(angle([ankle_r_x, ankle_r_y, neck_x, neck_y], [0, 0, 0, -1]), 2)
+    up_angle = min(up_angle, abs(up_angle - 3))
+    up_level = 0
+    for level in levels["up_forward_angle"]:
+        up_level = level[0]
+        if up_angle <= level[1]:
+            break
+    up_forward_direction = "后仰" if neck_x < ankle_r_x else "前倾"
+    up_state = "身体{}{}度".format(up_forward_direction, round(up_angle, 2))
+    result.append("站姿分析:{}".format(up_state))
+    result.append(up_level)
+
+    # for hip
+    hip_risk_level = 0
+    hip_r_x = data[9][0] - 2
+    hip_r_y = data[9][1]
+    knee_r_x = data[10][0]
+    knee_r_y = data[10][1]
+    hip_offset = abs((hip_r_x - ankle_r_x)) * h_real_eye2elbow / h_pixel_eye2elbow
+    for level in levels["hip_forward_offset"]:
+        hip_risk_level = level[0]
+        if hip_offset <= level[1]:
+            break
+    hip_forward_direction = None
+    if hip_r_x > ankle_r_x:
+        hip_forward_direction = "前移"
+    elif hip_r_x < ankle_r_x:
+        hip_forward_direction = "后移"
+    if hip_forward_direction:
+        hip_state = "髋关节{}{}cm".format(hip_forward_direction, round(hip_offset, 2))
+    else:
+        hip_state = "髋关节正常"
+
+    result.append("髋部分析:{}".format(hip_state))
+
+    result.append(hip_risk_level)
+
+    # for knee
+    knee_angle_r = 180 - angle([hip_r_x, hip_r_y, knee_r_x, knee_r_y], [knee_r_x, knee_r_y, ankle_r_x, ankle_r_y])
+    if knee_angle_r > 90:
+        knee_angle_r = 180 - knee_angle_r
+    knee_angle_r -= 3
+    knee_forward_risk_level = 0
+    for level in levels["knee_forward_angle"]:
+        knee_forward_risk_level = level[0]
+        if knee_angle_r <= level[1]:
+            break
+
+    if knee_forward_risk_level == 0:
+        result.append("膝盖角度分析:膝盖无明显超伸")
+    else:
+        result.append("膝盖角度分析:下肢膝盖超伸角度为{}度".format(round(knee_angle_r, 2)))
+    result.append(knee_forward_risk_level)
+    return result
+

+ 0 - 0
backend_refactor/service/aiutil/__init__.py → backend_refactor/service/ai/util/__init__.py


+ 2 - 2
backend_refactor/service/aiutil/body.py → backend_refactor/service/ai/util/body.py

@@ -6,8 +6,8 @@ import numpy as np
 import torch
 from scipy.ndimage.filters import gaussian_filter
 
-from service.aiutil import util
-from service.aiutil.model import bodypose_model
+from service.ai.util import util
+from service.ai.util.model import bodypose_model
 
 
 class Body(object):

+ 15 - 15
backend_refactor/service/aiutil/breakout25.py → backend_refactor/service/ai/util/breakout25.py

@@ -8,17 +8,19 @@ Created on Tue Apr 28 15:13:51 2020
 import numpy as np
 import math
 
-jointpairs = [[1,0],[1,2],[2,3],[3,4],[1,5],[5,6],[6,7],[1,8],[8,9],[9,10],[10,11],[8,12],[12,13],[13,14],[0,15],[0,16]\
-              ,[15,17],[16,18],[11,24],[11,22],[14,21],[14,19],[22,23],[19,20]]
-#[[1,0],   [1,2],   [2,3],   [3,4],   [1,5],   [5,6],   [6,7],   [1,8], [8,9], [9,10],[10,11], [8,12],[12,13], [13,14], [0,15],  [0,16]]
+jointpairs = [[1, 0], [1, 2], [2, 3], [3, 4], [1, 5], [5, 6], [6, 7], [1, 8], [8, 9], [9, 10], [10, 11], [8, 12],
+              [12, 13], [13, 14], [0, 15], [0, 16] \
+    , [15, 17], [16, 18], [11, 24], [11, 22], [14, 21], [14, 19], [22, 23], [19, 20]]
+# [[1,0],   [1,2],   [2,3],   [3,4],   [1,5],   [5,6],   [6,7],   [1,8], [8,9], [9,10],[10,11], [8,12],[12,13], [13,14], [0,15],  [0,16]]
 
-#[[30, 31],[14, 15],[16, 17],[18, 19],[22, 23],[24, 25],[26, 27],[0, 1],[6, 7],[2, 3],[4, 5],  [8, 9],[10, 11],[12, 13],[32, 33],[34, 35]]
+# [[30, 31],[14, 15],[16, 17],[18, 19],[22, 23],[24, 25],[26, 27],[0, 1],[6, 7],[2, 3],[4, 5],  [8, 9],[10, 11],[12, 13],[32, 33],[34, 35]]
 
-#[[15,17],[16,18],[11,24],[11,22],[14,21],[14,19],[22,23],[19,20]]
-#[[36,37],[38,39],[50,51],[46,47],[44,45],[40,41],[48,49],[42,43]]
-map25 = [[i,i+1] for i in range(0,52,2)]
+# [[15,17],[16,18],[11,24],[11,22],[14,21],[14,19],[22,23],[19,20]]
+# [[36,37],[38,39],[50,51],[46,47],[44,45],[40,41],[48,49],[42,43]]
+map25 = [[i, i + 1] for i in range(0, 52, 2)]
 
-def findoutmappair(all_peaks,paf):
+
+def findoutmappair(all_peaks, paf):
     mid_num = 10
     pairmap = []
     for pair in jointpairs:
@@ -30,7 +32,7 @@ def findoutmappair(all_peaks,paf):
         candA = candA[0]
         candB = candB[0]
         startend = list(zip(np.linspace(candA[0], candB[0], num=mid_num), \
-                                            np.linspace(candA[1], candB[1], num=mid_num)))
+                            np.linspace(candA[1], candB[1], num=mid_num)))
 
         vec = np.subtract(candB[:2], candA[:2])
         norm = math.sqrt(vec[0] * vec[0] + vec[1] * vec[1])
@@ -38,20 +40,18 @@ def findoutmappair(all_peaks,paf):
         score = 0.
         tmp = []
         for mp in map25:
-            score_mid = paf[:,:,[mp[0],mp[1]]]
+            score_mid = paf[:, :, [mp[0], mp[1]]]
             vec_x = np.array([score_mid[int(round(startend[I][1])), int(round(startend[I][0])), 0] \
-                                          for I in range(len(startend))])
+                              for I in range(len(startend))])
             vec_y = np.array([score_mid[int(round(startend[I][1])), int(round(startend[I][0])), 1] \
-                                          for I in range(len(startend))])
+                              for I in range(len(startend))])
             score_midpts = np.multiply(vec_x, vec[0]) + np.multiply(vec_y, vec[1])
             score_midpts = score_midpts.sum()
             if score < score_midpts:
                 score = score_midpts
                 tmp = mp
         if score > 0.5:
-            pairmap.append(tmp+[score,])
+            pairmap.append(tmp + [score, ])
         else:
             pairmap.append([])
     return pairmap
-            
-    

+ 380 - 0
backend_refactor/service/ai/util/model.py

@@ -0,0 +1,380 @@
+from collections import OrderedDict
+
+import torch
+import torch.nn as nn
+
+
+def make_layers(block, no_relu_layers, prelu_layers=[]):
+    layers = []
+    for layer_name, v in block.items():
+        if 'pool' in layer_name:
+            layer = nn.MaxPool2d(kernel_size=v[0], stride=v[1],
+                                 padding=v[2])
+            layers.append((layer_name, layer))
+        else:
+            conv2d = nn.Conv2d(in_channels=v[0], out_channels=v[1],
+                               kernel_size=v[2], stride=v[3],
+                               padding=v[4])
+            layers.append((layer_name, conv2d))
+            if layer_name not in no_relu_layers:
+                if layer_name not in prelu_layers:
+                    layers.append(('relu_' + layer_name, nn.ReLU(inplace=True)))
+                else:
+                    layers.append(('prelu' + layer_name[4:], nn.PReLU(v[1])))
+
+    return nn.Sequential(OrderedDict(layers))
+
+
+def make_layers_Mconv(block, no_relu_layers):
+    modules = []
+    for layer_name, v in block.items():
+        layers = []
+        if 'pool' in layer_name:
+            layer = nn.MaxPool2d(kernel_size=v[0], stride=v[1],
+                                 padding=v[2])
+            layers.append((layer_name, layer))
+        else:
+            conv2d = nn.Conv2d(in_channels=v[0], out_channels=v[1],
+                               kernel_size=v[2], stride=v[3],
+                               padding=v[4])
+            layers.append((layer_name, conv2d))
+            if layer_name not in no_relu_layers:
+                layers.append(('Mprelu' + layer_name[5:], nn.PReLU(v[1])))
+        modules.append(nn.Sequential(OrderedDict(layers)))
+    return nn.ModuleList(modules)
+
+
+class bodypose_25_model(nn.Module):
+    def __init__(self):
+        super(bodypose_25_model, self).__init__()
+        # these layers have no relu layer
+        no_relu_layers = ['Mconv7_stage0_L1', 'Mconv7_stage0_L2', \
+                          'Mconv7_stage1_L1', 'Mconv7_stage1_L2', \
+                          'Mconv7_stage2_L2', 'Mconv7_stage3_L2']
+        prelu_layers = ['conv4_2', 'conv4_3_CPM', 'conv4_4_CPM']
+        blocks = {}
+        block0 = OrderedDict([
+            ('conv1_1', [3, 64, 3, 1, 1]),
+            ('conv1_2', [64, 64, 3, 1, 1]),
+            ('pool1_stage1', [2, 2, 0]),
+            ('conv2_1', [64, 128, 3, 1, 1]),
+            ('conv2_2', [128, 128, 3, 1, 1]),
+            ('pool2_stage1', [2, 2, 0]),
+            ('conv3_1', [128, 256, 3, 1, 1]),
+            ('conv3_2', [256, 256, 3, 1, 1]),
+            ('conv3_3', [256, 256, 3, 1, 1]),
+            ('conv3_4', [256, 256, 3, 1, 1]),
+            ('pool3_stage1', [2, 2, 0]),
+            ('conv4_1', [256, 512, 3, 1, 1]),
+            ('conv4_2', [512, 512, 3, 1, 1]),
+            ('conv4_3_CPM', [512, 256, 3, 1, 1]),
+            ('conv4_4_CPM', [256, 128, 3, 1, 1])
+        ])
+        self.model0 = make_layers(block0, no_relu_layers, prelu_layers)
+
+        # L2
+        # stage0
+        blocks['Mconv1_stage0_L2'] = OrderedDict([
+            ('Mconv1_stage0_L2_0', [128, 96, 3, 1, 1]),
+            ('Mconv1_stage0_L2_1', [96, 96, 3, 1, 1]),
+            ('Mconv1_stage0_L2_2', [96, 96, 3, 1, 1])
+        ])
+        for i in range(2, 6):
+            blocks['Mconv%d_stage0_L2' % i] = OrderedDict([
+                ('Mconv%d_stage0_L2_0' % i, [288, 96, 3, 1, 1]),
+                ('Mconv%d_stage0_L2_1' % i, [96, 96, 3, 1, 1]),
+                ('Mconv%d_stage0_L2_2' % i, [96, 96, 3, 1, 1])
+            ])
+        blocks['Mconv6_7_stage0_L2'] = OrderedDict([
+            ('Mconv6_stage0_L2', [288, 256, 1, 1, 0]),
+            ('Mconv7_stage0_L2', [256, 52, 1, 1, 0])
+        ])
+        # stage1~3
+        for s in range(1, 4):
+            blocks['Mconv1_stage%d_L2' % s] = OrderedDict([
+                ('Mconv1_stage%d_L2_0' % s, [180, 128, 3, 1, 1]),
+                ('Mconv1_stage%d_L2_1' % s, [128, 128, 3, 1, 1]),
+                ('Mconv1_stage%d_L2_2' % s, [128, 128, 3, 1, 1])
+            ])
+            for i in range(2, 6):
+                blocks['Mconv%d_stage%d_L2' % (i, s)] = OrderedDict([
+                    ('Mconv%d_stage%d_L2_0' % (i, s), [384, 128, 3, 1, 1]),
+                    ('Mconv%d_stage%d_L2_1' % (i, s), [128, 128, 3, 1, 1]),
+                    ('Mconv%d_stage%d_L2_2' % (i, s), [128, 128, 3, 1, 1])
+                ])
+            blocks['Mconv6_7_stage%d_L2' % s] = OrderedDict([
+                ('Mconv6_stage%d_L2' % s, [384, 512, 1, 1, 0]),
+                ('Mconv7_stage%d_L2' % s, [512, 52, 1, 1, 0])
+            ])
+
+        # L1
+        # stage0
+        blocks['Mconv1_stage0_L1'] = OrderedDict([
+            ('Mconv1_stage0_L1_0', [180, 96, 3, 1, 1]),
+            ('Mconv1_stage0_L1_1', [96, 96, 3, 1, 1]),
+            ('Mconv1_stage0_L1_2', [96, 96, 3, 1, 1])
+        ])
+        for i in range(2, 6):
+            blocks['Mconv%d_stage0_L1' % i] = OrderedDict([
+                ('Mconv%d_stage0_L1_0' % i, [288, 96, 3, 1, 1]),
+                ('Mconv%d_stage0_L1_1' % i, [96, 96, 3, 1, 1]),
+                ('Mconv%d_stage0_L1_2' % i, [96, 96, 3, 1, 1])
+            ])
+        blocks['Mconv6_7_stage0_L1'] = OrderedDict([
+            ('Mconv6_stage0_L1', [288, 256, 1, 1, 0]),
+            ('Mconv7_stage0_L1', [256, 26, 1, 1, 0])
+        ])
+        # stage1
+        blocks['Mconv1_stage1_L1'] = OrderedDict([
+            ('Mconv1_stage1_L1_0', [206, 128, 3, 1, 1]),
+            ('Mconv1_stage1_L1_1', [128, 128, 3, 1, 1]),
+            ('Mconv1_stage1_L1_2', [128, 128, 3, 1, 1])
+        ])
+        for i in range(2, 6):
+            blocks['Mconv%d_stage1_L1' % i] = OrderedDict([
+                ('Mconv%d_stage1_L1_0' % i, [384, 128, 3, 1, 1]),
+                ('Mconv%d_stage1_L1_1' % i, [128, 128, 3, 1, 1]),
+                ('Mconv%d_stage1_L1_2' % i, [128, 128, 3, 1, 1])
+            ])
+        blocks['Mconv6_7_stage1_L1'] = OrderedDict([
+            ('Mconv6_stage1_L1', [384, 512, 1, 1, 0]),
+            ('Mconv7_stage1_L1', [512, 26, 1, 1, 0])
+        ])
+
+        for k in blocks.keys():
+            blocks[k] = make_layers_Mconv(blocks[k], no_relu_layers)
+        self.models = nn.ModuleDict(blocks)
+        # self.model_L2_S0_mconv1 = blocks['Mconv1_stage0_L2']
+
+    def _Mconv_forward(self, x, models):
+        outs = []
+        out = x
+        for m in models:
+            out = m(out)
+            outs.append(out)
+        return torch.cat(outs, 1)
+
+    def forward(self, x):
+        out0 = self.model0(x)
+        # L2
+        tout = out0
+        for s in range(4):
+            tout = self._Mconv_forward(tout, self.models['Mconv1_stage%d_L2' % s])
+            for v in range(2, 6):
+                tout = self._Mconv_forward(tout, self.models['Mconv%d_stage%d_L2' % (v, s)])
+            tout = self.models['Mconv6_7_stage%d_L2' % s][0](tout)
+            tout = self.models['Mconv6_7_stage%d_L2' % s][1](tout)
+            outL2 = tout
+            tout = torch.cat([out0, tout], 1)
+        # L1 stage0
+        # tout = torch.cat([out0,outL2],1)
+        tout = self._Mconv_forward(tout, self.models['Mconv1_stage0_L1'])
+        for v in range(2, 6):
+            tout = self._Mconv_forward(tout, self.models['Mconv%d_stage0_L1' % v])
+        tout = self.models['Mconv6_7_stage0_L1'][0](tout)
+        tout = self.models['Mconv6_7_stage0_L1'][1](tout)
+        outS0L1 = tout
+        tout = torch.cat([out0, outS0L1, outL2], 1)
+        # L1 stage1
+        tout = self._Mconv_forward(tout, self.models['Mconv1_stage1_L1'])
+        for v in range(2, 6):
+            tout = self._Mconv_forward(tout, self.models['Mconv%d_stage1_L1' % v])
+        tout = self.models['Mconv6_7_stage1_L1'][0](tout)
+        outS1L1 = self.models['Mconv6_7_stage1_L1'][1](tout)
+
+        return outS1L1, outL2
+
+
+class bodypose_model(nn.Module):
+    def __init__(self):
+        super(bodypose_model, self).__init__()
+
+        # these layers have no relu layer
+        no_relu_layers = ['conv5_5_CPM_L1', 'conv5_5_CPM_L2', 'Mconv7_stage2_L1', \
+                          'Mconv7_stage2_L2', 'Mconv7_stage3_L1', 'Mconv7_stage3_L2', \
+                          'Mconv7_stage4_L1', 'Mconv7_stage4_L2', 'Mconv7_stage5_L1', \
+                          'Mconv7_stage5_L2', 'Mconv7_stage6_L1', 'Mconv7_stage6_L1']
+        blocks = {}
+        block0 = OrderedDict([
+            ('conv1_1', [3, 64, 3, 1, 1]),
+            ('conv1_2', [64, 64, 3, 1, 1]),
+            ('pool1_stage1', [2, 2, 0]),
+            ('conv2_1', [64, 128, 3, 1, 1]),
+            ('conv2_2', [128, 128, 3, 1, 1]),
+            ('pool2_stage1', [2, 2, 0]),
+            ('conv3_1', [128, 256, 3, 1, 1]),
+            ('conv3_2', [256, 256, 3, 1, 1]),
+            ('conv3_3', [256, 256, 3, 1, 1]),
+            ('conv3_4', [256, 256, 3, 1, 1]),
+            ('pool3_stage1', [2, 2, 0]),
+            ('conv4_1', [256, 512, 3, 1, 1]),
+            ('conv4_2', [512, 512, 3, 1, 1]),
+            ('conv4_3_CPM', [512, 256, 3, 1, 1]),
+            ('conv4_4_CPM', [256, 128, 3, 1, 1])
+        ])
+
+        # Stage 1
+        block1_1 = OrderedDict([
+            ('conv5_1_CPM_L1', [128, 128, 3, 1, 1]),
+            ('conv5_2_CPM_L1', [128, 128, 3, 1, 1]),
+            ('conv5_3_CPM_L1', [128, 128, 3, 1, 1]),
+            ('conv5_4_CPM_L1', [128, 512, 1, 1, 0]),
+            ('conv5_5_CPM_L1', [512, 38, 1, 1, 0])
+        ])
+
+        block1_2 = OrderedDict([
+            ('conv5_1_CPM_L2', [128, 128, 3, 1, 1]),
+            ('conv5_2_CPM_L2', [128, 128, 3, 1, 1]),
+            ('conv5_3_CPM_L2', [128, 128, 3, 1, 1]),
+            ('conv5_4_CPM_L2', [128, 512, 1, 1, 0]),
+            ('conv5_5_CPM_L2', [512, 19, 1, 1, 0])
+        ])
+        blocks['block1_1'] = block1_1
+        blocks['block1_2'] = block1_2
+
+        self.model0 = make_layers(block0, no_relu_layers)
+
+        # Stages 2 - 6
+        for i in range(2, 7):
+            blocks['block%d_1' % i] = OrderedDict([
+                ('Mconv1_stage%d_L1' % i, [185, 128, 7, 1, 3]),
+                ('Mconv2_stage%d_L1' % i, [128, 128, 7, 1, 3]),
+                ('Mconv3_stage%d_L1' % i, [128, 128, 7, 1, 3]),
+                ('Mconv4_stage%d_L1' % i, [128, 128, 7, 1, 3]),
+                ('Mconv5_stage%d_L1' % i, [128, 128, 7, 1, 3]),
+                ('Mconv6_stage%d_L1' % i, [128, 128, 1, 1, 0]),
+                ('Mconv7_stage%d_L1' % i, [128, 38, 1, 1, 0])
+            ])
+
+            blocks['block%d_2' % i] = OrderedDict([
+                ('Mconv1_stage%d_L2' % i, [185, 128, 7, 1, 3]),
+                ('Mconv2_stage%d_L2' % i, [128, 128, 7, 1, 3]),
+                ('Mconv3_stage%d_L2' % i, [128, 128, 7, 1, 3]),
+                ('Mconv4_stage%d_L2' % i, [128, 128, 7, 1, 3]),
+                ('Mconv5_stage%d_L2' % i, [128, 128, 7, 1, 3]),
+                ('Mconv6_stage%d_L2' % i, [128, 128, 1, 1, 0]),
+                ('Mconv7_stage%d_L2' % i, [128, 19, 1, 1, 0])
+            ])
+
+        for k in blocks.keys():
+            blocks[k] = make_layers(blocks[k], no_relu_layers)
+
+        self.model1_1 = blocks['block1_1']
+        self.model2_1 = blocks['block2_1']
+        self.model3_1 = blocks['block3_1']
+        self.model4_1 = blocks['block4_1']
+        self.model5_1 = blocks['block5_1']
+        self.model6_1 = blocks['block6_1']
+
+        self.model1_2 = blocks['block1_2']
+        self.model2_2 = blocks['block2_2']
+        self.model3_2 = blocks['block3_2']
+        self.model4_2 = blocks['block4_2']
+        self.model5_2 = blocks['block5_2']
+        self.model6_2 = blocks['block6_2']
+
+    def forward(self, x):
+
+        out1 = self.model0(x)
+
+        out1_1 = self.model1_1(out1)
+        out1_2 = self.model1_2(out1)
+        out2 = torch.cat([out1_1, out1_2, out1], 1)
+
+        out2_1 = self.model2_1(out2)
+        out2_2 = self.model2_2(out2)
+        out3 = torch.cat([out2_1, out2_2, out1], 1)
+
+        out3_1 = self.model3_1(out3)
+        out3_2 = self.model3_2(out3)
+        out4 = torch.cat([out3_1, out3_2, out1], 1)
+
+        out4_1 = self.model4_1(out4)
+        out4_2 = self.model4_2(out4)
+        out5 = torch.cat([out4_1, out4_2, out1], 1)
+
+        out5_1 = self.model5_1(out5)
+        out5_2 = self.model5_2(out5)
+        out6 = torch.cat([out5_1, out5_2, out1], 1)
+
+        out6_1 = self.model6_1(out6)
+        out6_2 = self.model6_2(out6)
+
+        return out6_2, out6_1
+
+
+class handpose_model(nn.Module):
+    def __init__(self):
+        super(handpose_model, self).__init__()
+
+        # these layers have no relu layer
+        no_relu_layers = ['conv6_2_CPM', 'Mconv7_stage2', 'Mconv7_stage3', \
+                          'Mconv7_stage4', 'Mconv7_stage5', 'Mconv7_stage6']
+        # stage 1
+        block1_0 = OrderedDict([
+            ('conv1_1', [3, 64, 3, 1, 1]),
+            ('conv1_2', [64, 64, 3, 1, 1]),
+            ('pool1_stage1', [2, 2, 0]),
+            ('conv2_1', [64, 128, 3, 1, 1]),
+            ('conv2_2', [128, 128, 3, 1, 1]),
+            ('pool2_stage1', [2, 2, 0]),
+            ('conv3_1', [128, 256, 3, 1, 1]),
+            ('conv3_2', [256, 256, 3, 1, 1]),
+            ('conv3_3', [256, 256, 3, 1, 1]),
+            ('conv3_4', [256, 256, 3, 1, 1]),
+            ('pool3_stage1', [2, 2, 0]),
+            ('conv4_1', [256, 512, 3, 1, 1]),
+            ('conv4_2', [512, 512, 3, 1, 1]),
+            ('conv4_3', [512, 512, 3, 1, 1]),
+            ('conv4_4', [512, 512, 3, 1, 1]),
+            ('conv5_1', [512, 512, 3, 1, 1]),
+            ('conv5_2', [512, 512, 3, 1, 1]),
+            ('conv5_3_CPM', [512, 128, 3, 1, 1])
+        ])
+
+        block1_1 = OrderedDict([
+            ('conv6_1_CPM', [128, 512, 1, 1, 0]),
+            ('conv6_2_CPM', [512, 22, 1, 1, 0])
+        ])
+
+        blocks = {}
+        blocks['block1_0'] = block1_0
+        blocks['block1_1'] = block1_1
+
+        # stage 2-6
+        for i in range(2, 7):
+            blocks['block%d' % i] = OrderedDict([
+                ('Mconv1_stage%d' % i, [150, 128, 7, 1, 3]),
+                ('Mconv2_stage%d' % i, [128, 128, 7, 1, 3]),
+                ('Mconv3_stage%d' % i, [128, 128, 7, 1, 3]),
+                ('Mconv4_stage%d' % i, [128, 128, 7, 1, 3]),
+                ('Mconv5_stage%d' % i, [128, 128, 7, 1, 3]),
+                ('Mconv6_stage%d' % i, [128, 128, 1, 1, 0]),
+                ('Mconv7_stage%d' % i, [128, 22, 1, 1, 0])
+            ])
+
+        for k in blocks.keys():
+            blocks[k] = make_layers(blocks[k], no_relu_layers)
+
+        self.model1_0 = blocks['block1_0']
+        self.model1_1 = blocks['block1_1']
+        self.model2 = blocks['block2']
+        self.model3 = blocks['block3']
+        self.model4 = blocks['block4']
+        self.model5 = blocks['block5']
+        self.model6 = blocks['block6']
+
+    def forward(self, x):
+        out1_0 = self.model1_0(x)
+        out1_1 = self.model1_1(out1_0)
+        concat_stage2 = torch.cat([out1_1, out1_0], 1)
+        out_stage2 = self.model2(concat_stage2)
+        concat_stage3 = torch.cat([out_stage2, out1_0], 1)
+        out_stage3 = self.model3(concat_stage3)
+        concat_stage4 = torch.cat([out_stage3, out1_0], 1)
+        out_stage4 = self.model4(concat_stage4)
+        concat_stage5 = torch.cat([out_stage4, out1_0], 1)
+        out_stage5 = self.model5(concat_stage5)
+        concat_stage6 = torch.cat([out_stage5, out1_0], 1)
+        out_stage6 = self.model6(concat_stage6)
+        return out_stage6

+ 0 - 0
backend_refactor/service/aiutil/torch_openpose.py → backend_refactor/service/ai/util/torch_openpose.py


+ 0 - 0
backend_refactor/service/aiutil/util.py → backend_refactor/service/ai/util/util.py


+ 0 - 0
backend_refactor/service/aiutil/util2.py → backend_refactor/service/ai/util/util2.py


+ 0 - 0
backend_refactor/service/video_score/__init__.py → backend_refactor/service/ai/video/__init__.py


+ 0 - 0
backend_refactor/service/ai/video/classify/__init__.py


+ 0 - 0
backend_refactor/service/classify/gaotaitui.py → backend_refactor/service/ai/video/classify/gaotaitui.py


+ 0 - 0
backend_refactor/service/classify/juanfu.py → backend_refactor/service/ai/video/classify/juanfu.py


+ 0 - 0
backend_refactor/service/classify/shendun.py → backend_refactor/service/ai/video/classify/shendun.py


+ 1 - 3
backend_refactor/service/analyze/inner_analyze.py → backend_refactor/service/ai/video/inner_analyze.py

@@ -179,7 +179,6 @@ def analyse_npy_side_shendun(data):
 
 
 def analyse_npy_side_jump(data):
-
     result = {}
     # if len(data) != 25:
     #     logging.warning("Data len is not 25, skipping.")
@@ -241,7 +240,6 @@ def analyse_npy_side_jump(data):
 
     return result
 
-
 # def inner_analyze(data, mode, i):
 #     result = {}
 #     if mode == "juanfu":
@@ -251,4 +249,4 @@ def analyse_npy_side_jump(data):
 #     elif mode == "shendun":
 #         result_side = analyse_npy_side_shendun(data)
 #     else:
-#         result_side = analyse_npy_side_jump(data)
+#         result_side = analyse_npy_side_jump(data)

+ 0 - 0
backend_refactor/service/ai/video/video_score/__init__.py


+ 0 - 0
backend_refactor/service/video_score/balancebeam.py → backend_refactor/service/ai/video/video_score/balancebeam.py


+ 0 - 0
backend_refactor/service/video_score/gaotaitui.py → backend_refactor/service/ai/video/video_score/gaotaitui.py


+ 0 - 0
backend_refactor/service/video_score/juanfu.py → backend_refactor/service/ai/video/video_score/juanfu.py


+ 0 - 0
backend_refactor/service/video_score/jump.py → backend_refactor/service/ai/video/video_score/jump.py


+ 0 - 0
backend_refactor/service/video_score/jumpwithboth.py → backend_refactor/service/ai/video/video_score/jumpwithboth.py


+ 0 - 0
backend_refactor/service/video_score/pingban.py → backend_refactor/service/ai/video/video_score/pingban.py


+ 0 - 0
backend_refactor/service/video_score/shendun.py → backend_refactor/service/ai/video/video_score/shendun.py


+ 0 - 0
backend_refactor/service/video_score/sitforward.py → backend_refactor/service/ai/video/video_score/sitforward.py


+ 0 - 0
backend_refactor/service/video_score/standing.py → backend_refactor/service/ai/video/video_score/standing.py


+ 0 - 0
backend_refactor/service/video_score/tennisthrow.py → backend_refactor/service/ai/video/video_score/tennisthrow.py


+ 0 - 0
backend_refactor/service/video_score/turnaround.py → backend_refactor/service/ai/video/video_score/turnaround.py


+ 0 - 382
backend_refactor/service/aiutil/model.py

@@ -1,382 +0,0 @@
-import torch
-from collections import OrderedDict
-
-import torch
-import torch.nn as nn
-
-def make_layers(block, no_relu_layers,prelu_layers = []):
-    layers = []
-    for layer_name, v in block.items():
-        if 'pool' in layer_name:
-            layer = nn.MaxPool2d(kernel_size=v[0], stride=v[1],
-                                    padding=v[2])
-            layers.append((layer_name, layer))
-        else:
-            conv2d = nn.Conv2d(in_channels=v[0], out_channels=v[1],
-                               kernel_size=v[2], stride=v[3],
-                               padding=v[4])
-            layers.append((layer_name, conv2d))
-            if layer_name not in no_relu_layers:
-                if layer_name not in prelu_layers:
-                    layers.append(('relu_'+layer_name, nn.ReLU(inplace=True)))
-                else:
-                    layers.append(('prelu'+layer_name[4:],nn.PReLU(v[1])))
-
-    return nn.Sequential(OrderedDict(layers))
-
-def make_layers_Mconv(block,no_relu_layers):
-    modules = []
-    for layer_name, v in block.items():
-        layers = []
-        if 'pool' in layer_name:
-            layer = nn.MaxPool2d(kernel_size=v[0], stride=v[1],
-                                    padding=v[2])
-            layers.append((layer_name, layer))
-        else:
-            conv2d = nn.Conv2d(in_channels=v[0], out_channels=v[1],
-                               kernel_size=v[2], stride=v[3],
-                               padding=v[4])
-            layers.append((layer_name, conv2d))
-            if layer_name not in no_relu_layers:
-                layers.append(('Mprelu'+layer_name[5:], nn.PReLU(v[1])))
-        modules.append(nn.Sequential(OrderedDict(layers)))
-    return nn.ModuleList(modules)
-
-class bodypose_25_model(nn.Module):
-    def __init__(self):
-        super(bodypose_25_model,self).__init__()
-        # these layers have no relu layer
-        no_relu_layers = ['Mconv7_stage0_L1','Mconv7_stage0_L2',\
-                          'Mconv7_stage1_L1', 'Mconv7_stage1_L2',\
-                          'Mconv7_stage2_L2', 'Mconv7_stage3_L2']
-        prelu_layers = ['conv4_2','conv4_3_CPM','conv4_4_CPM']
-        blocks = {}
-        block0 = OrderedDict([
-                      ('conv1_1', [3, 64, 3, 1, 1]),
-                      ('conv1_2', [64, 64, 3, 1, 1]),
-                      ('pool1_stage1', [2, 2, 0]),
-                      ('conv2_1', [64, 128, 3, 1, 1]),
-                      ('conv2_2', [128, 128, 3, 1, 1]),
-                      ('pool2_stage1', [2, 2, 0]),
-                      ('conv3_1', [128, 256, 3, 1, 1]),
-                      ('conv3_2', [256, 256, 3, 1, 1]),
-                      ('conv3_3', [256, 256, 3, 1, 1]),
-                      ('conv3_4', [256, 256, 3, 1, 1]),
-                      ('pool3_stage1', [2, 2, 0]),
-                      ('conv4_1', [256, 512, 3, 1, 1]),
-                      ('conv4_2', [512, 512, 3, 1, 1]),
-                      ('conv4_3_CPM', [512, 256, 3, 1, 1]),
-                      ('conv4_4_CPM', [256, 128, 3, 1, 1])
-                  ])
-        self.model0 = make_layers(block0, no_relu_layers,prelu_layers)
-        
-        #L2
-        #stage0
-        blocks['Mconv1_stage0_L2'] = OrderedDict([
-                    ('Mconv1_stage0_L2_0',[128,96,3,1,1]),
-                    ('Mconv1_stage0_L2_1',[96,96,3,1,1]),
-                    ('Mconv1_stage0_L2_2',[96,96,3,1,1])
-                    ])
-        for i in range(2,6):
-            blocks['Mconv%d_stage0_L2' % i] = OrderedDict([
-                    ('Mconv%d_stage0_L2_0' % i,[288,96,3,1,1]),
-                    ('Mconv%d_stage0_L2_1' % i,[96,96,3,1,1]),
-                    ('Mconv%d_stage0_L2_2' % i,[96,96,3,1,1])
-              ])
-        blocks['Mconv6_7_stage0_L2'] = OrderedDict([
-                    ('Mconv6_stage0_L2',[288, 256, 1,1,0]),
-                    ('Mconv7_stage0_L2',[256,52,1,1,0])
-              ])
-        #stage1~3
-        for s in range(1,4):
-            blocks['Mconv1_stage%d_L2' % s] = OrderedDict([
-                    ('Mconv1_stage%d_L2_0' % s,[180,128,3,1,1]),
-                    ('Mconv1_stage%d_L2_1' % s,[128,128,3,1,1]),
-                    ('Mconv1_stage%d_L2_2' % s,[128,128,3,1,1])
-                ])
-            for i in range(2,6):
-                blocks['Mconv%d_stage%d_L2' % (i,s)] = OrderedDict([
-                        ('Mconv%d_stage%d_L2_0' % (i,s) ,[384,128,3,1,1]),
-                        ('Mconv%d_stage%d_L2_1' % (i,s) ,[128,128,3,1,1]),
-                        ('Mconv%d_stage%d_L2_2' % (i,s) ,[128,128,3,1,1])
-                    ])
-            blocks['Mconv6_7_stage%d_L2' % s] = OrderedDict([
-                    ('Mconv6_stage%d_L2' % s,[384,512,1,1,0]),
-                    ('Mconv7_stage%d_L2' % s,[512,52,1,1,0])
-                ])
-        
-        #L1
-        #stage0
-        blocks['Mconv1_stage0_L1'] = OrderedDict([
-                ('Mconv1_stage0_L1_0',[180,96,3,1,1]),
-                ('Mconv1_stage0_L1_1',[96,96,3,1,1]),
-                ('Mconv1_stage0_L1_2',[96,96,3,1,1])
-            ])
-        for i in range(2,6):
-            blocks['Mconv%d_stage0_L1' % i] = OrderedDict([
-                    ('Mconv%d_stage0_L1_0' % i,[288,96,3,1,1]),
-                    ('Mconv%d_stage0_L1_1' % i,[96,96,3,1,1]),
-                    ('Mconv%d_stage0_L1_2' % i,[96,96,3,1,1])
-              ])
-        blocks['Mconv6_7_stage0_L1'] = OrderedDict([
-                    ('Mconv6_stage0_L1',[288, 256, 1,1,0]),
-                    ('Mconv7_stage0_L1',[256,26,1,1,0])
-              ])
-        #stage1
-        blocks['Mconv1_stage1_L1'] = OrderedDict([
-                ('Mconv1_stage1_L1_0',[206,128,3,1,1]),
-                ('Mconv1_stage1_L1_1',[128,128,3,1,1]),
-                ('Mconv1_stage1_L1_2',[128,128,3,1,1])
-            ])
-        for i in range(2,6):
-            blocks['Mconv%d_stage1_L1' % i] = OrderedDict([
-                    ('Mconv%d_stage1_L1_0' % i,[384,128,3,1,1]),
-                    ('Mconv%d_stage1_L1_1' % i,[128,128,3,1,1]),
-                    ('Mconv%d_stage1_L1_2' % i,[128,128,3,1,1])
-                ])
-        blocks['Mconv6_7_stage1_L1'] = OrderedDict([
-                ('Mconv6_stage1_L1',[384,512,1,1,0]),
-                ('Mconv7_stage1_L1',[512,26,1,1,0])
-            ])
-        
-        for k in blocks.keys():
-            blocks[k] = make_layers_Mconv(blocks[k], no_relu_layers)
-        self.models = nn.ModuleDict(blocks)
-        #self.model_L2_S0_mconv1 = blocks['Mconv1_stage0_L2']
-            
-        
-    def _Mconv_forward(self,x,models):
-        outs = []
-        out = x
-        for m in models:
-            out = m(out)
-            outs.append(out)
-        return torch.cat(outs,1)
-        
-    def forward(self,x):
-        out0 = self.model0(x)
-        #L2
-        tout = out0
-        for s in range(4):
-            tout = self._Mconv_forward(tout,self.models['Mconv1_stage%d_L2' % s])
-            for v in range(2,6):
-                tout = self._Mconv_forward(tout,self.models['Mconv%d_stage%d_L2' % (v,s)])
-            tout = self.models['Mconv6_7_stage%d_L2' % s][0](tout)
-            tout = self.models['Mconv6_7_stage%d_L2' % s][1](tout)
-            outL2 = tout
-            tout = torch.cat([out0,tout],1)
-        #L1 stage0
-        #tout = torch.cat([out0,outL2],1)
-        tout = self._Mconv_forward(tout, self.models['Mconv1_stage0_L1'])
-        for v in range(2,6):
-            tout = self._Mconv_forward(tout, self.models['Mconv%d_stage0_L1' % v])
-        tout = self.models['Mconv6_7_stage0_L1'][0](tout)
-        tout = self.models['Mconv6_7_stage0_L1'][1](tout)
-        outS0L1 = tout
-        tout = torch.cat([out0,outS0L1,outL2],1)
-        #L1 stage1
-        tout = self._Mconv_forward(tout, self.models['Mconv1_stage1_L1'])
-        for v in range(2,6):
-            tout = self._Mconv_forward(tout, self.models['Mconv%d_stage1_L1' % v])
-        tout = self.models['Mconv6_7_stage1_L1'][0](tout)
-        outS1L1 = self.models['Mconv6_7_stage1_L1'][1](tout)
-        
-        return outS1L1,outL2
-        
-
-class bodypose_model(nn.Module):
-    def __init__(self):
-        super(bodypose_model, self).__init__()
-
-        # these layers have no relu layer
-        no_relu_layers = ['conv5_5_CPM_L1', 'conv5_5_CPM_L2', 'Mconv7_stage2_L1',\
-                          'Mconv7_stage2_L2', 'Mconv7_stage3_L1', 'Mconv7_stage3_L2',\
-                          'Mconv7_stage4_L1', 'Mconv7_stage4_L2', 'Mconv7_stage5_L1',\
-                          'Mconv7_stage5_L2', 'Mconv7_stage6_L1', 'Mconv7_stage6_L1']
-        blocks = {}
-        block0 = OrderedDict([
-                      ('conv1_1', [3, 64, 3, 1, 1]),
-                      ('conv1_2', [64, 64, 3, 1, 1]),
-                      ('pool1_stage1', [2, 2, 0]),
-                      ('conv2_1', [64, 128, 3, 1, 1]),
-                      ('conv2_2', [128, 128, 3, 1, 1]),
-                      ('pool2_stage1', [2, 2, 0]),
-                      ('conv3_1', [128, 256, 3, 1, 1]),
-                      ('conv3_2', [256, 256, 3, 1, 1]),
-                      ('conv3_3', [256, 256, 3, 1, 1]),
-                      ('conv3_4', [256, 256, 3, 1, 1]),
-                      ('pool3_stage1', [2, 2, 0]),
-                      ('conv4_1', [256, 512, 3, 1, 1]),
-                      ('conv4_2', [512, 512, 3, 1, 1]),
-                      ('conv4_3_CPM', [512, 256, 3, 1, 1]),
-                      ('conv4_4_CPM', [256, 128, 3, 1, 1])
-                  ])
-
-
-        # Stage 1
-        block1_1 = OrderedDict([
-                        ('conv5_1_CPM_L1', [128, 128, 3, 1, 1]),
-                        ('conv5_2_CPM_L1', [128, 128, 3, 1, 1]),
-                        ('conv5_3_CPM_L1', [128, 128, 3, 1, 1]),
-                        ('conv5_4_CPM_L1', [128, 512, 1, 1, 0]),
-                        ('conv5_5_CPM_L1', [512, 38, 1, 1, 0])
-                    ])
-
-        block1_2 = OrderedDict([
-                        ('conv5_1_CPM_L2', [128, 128, 3, 1, 1]),
-                        ('conv5_2_CPM_L2', [128, 128, 3, 1, 1]),
-                        ('conv5_3_CPM_L2', [128, 128, 3, 1, 1]),
-                        ('conv5_4_CPM_L2', [128, 512, 1, 1, 0]),
-                        ('conv5_5_CPM_L2', [512, 19, 1, 1, 0])
-                    ])
-        blocks['block1_1'] = block1_1
-        blocks['block1_2'] = block1_2
-
-        self.model0 = make_layers(block0, no_relu_layers)
-
-        # Stages 2 - 6
-        for i in range(2, 7):
-            blocks['block%d_1' % i] = OrderedDict([
-                    ('Mconv1_stage%d_L1' % i, [185, 128, 7, 1, 3]),
-                    ('Mconv2_stage%d_L1' % i, [128, 128, 7, 1, 3]),
-                    ('Mconv3_stage%d_L1' % i, [128, 128, 7, 1, 3]),
-                    ('Mconv4_stage%d_L1' % i, [128, 128, 7, 1, 3]),
-                    ('Mconv5_stage%d_L1' % i, [128, 128, 7, 1, 3]),
-                    ('Mconv6_stage%d_L1' % i, [128, 128, 1, 1, 0]),
-                    ('Mconv7_stage%d_L1' % i, [128, 38, 1, 1, 0])
-                ])
-
-            blocks['block%d_2' % i] = OrderedDict([
-                    ('Mconv1_stage%d_L2' % i, [185, 128, 7, 1, 3]),
-                    ('Mconv2_stage%d_L2' % i, [128, 128, 7, 1, 3]),
-                    ('Mconv3_stage%d_L2' % i, [128, 128, 7, 1, 3]),
-                    ('Mconv4_stage%d_L2' % i, [128, 128, 7, 1, 3]),
-                    ('Mconv5_stage%d_L2' % i, [128, 128, 7, 1, 3]),
-                    ('Mconv6_stage%d_L2' % i, [128, 128, 1, 1, 0]),
-                    ('Mconv7_stage%d_L2' % i, [128, 19, 1, 1, 0])
-                ])
-
-        for k in blocks.keys():
-            blocks[k] = make_layers(blocks[k], no_relu_layers)
-
-        self.model1_1 = blocks['block1_1']
-        self.model2_1 = blocks['block2_1']
-        self.model3_1 = blocks['block3_1']
-        self.model4_1 = blocks['block4_1']
-        self.model5_1 = blocks['block5_1']
-        self.model6_1 = blocks['block6_1']
-
-        self.model1_2 = blocks['block1_2']
-        self.model2_2 = blocks['block2_2']
-        self.model3_2 = blocks['block3_2']
-        self.model4_2 = blocks['block4_2']
-        self.model5_2 = blocks['block5_2']
-        self.model6_2 = blocks['block6_2']
-
-
-    def forward(self, x):
-
-        out1 = self.model0(x)
-
-        out1_1 = self.model1_1(out1)
-        out1_2 = self.model1_2(out1)
-        out2 = torch.cat([out1_1, out1_2, out1], 1)
-
-        out2_1 = self.model2_1(out2)
-        out2_2 = self.model2_2(out2)
-        out3 = torch.cat([out2_1, out2_2, out1], 1)
-
-        out3_1 = self.model3_1(out3)
-        out3_2 = self.model3_2(out3)
-        out4 = torch.cat([out3_1, out3_2, out1], 1)
-
-        out4_1 = self.model4_1(out4)
-        out4_2 = self.model4_2(out4)
-        out5 = torch.cat([out4_1, out4_2, out1], 1)
-
-        out5_1 = self.model5_1(out5)
-        out5_2 = self.model5_2(out5)
-        out6 = torch.cat([out5_1, out5_2, out1], 1)
-
-        out6_1 = self.model6_1(out6)
-        out6_2 = self.model6_2(out6)
-
-        return  out6_2,out6_1
-
-class handpose_model(nn.Module):
-    def __init__(self):
-        super(handpose_model, self).__init__()
-
-        # these layers have no relu layer
-        no_relu_layers = ['conv6_2_CPM', 'Mconv7_stage2', 'Mconv7_stage3',\
-                          'Mconv7_stage4', 'Mconv7_stage5', 'Mconv7_stage6']
-        # stage 1
-        block1_0 = OrderedDict([
-                ('conv1_1', [3, 64, 3, 1, 1]),
-                ('conv1_2', [64, 64, 3, 1, 1]),
-                ('pool1_stage1', [2, 2, 0]),
-                ('conv2_1', [64, 128, 3, 1, 1]),
-                ('conv2_2', [128, 128, 3, 1, 1]),
-                ('pool2_stage1', [2, 2, 0]),
-                ('conv3_1', [128, 256, 3, 1, 1]),
-                ('conv3_2', [256, 256, 3, 1, 1]),
-                ('conv3_3', [256, 256, 3, 1, 1]),
-                ('conv3_4', [256, 256, 3, 1, 1]),
-                ('pool3_stage1', [2, 2, 0]),
-                ('conv4_1', [256, 512, 3, 1, 1]),
-                ('conv4_2', [512, 512, 3, 1, 1]),
-                ('conv4_3', [512, 512, 3, 1, 1]),
-                ('conv4_4', [512, 512, 3, 1, 1]),
-                ('conv5_1', [512, 512, 3, 1, 1]),
-                ('conv5_2', [512, 512, 3, 1, 1]),
-                ('conv5_3_CPM', [512, 128, 3, 1, 1])
-            ])
-
-        block1_1 = OrderedDict([
-            ('conv6_1_CPM', [128, 512, 1, 1, 0]),
-            ('conv6_2_CPM', [512, 22, 1, 1, 0])
-        ])
-
-        blocks = {}
-        blocks['block1_0'] = block1_0
-        blocks['block1_1'] = block1_1
-
-        # stage 2-6
-        for i in range(2, 7):
-            blocks['block%d' % i] = OrderedDict([
-                    ('Mconv1_stage%d' % i, [150, 128, 7, 1, 3]),
-                    ('Mconv2_stage%d' % i, [128, 128, 7, 1, 3]),
-                    ('Mconv3_stage%d' % i, [128, 128, 7, 1, 3]),
-                    ('Mconv4_stage%d' % i, [128, 128, 7, 1, 3]),
-                    ('Mconv5_stage%d' % i, [128, 128, 7, 1, 3]),
-                    ('Mconv6_stage%d' % i, [128, 128, 1, 1, 0]),
-                    ('Mconv7_stage%d' % i, [128, 22, 1, 1, 0])
-                ])
-
-        for k in blocks.keys():
-            blocks[k] = make_layers(blocks[k], no_relu_layers)
-
-        self.model1_0 = blocks['block1_0']
-        self.model1_1 = blocks['block1_1']
-        self.model2 = blocks['block2']
-        self.model3 = blocks['block3']
-        self.model4 = blocks['block4']
-        self.model5 = blocks['block5']
-        self.model6 = blocks['block6']
-
-    def forward(self, x):
-        out1_0 = self.model1_0(x)
-        out1_1 = self.model1_1(out1_0)
-        concat_stage2 = torch.cat([out1_1, out1_0], 1)
-        out_stage2 = self.model2(concat_stage2)
-        concat_stage3 = torch.cat([out_stage2, out1_0], 1)
-        out_stage3 = self.model3(concat_stage3)
-        concat_stage4 = torch.cat([out_stage3, out1_0], 1)
-        out_stage4 = self.model4(concat_stage4)
-        concat_stage5 = torch.cat([out_stage4, out1_0], 1)
-        out_stage5 = self.model5(concat_stage5)
-        concat_stage6 = torch.cat([out_stage5, out1_0], 1)
-        out_stage6 = self.model6(concat_stage6)
-        return out_stage6
-
-

+ 4 - 332
backend_refactor/service/photo_analyzer.py

@@ -1,10 +1,10 @@
-import math
 from typing import Callable
 import cv2
 import copy
 from config import UPLOAD_DIR
-from service.aiutil import torch_openpose
-import service.aiutil as aiutil
+from service.ai.photo.standing_photo import *
+from service.ai.util import torch_openpose
+from service.ai.util.util import draw_bodypose
 
 
 class BasePhotoAnalyzer:
@@ -12,334 +12,6 @@ class BasePhotoAnalyzer:
         pass
 
 
-def angle(v1, v2):
-    dx1 = v1[2] - v1[0]
-    dy1 = v1[3] - v1[1]
-    dx2 = v2[2] - v2[0]
-    dy2 = v2[3] - v2[1]
-    angle1 = math.atan2(dy1, dx1)
-    angle1 = round(angle1 * 180.0 / math.pi, 2)
-    angle2 = math.atan2(dy2, dx2)
-    angle2 = round(angle2 * 180.0 / math.pi, 2)
-    if angle1 * angle2 >= 0:
-        included_angle = abs(angle1 - angle2)
-    else:
-        included_angle = abs(angle1) + abs(angle2)
-        if included_angle > 180:
-            included_angle = 360 - included_angle
-    return included_angle
-
-
-def angle_for_xo(v1, v2):
-    dx1 = v1[2] - v1[0]
-    dy1 = v1[3] - v1[1]
-    dx2 = v2[2] - v2[0]
-    dy2 = v2[3] - v2[1]
-    angle1 = math.atan2(dy1, dx1)
-    angle1 = round(angle1 * 180.0 / math.pi, 2)
-    angle2 = math.atan2(dy2, dx2)
-    angle2 = round(angle2 * 180.0 / math.pi, 2)
-    return angle1 - angle2
-
-
-def cal_head_extra_stress(angle):
-    HEAD_STRESS_ARGUMENT_0 = 11
-    HEAD_STRESS_ARGUMENT_1 = 1.02777777777769
-    HEAD_STRESS_ARGUMENT_2 = 0.00981481481482367
-    HEAD_STRESS_ARGUMENT_3 = -0.000567901234568158
-    HEAD_STRESS_ARGUMENT_4 = 0.00000576131687243021
-    return (HEAD_STRESS_ARGUMENT_1 * angle + HEAD_STRESS_ARGUMENT_2 * pow(angle, 2)
-            + HEAD_STRESS_ARGUMENT_3 * pow(angle, 3) + HEAD_STRESS_ARGUMENT_4 * pow(angle, 4)) / HEAD_STRESS_ARGUMENT_0
-
-
-def analyse_npy_front(npy_front, height):
-    levels = {
-        # (level, threshold)
-        "head_angle": [
-            (0, 4), (1, 10), (2, 20)
-        ],
-        "shoulder_angle": [
-            (0, 2.8), (1, 8), (2, 15)
-        ],
-        "shoulder_offset": [
-            (0, 3), (1, 8), (2, 15)
-        ],
-        "hip_angle": [
-            (0, 2.19), (1, 8), (2, 15)
-        ],
-        "hip_offset": [
-            (0, 2.19), (1, 8), (2, 15)
-        ],
-        "leg_angle": 4
-    }
-
-    result = []
-    data = npy_front[0]
-
-    result.append("------------------")
-    result.append("正面分析内容如下:")
-
-    # h-eye - h-elbow
-    h_pixel_eye2elbow = abs(data[15][1] - data[3][1])
-
-    h_real_eye2elbow = float(height) * 0.333
-
-    # body mid x
-    ankle_mid_x = (data[14][0] + data[11][0]) / 2
-
-    # for head
-    ear_r_x = data[17][0]
-    ear_r_y = data[17][1]
-    ear_l_x = data[18][0]
-    ear_l_y = data[18][1]
-
-    head_angle = angle([ear_r_x, ear_r_y, ear_l_x, ear_l_y], [0, 0, 1, 0])
-    head_front_level = 0
-    for level in levels["head_angle"]:
-        head_front_level = level[0]
-        if head_angle <= level[1]:
-            break
-
-    head_direction = None
-    if ear_l_y < ear_l_y:
-        head_direction = "左"
-    elif ear_l_y > ear_r_y:
-        head_direction = "右"
-    if head_front_level > 0 and head_direction:
-        result.append("头部分析:头部{}部高,向右倾斜,角度为{}度".format(head_direction, round(head_angle, 2)))
-    else:
-        result.append("头部分析:头部保持较好平衡")
-    result.append(head_front_level)
-
-    # for shoulder
-    shoulder_r_x = data[2][0]
-    shoulder_r_y = data[2][1]
-    shoulder_l_x = data[5][0]
-    shoulder_l_y = data[5][1]
-    shoulder_mid_x = (shoulder_l_x + shoulder_r_x) / 2
-    neck_x = data[1][0] - 2
-    shoulder_offset = (shoulder_mid_x - neck_x) * h_real_eye2elbow / h_pixel_eye2elbow
-    shoulder_angle = angle([shoulder_r_x, shoulder_r_y, shoulder_l_x, shoulder_l_y], [0, 0, 1, 0])
-    shoulder_angle = min(shoulder_angle, abs(shoulder_angle - 3))
-    shoulder_angle_level = 0
-    shoulder_offset_level = 0
-    for level in levels["shoulder_angle"]:
-        shoulder_angle_level = level[0]
-        if shoulder_angle <= level[1]:
-            break
-    for level in levels["shoulder_offset"]:
-        shoulder_offset_level = level[0]
-        if shoulder_offset <= level[1]:
-            break
-    if shoulder_offset_level == 0:
-        shoulder_level = shoulder_angle_level
-    elif shoulder_angle_level == 0:
-        shoulder_level = shoulder_offset_level
-    else:
-        shoulder_level = round(0.6 * shoulder_angle_level + 0.4 * shoulder_offset_level)
-
-    result.append("肩部分析:")
-    shoulder_offset_direction = None
-    if shoulder_offset > 0:
-        shoulder_offset_direction = "左"
-    elif shoulder_offset < 0:
-        shoulder_offset_direction = "右"
-    shoulder_angle_direction = None
-    if shoulder_l_y < shoulder_r_y:
-        shoulder_angle_direction = "右"
-    elif shoulder_l_y > shoulder_r_y:
-        shoulder_angle_direction = "左"
-    if shoulder_offset_direction:
-        result.append("肩部向{}横移,距离为{}cm".format(shoulder_offset_direction, round(abs(shoulder_offset), 2)))
-    else:
-        result.append("肩部中心位居中轴,位置良好")
-
-    if shoulder_angle_direction:
-        result.append("肩部向{}倾斜角度为{}度".format(shoulder_angle_direction, round(shoulder_angle, 2)))
-    else:
-        result.append("肩部无左右倾斜")
-    result.append(shoulder_level)
-
-    # for hip
-    hip_r_x = data[9][0]
-    hip_r_y = data[9][1]
-    hip_l_x = data[12][0]
-    hip_l_y = data[12][1]
-    hip_mid_x = (hip_r_x + hip_l_x) / 2
-    hip_offset = (hip_mid_x - ankle_mid_x) * h_real_eye2elbow / h_pixel_eye2elbow
-    hd_hip = abs(data[12][1] - data[9][1])
-    d_hip = math.sqrt((hip_l_x - hip_r_x) ** 2 + (hip_l_y - hip_r_y) ** 2)
-    rate_hip = hd_hip / d_hip
-    hip_angle = angle([hip_r_x, hip_r_y, hip_l_x, hip_l_y], [0, 0, 1, 0])
-    hip_angle_level = 0
-    hip_offset_level = 0
-    for level in levels["hip_angle"]:
-        hip_angle_level = level[0]
-        if hip_angle <= level[1]:
-            break
-    for level in levels["hip_offset"]:
-        hip_offset_level = level[0]
-        if hip_offset <= level[1]:
-            break
-    result.append("髋部分析:")
-    hip_offset_direction = None
-    if hip_offset > 0:
-        hip_offset_direction = "左"
-    elif hip_offset < 0:
-        hip_offset_direction = "右"
-    hip_angle_direction = None
-    if hip_l_y < hip_r_y:
-        hip_angle_direction = "右"
-    elif hip_l_y > hip_r_y:
-        hip_angle_direction = "左"
-    if hip_offset_direction:
-        result.append("髋部向{}横移,距离为{}cm".format(hip_offset_direction, round(abs(hip_offset), 2)))
-    else:
-        result.append("髋部中心位居中轴,位置良好")
-
-    if hip_angle_direction:
-        result.append("髋部向{}倾斜角度为{}度".format(hip_angle_direction, round(hip_angle, 2)))
-    else:
-        result.append("髋部角度保持较好平衡")
-    hip_level = round(0.6 * hip_offset_level + 0.4 * hip_angle_level)
-    result.append(hip_level)
-
-    result.append("腿型分析:")
-
-    # for knee distance
-    knee_r_x = data[10][0]
-    knee_r_y = data[10][1]
-    knee_l_x = data[13][0]
-    knee_l_y = data[13][1]
-
-    ankle_r_x = data[11][0]
-    ankle_r_y = data[11][1]
-    ankle_l_x = data[14][0]
-    ankle_l_y = data[14][1]
-
-    xo_l_angle = angle_for_xo([hip_l_x, hip_l_y, knee_l_x, knee_l_y], [hip_l_x, hip_l_y, ankle_l_x, ankle_l_y])
-    xo_r_angle = angle_for_xo([hip_r_x, hip_r_y, knee_r_x, knee_r_y], [hip_r_x, hip_r_y, ankle_r_x, ankle_r_y])
-    xo_angle = max(abs(xo_l_angle), abs(xo_r_angle))
-    if xo_angle > levels["leg_angle"]:
-        xo_direction = "X" if xo_l_angle < 0 and xo_l_angle + xo_r_angle < 0 else "O"
-        result.append("腿型可能为{}型腿".format(xo_direction))
-    else:
-        result.append("腿型基本正常,非X、O型腿")
-    return result
-
-
-def analyse_npy_side(npy_side, height):
-    levels = {
-        "head_forward_angle": [
-            (0, 4.57), (1, 8), (2, 15)
-        ],
-        "up_forward_angle": [
-            (0, 5), (1, 10), (2, 15)
-        ],
-        "hip_forward_offset": [
-            (0, 3), (1, 5), (2, 8)
-        ],
-        "knee_forward_angle": [
-            (0, 3.86), (1, 8), (2, 13)
-        ]
-    }
-
-    result = []
-    data = npy_side[0]
-    h_pixel_eye2elbow = abs(data[15][1] - data[3][1])
-
-    h_real_eye2elbow = float(height) * 0.333
-    result.append(" ")
-    result.append("------------------")
-    result.append("侧面分析内容如下:")
-
-    # for head
-    ear_r_x = data[17][0]
-    ear_r_y = data[17][1]
-    shoulder_r_x = data[2][0]
-    shoulder_r_y = data[2][1]
-    head_forward_angle = angle([shoulder_r_x, shoulder_r_y, ear_r_x, ear_r_y, ], [0, 0, 0, -1])
-    head_forward_level = 0
-    head_extra_stress = round(cal_head_extra_stress(head_forward_angle), 2) if 0 < head_forward_angle < 90 else 0
-    for level in levels["head_forward_angle"]:
-        head_forward_level = level[0]
-        if head_forward_angle <= level[1]:
-            break
-    head_forward_direction = None
-    if ear_r_x > shoulder_r_x:
-        head_forward_direction = "前倾"
-    elif ear_r_x < shoulder_r_x:
-        head_forward_direction = "后仰"
-    if head_forward_direction:
-        result.append("头部{}角度为{}度,颈椎额外承受压力为头部重量{}倍".format(head_forward_direction,
-                                                                               round(head_forward_angle, 2),
-                                                                               round(head_extra_stress, 2)))
-    else:
-        result.append("无头部前倾问题")
-    result.append(head_forward_level)
-
-    # upper part of body
-    neck_x = data[1][0]
-    neck_y = data[1][1]
-
-    ankle_r_x = data[11][0]
-    ankle_r_y = data[11][1]
-    up_angle = round(angle([ankle_r_x, ankle_r_y, neck_x, neck_y], [0, 0, 0, -1]), 2)
-    up_angle = min(up_angle, abs(up_angle - 3))
-    up_level = 0
-    for level in levels["up_forward_angle"]:
-        up_level = level[0]
-        if up_angle <= level[1]:
-            break
-    up_forward_direction = "后仰" if neck_x < ankle_r_x else "前倾"
-    up_state = "身体{}{}度".format(up_forward_direction, round(up_angle, 2))
-    result.append("站姿分析:{}".format(up_state))
-    result.append(up_level)
-
-    # for hip
-    hip_risk_level = 0
-    hip_r_x = data[9][0] - 2
-    hip_r_y = data[9][1]
-    knee_r_x = data[10][0]
-    knee_r_y = data[10][1]
-    hip_offset = abs((hip_r_x - ankle_r_x)) * h_real_eye2elbow / h_pixel_eye2elbow
-    for level in levels["hip_forward_offset"]:
-        hip_risk_level = level[0]
-        if hip_offset <= level[1]:
-            break
-    hip_forward_direction = None
-    if hip_r_x > ankle_r_x:
-        hip_forward_direction = "前移"
-    elif hip_r_x < ankle_r_x:
-        hip_forward_direction = "后移"
-    if hip_forward_direction:
-        hip_state = "髋关节{}{}cm".format(hip_forward_direction, round(hip_offset, 2))
-    else:
-        hip_state = "髋关节正常"
-
-    result.append("髋部分析:{}".format(hip_state))
-
-    result.append(hip_risk_level)
-
-    # for knee
-    knee_angle_r = 180 - angle([hip_r_x, hip_r_y, knee_r_x, knee_r_y], [knee_r_x, knee_r_y, ankle_r_x, ankle_r_y])
-    if knee_angle_r > 90:
-        knee_angle_r = 180 - knee_angle_r
-    knee_angle_r -= 3
-    knee_forward_risk_level = 0
-    for level in levels["knee_forward_angle"]:
-        knee_forward_risk_level = level[0]
-        if knee_angle_r <= level[1]:
-            break
-
-    if knee_forward_risk_level == 0:
-        result.append("膝盖角度分析:膝盖无明显超伸")
-    else:
-        result.append("膝盖角度分析:下肢膝盖超伸角度为{}度".format(round(knee_angle_r, 2)))
-    result.append(knee_forward_risk_level)
-    return result
-
-
 class StandingPhotoAnalyzer(BasePhotoAnalyzer):
 
     def __init__(self, data: dict):
@@ -369,7 +41,7 @@ class StandingPhotoAnalyzer(BasePhotoAnalyzer):
                     npys.append(analyse_npy_side(poses, self.height))
 
                 canvas = copy.deepcopy(ori_img)
-                canvas = aiutil.util.draw_bodypose(canvas, poses, 'body_25')
+                canvas = draw_bodypose(canvas, poses, 'body_25')
 
                 cv2.imwrite(UPLOAD_DIR + '{}.result.jpg'.format(i), canvas)
                 photos.append(UPLOAD_DIR + '{}.result.jpg'.format(i))

+ 15 - 15
backend_refactor/service/video_analyzer.py

@@ -7,11 +7,11 @@ import logging
 
 from service.aiutil.torch_openpose import torch_openpose
 from service.aiutil.util import draw_bodypose
-from service.analyze.inner_analyze import analyse_npy_side_juanfu, analyse_npy_side_shendun, analyse_npy_side_gaotaitui, \
+from service.ai import analyse_npy_side_juanfu, analyse_npy_side_shendun, analyse_npy_side_gaotaitui, \
     analyse_npy_side_jump
-from service.classify.gaotaitui import classify_gaotaitui
-from service.classify.juanfu import classify_juanfu
-from service.classify.shendun import classify_shendun
+from service.ai.video.classify import classify_gaotaitui
+from service.ai.video.classify import classify_juanfu
+from service.ai.video.classify import classify_shendun
 
 
 def run_openpose_for_npy_and_video(video_uuid):
@@ -82,18 +82,18 @@ class BaseVideoAnalyzer:
             raise e
 
 
-from service.video_score.jump import cal_jump
-from service.video_score.pingban import cal_pingban
-from service.video_score.turnaround import cal_turnaround
-from service.video_score.tennisthrow import cal_tennisthrow
-from service.video_score.jumpwithboth import cal_jumpwithboth
-from service.video_score.standing import cal_standing
-from service.video_score.balancebeam import cal_balancebeam
-from service.video_score.sitforward import cal_sitforward
+from service.ai.video.video_score.jump import cal_jump
+from service.ai.video.video_score import cal_pingban
+from service.ai.video.video_score import cal_turnaround
+from service.ai.video.video_score import cal_tennisthrow
+from service.ai.video.video_score import cal_jumpwithboth
+from service.ai.video.video_score import cal_standing
+from service.ai.video.video_score import cal_balancebeam
+from service.ai.video.video_score import cal_sitforward
 
-from service.video_score.juanfu import ignore_data_juanfu
-from service.video_score.shendun import ignore_data_shendun
-from service.video_score.gaotaitui import ignore_data_gaotaitui
+from service.ai.video.video_score import ignore_data_juanfu
+from service.ai.video.video_score.shendun import ignore_data_shendun
+from service.ai.video.video_score.gaotaitui import ignore_data_gaotaitui
 
 
 class JumpVideoAnalyzer(BaseVideoAnalyzer):