image_height = int(config_parser.get('training', 'image_height')) # Load images for training. logger = Logger() logger.log(Logger.INFO, "Loading images to train SVM classifier.") positive_images = Files(path_pre_processed_positive) negative_images = Files(path_pre_processed_negative) samples = [] responses = [] for file_path in positive_images.paths: # Load image. image = Image(file_path) # Convert and equalize image. image.convert_to_gray() # Add image for training. samples.append(image) responses.append(1) for file_path in negative_images.paths: # Load image. image = Image(file_path) image.convert_to_gray() # Add negative images for training. for i in range(1): x = int(np.random.random() * (image.width - image_width - 1)) y = int(np.random.random() * (image.height - image_height - 1)) negative = image.crop(Point(x, y),
character_validator = CharacterValidator() number_labels = [] number_images = [] letter_labels = [] letter_images = [] for index in range(len(positive_images.paths)): file_path = positive_images.paths[index] # Load image and configuration data. image_original = Image(file_path) config_data = ConfigData(Quadrilaterals(), file_path) config_data.read_data() # Convert and equalize image. image_original.convert_to_gray() for quadrilateral in config_data.quadrilaterals.data: # Crop image using configuration data. image = crop_image(image_original, quadrilateral, int(image_width), int(image_height)) image = pre_process_license_plate_image(image, adaptative=True) point1 = quadrilateral.points[0] point2 = quadrilateral.points[2] width = point2.x -point1.x height = point2.y -point1.y license_plate = Rect([point1.x, point1.y, width, height]) license_plate.image = image license_plate.subrects = image.compute_rectangles_for_characters() character_validator.remove_wrong_characters(license_plate) license_plate = character_validator.adjust_characters(license_plate, image_original, image_width)
def pre_processing(argv): ''' Pre process image files to train detector. ''' # Parses args. arg_parser = ArgumentParser(description='Load and plot image.') arg_parser.add_argument('-c', '--config', dest='config_file', default='config.ini', help='Configuration file') args = vars(arg_parser.parse_args()) # Parses configuration file. config_parser = SafeConfigParser() config_parser.read(args['config_file']) path_original_positive = config_parser.get('data', 'path_original_positive') path_original_negative = config_parser.get('data', 'path_original_negative') path_pre_processed_positive = config_parser.get( 'data', 'path_pre_processed_positive') path_pre_processed_negative = config_parser.get( 'data', 'path_pre_processed_negative') path_training_vec = config_parser.get('data', 'path_training_vec') total_positive_files = config_parser.get('training', 'total_positive_files') image_width = config_parser.get('training', 'image_width') image_height = config_parser.get('training', 'image_height') training_width = config_parser.get('training', 'training_width') training_height = config_parser.get('training', 'training_height') # Removing old files. logger = Logger() logger.log(Logger.INFO, "Removing old files.") files = Files(path_pre_processed_positive, True) files.remove() files = Files(path_pre_processed_negative, True) files.remove() files = Files(path_training_vec, True) files.remove() # Pre process positive images. logger.log(Logger.INFO, "Pre-processing positive images.") positive_images = Files(path_original_positive) for file_path in positive_images.paths: # Load image and configuration data. image = Image(file_path) config_data = ConfigData(Quadrilaterals(), file_path) config_data.read_data() # Convert and equalize image. image.convert_to_gray() image.equalize() # Get file name and extension. base_name = os.path.splitext(ntpath.basename(file_path)) file_name = base_name[0] extension = base_name[1] index_quadrilateral = 0 for quadrilateral in config_data.quadrilaterals.data: # Crop image using configuration data. license_plate = crop_image(image, quadrilateral, int(image_width), int(image_height)) # Save image. save_image_path = os.path.abspath(path_pre_processed_positive + file_name + "_" + str(index_quadrilateral) + extension) license_plate.save(save_image_path) index_quadrilateral += 1 # Pre process negative images. logger.log(Logger.INFO, "Pre-processing negative images.") negative_images = Files(path_original_negative) for file_path in negative_images.paths: # Load image. image = Image(file_path) # Convert and equalize image. image.convert_to_gray() image.equalize() # Get base name. base_name = ntpath.basename(file_path) # Save image. save_image_path = os.path.abspath(path_pre_processed_negative + base_name) image.save(save_image_path) # Save detector_training image paths in txt files. save_training_images_paths(path_pre_processed_positive, path_pre_processed_negative) # Generating samples. logger.log(Logger.INFO, "Generating samples.") call([ "perl", 'lib/generate_samples.pl', 'positive.txt', 'negative.txt', path_training_vec, str(int(total_positive_files) + 500), 'opencv_createsamples -bgcolor 0 -bgthresh 0 -maxxangle 1.1\ -maxyangle 1.1 maxzangle 0.5 -maxidev 40 -w ' + str(training_width) + ' -h ' + str(training_height) ]) # Merging data for detector_training. path_training_vec_file = "positive.vec" logger.log( Logger.INFO, "Merging data for detector_training in: " + path_training_vec_file) merge_vec_files(path_training_vec, path_training_vec_file)