def df2labelme(symbolDict, dir_image): try: symbolDict.rename(columns={ 'LabelName': 'label', 'ImageID': 'imagePath', 'height': 'imageHeight', 'width': 'imageWidth' }, inplace=True) # Get image path image_path = general_utils.find_file(dir_image, symbolDict['imagePath'][0]) assert image_path is not None encoded = base64.b64encode(open(image_path, "rb").read()) symbolDict.loc[:, 'imageData'] = encoded # File without annotations if 'XMin' in symbolDict.columns and 'YMin' in symbolDict.columns and 'XMax' in symbolDict.columns and 'YMax' in symbolDict.columns: symbolDict['min'] = symbolDict[['XMin', 'YMin']].values.tolist() symbolDict['max'] = symbolDict[['XMax', 'YMax']].values.tolist() symbolDict['points'] = symbolDict[['min', 'max']].values.tolist() symbolDict['shape_type'] = 'rectangle' symbolDict['group_id'] = None symbolDict = symbolDict.groupby( ['imagePath', 'imageWidth', 'imageHeight', 'imageData']) symbolDict = (symbolDict.apply(lambda x: x[[ 'label', 'points', 'shape_type', 'group_id' ]].to_dict('records')).reset_index().rename(columns={0: 'shapes'})) converted_json = json.loads(symbolDict.to_json(orient='records'))[0] except Exception as e: converted_json = {} print('error in labelme conversion:{}'.format(e)) return converted_json
def yolo2bb(annotations_path, images_dir, file_obj_names, bb_type=BBType.GROUND_TRUTH): ret = [] if not os.path.isfile(file_obj_names): print(f'Warning: File with names of classes {file_obj_names} not found.') return ret # Load classes all_classes = [] with open(file_obj_names, "r") as f: all_classes = [line.replace('\n', '') for line in f] # Get annotation files in the path annotation_files = _get_annotation_files(annotations_path) # Loop through each file for file_path in annotation_files: if not validations.is_yolo_format(file_path, bb_types=[bb_type]): continue img_name = os.path.basename(file_path) img_file = general_utils.find_file(images_dir, img_name, match_extension=False) img_resolution = general_utils.get_image_resolution(img_file) if img_resolution is None: print(f'Warning: It was not possible to find the resolution of image {img_name}') continue img_size = (img_resolution['width'], img_resolution['height']) # Loop through lines with open(file_path, "r") as f: for line in f: splitted_line = line.split(' ') class_id = splitted_line[0] if not general_utils.is_str_int(class_id): print( f'Warning: Class id represented in the {file_path} is not a valid integer.') return [] class_id = int(class_id) if class_id not in range(len(all_classes)): print( f'Warning: Class id represented in the {file_path} is not in the range of classes specified in the file {file_obj_names}.' ) return [] if bb_type == BBType.GROUND_TRUTH: confidence = None x1 = float(splitted_line[1]) y1 = float(splitted_line[2]) w = float(splitted_line[3]) h = float(splitted_line[4]) elif bb_type == BBType.DETECTED: confidence = float(splitted_line[1]) x1 = float(splitted_line[2]) y1 = float(splitted_line[3]) w = float(splitted_line[4]) h = float(splitted_line[5]) bb = BoundingBox(image_name=general_utils.get_file_name_only(img_file), class_id=all_classes[class_id], coordinates=(x1, y1, w, h), img_size=img_size, confidence=confidence, type_coordinates=CoordinatesType.RELATIVE, bb_type=bb_type, format=BBFormat.XYWH) ret.append(bb) return ret
def openimage2bb(annotations_path, images_dir, bb_type=BBType.GROUND_TRUTH): ret = [] # Get annotation files in the path annotation_files = _get_annotation_files(annotations_path) # Loop through each file for file_path in annotation_files: if not validations.is_openimage_format(file_path): continue images_shapes = {} # Open csv csv = pd.read_csv(file_path, sep=',') for i, row in csv.iterrows(): # Get image resolution if it was not loaded yet if row['ImageID'] not in images_shapes: img_name = row['ImageID'] image_file = general_utils.find_file(images_dir, img_name) images_shapes[image_file] = general_utils.get_image_resolution( image_file) if images_shapes[image_file] is None: print( f'Warning: It was not possible to find the resolution of image {img_name}' ) continue # Three is no bounding box for the given image if pd.isna(row['LabelName']) or pd.isna(row['XMin']) or pd.isna( row['XMax']) or pd.isna(row['YMin']) or pd.isna( row['YMax']): continue # images_shapes[image_file] = general_utils.get_image_resolution(image_file) img_size = (images_shapes[image_file]['width'], images_shapes[image_file]['height']) x1, x2, y1, y2 = (row['XMin'], row['XMax'], row['YMin'], row['YMax']) x1 = x1.replace(',', '.') if isinstance(x1, str) else x1 x2 = x2.replace(',', '.') if isinstance(x2, str) else x2 y1 = y1.replace(',', '.') if isinstance(y1, str) else y1 y2 = y2.replace(',', '.') if isinstance(y2, str) else y2 x1, x2, y1, y2 = float(x1), float(x2), float(y1), float(y2) confidence = None if pd.isna(row['Confidence']) else float( row['Confidence']) if bb_type == BBType.DETECTED and confidence is None: print( f'Warning: Confidence value found in the CSV file for the image {img_name}' ) return ret bb = BoundingBox(image_name=general_utils.get_file_name_only( row['ImageID']), class_id=row['LabelName'], coordinates=(x1, y1, x2, y2), img_size=img_size, confidence=confidence, type_coordinates=CoordinatesType.RELATIVE, bb_type=bb_type, format=BBFormat.XYX2Y2) ret.append(bb) return ret
def text2bb(annotations_path, bb_type=BBType.GROUND_TRUTH, bb_format=BBFormat.XYWH, type_coordinates=CoordinatesType.ABSOLUTE, img_dir=None): ret = [] # Get annotation files in the path annotation_files = _get_annotation_files(annotations_path) for file_path in annotation_files: if type_coordinates == CoordinatesType.ABSOLUTE: if bb_type == BBType.GROUND_TRUTH and not validations.is_absolute_text_format( file_path, num_blocks=[5], blocks_abs_values=[4]): continue if bb_type == BBType.DETECTED and not validations.is_absolute_text_format( file_path, num_blocks=[6], blocks_abs_values=[4]): continue elif type_coordinates == CoordinatesType.RELATIVE: if bb_type == BBType.GROUND_TRUTH and not validations.is_relative_text_format( file_path, num_blocks=[5], blocks_rel_values=[4]): continue if bb_type == BBType.DETECTED and not validations.is_relative_text_format( file_path, num_blocks=[6], blocks_rel_values=[4]): continue # Loop through lines with open(file_path, "r") as f: img_filename = os.path.basename(file_path) img_filename = os.path.splitext(img_filename)[0] img_size = None # If coordinates are relative, image size must be obtained in the img_dir if type_coordinates == CoordinatesType.RELATIVE: img_path = general_utils.find_file(img_dir, img_filename, match_extension=False) if img_path is None or os.path.isfile(img_path) is False: print( f'Warning: Image not found in the directory {img_path}. It is required to get its dimensions' ) return ret resolution = general_utils.get_image_resolution(img_path) img_size = (resolution['width'], resolution['height']) for line in f: if line.replace(' ', '') == '\n': continue splitted_line = line.split(' ') class_id = splitted_line[0] if bb_type == BBType.GROUND_TRUTH: confidence = None x1 = float(splitted_line[1]) y1 = float(splitted_line[2]) w = float(splitted_line[3]) h = float(splitted_line[4]) elif bb_type == BBType.DETECTED: confidence = float(splitted_line[1]) x1 = float(splitted_line[2]) y1 = float(splitted_line[3]) w = float(splitted_line[4]) h = float(splitted_line[5]) bb = BoundingBox(image_name=img_filename, class_id=class_id, coordinates=(x1, y1, w, h), img_size=img_size, confidence=confidence, type_coordinates=type_coordinates, bb_type=bb_type, format=bb_format) # If the format is correct, x,y,w,h,x2,y2 must be positive x, y, w, h = bb.get_absolute_bounding_box(format=BBFormat.XYWH) _, _, x2, y2 = bb.get_absolute_bounding_box( format=BBFormat.XYX2Y2) if x < 0 or y < 0 or w < 0 or h < 0 or x2 < 0 or y2 < 0: continue ret.append(bb) return ret
cv2.rectangle( image, (r_Xin, r_Yin - thickness), (r_Xin + tw + thickness * 3, r_Yin + th + int(12.5 * fontScale)), (b, g, r), -1) cv2.putText(image, label, (xin_bb, yin_bb), font, fontScale, (0, 0, 0), fontThickness, cv2.LINE_AA) return image # Drawing bb into the images green_color = [62, 235, 59] red_color = [255, 0, 0] for img_file in general_utils.get_files_recursively(dir_imgs): # Get corresponding GT bounding boxes gt_annotation_file = general_utils.find_file(dir_gts, os.path.basename(img_file), match_extension=False) if gt_annotation_file is None: continue gt_bbs = converter.vocpascal2bb(gt_annotation_file) # Get corresponding detections bounding boxes det_annotation_file = general_utils.find_file(dir_dets, os.path.basename(img_file), match_extension=False) if det_annotation_file is None: det_bbs = [] else: det_bbs = converter.text2bb(det_annotation_file, bb_type=BBType.DETECTED, bb_format=BBFormat.XYWH, type_coordinates=CoordinatesType.ABSOLUTE,