def main(quantMat, path): #quantMat = np.full([8,8], 1) #Read Image orgImage = imt.ImageTransform() orgRGB = orgImage.readImage(path) #Reduce resolution imgPIL = orgImage.rgb2img(orgRGB) halfImg = imt.ImageTransform.imresize(imgPIL, np.shape(orgRGB), 2) quartImg = imt.ImageTransform.imresize(imgPIL, np.shape(orgRGB), 4) '''Hierachical Encoding''' #Encode quartImg F_info_quart, orgShape_quart = coding.encode(np.array(quartImg), quantMat) #print orgShape_quart #Decode QuartImg recRGB_quart, recImg2show_quart = coding.decode(F_info_quart, quantMat, orgShape_quart) #recImg2show_quart.show() #Encode half diff Image hierVar = hr.Hier(quantMat) halfdiffF_info, halfdifforgShape, hafldiffrecRGB, halfdiffrecImg2show = hierVar.hierEncode( np.array(quartImg), np.array(halfImg)) #Decode half recRGB_halfdiff, recImg2show_halfdiff = coding.decode( halfdiffF_info, quantMat, halfdifforgShape) fRecoverHalf, fRecoverHalfImg = hierVar.hireDecode(np.array(quartImg), recRGB_halfdiff) #fRecoverHalfImg.show() #fRecover, fRecoverImg = hierVar.hireDecode(fRecoverHalf, diffF_info, difforgShape) #Encode whole diff Image #imgPIL.show() diffF_info, difforgShape, diffrecRGB, diffrecImg2show = hierVar.hierEncode( np.array(fRecoverHalfImg), np.array(imgPIL)) #Decode whole image recRGB_diff, recImg2show_diff = coding.decode(diffF_info, quantMat, difforgShape) fRecover, fRecoverImg = hierVar.hireDecode(np.array(fRecoverHalfImg), recRGB_diff) #fRecoverHalfImg.show() #fRecoverImg.show() return [ imgPIL, fRecoverImg, halfdiffrecImg2show, diffrecImg2show, fRecoverHalfImg, recImg2show_quart ]
def detect_markers(img): width, height, _ = img.shape gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray, 10, 100) contours, hierarchy = cv2.findContours(edges.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)[-2:] # We only keep the long enough contours min_contour_length = min(width, height) / 50 contours = [ contour for contour in contours if len(contour) > min_contour_length ] warped_size = 49 canonical_marker_coords = array( ((0, 0), (warped_size - 1, 0), (warped_size - 1, warped_size - 1), (0, warped_size - 1)), dtype='float32') markers_list = [] transform_list = [] for contour in contours: approx_curve = cv2.approxPolyDP(contour, len(contour) * 0.01, True) if not (len(approx_curve) == 4 and cv2.isContourConvex(approx_curve)): continue sorted_curve = array(cv2.convexHull(approx_curve, clockwise=False), dtype='float32') persp_transf = cv2.getPerspectiveTransform(sorted_curve, canonical_marker_coords) transform_list.append(persp_transf) warped_img = cv2.warpPerspective(img, persp_transf, (warped_size, warped_size)) warped_gray = cv2.cvtColor(warped_img, cv2.COLOR_BGR2GRAY) _, warped_bin = cv2.threshold(warped_gray, 127, 255, cv2.THRESH_BINARY) marker = warped_bin.reshape([ MARKER_SIZE, warped_size / MARKER_SIZE, MARKER_SIZE, warped_size / MARKER_SIZE ]) marker = marker.mean(axis=3).mean(axis=1) marker[marker < 127] = 0 marker[marker >= 127] = 1 try: marker = validate_and_turn(marker) hamming_code = extract_hamming_code(marker) marker_id = int(decode(hamming_code), 2) markers_list.append( HammingMarker(id=marker_id, contours=approx_curve)) except ValueError: continue return markers_list
def main(quantMat, path): #quantMat = np.full([8,8], 1) #Read Image orgImage = imt.ImageTransform() orgRGB = orgImage.readImage(path) #Reduce resolution imgPIL = orgImage.rgb2img(orgRGB) halfImg = imt.ImageTransform.imresize(imgPIL, np.shape(orgRGB), 2) quartImg = imt.ImageTransform.imresize(imgPIL, np.shape(orgRGB), 4) '''Hierachical Encoding''' #Encode quartImg F_info_quart, orgShape_quart = coding.encode(np.array(quartImg), quantMat) #print orgShape_quart #Decode QuartImg recRGB_quart, recImg2show_quart = coding.decode(F_info_quart, quantMat, orgShape_quart) #recImg2show_quart.show() #Encode half diff Image hierVar = hr.Hier(quantMat) halfdiffF_info, halfdifforgShape, hafldiffrecRGB, halfdiffrecImg2show = hierVar.hierEncode(np.array(quartImg), np.array(halfImg)) #Decode half recRGB_halfdiff, recImg2show_halfdiff = coding.decode(halfdiffF_info, quantMat, halfdifforgShape) fRecoverHalf, fRecoverHalfImg = hierVar.hireDecode(np.array(quartImg), recRGB_halfdiff) #fRecoverHalfImg.show() #fRecover, fRecoverImg = hierVar.hireDecode(fRecoverHalf, diffF_info, difforgShape) #Encode whole diff Image #imgPIL.show() diffF_info, difforgShape, diffrecRGB, diffrecImg2show = hierVar.hierEncode(np.array(fRecoverHalfImg), np.array(imgPIL)) #Decode whole image recRGB_diff, recImg2show_diff = coding.decode(diffF_info, quantMat, difforgShape) fRecover, fRecoverImg = hierVar.hireDecode(np.array(fRecoverHalfImg), recRGB_diff) #fRecoverHalfImg.show() #fRecoverImg.show() return [imgPIL, fRecoverImg, halfdiffrecImg2show ,diffrecImg2show, fRecoverHalfImg ,recImg2show_quart]
def hierEncode(self, f_half, f): highResShape = np.shape(f) E_f_half = imt.ImageTransform.imresize(self.IMT.rgb2img(f_half), highResShape, 1) E_f_half_RGB = np.array(E_f_half) diffRGB = f.astype(int) - E_f_half_RGB.astype(int) diffRGB[diffRGB<0] = 1 diffRGB[diffRGB>255] = 255 diffRGB = diffRGB.astype(np.uint8) F_info, orgShape = coding.encode(np.array(diffRGB), self.quantMat) recRGB, recImg2show = coding.decode(F_info, self.quantMat, orgShape) return F_info, orgShape, recRGB, recImg2show
def hierEncode(self, f_half, f): highResShape = np.shape(f) E_f_half = imt.ImageTransform.imresize(self.IMT.rgb2img(f_half), highResShape, 1) E_f_half_RGB = np.array(E_f_half) diffRGB = f.astype(int) - E_f_half_RGB.astype(int) diffRGB[diffRGB < 0] = 1 diffRGB[diffRGB > 255] = 255 diffRGB = diffRGB.astype(np.uint8) F_info, orgShape = coding.encode(np.array(diffRGB), self.quantMat) recRGB, recImg2show = coding.decode(F_info, self.quantMat, orgShape) return F_info, orgShape, recRGB, recImg2show
def detect_markers(img): width, height, _ = img.shape gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray, 10, 100) contours, hierarchy = cv2.findContours(edges.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) # We only keep the long enough contours min_contour_length = min(width, height) / 50 contours = [contour for contour in contours if len(contour) > min_contour_length] warped_size = 49 canonical_marker_coords = array(((0, 0), (warped_size - 1, 0), (warped_size - 1, warped_size - 1), (0, warped_size - 1)), dtype='float32') markers_list = [] for contour in contours: approx_curve = cv2.approxPolyDP(contour, len(contour) * 0.01, True) if not (len(approx_curve) == 4 and cv2.isContourConvex(approx_curve)): continue sorted_curve = array(cv2.convexHull(approx_curve, clockwise=False), dtype='float32') persp_transf = cv2.getPerspectiveTransform(sorted_curve, canonical_marker_coords) warped_img = cv2.warpPerspective(img, persp_transf, (warped_size, warped_size)) warped_gray = cv2.cvtColor(warped_img, cv2.COLOR_BGR2GRAY) _, warped_bin = cv2.threshold(warped_gray, 127, 255, cv2.THRESH_BINARY) marker = warped_bin.reshape( [MARKER_SIZE, warped_size / MARKER_SIZE, MARKER_SIZE, warped_size / MARKER_SIZE] ) marker = marker.mean(axis=3).mean(axis=1) marker[marker < 127] = 0 marker[marker >= 127] = 1 try: marker = validate_and_turn(marker) hamming_code = extract_hamming_code(marker) marker_id = int(decode(hamming_code), 2) markers_list.append(HammingMarker(id=marker_id, contours=approx_curve)) except ValueError: continue return markers_list
def evaluate(net, loader, thres=0.5, max_aabbs=None): batch_imgs = [] batch_aabbs = [] loss = 0 for i in range(len(loader)): # get batch loader_item = loader[i] with torch.no_grad(): y = net(loader_item.batch_imgs, apply_softmax=True) y_np = y.to('cpu').numpy() if loader_item.batch_gt_maps is not None: loss += compute_loss( y, loader_item.batch_gt_maps).to('cpu').numpy() scale_up = 1 / compute_scale_down(WordDetectorNet.input_size, WordDetectorNet.output_size) metrics = BinaryClassificationMetrics(0, 0, 0) for i in range(len(y_np)): img_np = loader_item.batch_imgs[i, 0].to('cpu').numpy() pred_map = y_np[i] aabbs = decode(pred_map, comp_fg=fg_by_cc(thres, max_aabbs), f=scale_up) h, w = img_np.shape aabbs = [aabb.clip(AABB(0, w - 1, 0, h - 1)) for aabb in aabbs] # bounding box must be inside img clustered_aabbs = cluster_aabbs(aabbs) if loader_item.batch_aabbs is not None: curr_metrics = binary_classification_metrics( loader_item.batch_aabbs[i], clustered_aabbs) metrics = metrics.accumulate(curr_metrics) batch_imgs.append(img_np) batch_aabbs.append(clustered_aabbs) return EvaluateRes(batch_imgs, batch_aabbs, loss / len(loader), metrics)
class DatasetIAMSplit: """wrapper which provides a dataset interface for a split of the original dataset""" def __init__(self, dataset, start_idx, end_idx): assert start_idx >= 0 and end_idx <= len(dataset) self.dataset = dataset self.start_idx = start_idx self.end_idx = end_idx def __getitem__(self, idx): return self.dataset[self.start_idx + idx] def __len__(self): return self.end_idx - self.start_idx if __name__ == '__main__': from visualization import visualize from coding import encode, decode import matplotlib.pyplot as plt dataset = DatasetIAM(Path('../data'), (350, 350), (350, 350), caching=False) img, gt = dataset[0] gt_map = encode(img.shape, gt) gt = decode(gt_map) plt.imshow(visualize(img / 255 - 0.5, gt)) plt.show()
def check(s): c = encode(s) s2 = decode(c) assert '\n' not in c[:-1] assert c[-1] == '\n' assert s == s2
def on_decode_button_clicked(self): method = self.method_chooser.get() code = self.code.get('1.0', 'end')[:-1] text = coding.decode(method, code) self.text.delete('1.0', 'end') self.text.insert('1.0', text)
def load_line(line): return pickle.loads(decode(line))