Toybrick

人工智能开发系列(7) OPENPOSE开发与实现

发表于 2019-5-30 17:00:55    查看: 1995|回复: 9 | [复制链接]    打印 | 显示全部楼层

本教程视频直播回看:
[url=https://v.qq.com/x/page/z0873pfnk3l.html][/url]

1.快速上手

    1 准备3399pro开发板一块,USB摄像头一个,usb键盘,usb鼠标,hdmi显示屏,网线
    2 连接USB摄像头到3399pro开发板,连接鼠标键盘,连接显示器,连接网线,接通电源
    3 模型下载,建议在PC上做
  1. git clone https://github.com/spmallick/learnopencv.git
  2. cd OpenPose-Multi-Person/
  3. sudo chmod a+x getModels.sh
  4. ./getModels.sh
  5. python3 multi-person-openpose.py
复制代码
    若报cv2.dnn错误,这是opencv版本低的问题,需要升级opencv到3.4.1以上版本(不包含3.4.1),python3 multi-person-openpose.py为可选操作,报错不影响后续运行
    4 修改prototxt文件
      
    5 解压附件到OpenPose-Multi-Person目录
    6 python3 rknn_transfer.py进行模型转换,模型转化比较耗内存建议先设置swap大于2G
    7 拷贝OpenPose-Multi-Person目录到开发板,以下操作在开发板运行
    8 安装rknn-toolkit及其依赖库,按照wiki教程安装环境
    9 安装gstreamer包
  1. sudo dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
  2. sudo dnf install gstreamer1-libav
复制代码
   10 python3 test_rnetCam.py(单人)或者python3 multi-person-openpose_rknn-cam.py(多人)

2.概述

VGG-19用于生成特征值。每个stage对应一个身体部位,branch1用于生产Confidence Maps,branch2用于生产PAF(Part Affinity maps )
Input: [1x3x368x368](输入的数据format是nchw,bgr格式)
Output: [1x57x46x46](输出数据前面部分是身体部位的Confidence Maps ,后面部分是PAF)

3.代码解析

├── pose_deploy_linevec_pre_compile.rknn.rknn        //转换之后的rknn模型
├── dataset.txt                                                             //量化的数据集
├── p1_368_368.jpg                                                     //用于量化的图片
├── multi-person-openpose_rknn-cam.py                  //使用rknn进行推理,以及后处理(多人)
├── test_rnetCam.py                                                  //使用rknn进行推理,以及后处理(单人)
└── rknn_transfer.py                                                 //用于将caffe模型转换为rknn模型

rknn_transfer.py

  1. from rknn.api import RKNN
  2. import cv2
  3. import time
  4. import numpy as np

  5. if __name__ == '__main__':

  6.     # Create RKNN object
  7.     rknn = RKNN()
  8.    
  9.     # pre-process config
  10.     print('--> config model')
  11.     # 配置模型输入,用于NPU对数据输入的预处理
  12.     # channel_mean_value='0 0 0 255',那么模型推理时,将会对RGB数据做如下转换
  13.     # (R - 0)/255, (G - 0)/255, (B - 0)/255。推理时,RKNN模型会自动做均值和归一化处理
  14.     # reorder_channel=’0 1 2’用于指定是否调整RBG顺序,设置成0 1 2即按输入的RGB顺序不做调整
  15.     # reorder_channel=’2 1 0’表示交换0和2通道,輸入调整为BGR   
  16.     rknn.config(channel_mean_value='0 0 0 255', reorder_channel='2 1 0')
  17.     print('done')

  18.     # Load tensorflow model
  19.     print('--> Loading model')
  20.     ret = rknn.load_caffe(model='./pose/coco/pose_deploy_linevec.prototxt', proto='caffe',
  21.                             blobs='./pose/coco/pose_iter_440000.caffemodel')
  22.     if ret != 0:
  23.         print('Load model failed!')
  24.         exit(ret)
  25.     print('done')

  26.     # Build model
  27.     print('--> Building model')
  28.         # do_quantization=True进行量化
  29.         # 量化会减小模型的体积和提升运算速度,但是会有精度的丢失
  30.         # 开启预编译,提高load速度
  31.     ret = rknn.build(do_quantization=True, dataset='./dataset.txt', pre_compile=True)
  32.     if ret != 0:
  33.         print('Build model failed!')
  34.         exit(ret)
  35.     print('done')
  36.     # Export rknn model
  37.     print('--> Export RKNN model')
  38.     ret = rknn.export_rknn('./pose_deploy_linevec_pre_compile.rknn')
  39.     if ret != 0:
  40.         print('Export model failed!')
  41.         exit(ret)
  42.     print('done')

  43.     rknn.release()


复制代码

multi-person-openpose_rknn-cam.py
  1. import cv2
  2. import time
  3. import numpy as np
  4. from random import randint
  5. from rknn.api import RKNN

  6. rknn = RKNN()
  7. '''
  8. protoFile = "pose/coco/pose_deploy_linevec.prototxt"
  9. weightsFile = "pose/coco/pose_iter_440000.caffemodel"
  10. '''
  11. nPoints = 18
  12. # COCO Output Format
  13. keypointsMapping = ['Nose', 'Neck', 'R-Sho', 'R-Elb', 'R-Wr', 'L-Sho', 'L-Elb', 'L-Wr', 'R-Hip', 'R-Knee', 'R-Ank', 'L-Hip', 'L-Knee', 'L-Ank', 'R-Eye', 'L-Eye', 'R-Ear', 'L-Ear']

  14. POSE_PAIRS = [[1,2], [1,5], [2,3], [3,4], [5,6], [6,7],
  15.               [1,8], [8,9], [9,10], [1,11], [11,12], [12,13],
  16.               [1,0], [0,14], [14,16], [0,15], [15,17],
  17.               [2,16], [5,17] ]

  18. # index of pafs correspoding to the POSE_PAIRS
  19. # e.g for POSE_PAIR(1,2), the PAFs are located at indices (31,32) of output, Similarly, (1,5) -> (39,40) and so on.
  20. mapIdx = [[31,32], [39,40], [33,34], [35,36], [41,42], [43,44],
  21.           [19,20], [21,22], [23,24], [25,26], [27,28], [29,30],
  22.           [47,48], [49,50], [53,54], [51,52], [55,56],
  23.           [37,38], [45,46]]

  24. colors = [ [0,100,255], [0,100,255], [0,255,255], [0,100,255], [0,255,255], [0,100,255],
  25.          [0,255,0], [255,200,100], [255,0,255], [0,255,0], [255,200,100], [255,0,255],
  26.          [0,0,255], [255,0,0], [200,200,0], [255,0,0], [200,200,0], [0,0,0]]


  27. def getKeypoints(probMap, threshold=0.1):

  28.     mapSmooth = cv2.GaussianBlur(probMap,(3,3),0,0)

  29.     mapMask = np.uint8(mapSmooth>threshold)
  30.     #np.set_printoptions(threshold=np.inf)
  31.     keypoints = []

  32.     #find the blobs
  33.     _, contours, hierarchy = cv2.findContours(mapMask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

  34.     #for each blob find the maxima
  35.     #对于每个关键点,对confidence map 应用一个阀值(本例采用0.1),生成二值图。
  36.     #首先找出每个关键点区域的全部轮廓。
  37.     #生成这个区域的mask。
  38.     #通过用probMap乘以这个mask,提取该区域的probMap。
  39.     #找到这个区域的本地极大值。要对每个即关键点区域进行处理。
  40.     #本地极大值对应的坐标就是关键点坐标
  41.     for cnt in contours:
  42.         blobMask = np.zeros(mapMask.shape)
  43.         blobMask = cv2.fillConvexPoly(blobMask, cnt, 1)
  44.         maskedProbMap = mapSmooth * blobMask
  45.         _, maxVal, _, maxLoc = cv2.minMaxLoc(maskedProbMap)
  46.         keypoints.append(maxLoc + (probMap[maxLoc[1], maxLoc[0]],))

  47.     return keypoints


  48. # Find valid connections between the different joints of a all persons present
  49. def getValidPairs(output):
  50.     valid_pairs = []
  51.     invalid_pairs = []
  52.     n_interp_samples = 10
  53.     paf_score_th = 0.1
  54.     conf_th = 0.7
  55.     # loop for every POSE_PAIR
  56.     for k in range(len(mapIdx)):
  57.         # A->B constitute a limb
  58.         pafA = output[0, mapIdx[k][0], :, :]
  59.         pafB = output[0, mapIdx[k][1], :, :]
  60.         pafA = cv2.resize(pafA, (frameWidth, frameHeight))
  61.         pafB = cv2.resize(pafB, (frameWidth, frameHeight))

  62.         # candA: (124, 365, 0.17102814, 43)
  63.         #                               detected_keypoints keypoint_id
  64.         # Find the keypoints for the first and second limb
  65.         #把连接对上的关键点提取出来,相同的关键点放一起。把关键点对分开地方到两个列表上
  66.         #(列表名为candA和candB)。在列表candA上的每一个点都会和列表candB上某些点连接
  67.         candA = detected_keypoints[POSE_PAIRS[k][0]]
  68.         candB = detected_keypoints[POSE_PAIRS[k][1]]

  69.         nA = len(candA)
  70.         nB = len(candB)

  71.         # If keypoints for the joint-pair is detected
  72.         # check every joint in candA with every joint in candB
  73.         # Calculate the distance vector between the two joints
  74.         # Find the PAF values at a set of interpolated points between the joints
  75.         # Use the above formula to compute a score to mark the connection valid

  76.         if( nA != 0 and nB != 0):
  77.             valid_pair = np.zeros((0,3))
  78.             for i in range(nA):
  79.                 max_j=-1
  80.                 maxScore = -1
  81.                 found = 0
  82.                 for j in range(nB):
  83.                     # Find d_ij
  84.                     d_ij = np.subtract(candB[j][:2], candA[i][:2])
  85.                     norm = np.linalg.norm(d_ij)
  86.                     if norm:
  87.                         d_ij = d_ij / norm
  88.                     else:
  89.                         continue
  90.                     # Find p(u)
  91.                     interp_coord = list(zip(np.linspace(candA[i][0], candB[j][0], num=n_interp_samples),
  92.                                             np.linspace(candA[i][1], candB[j][1], num=n_interp_samples)))
  93.                     # Find L(p(u))
  94.                     paf_interp = []
  95.                     for k in range(len(interp_coord)):
  96.                         paf_interp.append([pafA[int(round(interp_coord[k][1])), int(round(interp_coord[k][0]))],
  97.                                            pafB[int(round(interp_coord[k][1])), int(round(interp_coord[k][0]))] ])
  98.                     # Find E
  99.                     paf_scores = np.dot(paf_interp, d_ij)
  100.                     avg_paf_score = sum(paf_scores)/len(paf_scores)

  101.                     # Check if the connection is valid
  102.                     # If the fraction of interpolated vectors aligned with PAF is higher then threshold -> Valid Pair
  103.                     if ( len(np.where(paf_scores > paf_score_th)[0]) / n_interp_samples ) > conf_th :
  104.                         if avg_paf_score > maxScore:
  105.                             max_j = j
  106.                             maxScore = avg_paf_score
  107.                             found = 1
  108.                 # Append the connection to the list
  109.                 if found:
  110.                     #   detected_keypoints keypoint_id
  111.                     valid_pair = np.append(valid_pair, [[candA[i][3], candB[max_j][3], maxScore]], axis=0)
  112.             # Append the detected connections to the global list
  113.             valid_pairs.append(valid_pair)
  114.         else: # If no keypoints are detected
  115.             invalid_pairs.append(k)
  116.             valid_pairs.append([])
  117.     return valid_pairs, invalid_pairs



  118. # This function creates a list of keypoints belonging to each person
  119. # For each detected valid pair, it assigns the joint(s) to a person
  120. def getPersonwiseKeypoints(valid_pairs, invalid_pairs):
  121.     # the last number in each row is the overall score

  122.     #我们首先创建空列表,用来存放每个人的关键点(即关键部位)
  123.     personwiseKeypoints = -1 * np.ones((0, 19))
  124.     for k in range(len(mapIdx)):
  125.         if k not in invalid_pairs:
  126.             partAs = valid_pairs[k][:,0]
  127.             partBs = valid_pairs[k][:,1]
  128.             indexA, indexB = np.array(POSE_PAIRS[k])

  129.             for i in range(len(valid_pairs[k])):
  130.                 found = 0
  131.                 person_idx = -1
  132.                 #遍历每一个连接对,检查连接对中的partA是否已经存在于任意列表之中
  133.                 for j in range(len(personwiseKeypoints)):
  134.                     if personwiseKeypoints[j][indexA] == partAs[i]:
  135.                         person_idx = j
  136.                         found = 1
  137.                         break

  138.                 #如果存在,那么意味着这关键点属于当前列表,同时连接对中的partB也同样属于这个人体
  139.                 #把连接对中的partB增加到partA所在的列表。
  140.                 if found:
  141.                     personwiseKeypoints[person_idx][indexB] = partBs[i]
  142.                     personwiseKeypoints[person_idx][-1] += keypoints_list[partBs[i].astype(int), 2] + valid_pairs[k][i][2]

  143.                 # if find no partA in the subset, create a new subset
  144.                 #如果partA不存在于任意列表,那么说明这一对属于一个还没建立列表的人体,于是需要新建一个新列表。
  145.                 elif not found and k < 17:
  146.                     row = -1 * np.ones(19)
  147.                     row[indexA] = partAs[i]
  148.                     row[indexB] = partBs[i]
  149.                     # add the keypoint_scores for the two keypoints and the paf_score
  150.                     row[-1] = sum(keypoints_list[valid_pairs[k][i,:2].astype(int), 2]) + valid_pairs[k][i][2]
  151.                     personwiseKeypoints = np.vstack([personwiseKeypoints, row])
  152.     return personwiseKeypoints


  153. inWidth = 368
  154. inHeight = 368

  155. rknn.load_rknn('./pose_deploy_linevec_pre_compile.rknn')
  156. ret = rknn.init_runtime()
  157. if ret != 0:
  158.     print('Init runtime environment failed')
  159.     exit(ret)
  160. print('done')

  161. cap = cv2.VideoCapture(0)

  162. hasFrame, frame = cap.read()

  163. while cv2.waitKey(1) < 0:
  164.     t = time.time()
  165.     hasFrame, frame = cap.read()

  166.     # resize输入图像为368x368
  167.     frame = cv2.resize(frame, (inWidth, inHeight), interpolation=cv2.INTER_CUBIC)
  168.     if not hasFrame:
  169.         cv2.waitKey()
  170.         break
  171.     frameWidth = frame.shape[1]
  172.     frameHeight = frame.shape[0]

  173.     # input mode转为’nchw’
  174.     frame_input = np.transpose(frame, [2, 0, 1])
  175.     t = time.time()
  176.     [output] = rknn.inference(inputs=[frame_input], data_format="nchw")
  177.     print("time:", time.time()-t)
  178.    
  179.     # rknn输出的数组转为1x57x46x46的矩阵
  180.     output = output.reshape(1, 57, 46, 46)
  181.    
  182.     detected_keypoints = []
  183.     keypoints_list = np.zeros((0,3))
  184.     keypoint_id = 0
  185.     threshold = 0.1

  186.     for part in range(nPoints):
  187.         probMap = output[0,part,:,:]
  188.         probMap = cv2.resize(probMap, (frame.shape[1], frame.shape[0]))
  189.         keypoints = getKeypoints(probMap, threshold)
  190.         keypoints_with_id = []
  191.         for i in range(len(keypoints)):
  192.             keypoints_with_id.append(keypoints[i] + (keypoint_id,))
  193.             keypoints_list = np.vstack([keypoints_list, keypoints[i]])
  194.             keypoint_id += 1

  195.         detected_keypoints.append(keypoints_with_id)


  196.     frameClone = frame.copy()
  197.    
  198.     #for i in range(nPoints):
  199.     #   for j in range(len(detected_keypoints[i])):
  200.     #        cv2.circle(frameClone, detected_keypoints[i][j][0:2], 5, colors[i], -1, cv2.LINE_AA)
  201.     #cv2.imshow("Keypoints",frameClone)
  202.    
  203.    
  204.     valid_pairs, invalid_pairs = getValidPairs(output)
  205.     personwiseKeypoints = getPersonwiseKeypoints(valid_pairs, invalid_pairs)
  206.     #连接各个人体关键点
  207.     for i in range(17):
  208.         for n in range(len(personwiseKeypoints)):
  209.             index = personwiseKeypoints[n][np.array(POSE_PAIRS[i])]
  210.             if -1 in index:
  211.                 continue
  212.             B = np.int32(keypoints_list[index.astype(int), 0])
  213.             A = np.int32(keypoints_list[index.astype(int), 1])
  214.             cv2.line(frameClone, (B[0], A[0]), (B[1], A[1]), colors[i], 3, cv2.LINE_AA)


  215.     cv2.imshow("Detected Pose" , frameClone)
  216.    
  217.     #cv2.waitKey(0)

  218. rknn.release()
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

you_big_father

注册会员

积分
102
发表于 2019-6-5 13:36:55 | 显示全部楼层
您好,我转换模型的时候出现如下错误,请问如何解决
--> Building model
E generate vdata error, could not find vdata file, vdes file
E Catch exception when building RKNN model!
T Traceback (most recent call last):
T   File "rknn/api/rknn_base.py", line 476, in rknn.api.rknn_base.RKNNBase.build
T   File "rknn/api/rknn_base.py", line 405, in rknn.api.rknn_base.RKNNBase._build
T   File "rknn/base/ovxconfiggenerator.py", line 171, in rknn.base.ovxconfiggenerator.generate_vx_config_from_files
T   File "rknn/base/ovxconfiggenerator.py", line 91, in rknn.base.ovxconfiggenerator.generate_vdata
T   File "rknn/base/RKNNlib/app/code_generator/casegenerator.py", line 363, in rknn.base.RKNNlib.app.code_generator.casegenerator.CaseGenerator.generate
T   File "rknn/base/RKNNlib/app/code_generator/casegenerator.py", line 329, in rknn.base.RKNNlib.app.code_generator.casegenerator.CaseGenerator._gen_special_case
T   File "rknn/base/RKNNlib/app/code_generator/casegenerator.py", line 274, in rknn.base.RKNNlib.app.code_generator.casegenerator.CaseGenerator._gen_vdata_file
T   File "rknn/base/RKNNlib/RKNNlog.py", line 105, in rknn.base.RKNNlib.RKNNlog.RKNNLog.e
T ValueError: generate vdata error, could not find vdata file, vdes file
Build model failed!
回复

使用道具 举报

bill

新手上路

积分
35
发表于 2019-6-11 06:47:45 | 显示全部楼层
您好,我转换模型的时候出现如下错误,请问如何解决,docker 环境下执行的转换
root@89ee00158270:/home/OpenPose-Multi-Person# python3 rknn_transfer.py
--> config model
done
--> Loading model
E Deprecated caffe input usage, please change it to input layer.
E Catch exception when loading caffe model: ./pose/coco/pose_deploy_linevec.prototxt!
T Traceback (most recent call last):
T   File "rknn/api/rknn_base.py", line 281, in rknn.api.rknn_base.RKNNBase.load_caffe
T   File "rknn/base/RKNNlib/converter/caffeloader.py", line 977, in rknn.base.RKNNlib.converter.caffeloader.CaffeLoader.load
T   File "rknn/base/RKNNlib/converter/caffeloader.py", line 746, in rknn.base.RKNNlib.converter.caffeloader.CaffeLoader.parse_net_param
T   File "rknn/base/RKNNlib/RKNNlog.py", line 105, in rknn.base.RKNNlib.RKNNlog.RKNNLog.e
T ValueError: Deprecated caffe input usage, please change it to input layer.
Load model failed!


回复

使用道具 举报

bill

新手上路

积分
35
发表于 2019-6-11 08:23:28 | 显示全部楼层
bill 发表于 2019-6-11 06:47
您好,我转换模型的时候出现如下错误,请问如何解决,docker 环境下执行的转换
root@89ee00158270:/home/Op ...

我的已解决了,pose_deploy_linevec.prototxt 模型文件版本低的问题
回复

使用道具 举报

bill

新手上路

积分
35
发表于 2019-6-12 07:26:36 | 显示全部楼层
在docker 环境执行了这例子。但一个姿态都没有识别出来,output 打印基本全是【0,。。。。0】。
docker 环境为跑这个例子,源码主要改动点:
a.模型转换中将 pre_compile=False ,原来True 转换报错说,不支持pre_compile
b. 将从摄像图输入,改为输入图片或视屏
c. output = output.reshape(1, 57, 46, 46) 修改为 output = output.reshape(1, 57, 28, 28) 因为output size 是44688 不能reshape 为 (1, 57, 46, 46)
回复

使用道具 举报

bill

新手上路

积分
35
发表于 2019-6-12 23:00:26 | 显示全部楼层
早上这个问题也解决了,是由于修改prototxt文件参数,dim 228 要修改368
回复

使用道具 举报

1074292224

注册会员

积分
75
发表于 2019-6-28 10:44:50 | 显示全部楼层
请问有没有修改后的prototxt文件,我的build过程报错:,望大神帮助!
done
--> Building model
E Catch exception when building RKNN model!
T Traceback (most recent call last):
T   File "rknn/api/rknn_base.py", line 515, in rknn.api.rknn_base.RKNNBase.build
T   File "rknn/api/rknn_base.py", line 439, in rknn.api.rknn_base.RKNNBase._build
T   File "rknn/base/ovxconfiggenerator.py", line 197, in rknn.base.ovxconfiggenerator.generate_vx_config_from_files
T   File "rknn/base/RKNNlib/app/exporter/ovxlib_case/casegenerator.py", line 382, in rknn.base.RKNNlib.app.exporter.ovxlib_case.casegenerator.CaseGenerator.generate
T   File "rknn/base/RKNNlib/app/exporter/ovxlib_case/casegenerator.py", line 339, in rknn.base.RKNNlib.app.exporter.ovxlib_case.casegenerator.CaseGenerator._gen_unify_case
T   File "rknn/base/RKNNlib/app/exporter/ovxlib_case/casegenerator.py", line 234, in rknn.base.RKNNlib.app.exporter.ovxlib_case.casegenerator.CaseGenerator._generate_ovxlib_case
T   File "rknn/base/RKNNlib/app/exporter/ovxlib_case/vxnetgenerator.py", line 419, in rknn.base.RKNNlib.app.exporter.ovxlib_case.vxnetgenerator.VXNetGenerator.generate
T   File "rknn/base/RKNNlib/app/exporter/ovxlib_case/vxnetgenerator.py", line 652, in rknn.base.RKNNlib.app.exporter.ovxlib_case.vxnetgenerator.VXNetGenerator._generate_node_connections
T   File "rknn/base/RKNNlib/app/exporter/ovxlib_case/vxnetgenerator.py", line 474, in rknn.base.RKNNlib.app.exporter.ovxlib_case.vxnetgenerator.VXNetGenerator._gen_first
T KeyError: 'output_1'
Build model failed!
回复

使用道具 举报

1074292224

注册会员

积分
75
发表于 2019-6-30 12:12:42 | 显示全部楼层
我在转换时遇到这个错误,是因为什么原因呢,希望大神可以指导!
--> config model
done
--> Loading model
E Catch exception when loading caffe model: ../pose/coco/pose_deploy_linevec.prototxt!
T Traceback (most recent call last):
T   File "rknn/api/rknn_base.py", line 288, in rknn.api.rknn_base.RKNNBase.load_caffe
T   File "rknn/base/RKNNlib/converter/caffeloader.py", line 993, in rknn.base.RKNNlib.converter.caffeloader.CaffeLoader.load_blobs
T   File "/usr/local/lib/python3.6/site-packages/google/protobuf/message.py", line 187, in ParseFromString
T     return self.MergeFromString(serialized)
T   File "/usr/local/lib/python3.6/site-packages/google/protobuf/internal/python_message.py", line 1124, in MergeFromString
T     if self._InternalParse(serialized, 0, length) != length:
T   File "/usr/local/lib/python3.6/site-packages/google/protobuf/internal/python_message.py", line 1189, in InternalParse
T     pos = field_decoder(buffer, new_pos, end, self, field_dict)
T   File "/usr/local/lib/python3.6/site-packages/google/protobuf/internal/decoder.py", line 700, in DecodeRepeatedField
T     raise _DecodeError('Truncated message.')
T google.protobuf.message.DecodeError: Truncated message.
Load model failed!

这是我的pose_deploy_linevec.prototxt文件内容:刚开始的那些需不需要保留?
layer {
  name: "image"
  type: "Input"
  top: "image"
  input_param{
    shape {
          dim: 1
          dim: 3
          dim: 368
          dim: 368
    }
  }
}
回复

使用道具 举报

Guanghai.Wan

新手上路

积分
22
发表于 2019-7-25 18:36:38 | 显示全部楼层
有谁转换成功了的,还麻烦发一个转换好的模型文件给我了
回复

使用道具 举报

 楼主| 发表于 2019-7-25 19:35:58 | 显示全部楼层
#input: "image"
#input_dim: 1
#input_dim: 3
#input_dim: 1 # This value will be defined at runtime
#input_dim: 1 # This value will be defined at runtime
layer {
  name: "image"
  type: "Input"
  top: "image"
  input_param {
    shape {
      dim: 1
      dim: 3
      dim: 368
      dim: 368
    }
  }
}

prototxt文件修改方式。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 关于Toybrick


快速回复 返回顶部 返回列表