DNN gesture recognition scores brush list (not using a convolution layer)

#!/usr/bin/env python
# coding: utf-8

# In[1]:


# 查看当前挂载的数据集目录, 该目录下的变更重启环境后会自动还原
# View dataset directory. This directory will be recovered automatically after resetting environment. 
#get_ipython().system('ls /home/aistudio/data')


# In[2]:


# 查看工作区文件, 该目录下的变更将会持久保存. 请及时清理不必要的文件, 避免加载过慢.
# View personal work directory. All changes under this directory will be kept even after reset. Please clean unnecessary files in time to speed up environment loading.
#get_ipython().system('ls /home/aistudio/work')


# In[3]:



#get_ipython().system('cd /home/aistudio/data/data23668 && unzip -qo Dataset.zip')
#get_ipython().system('cd /home/aistudio/data/data23668/Dataset && rm -f */.DS_Store # 删除无关文件 ')


# In[4]:


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 paddle.fluid.dygraph import Pool2D,Conv2D
from paddle.fluid.dygraph import Linear


# In[5]:



# 生成图像列表
data_path = 'E:\AI/task2/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('列表已生成')
#%%数据预处理
import numpy as np
import cv2
from PIL import Image,ImageEnhance
import random

# 随机改变亮暗、对比度和颜色等
def random_distort(img):
    # 随机改变亮度
    def random_brightness(img, lower=0.5, upper=1.5):
        e = np.random.uniform(lower, upper)
        return ImageEnhance.Brightness(img).enhance(e)
    # 随机改变对比度
    def random_contrast(img, lower=0.5, upper=1.5):
        e = np.random.uniform(lower, upper)
        return ImageEnhance.Contrast(img).enhance(e)
    # 随机改变颜色
    def random_color(img, lower=0.5, upper=1.5):
        e = np.random.uniform(lower, upper)
        return ImageEnhance.Color(img).enhance(e)

    ops = [random_brightness, random_contrast, random_color]
    np.random.shuffle(ops)

    img = Image.fromarray(img)
    img = ops[0](img)
    img = ops[1](img)
    img = ops[2](img)
    img = np.asarray(img)

    return img
# 随机填充
def random_expand(img,        
                  max_ratio=4.,
                  fill=None,
                  keep_ratio=True,
                  thresh=0.5):

    h, w, c = img.shape
    ratio_x = random.uniform(1, max_ratio)
    if keep_ratio:
        ratio_y = ratio_x
    else:
        ratio_y = random.uniform(1, max_ratio)
    oh = int(h * ratio_y)
    ow = int(w * ratio_x)
    off_x = random.randint(0, ow - w)
    off_y = random.randint(0, oh - h)

    out_img = np.zeros((oh, ow, c))
    if fill and len(fill) == c:
        for i in range(c):
            out_img[:, :, i] = fill[i] * 255.0

    out_img[off_y:off_y + h, off_x:off_x + w, :] = img
    return out_img.astype('uint8')
# 随机缩放
def random_interp(img, size, interp=None):
    interp_method = [
        cv2.INTER_NEAREST,
        cv2.INTER_LINEAR,
        cv2.INTER_AREA,
        cv2.INTER_CUBIC,
        cv2.INTER_LANCZOS4,
    ]
    if not interp or interp not in interp_method:
        interp = interp_method[random.randint(0, len(interp_method) - 1)]
    h, w, _ = img.shape
    im_scale_x = size / float(w)
    im_scale_y = size / float(h)
    img = cv2.resize(
        img, None, None, fx=im_scale_x, fy=im_scale_y, interpolation=interp)
    return img
# 随机翻转
def random_flip(img,  thresh=0.5):
    if random.random() > thresh:
        img = img[:, ::-1, :]
    return img

# 图像增广方法汇总
def image_augment(img,gtlabels,size, means=None):    
    # 随机改变亮暗、对比度和颜色等
    img = random_distort(img)
    # 随机填充
#    img= random_expand(img, fill=means)
#    # 随机缩放
#    img = random_interp(img, size)
#    # 随机翻转
    img = random_flip(img)
    return img,gtlabels
# In[6]:


## 定义训练集和测试集的reader
#def data_mapper(sample):
#    img, label = sample
#    img = cv2.imread(img)
#    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#    img, label=image_augment(img, label,640)
#    img = Image.fromarray(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
# 定义训练集和测试集的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() # 打乱数据
            np.random.shuffle(lines)
            for line in lines:
                img, label = line.split('\t')                
                yield img, int(label)             
    return paddle.reader.xmap_readers(data_mapper, reader, cpu_count(), 512)
 


# In[7]:


# 用于训练的数据提供器
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) 
print(train_reader)

# In[10]:


#定义DNN网络
class MyDNN(fluid.dygraph.Layer):

    def __init__(self):
        super(MyDNN,self).__init__()
        self.hidden1 = Linear(100, 100, act="relu")
        
        self.hidden2 = Linear(100,100, act="relu")
        
        self.hidden3 = Linear(100, 100, act="relu")
        
        self.hidden4 = Linear(3*100*100, 10, act="softmax")

    def forward(self,input):
        output = self.hidden1(input) 
        output = fluid.layers.dropout(output,dropout_prob=0.1)
        output = self.hidden2(output)
        output = fluid.layers.dropout(output,dropout_prob=0.1)
        output= self.hidden3(output)
        output = fluid.layers.reshape(input,shape=[-1,3*100*100])
        output = fluid.layers.dropout(output,dropout_prob=0.1)
        y = self.hidden4(output)


     
        return y


# In[11]:



#用动态图进行训练
with fluid.dygraph.guard():
    model=MyDNN() #模型实例化
    model.train() #训练模式
    base_lr = 0.1
    epochs_num=300 #迭代次数
    lr = fluid.layers.cosine_decay( learning_rate = base_lr, step_each_epoch=10000, epochs=epochs_num) #动态学习率
    opt=fluid.optimizer.AdamOptimizer(learning_rate=lr, parameter_list=model.parameters())#优化器选用SGD随机梯度下降,学习率为0.001.

    
    
    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)
            loss=fluid.layers.cross_entropy(predict,label)
            avg_loss=fluid.layers.mean(loss)#获取loss值
            
            acc=fluid.layers.accuracy(predict,label)#计算精度
            
            if batch_id!=0 and batch_id%50==0:
                print("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')#保存模型
 


# In[ ]:


#模型校验
with fluid.dygraph.guard():
    accs = []
    model_dict, _ = fluid.load_dygraph('MyDNN')
    model = MyDNN()
    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)


# In[ ]:


#读取预测图像,进行预测

def load_image(path):
    img = Image.open(path)
    img = img.resize((100, 100), Image.ANTIALIAS)
    img = np.array(img).astype('float32')
    img = img.transpose((2, 0, 1))
    img = img/255.0
    print(img.shape)
    return img

#构建预测动态图过程
with fluid.dygraph.guard():
    infer_path = '手势.JPG'
    model=MyDNN()#模型实例化
    model_dict,_=fluid.load_dygraph('MyDNN')
    model.load_dict(model_dict)#加载模型参数
    model.eval()#评估模式
    infer_img = load_image(infer_path)
    infer_img=np.array(infer_img).astype('float32')
    infer_img=infer_img[np.newaxis,:, : ,:]
    infer_img = fluid.dygraph.to_variable(infer_img)
    result=model(infer_img)
    display(Image.open('手势.JPG'))
    print(np.argmax(result.numpy()))


Released nine original articles · won praise 8 · views 773

Guess you like

Origin blog.csdn.net/weixin_42076509/article/details/105280954