美文网首页
【深度学习TensorFlow(九)】剪刀石头布手势识别(多分类

【深度学习TensorFlow(九)】剪刀石头布手势识别(多分类

作者: Geekero | 来源:发表于2021-02-20 17:59 被阅读0次

    学习自中国大学MOOC TensorFlow学习课程

    一、加载数据

    下载

    !wget --no-check-certificate \
        https://storage.googleapis.com/laurencemoroney-blog.appspot.com/rps.zip \
        -O /tmp/rps.zip
      
    !wget --no-check-certificate \
        https://storage.googleapis.com/laurencemoroney-blog.appspot.com/rps-test-set.zip \
        -O /tmp/rps-test-set.zip
    
        'wget' 不是内部或外部命令,也不是可运行的程序
        或批处理文件。
        'wget' 不是内部或外部命令,也不是可运行的程序
        或批处理文件。
        
    

    解压

    import os
    import zipfile
    
    local_zip = 'rps.zip'
    zip_ref = zipfile.ZipFile(local_zip, 'r')
    zip_ref.extractall('./')
    zip_ref.close()
    
    local_zip = 'rps-test-set.zip'
    zip_ref = zipfile.ZipFile(local_zip, 'r')
    zip_ref.extractall('./')
    zip_ref.close()
    

    查看数据结构

    rock_dir = os.path.join('./rps/rock')
    paper_dir = os.path.join('./rps/paper')
    scissors_dir = os.path.join('./rps/scissors')
    
    print('total training rock images:', len(os.listdir(rock_dir)))
    print('total training paper images:', len(os.listdir(paper_dir)))
    print('total training scissors images:', len(os.listdir(scissors_dir)))
    
    rock_files = os.listdir(rock_dir)
    print(rock_files[:10])
    
    paper_files = os.listdir(paper_dir)
    print(paper_files[:10])
    
    scissors_files = os.listdir(scissors_dir)
    print(scissors_files[:10])
    
    total training rock images: 840
    total training paper images: 840
    total training scissors images: 840
    ['rock01-000.png', 'rock01-001.png', 'rock01-002.png', 'rock01-003.png', 'rock01-004.png', 'rock01-005.png', 'rock01-006.png', 'rock01-007.png', 'rock01-008.png', 'rock01-009.png']
    ['paper01-000.png', 'paper01-001.png', 'paper01-002.png', 'paper01-003.png', 'paper01-004.png', 'paper01-005.png', 'paper01-006.png', 'paper01-007.png', 'paper01-008.png', 'paper01-009.png']
    ['scissors01-000.png', 'scissors01-001.png', 'scissors01-002.png', 'scissors01-003.png', 'scissors01-004.png', 'scissors01-005.png', 'scissors01-006.png', 'scissors01-007.png', 'scissors01-008.png', 'scissors01-009.png']
    

    可视化

    %matplotlib inline
    
    import matplotlib.pyplot as plt
    import matplotlib.image as mpimg
    
    pic_index = 2
    
    next_rock = [os.path.join(rock_dir, fname) 
                    for fname in rock_files[pic_index-2:pic_index]]
    next_paper = [os.path.join(paper_dir, fname) 
                    for fname in paper_files[pic_index-2:pic_index]]
    next_scissors = [os.path.join(scissors_dir, fname) 
                    for fname in scissors_files[pic_index-2:pic_index]]
    
    for i, img_path in enumerate(next_rock+next_paper+next_scissors):
      #print(img_path)
      img = mpimg.imread(img_path)
      plt.imshow(img)
      plt.axis('Off')
      plt.show()
    
    output_3_0.png output_3_1.png output_3_2.png output_3_3.png output_3_4.png output_3_5.png

    二、构建神经网络并训练网络

    import tensorflow as tf
    import keras_preprocessing
    from keras_preprocessing import image
    from keras_preprocessing.image import ImageDataGenerator
    
    TRAINING_DIR = "./rps/"
    training_datagen = ImageDataGenerator(
          rescale = 1./255,
          rotation_range=40,
          width_shift_range=0.2,
          height_shift_range=0.2,
          shear_range=0.2,
          zoom_range=0.2,
          horizontal_flip=True,
          fill_mode='nearest')
    
    VALIDATION_DIR = "./rps-test-set/"
    validation_datagen = ImageDataGenerator(rescale = 1./255)
    
    train_generator = training_datagen.flow_from_directory(
        TRAINING_DIR,
        target_size=(150,150),
        class_mode='categorical'
    )
    
    validation_generator = validation_datagen.flow_from_directory(
        VALIDATION_DIR,
        target_size=(150,150),
        class_mode='categorical'
    )
    
    model = tf.keras.models.Sequential([
        # Note the input shape is the desired size of the image 150x150 with 3 bytes color
        # This is the first convolution
        tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(150, 150, 3)),
        tf.keras.layers.MaxPooling2D(2, 2),
        # The second convolution
        tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
        tf.keras.layers.MaxPooling2D(2,2),
        # The third convolution
        tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
        tf.keras.layers.MaxPooling2D(2,2),
        # The fourth convolution
        tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
        tf.keras.layers.MaxPooling2D(2,2),
        # Flatten the results to feed into a DNN
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dropout(0.5),
        # 512 neuron hidden layer
        tf.keras.layers.Dense(512, activation='relu'),
        tf.keras.layers.Dense(3, activation='softmax') #三个输出,所有输出合起来等于1,每个分类的概率在0~1之间
    ])
    
    
    model.summary()
    
    model.compile(loss = 'categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy']) #优化学习步长的算法rmsprop
    
    history = model.fit_generator(train_generator, epochs=5, validation_data = validation_generator, verbose = 1)
    
    model.save("rps.h5")
    
    
        Found 2520 images belonging to 3 classes.
        Found 372 images belonging to 3 classes.
        Model: "sequential"
        _________________________________________________________________
        Layer (type)                 Output Shape              Param #   
        =================================================================
        conv2d (Conv2D)              (None, 148, 148, 64)      1792      
        _________________________________________________________________
        max_pooling2d (MaxPooling2D) (None, 74, 74, 64)        0         
        _________________________________________________________________
        conv2d_1 (Conv2D)            (None, 72, 72, 64)        36928     
        _________________________________________________________________
        max_pooling2d_1 (MaxPooling2 (None, 36, 36, 64)        0         
        _________________________________________________________________
        conv2d_2 (Conv2D)            (None, 34, 34, 128)       73856     
        _________________________________________________________________
        max_pooling2d_2 (MaxPooling2 (None, 17, 17, 128)       0         
        _________________________________________________________________
        conv2d_3 (Conv2D)            (None, 15, 15, 128)       147584    
        _________________________________________________________________
        max_pooling2d_3 (MaxPooling2 (None, 7, 7, 128)         0         
        _________________________________________________________________
        flatten (Flatten)            (None, 6272)              0         
        _________________________________________________________________
        dropout (Dropout)            (None, 6272)              0         
        _________________________________________________________________
        dense (Dense)                (None, 512)               3211776   
        _________________________________________________________________
        dense_1 (Dense)              (None, 3)                 1539      
        =================================================================
        Total params: 3,473,475
        Trainable params: 3,473,475
        Non-trainable params: 0
        _________________________________________________________________
        
    
        D:\anaconda\envs\TF2_4\lib\site-packages\tensorflow\python\keras\engine\training.py:1844: UserWarning: `Model.fit_generator` is deprecated and will be removed in a future version. Please use `Model.fit`, which supports generators.
          warnings.warn('`Model.fit_generator` is deprecated and '
        
    
        Epoch 1/5
        79/79 [==============================] - 53s 613ms/step - loss: 1.3453 - accuracy: 0.3601 - val_loss: 0.7386 - val_accuracy: 0.7151
        Epoch 2/5
        79/79 [==============================] - 26s 323ms/step - loss: 0.9369 - accuracy: 0.5563 - val_loss: 0.2506 - val_accuracy: 0.9704
        Epoch 3/5
        79/79 [==============================] - 27s 339ms/step - loss: 0.5901 - accuracy: 0.7418 - val_loss: 0.1306 - val_accuracy: 0.9892
        Epoch 4/5
        79/79 [==============================] - 26s 329ms/step - loss: 0.3498 - accuracy: 0.8712 - val_loss: 0.1069 - val_accuracy: 0.9731
        Epoch 5/5
        79/79 [==============================] - 26s 322ms/step - loss: 0.2504 - accuracy: 0.9016 - val_loss: 0.0632 - val_accuracy: 0.9677
        
    

    评估模型性能

    import matplotlib.pyplot as plt
    acc = history.history['accuracy']
    val_acc = history.history['val_accuracy']
    loss = history.history['loss']
    val_loss = history.history['val_accuracy']
    
    epochs = range(len(acc))
    
    plt.plot(epochs, acc, 'r', label='Training accuracy')
    plt.plot(epochs, val_acc, 'b', label='Validation accuracy')
    plt.title('Training and validation accuracy')
    plt.legend(loc=0)
    plt.figure()
    
    
    plt.show()
        <Figure size 432x288 with 0 Axes>
    
    
    ![output_5_0.png](https://img.haomeiwen.com/i21726235/0d54a1b4de0181de.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    import numpy as np
    from google.colab import files
    from keras.preprocessing import image
    
    uploaded = files.upload()
    
    for fn in uploaded.keys():
     
      # predicting images
      path = fn
      img = image.load_img(path, target_size=(150, 150))
      x = image.img_to_array(img)
      x = np.expand_dims(x, axis=0)
    
      images = np.vstack([x])
      classes = model.predict(images, batch_size=10)
      print(fn)
      print(classes)
    
    import numpy as np
    from keras.preprocessing import image
    
    # predicting images
    path = 'D:/Data/Tensorflow/第二部分/第八章图像多分类问题/rps-test-set/scissors/testscissors01-19.png'
    img = image.load_img(path, target_size=(150, 150))
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    
    images = np.vstack([x])
    classes = model.predict(images, batch_size=10)
    print(classes)
    
    [[0. 0. 1.]]
    
    img
    
    output_8_0.png
    #释放资源
    import os, signal
    #在Windows中,signal()只能叫SIGABRT, SIGFPE,SIGILL,SIGINT,SIGSEGV,或 SIGTERM。ValueError在其他情况下,将引发A。
    #os.kill(os.getpid(), signal.SIGKILL)
    os.kill(os.getpid(), signal.SIGINT)
    

    相关文章

      网友评论

          本文标题:【深度学习TensorFlow(九)】剪刀石头布手势识别(多分类

          本文链接:https://www.haomeiwen.com/subject/uqjxfltx.html