基于机器视觉的数字1-10手势识别系统( 三 )


这个程序文件名为hog.py,它包含了一些函数用于提取图像的HOG特征 。具体功能如下:
函数:使用库中的hog函数提取图像的HOG特征 。它接受一个灰度图像作为输入,并可以设置一些参数,如bin的个数、每个cell的大小、每个block中含有多少cell等 。如果设置了参数为True,则可以输出HOG图像;否则,返回一维向量表示的HOG特征 。
函数:该函数用于获取指定文件夹下所有图片的HOG特征 。它接受一个文件夹路径作为输入,并遍历该文件夹下的所有图片文件 。对于每个图片文件,首先使用cv2.函数读取为灰度图像,然后调用函数提取HOG特征 。根据文件名中是否包含"train"来判断是训练数据还是测试数据,并将HOG特征添加到相应的列表中 。最后,将训练数据和测试数据转换为NumPy数组并返回 。
总体来说,这个程序文件提供了一种使用库提取图像HOG特征的方法,并提供了一个函数用于获取指定文件夹下所有图片的HOG特征 。
5.4 play.py
class DataPrinter:def __init__(self, file_path):self.file_path = file_pathdef print_data(self):x = pickle.load(open(self.file_path, 'rb'))print("Length", len(x))print(x[0])print("Press y to print all data and n to exit")t = input()if t == 'y':for each in x:print(each)
这个程序文件名为play.py,它的功能是加载一个文件并显示其中的数据 。
程序首先导入了sys和模块 。然后,它使用.load函数加载了一个文件,该文件的路径由命令行参数sys.argv[1]指定 。加载的数据被赋值给变量x 。
接下来,程序打印出变量x的长度,即数据的数量 。然后,它打印出x中的第一个元素 。
程序接着提示用户输入一个字符,如果输入的字符是’y’,则程序会遍历x中的每个元素,并将其打印出来 。
总结起来,这个程序的功能是加载文件并显示其中的数据 。用户可以选择是否打印出所有的数据 。

基于机器视觉的数字1-10手势识别系统

文章插图
5.5 .py
class FramePredictor:def __init__(self, model_file, frames_folder, input_layer='Placeholder', output_layer='final_result', batch_size=10):self.model_file = model_fileself.frames_folder = frames_folderself.input_layer = input_layerself.output_layer = output_layerself.batch_size = batch_sizedef load_graph(self):graph = tf.Graph()graph_def = tf.GraphDef()with open(self.model_file, "rb") as f:graph_def.ParseFromString(f.read())with graph.as_default():tf.import_graph_def(graph_def)return graphdef read_tensor_from_image_file(self, frames, input_height=299, input_width=299, input_mean=0, input_std=255):input_name = "file_reader"frames = [(tf.read_file(frame, input_name), frame) for frame in frames]decoded_frames = []for frame in frames:file_name = frame[1]file_reader = frame[0]if file_name.endswith(".png"):image_reader = tf.image.decode_png(file_reader, channels=3, name="png_reader")elif file_name.endswith(".gif"):image_reader = tf.squeeze(tf.image.decode_gif(file_reader, name="gif_reader"))elif file_name.endswith(".bmp"):image_reader = tf.image.decode_bmp(file_reader, name="bmp_reader")else:image_reader = tf.image.decode_jpeg(file_reader, channels=3, name="jpeg_reader")decoded_frames.append(image_reader)float_caster = [tf.cast(image_reader, tf.float32) for image_reader in decoded_frames]float_caster = tf.stack(float_caster)resized = tf.image.resize_bilinear(float_caster, [input_height, input_width])normalized = tf.divide(tf.subtract(resized, [input_mean]), [input_std])sess = tf.Session()result = sess.run(normalized)return resultdef load_labels(self, label_file):label = []proto_as_ascii_lines = tf.gfile.GFile(label_file).readlines()for l in proto_as_ascii_lines:label.append(l.rstrip())return labeldef predict(self, graph, image_tensor):input_name = "import/" + self.input_layeroutput_name = "import/" + self.output_layerinput_operation = graph.get_operation_by_name(input_name)output_operation = graph.get_operation_by_name(output_name)with tf.Session(graph=graph) as sess:results = sess.run(output_operation.outputs[0],{input_operation.outputs[0]: image_tensor})results = np.squeeze(results)return resultsdef predict_on_frames(self):input_height = 299input_width = 299input_mean = 0input_std = 255batch_size = self.batch_sizegraph = self.load_graph()labels_in_dir = os.listdir(self.frames_folder)frames = [each for each in os.walk(self.frames_folder) if os.path.basename(each[0]) in labels_in_dir]predictions = []for each in frames:label = each[0]print("Predicting on frame of %s\n" % (label))for i in tqdm(range(0, len(each[2]), batch_size), ascii=True):batch = each[2][i:i + batch_size]try:batch = [os.path.join(label, frame) for frame in batch]frames_tensors = self.read_tensor_from_image_file(batch, input_height=input_height, input_width=input_width, input_mean=input_mean, input_std=input_std)pred = self.predict(graph, frames_tensors)pred = [[each.tolist(), os.path.basename(label)] for each in pred]predictions.extend(pred)except KeyboardInterrupt:print("You quit with ctrl+c")sys.exit()except Exception as e:print("Error making prediction: %s" % (e))x = input("\nDo You Want to continue on other samples: y/n")if x.lower() == 'y':continueelse:sys.exit()return predictionsdef run(self):# reduce tf verbosityos.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'predictions = self.predict_on_frames()out_file = 'predicted-frames-%s-%s.pkl' % (self.output_layer.split("/")[-1], train_or_test)print("Dumping predictions to: %s" % (out_file))with open(out_file, 'wb') as fout:pickle.dump(predictions, fout)print("Done.")