百度Paddle 關於 學習利用神經網絡實現手勢識別

  今天學習的是利用神經網絡實現手勢識別

  數據和部分代碼來自:https://aistudio.baidu.com

  首先 把任務比作火箭,神經網絡就是火箭的發動機,那數據集就是 火箭的油

  數據這裏就暫時無法提供了 可以去aistudio自取

  這裏就是數據集裏面已經分好類的圖片了,到時候方便我們調用

  下面我們來到我們的代碼部分:

  import os

  import time

  import random

  import numpy as np

  from PIL import Image

  import matplotlib.pyplot as plt

  import paddle

  import paddle.fluid as fluid

  import paddle.fluid.layers as layers

  from multiprocessing import cpu_count

  from PIL._imaging import display

  from paddle.fluid.dygraph import Pool2D,Conv2D

  from paddle.fluid.dygraph import Linear

  直接把需要的庫調用出來

  對於飛槳的API查找直接百度搜索飛槳進入官網查看文檔即可

  # 生成圖像列表

  data_path = 'data/data23668/Dataset'

  character_folders = os.listdir(data_path)

  # print(character_folders)

  if (os.path.exists('./train_data.list')):

  os.remove('./train_data.list')

  if (os.path.exists('./test_data.list')):

  os.remove('./test_data.list')

  for character_folder in character_folders:

  with open('./train_data.list', 'a') as f_train:

  with open('./test_data.list', 'a') as f_test:

  if character_folder == '.DS_Store':

  continue

  character_imgs = os.listdir(os.path.join(data_path, character_folder))

  count = 0

  for img in character_imgs:

  if img == '.DS_Store':

  continue

  if count % 10 == 0:

  f_test.write(os.path.join(data_path, character_folder, img) + '\t' + character_folder + '\n')

  else:

  f_train.write(os.path.join(data_path, character_folder, img) + '\t' + character_folder + '\n')

  count += 1

  print('列表已生成')

  # 定義訓練集和測試集的reader

  def data_mapper(sample):

  img, label = sample

  img = Image.open(img)

  img = img.resize((100, 100), Image.ANTIALIAS)

  img = np.array(img).astype('float32')

  img = img.transpose((2, 0, 1))

  img = img/255.0

  return img, label

  def data_reader(data_list_path):

  def reader():

  with open(data_list_path, 'r') as f:

  lines = f.readlines()

  for line in lines:

  img, label = line.split('\t')

  yield img, int(label)

  return paddle.reader.xmap_readers(data_mapper, reader, cpu_count(), 512)

  # 用於訓練的數據提供器

  train_reader = paddle.batch(reader=paddle.reader.shuffle(reader=data_reader('./train_data.list'), buf_size=256), batch_size=32)

  # 用於測試的數據提供器

  test_reader = paddle.batch(reader=data_reader('./test_data.list'), batch_size=32)

  以上代碼是對數據集的一些處理來幫助我們的網絡進行訓練

  接下來就是我們神經網絡的設計部分:

  class DensenNet(fluid.dygraph.Layer):

  def __init__(self,training=True):

  super(DensenNet,self).__init__()

  self.conv1 = Conv2D(num_channels=3,num_filters=32,filter_size=3,act='relu')

  self.pool1 = Pool2D(pool_size=2,pool_stride=2,pool_type='max')

  self.conv2 = Conv2D(num_channels=32, num_filters=32, filter_size=3, act='relu')

  self.pool2 = Pool2D(pool_size=2, pool_stride=2,pool_type='max')

  self.conv3 = Conv2D(num_channels=32, num_filters=64, filter_size=3, act='relu')

  self.pool3 = Pool2D(pool_size=2, pool_stride=2,pool_type='max')

  self.fc1 = Linear(input_dim=6400,output_dim=8192,act='relu')

  self.drop_ratiol = 0.5 if training else 0.0

  self.fc2 = Linear(input_dim=8192,output_dim=10)

  def forward(self,input1):

  conv1 = self.conv1(input1)

  pool1 = self.pool1(conv1)

  #

  conv2 = self.conv2(pool1)

  pool2 = self.pool2(conv2)

  #

  conv3 = self.conv3(pool2)

  pool3 = self.pool3(conv3)

  rs_1 = fluid.layers.reshape(pool3,[pool3.shape[0],-1])

  fc1 = self.fc1(rs_1)

  drop1 = fluid.layers.dropout(fc1,self.drop_ratiol)

  y = self.fc2(drop1)

  return y

  這是一個典型的Net神經網絡

  對於一些不懂的地方歡迎移步官方文檔:https://www.paddlepaddle.org.cn/tutorials/projectdetail/340219#anchor-0

  感覺被比我講的好

  神經網絡設計完成後:

  我們就用飛槳的動態圖來完成神經網絡的訓練

  關於動態圖的解釋也可以在剛剛的官網裏找到

  with fluid.dygraph.guard():

  model = DensenNet(True) # 模型實例化

  model.train() # 訓練模式

  # opt = fluid.optimizer.SGDOptimizer(learning_rate=0.01,

  # parameter_list=model.parameters()) # 優化器選用SGD隨機梯度下降,學習率爲0.001.

  opt = fluid.optimizer.Momentum(learning_rate=0.001, momentum=0.9, parameter_list=model.parameters())

  epochs_num = 100 # 迭代次數

  for pass_num in range(epochs_num):

  for batch_id, data in enumerate(train_reader()):

  images = np.array([x[0].reshape(3, 100, 100) for x in data], np.float32)

  labels = np.array([x[1] for x in data]).astype('int64')

  labels = labels[:, np.newaxis]

  # print(images.shape)

  image = fluid.dygraph.to_variable(images)

  label = fluid.dygraph.to_variable(labels)

  predict = model(image) # 預測

  # print(predict)

  sf_predict = fluid.layers.softmax(predict)

  # loss = fluid.layers.cross_entropy(predict, label)這個問題huaiyizaizhe

  loss = fluid.layers.softmax_with_cross_entropy(predict, label)

  avg_loss = fluid.layers.mean(loss) # 獲取loss值

  acc = fluid.layers.accuracy(sf_predict, label) # 計算精度

  if batch_id != 0 and batch_id % 50 == 0:

  print(鄭州婦科醫院 http://www.xasgfk.cn/

  "train_pass:{},batch_id:{},train_loss:{},train_acc:{}".format(pass_num, batch_id, avg_loss.numpy(),

  acc.numpy()))

  avg_loss.backward()

  opt.minimize(avg_loss)

  model.clear_gradients()

  fluid.save_dygraph(model.state_dict(), 'MyDNN') # 保存模型

  接下來就開始我們的模型校驗:

  # 模型校驗

  with fluid.dygraph.guard():

  accs = []

  model_dict, _ = fluid.load_dygraph('MyDNN')

  model = DensenNet()

  model.load_dict(model_dict) # 加載模型參數

  model.eval() # 訓練模式

  for batch_id, data in enumerate(test_reader()): # 測試集

  images = np.array([x[0].reshape(3, 100, 100) for x in data], np.float32)

  labels = np.array([x[1] for x in data]).astype('int64')

  labels = labels[:, np.newaxis]

  image = fluid.dygraph.to_variable(images)

  label = fluid.dygraph.to_variable(labels)

  predict = model(image)

  acc = fluid.layers.accuracy(predict, label)

  accs.append(acc.numpy()[0])

  avg_acc = np.mean(accs)

  print(avg_acc)

  以上就完成了一個手勢識別的神經網絡設計和訓練啦。

  接下來的就是讀取圖片了:

  # 模型校驗

  with fluid.dygraph.guard():

  accs = []

  model_dict, _ = fluid.load_dygraph('MyDNN')

  model = DensenNet()

  model.load_dict(model_dict) # 加載模型參數

  model.eval() # 訓練模式

  for batch_id, data in enumerate(test_reader()): # 測試集

  images = np.array([x[0].reshape(3, 100, 100) for x in data], np.float32)

  labels = np.array([x[1] for x in data]).astype('int64')

  labels = labels[:, np.newaxis]

  image = fluid.dygraph.to_variable(images)

  label = fluid.dygraph.to_variable(labels)

  predict = model(image)

  acc = fluid.layers.accuracy(predict, label)

  accs.append(acc.numpy()[0])

  avg_acc = np.mean(accs)

  print(avg_acc)

  #讀取預測圖像,進行預測


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章