def handle_one(oriImg): # for visualize canvas = np.copy(oriImg) imageToTest = Variable(T.transpose( T.transpose(T.unsqueeze(torch.from_numpy(oriImg).float(), 0), 2, 3), 1, 2), volatile=True).cuda() print oriImg.shape scale = model_['boxsize'] / float(oriImg.shape[0]) print scale h = int(oriImg.shape[0] * scale) w = int(oriImg.shape[1] * scale) pad_h = 0 if (h % model_['stride'] == 0) else model_['stride'] - (h % model_['stride']) pad_w = 0 if (w % model_['stride'] == 0) else model_['stride'] - (w % model_['stride']) new_h = h + pad_h new_w = w + pad_w imageToTest = cv2.resize(oriImg, (0, 0), fx=scale, fy=scale, interpolation=cv2.INTER_CUBIC) imageToTest_padded, pad = util.padRightDownCorner(imageToTest, model_['stride'], model_['padValue']) imageToTest_padded = np.transpose( np.float32(imageToTest_padded[:, :, :, np.newaxis]), (3, 2, 0, 1)) / 256 - 0.5 feed = Variable(T.from_numpy(imageToTest_padded)).cuda() output1, output2 = model(feed) heatmap = nn.UpsamplingBilinear2d( (oriImg.shape[0], oriImg.shape[1])).cuda()(output2) paf = nn.UpsamplingBilinear2d( (oriImg.shape[0], oriImg.shape[1])).cuda()(output1) print heatmap.size() print paf.size() print type(heatmap) heatmap_avg = T.transpose(T.transpose(heatmap[0], 0, 1), 1, 2).data.cpu().numpy() paf_avg = T.transpose(T.transpose(paf[0], 0, 1), 1, 2).data.cpu().numpy() all_peaks = [] peak_counter = 0 #maps = for part in range(18): map_ori = heatmap_avg[:, :, part] map = gaussian_filter(map_ori, sigma=3) map_left = np.zeros(map.shape) map_left[1:, :] = map[:-1, :] map_right = np.zeros(map.shape) map_right[:-1, :] = map[1:, :] map_up = np.zeros(map.shape) map_up[:, 1:] = map[:, :-1] map_down = np.zeros(map.shape) map_down[:, :-1] = map[:, 1:] peaks_binary = np.logical_and.reduce( (map >= map_left, map >= map_right, map >= map_up, map >= map_down, map > param_['thre1'])) # peaks_binary = T.eq( # peaks = zip(T.nonzero(peaks_binary)[0],T.nonzero(peaks_binary)[0]) peaks = zip(np.nonzero(peaks_binary)[1], np.nonzero(peaks_binary)[0]) # note reverse peaks_with_score = [x + (map_ori[x[1], x[0]], ) for x in peaks] id = range(peak_counter, peak_counter + len(peaks)) peaks_with_score_and_id = [ peaks_with_score[i] + (id[i], ) for i in range(len(id)) ] all_peaks.append(peaks_with_score_and_id) peak_counter += len(peaks) connection_all = [] special_k = [] mid_num = 10 for k in range(len(mapIdx)): score_mid = paf_avg[:, :, [x - 19 for x in mapIdx[k]]] candA = all_peaks[limbSeq[k][0] - 1] candB = all_peaks[limbSeq[k][1] - 1] nA = len(candA) nB = len(candB) indexA, indexB = limbSeq[k] if (nA != 0 and nB != 0): connection_candidate = [] for i in range(nA): for j in range(nB): vec = np.subtract(candB[j][:2], candA[i][:2]) norm = math.sqrt(vec[0] * vec[0] + vec[1] * vec[1]) vec = np.divide(vec, norm) startend = zip(np.linspace(candA[i][0], candB[j][0], num=mid_num), \ np.linspace(candA[i][1], candB[j][1], num=mid_num)) vec_x = np.array([score_mid[int(round(startend[I][1])), int(round(startend[I][0])), 0] \ 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))]) score_midpts = np.multiply(vec_x, vec[0]) + np.multiply( vec_y, vec[1]) score_with_dist_prior = sum( score_midpts) / len(score_midpts) + min( 0.5 * oriImg.shape[0] / norm - 1, 0) criterion1 = len( np.nonzero(score_midpts > param_['thre2']) [0]) > 0.8 * len(score_midpts) criterion2 = score_with_dist_prior > 0 if criterion1 and criterion2: connection_candidate.append([ i, j, score_with_dist_prior, score_with_dist_prior + candA[i][2] + candB[j][2] ]) connection_candidate = sorted(connection_candidate, key=lambda x: x[2], reverse=True) connection = np.zeros((0, 5)) for c in range(len(connection_candidate)): i, j, s = connection_candidate[c][0:3] if (i not in connection[:, 3] and j not in connection[:, 4]): connection = np.vstack( [connection, [candA[i][3], candB[j][3], s, i, j]]) if (len(connection) >= min(nA, nB)): break connection_all.append(connection) else: special_k.append(k) connection_all.append([]) # last number in each row is the total parts number of that person # the second last number in each row is the score of the overall configuration subset = -1 * np.ones((0, 20)) candidate = np.array([item for sublist in all_peaks for item in sublist]) for k in range(len(mapIdx)): if k not in special_k: partAs = connection_all[k][:, 0] partBs = connection_all[k][:, 1] indexA, indexB = np.array(limbSeq[k]) - 1 for i in range(len(connection_all[k])): #= 1:size(temp,1) found = 0 subset_idx = [-1, -1] for j in range(len(subset)): #1:size(subset,1): if subset[j][indexA] == partAs[i] or subset[j][ indexB] == partBs[i]: subset_idx[found] = j found += 1 if found == 1: j = subset_idx[0] if (subset[j][indexB] != partBs[i]): subset[j][indexB] = partBs[i] subset[j][-1] += 1 subset[j][-2] += candidate[partBs[i].astype(int), 2] + connection_all[k][i][2] elif found == 2: # if found 2 and disjoint, merge them j1, j2 = subset_idx print "found = 2" membership = ((subset[j1] >= 0).astype(int) + (subset[j2] >= 0).astype(int))[:-2] if len(np.nonzero(membership == 2)[0]) == 0: #merge subset[j1][:-2] += (subset[j2][:-2] + 1) subset[j1][-2:] += subset[j2][-2:] subset[j1][-2] += connection_all[k][i][2] subset = np.delete(subset, j2, 0) else: # as like found == 1 subset[j1][indexB] = partBs[i] subset[j1][-1] += 1 subset[j1][-2] += candidate[ partBs[i].astype(int), 2] + connection_all[k][i][2] # if find no partA in the subset, create a new subset elif not found and k < 17: row = -1 * np.ones(20) row[indexA] = partAs[i] row[indexB] = partBs[i] row[-1] = 2 row[-2] = sum( candidate[connection_all[k][i, :2].astype(int), 2]) + connection_all[k][i][2] subset = np.vstack([subset, row]) # delete some rows of subset which has few parts occur deleteIdx = [] for i in range(len(subset)): if subset[i][-1] < 4 or subset[i][-2] / subset[i][-1] < 0.4: deleteIdx.append(i) subset = np.delete(subset, deleteIdx, axis=0) # canvas = cv2.imread(test_image) # B,G,R order for i in range(18): for j in range(len(all_peaks[i])): cv2.circle(canvas, all_peaks[i][j][0:2], 4, colors[i], thickness=-1) stickwidth = 4 for i in range(17): for n in range(len(subset)): index = subset[n][np.array(limbSeq[i]) - 1] if -1 in index: continue cur_canvas = canvas.copy() Y = candidate[index.astype(int), 0] X = candidate[index.astype(int), 1] mX = np.mean(X) mY = np.mean(Y) length = ((X[0] - X[1])**2 + (Y[0] - Y[1])**2)**0.5 angle = math.degrees(math.atan2(X[0] - X[1], Y[0] - Y[1])) polygon = cv2.ellipse2Poly( (int(mY), int(mX)), (int(length / 2), stickwidth), int(angle), 0, 360, 1) cv2.fillConvexPoly(cur_canvas, polygon, colors[i]) canvas = cv2.addWeighted(canvas, 0.4, cur_canvas, 0.6, 0) return canvas
def handle_one(oriImg): # for visualize canvas = np.copy(oriImg) imageToTest = Variable(T.transpose(T.transpose(T.unsqueeze(torch.from_numpy(oriImg).float(),0),2,3),1,2),volatile=True).cuda() print oriImg.shape scale = model_['boxsize'] / float(oriImg.shape[0]) print scale h = int(oriImg.shape[0]*scale) w = int(oriImg.shape[1]*scale) pad_h = 0 if (h%model_['stride']==0) else model_['stride'] - (h % model_['stride']) pad_w = 0 if (w%model_['stride']==0) else model_['stride'] - (w % model_['stride']) new_h = h+pad_h new_w = w+pad_w imageToTest = cv2.resize(oriImg, (0,0), fx=scale, fy=scale, interpolation=cv2.INTER_CUBIC) imageToTest_padded, pad = util.padRightDownCorner(imageToTest, model_['stride'], model_['padValue']) imageToTest_padded = np.transpose(np.float32(imageToTest_padded[:,:,:,np.newaxis]), (3,2,0,1))/256 - 0.5 feed = Variable(T.from_numpy(imageToTest_padded)).cuda() output1,output2 = model(feed) heatmap = nn.UpsamplingBilinear2d((oriImg.shape[0], oriImg.shape[1])).cuda()(output2) paf = nn.UpsamplingBilinear2d((oriImg.shape[0], oriImg.shape[1])).cuda()(output1) print heatmap.size() print paf.size() print type(heatmap) heatmap_avg = T.transpose(T.transpose(heatmap[0],0,1),1,2).data.cpu().numpy() paf_avg = T.transpose(T.transpose(paf[0],0,1),1,2).data.cpu().numpy() all_peaks = [] peak_counter = 0 #maps = for part in range(18): map_ori = heatmap_avg[:,:,part] map = gaussian_filter(map_ori, sigma=3) map_left = np.zeros(map.shape) map_left[1:,:] = map[:-1,:] map_right = np.zeros(map.shape) map_right[:-1,:] = map[1:,:] map_up = np.zeros(map.shape) map_up[:,1:] = map[:,:-1] map_down = np.zeros(map.shape) map_down[:,:-1] = map[:,1:] peaks_binary = np.logical_and.reduce((map>=map_left, map>=map_right, map>=map_up, map>=map_down, map > param_['thre1'])) # peaks_binary = T.eq( # peaks = zip(T.nonzero(peaks_binary)[0],T.nonzero(peaks_binary)[0]) peaks = zip(np.nonzero(peaks_binary)[1], np.nonzero(peaks_binary)[0]) # note reverse peaks_with_score = [x + (map_ori[x[1],x[0]],) for x in peaks] id = range(peak_counter, peak_counter + len(peaks)) peaks_with_score_and_id = [peaks_with_score[i] + (id[i],) for i in range(len(id))] all_peaks.append(peaks_with_score_and_id) peak_counter += len(peaks) connection_all = [] special_k = [] mid_num = 10 for k in range(len(mapIdx)): score_mid = paf_avg[:,:,[x-19 for x in mapIdx[k]]] candA = all_peaks[limbSeq[k][0]-1] candB = all_peaks[limbSeq[k][1]-1] nA = len(candA) nB = len(candB) indexA, indexB = limbSeq[k] if(nA != 0 and nB != 0): connection_candidate = [] for i in range(nA): for j in range(nB): vec = np.subtract(candB[j][:2], candA[i][:2]) norm = math.sqrt(vec[0]*vec[0] + vec[1]*vec[1]) vec = np.divide(vec, norm) startend = zip(np.linspace(candA[i][0], candB[j][0], num=mid_num), \ np.linspace(candA[i][1], candB[j][1], num=mid_num)) vec_x = np.array([score_mid[int(round(startend[I][1])), int(round(startend[I][0])), 0] \ 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))]) score_midpts = np.multiply(vec_x, vec[0]) + np.multiply(vec_y, vec[1]) score_with_dist_prior = sum(score_midpts)/len(score_midpts) + min(0.5*oriImg.shape[0]/norm-1, 0) criterion1 = len(np.nonzero(score_midpts > param_['thre2'])[0]) > 0.8 * len(score_midpts) criterion2 = score_with_dist_prior > 0 if criterion1 and criterion2: connection_candidate.append([i, j, score_with_dist_prior, score_with_dist_prior+candA[i][2]+candB[j][2]]) connection_candidate = sorted(connection_candidate, key=lambda x: x[2], reverse=True) connection = np.zeros((0,5)) for c in range(len(connection_candidate)): i,j,s = connection_candidate[c][0:3] if(i not in connection[:,3] and j not in connection[:,4]): connection = np.vstack([connection, [candA[i][3], candB[j][3], s, i, j]]) if(len(connection) >= min(nA, nB)): break connection_all.append(connection) else: special_k.append(k) connection_all.append([]) # last number in each row is the total parts number of that person # the second last number in each row is the score of the overall configuration subset = -1 * np.ones((0, 20)) candidate = np.array([item for sublist in all_peaks for item in sublist]) for k in range(len(mapIdx)): if k not in special_k: partAs = connection_all[k][:,0] partBs = connection_all[k][:,1] indexA, indexB = np.array(limbSeq[k]) - 1 for i in range(len(connection_all[k])): #= 1:size(temp,1) found = 0 subset_idx = [-1, -1] for j in range(len(subset)): #1:size(subset,1): if subset[j][indexA] == partAs[i] or subset[j][indexB] == partBs[i]: subset_idx[found] = j found += 1 if found == 1: j = subset_idx[0] if(subset[j][indexB] != partBs[i]): subset[j][indexB] = partBs[i] subset[j][-1] += 1 subset[j][-2] += candidate[partBs[i].astype(int), 2] + connection_all[k][i][2] elif found == 2: # if found 2 and disjoint, merge them j1, j2 = subset_idx print "found = 2" membership = ((subset[j1]>=0).astype(int) + (subset[j2]>=0).astype(int))[:-2] if len(np.nonzero(membership == 2)[0]) == 0: #merge subset[j1][:-2] += (subset[j2][:-2] + 1) subset[j1][-2:] += subset[j2][-2:] subset[j1][-2] += connection_all[k][i][2] subset = np.delete(subset, j2, 0) else: # as like found == 1 subset[j1][indexB] = partBs[i] subset[j1][-1] += 1 subset[j1][-2] += candidate[partBs[i].astype(int), 2] + connection_all[k][i][2] # if find no partA in the subset, create a new subset elif not found and k < 17: row = -1 * np.ones(20) row[indexA] = partAs[i] row[indexB] = partBs[i] row[-1] = 2 row[-2] = sum(candidate[connection_all[k][i,:2].astype(int), 2]) + connection_all[k][i][2] subset = np.vstack([subset, row]) # delete some rows of subset which has few parts occur deleteIdx = []; for i in range(len(subset)): if subset[i][-1] < 4 or subset[i][-2]/subset[i][-1] < 0.4: deleteIdx.append(i) subset = np.delete(subset, deleteIdx, axis=0) # canvas = cv2.imread(test_image) # B,G,R order for i in range(18): for j in range(len(all_peaks[i])): cv2.circle(canvas, all_peaks[i][j][0:2], 4, colors[i], thickness=-1) stickwidth = 4 for i in range(17): for n in range(len(subset)): index = subset[n][np.array(limbSeq[i])-1] if -1 in index: continue cur_canvas = canvas.copy() Y = candidate[index.astype(int), 0] X = candidate[index.astype(int), 1] mX = np.mean(X) mY = np.mean(Y) length = ((X[0] - X[1]) ** 2 + (Y[0] - Y[1]) ** 2) ** 0.5 angle = math.degrees(math.atan2(X[0] - X[1], Y[0] - Y[1])) polygon = cv2.ellipse2Poly((int(mY),int(mX)), (int(length/2), stickwidth), int(angle), 0, 360, 1) cv2.fillConvexPoly(cur_canvas, polygon, colors[i]) canvas = cv2.addWeighted(canvas, 0.4, cur_canvas, 0.6, 0) return canvas
def handle_one(oriImg, dont_draw=False, dont_resize=False): oriImg = np.squeeze(oriImg) oriImg = np.copy(oriImg) canvas = np.copy(oriImg) scale = model_['boxsize'] / float(oriImg.shape[0]) h = int(oriImg.shape[0] * scale) w = int(oriImg.shape[1] * scale) pad_h = 0 if (h % model_['stride'] == 0) else model_['stride'] - (h % model_['stride']) pad_w = 0 if (w % model_['stride'] == 0) else model_['stride'] - (w % model_['stride']) new_h = h + pad_h new_w = w + pad_w if dont_resize: imageToTest = oriImg else: imageToTest = cv2.resize( oriImg, (int(scale * oriImg.shape[0]), int(scale * oriImg.shape[1])), interpolation=cv2.INTER_CUBIC) imageToTest_padded, pad = util.padRightDownCorner(imageToTest, model_['stride'], model_['padValue']) imageToTest_padded = np.transpose( np.float32(imageToTest_padded[:, :, :, np.newaxis]), (3, 2, 0, 1)) / 255.0 - 0.5 feed = Variable(T.from_numpy(imageToTest_padded), volatile=True).cuda() p = time.time() output1, output2 = model(feed) heatmap = nn.UpsamplingBilinear2d( (oriImg.shape[0], oriImg.shape[1])).cuda()(output2) paf = nn.UpsamplingBilinear2d( (oriImg.shape[0], oriImg.shape[1])).cuda()(output1) pool_t = time.time() map_ori = heatmap[0][:N_JOINTS] map_max = max_erode( F.avg_pool2d(map_ori, 3, stride=1, padding=1) ) # torch.eq(blurred_avg_tensor, max_tensor).float() * blurred_avg_tensor peaks_binary = map_max > param_['thre1'] all_peak_idxs = torch.nonzero(peaks_binary.data) if all_peak_idxs.size() == (): return None all_peak_idxs = all_peak_idxs.cpu().numpy() nonzero_vals = map_ori[peaks_binary].data.cpu().numpy() paf_avg = paf[0].data.cpu().numpy() return post_process(oriImg, canvas, paf_avg, all_peak_idxs, nonzero_vals, dont_draw)
def process_image(oriImg, model, model_params, jjac_info): # for visualize t0 = time.time() canvas = np.copy(oriImg) #imageToTest = Variable(T.transpose(T.transpose(T.unsqueeze(torch.from_numpy(oriImg).float(), 0), 2, 3), 1, 2), # volatile=True).cuda() #print oriImg.shape tic = time.time() scale = model_params['model_']['boxsize'] / float(oriImg.shape[0]) #print scale h = int(oriImg.shape[0] * scale) w = int(oriImg.shape[1] * scale) pad_h = 0 if (h % model_params['model_']['stride'] == 0) else model_params['model_']['stride'] - ( h % model_params['model_']['stride']) pad_w = 0 if (w % model_params['model_']['stride'] == 0) else model_params['model_']['stride'] - ( w % model_params['model_']['stride']) new_h = h + pad_h new_w = w + pad_w #print 'scaled width and height ({}, {})'.format(h, w) imageToTest = cv2.resize(oriImg, (0, 0), fx=scale, fy=scale, interpolation=cv2.INTER_CUBIC) imageToTest_padded, pad = util.padRightDownCorner( imageToTest, model_params['model_']['stride'], model_params['model_']['padValue']) imageToTest_padded = np.transpose( np.float32(imageToTest_padded[:, :, :, np.newaxis]), (3, 2, 0, 1)) / 256 - 0.5 feed = Variable(T.from_numpy(imageToTest_padded)).cuda() output1, output2 = model(feed) heatmap = nn.UpsamplingBilinear2d( (oriImg.shape[0], oriImg.shape[1])).cuda()(output2) paf = nn.UpsamplingBilinear2d( (oriImg.shape[0], oriImg.shape[1])).cuda()(output1) toc = time.time() model_running_time = toc - tic #print heatmap.size() # (360, 640, 3) #print paf.size() #print type(heatmap) tic = time.time() heatmap_avg = T.transpose(T.transpose(heatmap[0], 0, 1), 1, 2).data.cpu().numpy() #paf_avg = T.transpose(T.transpose(paf[0], 0, 1), 1, 2).data.cpu().numpy() all_peaks = [] peak_counter = 0 # 13-17 are head # 10, 11, 12, 13 are legs # hand_parts = [5, 6, 7, 8, 15, 16] # 4 is right hand # todo is it actually left elbow below because inverse? confirm # 5 was left elbow # 6 was left shoulder # 7 is left hand. Right hand only? # 15 is head. right part of head body_part_index_to_name = { '4': 'Right Hand', '5': 'Left Elbow', '6': 'Left Shoulder', '7': 'Left Hand', '15': 'Left Eye', '14': '1', '16': '2', '17': '3' } hand_parts = [4, 7, 15, 16, 17] # hand_parts = list(range(18)) # for part in range(18): for part in hand_parts: map_ori = heatmap_avg[:, :, part] map = gaussian_filter(map_ori, sigma=3) map_left = np.zeros(map.shape) map_left[1:, :] = map[:-1, :] map_right = np.zeros(map.shape) map_right[:-1, :] = map[1:, :] map_up = np.zeros(map.shape) map_up[:, 1:] = map[:, :-1] map_down = np.zeros(map.shape) map_down[:, :-1] = map[:, 1:] peaks_binary = np.logical_and.reduce( (map >= map_left, map >= map_right, map >= map_up, map >= map_down, map > model_params['param_']['thre1'])) # peaks_binary = T.eq( # peaks = zip(T.nonzero(peaks_binary)[0],T.nonzero(peaks_binary)[0]) peaks = zip(np.nonzero(peaks_binary)[1], np.nonzero(peaks_binary)[0]) # note reverse peaks_with_score = [x + (map_ori[x[1], x[0]], ) for x in peaks] id = range(peak_counter, peak_counter + len(peaks)) peaks_with_score_and_id = [ peaks_with_score[i] + (id[i], ) for i in range(len(id)) ] all_peaks.append(peaks_with_score_and_id) # print peaks_with_score_and_id peak_counter += len(peaks) #print 'heat map peak stuff time is %.5f' % (time.time() - tic) # connection_all = [] # special_k = [] # mid_num = 10 # for k in range(len(mapIdx)): # score_mid = paf_avg[:, :, [x - 19 for x in mapIdx[k]]] # candA = all_peaks[limbSeq[k][0] - 1] # candB = all_peaks[limbSeq[k][1] - 1] # nA = len(candA) # nB = len(candB) # indexA, indexB = limbSeq[k] # if (nA != 0 and nB != 0): # connection_candidate = [] # for i in range(nA): # for j in range(nB): # vec = np.subtract(candB[j][:2], candA[i][:2]) # norm = math.sqrt(vec[0] * vec[0] + vec[1] * vec[1]) # vec = np.divide(vec, norm) # # startend = zip(np.linspace(candA[i][0], candB[j][0], num=mid_num), \ # np.linspace(candA[i][1], candB[j][1], num=mid_num)) # # vec_x = np.array([score_mid[int(round(startend[I][1])), int(round(startend[I][0])), 0] \ # 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))]) # # score_midpts = np.multiply(vec_x, vec[0]) + np.multiply(vec_y, vec[1]) # score_with_dist_prior = sum(score_midpts) / len(score_midpts) + min( # 0.5 * oriImg.shape[0] / norm - 1, 0) # criterion1 = len(np.nonzero(score_midpts > param_['thre2'])[0]) > 0.8 * len(score_midpts) # criterion2 = score_with_dist_prior > 0 # if criterion1 and criterion2: # connection_candidate.append( # [i, j, score_with_dist_prior, score_with_dist_prior + candA[i][2] + candB[j][2]]) # # connection_candidate = sorted(connection_candidate, key=lambda x: x[2], reverse=True) # connection = np.zeros((0, 5)) # for c in range(len(connection_candidate)): # i, j, s = connection_candidate[c][0:3] # if (i not in connection[:, 3] and j not in connection[:, 4]): # connection = np.vstack([connection, [candA[i][3], candB[j][3], s, i, j]]) # if (len(connection) >= min(nA, nB)): # break # # connection_all.append(connection) # else: # special_k.append(k) # connection_all.append([]) # last number in each row is the total parts number of that person # the second last number in each row is the score of the overall configuration # subset = -1 * np.ones((0, 20)) # candidate = np.array([item for sublist in all_peaks for item in sublist]) # # for k in range(len(mapIdx)): # if k not in special_k: # partAs = connection_all[k][:, 0] # partBs = connection_all[k][:, 1] # indexA, indexB = np.array(limbSeq[k]) - 1 # # for i in range(len(connection_all[k])): # = 1:size(temp,1) # found = 0 # subset_idx = [-1, -1] # for j in range(len(subset)): # 1:size(subset,1): # if subset[j][indexA] == partAs[i] or subset[j][indexB] == partBs[i]: # subset_idx[found] = j # found += 1 # # if found == 1: # j = subset_idx[0] # if (subset[j][indexB] != partBs[i]): # subset[j][indexB] = partBs[i] # subset[j][-1] += 1 # subset[j][-2] += candidate[partBs[i].astype(int), 2] + connection_all[k][i][2] # elif found == 2: # if found 2 and disjoint, merge them # j1, j2 = subset_idx # print "found = 2" # membership = ((subset[j1] >= 0).astype(int) + (subset[j2] >= 0).astype(int))[:-2] # if len(np.nonzero(membership == 2)[0]) == 0: # merge # subset[j1][:-2] += (subset[j2][:-2] + 1) # subset[j1][-2:] += subset[j2][-2:] # subset[j1][-2] += connection_all[k][i][2] # subset = np.delete(subset, j2, 0) # else: # as like found == 1 # subset[j1][indexB] = partBs[i] # subset[j1][-1] += 1 # subset[j1][-2] += candidate[partBs[i].astype(int), 2] + connection_all[k][i][2] # # # if find no partA in the subset, create a new subset # elif not found and k < 17: # row = -1 * np.ones(20) # row[indexA] = partAs[i] # row[indexB] = partBs[i] # row[-1] = 2 # row[-2] = sum(candidate[connection_all[k][i, :2].astype(int), 2]) + connection_all[k][i][2] # subset = np.vstack([subset, row]) # # # delete some rows of subset which has few parts occur # deleteIdx = []; # for i in range(len(subset)): # if subset[i][-1] < 4 or subset[i][-2] / subset[i][-1] < 0.4: # deleteIdx.append(i) # subset = np.delete(subset, deleteIdx, axis=0) # canvas = cv2.imread(test_image) # B,G,R order found_hand = False found_head = False found_2_hands = False tic = time.time() # for i in range(18): for i in range(len(hand_parts)): for j in range(len(all_peaks[i])): #cv2.circle(canvas, all_peaks[i][j][0:2], 4, colors[i], thickness=-1) # Right hand is first in loop. so if it fails we have backup if body_part_index_to_name[str(hand_parts[i])] == 'Right Hand': # # BGR order. So blue is below # cv2.circle(canvas, all_peaks[i][j][0:2], 4, (255, 0, 0), thickness=-1) #print 'Hand position:', all_peaks[i][j][0:2] found_hand = True hand_position = all_peaks[i][j][0:2] elif body_part_index_to_name[str(hand_parts[i])] == 'Left Hand': # cv2.circle(canvas, all_peaks[i][j][0:2], 4, (0, 255, 0), thickness=-1) if not found_hand: print 'Did not find Right hand but found left hand!' found_hand = True hand_position = all_peaks[i][j][0:2] else: print 'Found two hands' found_2_hands = True second_hand_position = all_peaks[i][j][0:2] #hand_position = all_peaks[i][j][0:2] elif body_part_index_to_name[str(hand_parts[i])] == 'Left Eye': # BGR order. So red is below # cv2.circle(canvas, all_peaks[i][j][0:2], 4, (0, 0, 255), thickness=-1) #print 'Head position:', all_peaks[i][j][0:2] found_head = True head_position = all_peaks[i][j][0:2] jjac_info['last_x_head_pos'].append(head_position[1]) if len(jjac_info['last_x_head_pos']) > 10: jjac_info['last_x_head_pos'].pop() biggest_diff = max(jjac_info['last_x_head_pos']) - min( jjac_info['last_x_head_pos']) if biggest_diff > jjac_info['biggest_diff']: jjac_info['biggest_diff'] = biggest_diff # espeak_command = 'Largest y range from last_x_head_pos: {}'.format(biggest_diff) espeak_command = 'Largest range from last positions: {}'.format( biggest_diff) print espeak_command # os.system(espeak_command) # jjac_info['head_y_range'] elif body_part_index_to_name[str(hand_parts[i])] == '1': cv2.circle(canvas, all_peaks[i][j][0:2], 4, (0, 0, 255), thickness=-1) elif body_part_index_to_name[str(hand_parts[i])] == '2': cv2.circle(canvas, all_peaks[i][j][0:2], 4, (0, 255, 255), thickness=-1) elif body_part_index_to_name[str(hand_parts[i])] == '3': cv2.circle(canvas, all_peaks[i][j][0:2], 4, (255, 255, 255), thickness=-1) else: # cv2.circle(canvas, all_peaks[i][j][0:2], 4, colors[i], thickness=-1) cv2.circle(canvas, all_peaks[i][j][0:2], 4, (128, 128, 128), thickness=-1) #global how_many_times_hands_went_over_head, hands_over_head if found_hand and found_head: # both hands over head or 1 hand over head if (found_2_hands and hand_position[1] < head_position[1] and second_hand_position[1] < head_position[1] ) or hand_position[1] < head_position[1]: print 'Hand is higher than head {} < {}'.format( hand_position[1], head_position[1]) # if first time hand over head, then increase jumping jack count if not jjac_info['hands_over_head']: jjac_info['hands_over_head'] = True jjac_info['num_jumping_jacks'] += 1 print 'Number of jumping jacks:', jjac_info[ 'num_jumping_jacks'] # speak speech command example # espeak '1 Jumping Jack' espeak_command = "espeak {}".format( '\'{} Jumping jack{}\''.format( jjac_info['num_jumping_jacks'], 's' if jjac_info['num_jumping_jacks'] > 1 else '')) # os.system(espeak_command) # slows it down? else: jjac_info['hands_over_head'] = False print 'hand is lower than head {} > {}'.format( hand_position[1], head_position[1]) #print 'Drawing circles time is %.5f' % (time.time() - tic) cv2.putText( canvas, "No. Jumping Jacks: {} ".format(jjac_info['num_jumping_jacks']), (0, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.6, 255) cv2.putText( canvas, "Hands over head: {}".format( 'Yes' if jjac_info['hands_over_head'] else 'No'), (0, 45), cv2.FONT_HERSHEY_SIMPLEX, 0.6, 255) # stickwidth = 4 # for i in range(17): # for n in range(len(subset)): # index = subset[n][np.array(limbSeq[i]) - 1] # if -1 in index: # continue # cur_canvas = canvas.copy() # Y = candidate[index.astype(int), 0] # X = candidate[index.astype(int), 1] # mX = np.mean(X) # mY = np.mean(Y) # length = ((X[0] - X[1]) ** 2 + (Y[0] - Y[1]) ** 2) ** 0.5 # angle = math.degrees(math.atan2(X[0] - X[1], Y[0] - Y[1])) # polygon = cv2.ellipse2Poly((int(mY), int(mX)), (int(length / 2), stickwidth), int(angle), 0, 360, 1) # cv2.fillConvexPoly(cur_canvas, polygon, colors[i]) # canvas = cv2.addWeighted(canvas, 0.4, cur_canvas, 0.6, 0) print 'cv and print: %.5f, Model time: %.5f, Full processing time is %.5f.' % ( time.time() - tic, model_running_time, time.time() - t0) return canvas