卷积神经网络交通标志识别

基于卷积神经网络的交通标志识别(pytorch,opencv,yolov5) 使用resnet18,yolov5进行交通标志检测,与分类。本文使用的数据集共有6000多张,共包含58个类别。 阅读详情
AI摘要

本节利用德国交通标志数据集实现交通标志识别,步骤包括数据导入、探索和可视化、预处理以及模型搭建。模型搭建有多种结构,如2层Conv2D搭配多层其他层等,还对部分模型进行改进增加Dropout层,最后补充单张图片预测。

在这里插入图片描述
这节采用德国交通标志数据集实现交通标志识别。本节步骤分为数据导入,探索和可视化数据集,数据预处理,交通标志识别模型搭建。
一、加载数据

# 加载数据
import pickle

# 数据集所在的文件位置
training_file = "/content/drive/traffic-signs-data/train.p"
validation_file = "/content/drive/traffic-signs-data/valid.p"
testing_file = "/content/drive/traffic-signs-data/test.p"

# 打开文件
with open(training_file,mode="rb") as f:
  train = pickle.load(f)
with open(validation_file,mode="rb") as f:
  valid = pickle.load(f)
with open(testing_file,mode="rb") as f:
  test = pickle.load(f)

# 获取数据集的特征及标签数据
X_train,y_train = train["features"],train["labels"]
X_valid,y_valid = valid["features"],valid["labels"]
X_test,y_test = test["features"],test["labels"]
# 查看数据量
print("Number of training examples =",X_train.shape[0])
print("Number of validtion examples =",X_valid.shape[0])
print("Number of testing examples=",X_test.shape[0])

# 查看数据格式
print("Image data shape =",X_train.shape[1:])
Number of training examples = 34799
Number of validtion examples = 4410
Number of testing examples= 12630
Image data shape = (32, 32, 3)
# 查看数据的标签的数量
import numpy as np

sum = np.unique(y_train)
print("number of classes =",len(sum))
number of classes = 43
# 查看标签数据
import pandas as pd

sign_names_file = "/content/drive/traffic-signs-data/signnames.csv"
sign_names = pd.read_csv(sign_names_file)
print(sign_names)
    ClassId                                           SignName
0         0                               Speed limit (20km/h)
1         1                               Speed limit (30km/h)
2         2                               Speed limit (50km/h)
3         3                               Speed limit (60km/h)
4         4                               Speed limit (70km/h)
5         5                               Speed limit (80km/h)
6         6                        End of speed limit (80km/h)
7         7                              Speed limit (100km/h)
8         8                              Speed limit (120km/h)
9         9                                         No passing
10       10       No passing for vehicles over 3.5 metric tons
11       11              Right-of-way at the next intersection
12       12                                      Priority road
13       13                                              Yield
14       14                                               Stop
15       15                                        No vehicles
16       16           Vehicles over 3.5 metric tons prohibited
17       17                                           No entry
18       18                                    General caution
19       19                        Dangerous curve to the left
20       20                       Dangerous curve to the right
21       21                                       Double curve
22       22                                         Bumpy road
23       23                                      Slippery road
24       24                          Road narrows on the right
25       25                                          Road work
26       26                                    Traffic signals
27       27                                        Pedestrians
28       28                                  Children crossing
29       29                                  Bicycles crossing
30       30                                 Beware of ice/snow
31       31                              Wild animals crossing
32       32                End of all speed and passing limits
33       33                                   Turn right ahead
34       34                                    Turn left ahead
35       35                                         Ahead only
36       36                               Go straight or right
37       37                                Go straight or left
38       38                                         Keep right
39       39                                          Keep left
40       40                               Roundabout mandatory
41       41                                  End of no passing
42       42  End of no passing by vehicles over 3.5 metric ...
# 定义将标签id转换成name的函数
sign_names = np.array(sign_names)
def id_to_name(id):
  return sign_names[id][1]
# 验证是否id_to_name函数
id_to_name(0)
'Speed limit (20km/h)'
# 绘制交通标志图
import matplotlib.pyplot as plt
%matplotlib inline

fig,axes = plt.subplots(2,5,figsize=(18,5))
ax_array = axes.ravel()
for ax in ax_array:
  index = np.random.randint(0,len(X_train))
  ax.imshow(X_train[index])
  ax.axis("off")
  ax.set_title(id_to_name(y_train[index]))
plt.show()

在这里插入图片描述

# 直方图来展示图像训练集的各个类别的分布情况
n_classes = len(sum)
def plot_y_train_hist():
    fig = plt.figure(figsize=(15,5))
    ax = fig.add_subplot(1,1,1)
    hist = ax.hist(y_train,bins = n_classes)
    ax.set_title("the frequency of each category sign")
    ax.set_xlabel("signs")
    ax.set_ylabel("frequency")
    plt.show()
    return hist

print(X_train.shape)
print(y_train.shape)
hist = plot_y_train_hist()
(34799, 32, 32, 3)
(34799,)

在这里插入图片描述

# 数据重采样,使样本个数分配均匀
bin_edges = hist[1]
bin_centers = (bin_edges[1:] + bin_edges[0:len(bin_edges)-1])/2
for i in range(len(bin_centers)):
    if hist[0][i] < 1000:
        train_data = [X_train[j] for j in range(len(y_train)) if y_train[j] == i]
        need_resample_num = int(1000 - hist[0][i])
        new_data_x = [np.copy(train_data[np.random.randint(len(train_data))]) for k in range(need_resample_num)]
        new_data_y = [i for x in range(need_resample_num)]
        X_train = np.vstack((X_train, np.array(new_data_x)))
        y_train = np.hstack((y_train, np.array(new_data_y)))
print(X_train.shape)
print(y_train.shape)
plot_y_train_hist()
(51690, 32, 32, 3)
(51690,)

在这里插入图片描述

(array([1000., 1980., 2010., 1260., 1770., 1650., 1000., 1290., 1260.,
        1320., 1800., 1170., 1890., 1920., 1000., 1000., 1000., 1000.,
        1080., 1000., 1000., 1000., 1000., 1000., 1000., 1350., 1000.,
        1000., 1000., 1000., 1000., 1000., 1000., 1000., 1000., 1080.,
        1000., 1000., 1860., 1000., 1000., 1000., 1000.]),
 array([ 0.        ,  0.97674419,  1.95348837,  2.93023256,  3.90697674,
         4.88372093,  5.86046512,  6.8372093 ,  7.81395349,  8.79069767,
         9.76744186, 10.74418605, 11.72093023, 12.69767442, 13.6744186 ,
        14.65116279, 15.62790698, 16.60465116, 17.58139535, 18.55813953,
        19.53488372, 20.51162791, 21.48837209, 22.46511628, 23.44186047,
        24.41860465, 25.39534884, 26.37209302, 27.34883721, 28.3255814 ,
        29.30232558, 30.27906977, 31.25581395, 32.23255814, 33.20930233,
        34.18604651, 35.1627907 , 36.13953488, 37.11627907, 38.09302326,
        39.06976744, 40.04651163, 41.02325581, 42.        ]),
 <a list of 43 Patch objects>)

二、数据预处理

# 源图像
src = X_train[4000]
plt.imshow(src)
print(src.shape)
(32, 32, 3)

在这里插入图片描述

# 转为灰度图像
import cv2

dst = cv2.cvtColor(src,cv2.COLOR_RGB2GRAY)
plt.imshow(dst)
print(dst.shape)
(32, 32)

在这里插入图片描述

# 灰度图的直方图
plt.hist(dst.ravel(),256,[0,256],color="r")
plt.show()

在这里插入图片描述

# 灰度图的直方图均衡化
dst2 = cv2.equalizeHist(dst)
plt.hist(dst2.ravel(),256,[0,256],color="r")
plt.show()

在这里插入图片描述

# 查看直方图均衡化的图片
plt.imshow(dst2)
<matplotlib.image.AxesImage at 0x7f97bb3a86a0>

在这里插入图片描述

# 增加维度
print(dst2.shape)
dst3 = np.expand_dims(dst2,2)
print(dst3.shape)
(32, 32)
(32, 32, 1)
# 归一化处理
dst4 = np.array(dst3,dtype=np.float32)
dst4 = (dst4-128)/128
# 查看一下归一化处理后的图像数据
dst4[0]
array([[-0.859375 ],
       [-0.9609375],
       [-0.9765625],
       [-0.9296875],
       [-0.859375 ],
       [-0.859375 ],
       [-0.625    ],
       [-0.484375 ],
       [-0.625    ],
       [-0.625    ],
       [-0.375    ],
       [-0.375    ],
       [-0.2890625],
       [ 0.171875 ],
       [ 0.6171875],
       [ 0.3359375],
       [-0.1171875],
       [ 0.171875 ],
       [ 0.3359375],
       [ 0.171875 ],
       [-0.0546875],
       [ 0.125    ],
       [ 0.125    ],
       [ 0.0078125],
       [ 0.0078125],
       [ 0.125    ],
       [-0.1171875],
       [-0.1875   ],
       [-0.1875   ],
       [ 0.0625   ],
       [ 0.125    ],
       [ 0.171875 ]], dtype=float32)
# 封装数据预处理的方法
import cv2

def preprocess_features(X, equalize_hist=True):
    normalized_X = []
    for i in range(len(X)):
        # Convert from RGB to YUV
        yuv_img = cv2.cvtColor(X[i], cv2.COLOR_RGB2YUV)
        yuv_img_v = X[i][:, :, 0]
        # equalizeHist
        yuv_img_v = cv2.equalizeHist(yuv_img_v)
        # expand_dis
        yuv_img_v = np.expand_dims(yuv_img_v, 2)
        normalized_X.append(yuv_img_v)
    # normalize
    normalized_X = np.array(normalized_X, dtype=np.float32)
    normalized_X = (normalized_X-128)/128
    # normalized_X /= (np.std(normalized_X, axis=0) + np.finfo('float32').eps)
    return normalized_X
# 对数据集整体进行处理
X_train_normalized = preprocess_features(X_train)
X_valid_normalized = preprocess_features(X_valid)
X_test_normalized = preprocess_features(X_test)
# 将数据集打乱
from sklearn.utils import shuffle
X_train_normalized,y_train = shuffle(X_train_normalized,y_train)
# 数据增强
from keras.preprocessing.image import ImageDataGenerator

# 图像数据生成器
image_datagen = ImageDataGenerator(rotation_range = 10.,
                                   zoom_range = 0.2,
                                   width_shift_range =  0.08,
                                   height_shift_range = 0.08
                                  )

# 从训练集随意选取一张图片
index = np.random.randint(0, len(X_train_normalized))
img = X_train_normalized[index]

# 展示原始图片
plt.figure(figsize=(1, 1))
plt.imshow(np.squeeze(img), cmap="gray")
plt.title('Example of GRAY image (name = {})'.format(id_to_name(y_train[index])))
plt.axis('off')
plt.show()

# 展示数据增强生成的图片
fig, ax_array = plt.subplots(3, 10, figsize=(15, 5))
for ax in ax_array.ravel():
    images = np.expand_dims(img, 0)
    # np.expand_dims(img, 0) means add dim
    augmented_img, _ = image_datagen.flow(np.expand_dims(img, 0), np.expand_dims(y_train[index], 0)).next()
    #augmented_img=preprocess_features(augmented_img)
    ax.imshow(augmented_img.squeeze(), cmap="gray")
    ax.axis('off')
plt.suptitle('Random examples of data augment (starting from the previous image)')
plt.show()
Using TensorFlow backend.

在这里插入图片描述

print("Number of training examples =",X_train.shape[0])
Number of training examples = 51690
# 对标签数据进行one-hot编码
from keras.utils  import np_utils
print("Shape before one-hot encoding:",y_train.shape)
Y_train = np_utils.to_categorical(y_train,n_classes)
Y_valid = np_utils.to_categorical(y_valid,n_classes)
Y_test = np_utils.to_categorical(y_test,n_classes)
print("Shape after one-hot encoding:",Y_train.shape)
Shape before one-hot encoding: (51690,)
Shape after one-hot encoding: (51690, 43)
print(y_train[0])
print(Y_train[0])
24
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

三、交通标志牌的识别模型搭建

1.2层Conv2D+1层MaxPooling2D+1层Drop(0.25)+1层Flatten+1层Dense+1层Dropout层(0.5)+1层Dense

from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D

model = Sequential()
## Feature Extraction
# 第1层卷积,32个3x3的卷积核 ,激活函数使用 relu
model.add(Conv2D(filters=32, kernel_size=(3, 3), activation='relu',
                 input_shape=X_train_normalized.shape[1:]))

# 第2层卷积,64个3x3的卷积核,激活函数使用 relu
model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu'))

# 最大池化层,池化窗口 2x2
model.add(MaxPooling2D(pool_size=(2, 2)))

# Dropout 25% 的输入神经元
model.add(Dropout(0.25))

# 将 Pooled feature map 摊平后输入全连接网络
model.add(Flatten())

## Classification
# 全联接层
model.add(Dense(128, activation='relu'))

# Dropout 50% 的输入神经元
model.add(Dropout(0.5))

# 使用 softmax 激活函数做多分类,输出各类别的概率
model.add(Dense(n_classes, activation='softmax'))
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Colocations handled automatically by placer.
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:3445: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.
Instructions for updating:
Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.
# 查看模型的结构
model.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 30, 30, 32)        320       
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 28, 28, 64)        18496     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 14, 14, 64)        0         
_________________________________________________________________
dropout_1 (Dropout)          (None, 14, 14, 64)        0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 12544)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 128)               1605760   
_________________________________________________________________
dropout_2 (Dropout)          (None, 128)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 43)                5547      
=================================================================
Total params: 1,630,123
Trainable params: 1,630,123
Non-trainable params: 0
_________________________________________________________________
# 编译模型
model.compile(loss="categorical_crossentropy",
              metrics=["accuracy"],
              optimizer="adam")
# 训练模型
history = model.fit(X_train_normalized,
                    Y_train,
                    batch_size=256,
                    epochs=120,
                    verbose=2,
                    validation_data=(X_valid_normalized,Y_valid))     
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.cast instead.
Train on 51690 samples, validate on 4410 samples
Epoch 1/120
 - 7s - loss: 1.2242 - acc: 0.6591 - val_loss: 0.3351 - val_acc: 0.8957
Epoch 2/120
 - 4s - loss: 0.2724 - acc: 0.9174 - val_loss: 0.2139 - val_acc: 0.9370
Epoch 3/120
 - 4s - loss: 0.1670 - acc: 0.9492 - val_loss: 0.1646 - val_acc: 0.9490
Epoch 4/120
 - 4s - loss: 0.1190 - acc: 0.9622 - val_loss: 0.1639 - val_acc: 0.9467
Epoch 5/120
 - 4s - loss: 0.0910 - acc: 0.9709 - val_loss: 0.1620 - val_acc: 0.9537
Epoch 6/120
 - 4s - loss: 0.0770 - acc: 0.9752 - val_loss: 0.1439 - val_acc: 0.9585
Epoch 7/120
 - 4s - loss: 0.0656 - acc: 0.9795 - val_loss: 0.1304 - val_acc: 0.9587
Epoch 8/120
 - 4s - loss: 0.0572 - acc: 0.9809 - val_loss: 0.1411 - val_acc: 0.9601
Epoch 9/120
 - 4s - loss: 0.0514 - acc: 0.9835 - val_loss: 0.1529 - val_acc: 0.9562
Epoch 10/120
 - 4s - loss: 0.0473 - acc: 0.9847 - val_loss: 0.1166 - val_acc: 0.9642
Epoch 11/120
 - 4s - loss: 0.0427 - acc: 0.9863 - val_loss: 0.1336 - val_acc: 0.9619
Epoch 12/120
 - 4s - loss: 0.0371 - acc: 0.9879 - val_loss: 0.1309 - val_acc: 0.9635
Epoch 13/120
 - 4s - loss: 0.0380 - acc: 0.9874 - val_loss: 0.1194 - val_acc: 0.9685
Epoch 14/120
 - 4s - loss: 0.0315 - acc: 0.9898 - val_loss: 0.1403 - val_acc: 0.9633
Epoch 15/120
 - 4s - loss: 0.0328 - acc: 0.9889 - val_loss: 0.1469 - val_acc: 0.9574
Epoch 16/120
 - 4s - loss: 0.0292 - acc: 0.9903 - val_loss: 0.1241 - val_acc: 0.9689
Epoch 17/120
 - 4s - loss: 0.0291 - acc: 0.9903 - val_loss: 0.1307 - val_acc: 0.9673
Epoch 18/120
 - 4s - loss: 0.0265 - acc: 0.9910 - val_loss: 0.1434 - val_acc: 0.9651
Epoch 19/120
 - 4s - loss: 0.0259 - acc: 0.9914 - val_loss: 0.1291 - val_acc: 0.9680
Epoch 20/120
 - 4s - loss: 0.0246 - acc: 0.9916 - val_loss: 0.1332 - val_acc: 0.9635
Epoch 21/120
 - 4s - loss: 0.0231 - acc: 0.9922 - val_loss: 0.1261 - val_acc: 0.9671
Epoch 22/120
 - 4s - loss: 0.0232 - acc: 0.9923 - val_loss: 0.1301 - val_acc: 0.9680
Epoch 23/120
 - 4s - loss: 0.0198 - acc: 0.9932 - val_loss: 0.1388 - val_acc: 0.9669
Epoch 24/120
 - 4s - loss: 0.0226 - acc: 0.9923 - val_loss: 0.1210 - val_acc: 0.9719
Epoch 25/120
 - 4s - loss: 0.0212 - acc: 0.9930 - val_loss: 0.1297 - val_acc: 0.9683
Epoch 26/120
 - 4s - loss: 0.0206 - acc: 0.9932 - val_loss: 0.1344 - val_acc: 0.9687
Epoch 27/120
 - 4s - loss: 0.0203 - acc: 0.9932 - val_loss: 0.1495 - val_acc: 0.9692
Epoch 28/120
 - 4s - loss: 0.0200 - acc: 0.9935 - val_loss: 0.1305 - val_acc: 0.9696
Epoch 29/120
 - 4s - loss: 0.0181 - acc: 0.9938 - val_loss: 0.1436 - val_acc: 0.9685
Epoch 30/120
 - 4s - loss: 0.0167 - acc: 0.9944 - val_loss: 0.1377 - val_acc: 0.9673

 - 7s - loss: 0.0072 - acc: 0.9977 - val_loss: 0.1146 - val_acc: 0.9823
Epoch 111/120
 - 7s - loss: 0.0059 - acc: 0.9981 - val_loss: 0.1531 - val_acc: 0.9741
Epoch 112/120
 - 7s - loss: 0.0065 - acc: 0.9977 - val_loss: 0.1157 - val_acc: 0.9805
Epoch 113/120
 - 7s - loss: 0.0061 - acc: 0.9980 - val_loss: 0.1638 - val_acc: 0.9717
Epoch 114/120
 - 7s - loss: 0.0055 - acc: 0.9983 - val_loss: 0.1301 - val_acc: 0.9794
Epoch 115/120
 - 7s - loss: 0.0041 - acc: 0.9985 - val_loss: 0.1501 - val_acc: 0.9773
Epoch 116/120
 - 5s - loss: 0.0066 - acc: 0.9976 - val_loss: 0.1437 - val_acc: 0.9757
Epoch 117/120
 - 4s - loss: 0.0064 - acc: 0.9979 - val_loss: 0.1508 - val_acc: 0.9780
Epoch 118/120
 - 4s - loss: 0.0066 - acc: 0.9978 - val_loss: 0.1489 - val_acc: 0.9769
Epoch 119/120
 - 4s - loss: 0.0065 - acc: 0.9980 - val_loss: 0.1378 - val_acc: 0.9766
Epoch 120/120
 - 4s - loss: 0.0059 - acc: 0.9982 - val_loss: 0.1255 - val_acc: 0.9789
# 可视化指标
fig = plt.figure()
plt.subplot(2,1,1)
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('Model Accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='lower right')

plt.subplot(2,1,2)
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model Loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='upper right')
plt.tight_layout()

plt.show()

在这里插入图片描述

# 保存模型
import os
import tensorflow.gfile as gfile

save_dir = "/content/drive/model/v1/"

if gfile.Exists(save_dir):
    gfile.DeleteRecursively(save_dir)
gfile.MakeDirs(save_dir)

model_name = 'keras_traffic_1.h5'
model_path = os.path.join(save_dir, model_name)
model.save(model_path)
print('Saved trained model at %s ' % model_path)
Saved trained model at /content/drive/model/v1/keras_traffic_1.h5 
# 加载模型
from keras.models import load_model

traffic_model = load_model(model_path)
# 统计模型在测试集上的分类结果
loss_and_metrics = traffic_model.evaluate(X_test_normalized, Y_test, verbose=2,batch_size=256)
    
print("Test Loss: {}".format(loss_and_metrics[0]))
print("Test Accuracy: {}%".format(loss_and_metrics[1]*100))

predicted_classes = traffic_model.predict_classes(X_test_normalized)

correct_indices = np.nonzero(predicted_classes == y_test)[0]
incorrect_indices = np.nonzero(predicted_classes != y_test)[0]
print("Classified correctly count: {}".format(len(correct_indices)))
print("Classified incorrectly count: {}".format(len(incorrect_indices)))
Test Loss: 0.22923571624080058
Test Accuracy: 96.88836103380434%
Classified correctly count: 12237
Classified incorrectly count: 393

2.3层Con2D MaxPooling2D+1层Flatten层+2层Dense

from keras.models import Sequential
from keras.layers import Dense,Dropout,Flatten
from keras.layers import Conv2D,MaxPooling2D

model2 = Sequential()

# layers1
model2.add(Conv2D(filters=32,
                 kernel_size=(3,3),
                 input_shape=X_train_normalized.shape[1:],
                 activation="relu"))
model2.add(MaxPooling2D(pool_size=(2,2)))

# layers2
model2.add(Conv2D(filters=64,
                 kernel_size=(3,3),
                 activation="relu"))
model2.add(MaxPooling2D(pool_size=(2,2)))

# layers3
model2.add(Conv2D(filters=64,
                 kernel_size=(3,3),
                 activation="relu"))
model2.add(MaxPooling2D(pool_size=(2,2)))

# flattern
model2.add(Flatten())

# Dense
model2.add(Dense(512,activation="relu"))


# Dense
model2.add(Dense(n_classes,activation="softmax"))
# 查看模型的结构
model2.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_3 (Conv2D)            (None, 30, 30, 32)        320       
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 15, 15, 32)        0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 13, 13, 64)        18496     
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 6, 6, 64)          0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 4, 4, 64)          36928     
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 2, 2, 64)          0         
_________________________________________________________________
flatten_2 (Flatten)          (None, 256)               0         
_________________________________________________________________
dense_3 (Dense)              (None, 512)               131584    
_________________________________________________________________
dense_4 (Dense)              (None, 43)                22059     
=================================================================
Total params: 209,387
Trainable params: 209,387
Non-trainable params: 0
_________________________________________________________________
# 编译模型
model2.compile(loss="categorical_crossentropy",
              metrics=["accuracy"],
              optimizer="adam")
# 训练模型
history2 = model2.fit(X_train_normalized,
                    Y_train,
                    batch_size=256,
                    epochs=120,
                    verbose=2,
                    validation_data=(X_valid_normalized,Y_valid))                    
Train on 51690 samples, validate on 4410 samples
Epoch 1/120
 - 2s - loss: 1.3340 - acc: 0.6319 - val_loss: 0.6667 - val_acc: 0.8041
Epoch 2/120
 - 2s - loss: 0.2375 - acc: 0.9308 - val_loss: 0.4388 - val_acc: 0.8762
Epoch 3/120
 - 2s - loss: 0.1122 - acc: 0.9669 - val_loss: 0.3823 - val_acc: 0.8964
Epoch 4/120
 - 2s - loss: 0.0769 - acc: 0.9775 - val_loss: 0.3509 - val_acc: 0.9036
Epoch 5/120
 - 2s - loss: 0.0508 - acc: 0.9857 - val_loss: 0.3434 - val_acc: 0.9088
Epoch 6/120
 - 2s - loss: 0.0420 - acc: 0.9874 - val_loss: 0.3413 - val_acc: 0.9204
Epoch 7/120
 - 2s - loss: 0.0297 - acc: 0.9912 - val_loss: 0.3266 - val_acc: 0.9243
Epoch 8/120
 - 2s - loss: 0.0198 - acc: 0.9943 - val_loss: 0.3150 - val_acc: 0.9256
Epoch 9/120
 - 2s - loss: 0.0205 - acc: 0.9940 - val_loss: 0.3463 - val_acc: 0.9200
Epoch 10/120
 - 2s - loss: 0.0174 - acc: 0.9947 - val_loss: 0.3045 - val_acc: 0.9236
Epoch 11/120
 - 2s - loss: 0.0194 - acc: 0.9943 - val_loss: 0.3561 - val_acc: 0.9184
Epoch 12/120
 - 2s - loss: 0.0109 - acc: 0.9968 - val_loss: 0.3475 - val_acc: 0.9259
Epoch 13/120
 - 2s - loss: 0.0116 - acc: 0.9964 - val_loss: 0.3646 - val_acc: 0.9270
Epoch 14/120
 - 2s - loss: 0.0127 - acc: 0.9958 - val_loss: 0.3486 - val_acc: 0.9295
Epoch 15/120
 - 2s - loss: 0.0090 - acc: 0.9975 - val_loss: 0.3234 - val_acc: 0.9297
Epoch 16/120
 - 2s - loss: 0.0118 - acc: 0.9962 - val_loss: 0.4056 - val_acc: 0.9236
Epoch 17/120
 - 2s - loss: 0.0082 - acc: 0.9976 - val_loss: 0.3282 - val_acc: 0.9345
Epoch 18/120
 - 2s - loss: 0.0066 - acc: 0.9982 - val_loss: 0.3327 - val_acc: 0.9381
Epoch 19/120
 - 2s - loss: 0.0089 - acc: 0.9971 - val_loss: 0.3708 - val_acc: 0.9338
Epoch 20/120
 - 2s - loss: 0.0109 - acc: 0.9967 - val_loss: 0.3011 - val_acc: 0.9397
Epoch 21/120
 - 2s - loss: 0.0030 - acc: 0.9993 - val_loss: 0.3431 - val_acc: 0.9406
Epoch 22/120
 - 2s - loss: 0.0121 - acc: 0.9965 - val_loss: 0.3113 - val_acc: 0.9413
Epoch 23/120
 - 2s - loss: 0.0068 - acc: 0.9981 - val_loss: 0.3195 - val_acc: 0.9431
Epoch 24/120
 - 2s - loss: 0.0021 - acc: 0.9995 - val_loss: 0.3079 - val_acc: 0.9447
Epoch 25/120
 - 2s - loss: 0.0080 - acc: 0.9973 - val_loss: 0.2953 - val_acc: 0.9408
Epoch 26/120
 - 2s - loss: 0.0086 - acc: 0.9971 - val_loss: 0.3595 - val_acc: 0.9315
Epoch 27/120
 - 2s - loss: 0.0105 - acc: 0.9967 - val_loss: 0.3286 - val_acc: 0.9342
Epoch 28/120
 - 2s - loss: 0.0039 - acc: 0.9990 - val_loss: 0.3357 - val_acc: 0.9363
Epoch 29/120
 - 2s - loss: 0.0038 - acc: 0.9992 - val_loss: 0.2930 - val_acc: 0.9440
Epoch 30/120
 - 2s - loss: 0.0053 - acc: 0.9985 - val_loss: 0.2465 - val_acc: 0.9537

Epoch 110/120
 - 2s - loss: 6.2377e-04 - acc: 1.0000 - val_loss: 0.4051 - val_acc: 0.9519
Epoch 111/120
 - 2s - loss: 6.2377e-04 - acc: 1.0000 - val_loss: 0.4071 - val_acc: 0.9524
Epoch 112/120
 - 2s - loss: 6.2377e-04 - acc: 1.0000 - val_loss: 0.4111 - val_acc: 0.9524
Epoch 113/120
 - 2s - loss: 6.2377e-04 - acc: 1.0000 - val_loss: 0.4106 - val_acc: 0.9524
Epoch 114/120
 - 2s - loss: 6.2377e-04 - acc: 1.0000 - val_loss: 0.4115 - val_acc: 0.9522
Epoch 115/120
 - 2s - loss: 6.2377e-04 - acc: 1.0000 - val_loss: 0.4134 - val_acc: 0.9519
Epoch 116/120
 - 2s - loss: 6.2377e-04 - acc: 1.0000 - val_loss: 0.4157 - val_acc: 0.9510
Epoch 117/120
 - 2s - loss: 6.2377e-04 - acc: 1.0000 - val_loss: 0.4181 - val_acc: 0.9515
Epoch 118/120
 - 2s - loss: 6.2376e-04 - acc: 1.0000 - val_loss: 0.4188 - val_acc: 0.9517
Epoch 119/120
 - 2s - loss: 6.2376e-04 - acc: 1.0000 - val_loss: 0.4199 - val_acc: 0.9517
Epoch 120/120
 - 2s - loss: 6.2376e-04 - acc: 1.0000 - val_loss: 0.4196 - val_acc: 0.9510
# 可视化指标
fig = plt.figure()
plt.subplot(2,1,1)
plt.plot(history2.history['acc'])
plt.plot(history2.history['val_acc'])
plt.title('Model Accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='lower right')

plt.subplot(2,1,2)
plt.plot(history2.history['loss'])
plt.plot(history2.history['val_loss'])
plt.title('Model Loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='upper right')
plt.tight_layout()

plt.show()

在这里插入图片描述

# 保存模型
import os
import tensorflow.gfile as gfile

save_dir = "/content/drive/model/v2/"

if gfile.Exists(save_dir):
    gfile.DeleteRecursively(save_dir)
gfile.MakeDirs(save_dir)

model_name = 'keras_traffic_2.h5'
model_path = os.path.join(save_dir, model_name)

model2.save(model_path)
print('Saved trained model at %s ' % model_path)
Saved trained model at /content/drive/model/v2/keras_traffic_2.h5 
# 加载模型
from keras.models import load_model

traffic_model = load_model(model_path)
# 统计模型在测试集上的分类结果
loss_and_metrics = traffic_model.evaluate(X_test_normalized, Y_test, verbose=2,batch_size=256)
    
print("Test Loss: {}".format(loss_and_metrics[0]))
print("Test Accuracy: {}%".format(loss_and_metrics[1]*100))

predicted_classes = traffic_model.predict_classes(X_test_normalized)

correct_indices = np.nonzero(predicted_classes == y_test)[0]
incorrect_indices = np.nonzero(predicted_classes != y_test)[0]
print("Classified correctly count: {}".format(len(correct_indices)))
print("Classified incorrectly count: {}".format(len(incorrect_indices)))
Test Loss: 0.6938359957692742
Test Accuracy: 93.08788600368152%
Classified correctly count: 11757
Classified incorrectly count: 873

3.对上述模型进行改进 增加2层Dropout层

from keras.models import Sequential
from keras.layers import Dense,Dropout,Flatten
from keras.layers import Conv2D,MaxPooling2D

model3 = Sequential()

# layers1
model3.add(Conv2D(filters=32,
                 kernel_size=(3,3),
                 input_shape=X_train_normalized.shape[1:],
                 activation="relu"))
model3.add(MaxPooling2D(pool_size=(2,2)))

# layers2
model3.add(Conv2D(filters=64,
                 kernel_size=(3,3),
                 activation="relu"))
model3.add(MaxPooling2D(pool_size=(2,2)))

# Dropout
model3.add(Dropout(0.25))

# layers3
model3.add(Conv2D(filters=64,
                 kernel_size=(3,3),
                 activation="relu"))
model3.add(MaxPooling2D(pool_size=(2,2)))

# flattern
model3.add(Flatten())

# Dense
model3.add(Dense(512,activation="relu"))

# Dropout
model3.add(Dropout(0.5))

# Dense
model3.add(Dense(n_classes,activation="softmax"))
model3.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_6 (Conv2D)            (None, 30, 30, 32)        320       
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 15, 15, 32)        0         
_________________________________________________________________
conv2d_7 (Conv2D)            (None, 13, 13, 64)        18496     
_________________________________________________________________
max_pooling2d_6 (MaxPooling2 (None, 6, 6, 64)          0         
_________________________________________________________________
dropout_3 (Dropout)          (None, 6, 6, 64)          0         
_________________________________________________________________
conv2d_8 (Conv2D)            (None, 4, 4, 64)          36928     
_________________________________________________________________
max_pooling2d_7 (MaxPooling2 (None, 2, 2, 64)          0         
_________________________________________________________________
flatten_3 (Flatten)          (None, 256)               0         
_________________________________________________________________
dense_5 (Dense)              (None, 512)               131584    
_________________________________________________________________
dropout_4 (Dropout)          (None, 512)               0         
_________________________________________________________________
dense_6 (Dense)              (None, 43)                22059     
=================================================================
Total params: 209,387
Trainable params: 209,387
Non-trainable params: 0
_________________________________________________________________
# 编译模型
model3.compile(loss="categorical_crossentropy",
              metrics=["accuracy"],
              optimizer="adam")
# 训练模型
history3 = model3.fit(X_train_normalized,
                    Y_train,
                    batch_size=256,
                    epochs=120,
                    verbose=2,
                    validation_data=(X_valid_normalized,Y_valid))                    
Train on 51690 samples, validate on 4410 samples
Epoch 1/120
 - 2s - loss: 1.8536 - acc: 0.4729 - val_loss: 0.6255 - val_acc: 0.8197
Epoch 2/120
 - 2s - loss: 0.4513 - acc: 0.8609 - val_loss: 0.3030 - val_acc: 0.9082
Epoch 3/120
 - 2s - loss: 0.2391 - acc: 0.9261 - val_loss: 0.2413 - val_acc: 0.9272
Epoch 4/120
 - 2s - loss: 0.1676 - acc: 0.9480 - val_loss: 0.2010 - val_acc: 0.9401
Epoch 5/120
 - 2s - loss: 0.1248 - acc: 0.9610 - val_loss: 0.1635 - val_acc: 0.9519
Epoch 6/120
 - 2s - loss: 0.1006 - acc: 0.9692 - val_loss: 0.1346 - val_acc: 0.9619
Epoch 7/120
 - 2s - loss: 0.0848 - acc: 0.9736 - val_loss: 0.1464 - val_acc: 0.9553
Epoch 8/120
 - 2s - loss: 0.0731 - acc: 0.9765 - val_loss: 0.1513 - val_acc: 0.9526
Epoch 9/120
 - 2s - loss: 0.0664 - acc: 0.9785 - val_loss: 0.1365 - val_acc: 0.9580
Epoch 10/120
 - 2s - loss: 0.0590 - acc: 0.9810 - val_loss: 0.1404 - val_acc: 0.9553
Epoch 11/120
 - 2s - loss: 0.0493 - acc: 0.9838 - val_loss: 0.1258 - val_acc: 0.9646
Epoch 12/120
 - 2s - loss: 0.0446 - acc: 0.9859 - val_loss: 0.1265 - val_acc: 0.9642
Epoch 13/120
 - 2s - loss: 0.0389 - acc: 0.9874 - val_loss: 0.1258 - val_acc: 0.9678
Epoch 14/120
 - 2s - loss: 0.0385 - acc: 0.9872 - val_loss: 0.1220 - val_acc: 0.9669
Epoch 15/120
 - 2s - loss: 0.0348 - acc: 0.9889 - val_loss: 0.1200 - val_acc: 0.9662
Epoch 16/120
 - 2s - loss: 0.0354 - acc: 0.9883 - val_loss: 0.0980 - val_acc: 0.9728
Epoch 17/120
 - 2s - loss: 0.0316 - acc: 0.9897 - val_loss: 0.1222 - val_acc: 0.9680
Epoch 18/120
 - 2s - loss: 0.0280 - acc: 0.9909 - val_loss: 0.1069 - val_acc: 0.9703
Epoch 19/120
 - 2s - loss: 0.0285 - acc: 0.9911 - val_loss: 0.1080 - val_acc: 0.9703
Epoch 20/120
 - 2s - loss: 0.0240 - acc: 0.9915 - val_loss: 0.1049 - val_acc: 0.9714
Epoch 21/120
 - 2s - loss: 0.0248 - acc: 0.9921 - val_loss: 0.1137 - val_acc: 0.9703
Epoch 22/120
 - 2s - loss: 0.0248 - acc: 0.9922 - val_loss: 0.0974 - val_acc: 0.9728
Epoch 23/120
 - 2s - loss: 0.0213 - acc: 0.9930 - val_loss: 0.1277 - val_acc: 0.9633
Epoch 24/120
 - 2s - loss: 0.0232 - acc: 0.9924 - val_loss: 0.0980 - val_acc: 0.9751
Epoch 25/120
 - 2s - loss: 0.0208 - acc: 0.9932 - val_loss: 0.1124 - val_acc: 0.9739
Epoch 26/120
 - 2s - loss: 0.0183 - acc: 0.9939 - val_loss: 0.1076 - val_acc: 0.9726
Epoch 27/120
 - 2s - loss: 0.0205 - acc: 0.9928 - val_loss: 0.0998 - val_acc: 0.9735
Epoch 28/120
 - 2s - loss: 0.0167 - acc: 0.9944 - val_loss: 0.1231 - val_acc: 0.9701
Epoch 29/120
 - 2s - loss: 0.0188 - acc: 0.9940 - val_loss: 0.1025 - val_acc: 0.9737
Epoch 30/120
 - 2s - loss: 0.0164 - acc: 0.9947 - val_loss: 0.1189 - val_acc: 0.9701

Epoch 110/120
 - 2s - loss: 0.0069 - acc: 0.9980 - val_loss: 0.0982 - val_acc: 0.9805
Epoch 111/120
 - 2s - loss: 0.0086 - acc: 0.9976 - val_loss: 0.0940 - val_acc: 0.9816
Epoch 112/120
 - 2s - loss: 0.0057 - acc: 0.9982 - val_loss: 0.0958 - val_acc: 0.9807
Epoch 113/120
 - 2s - loss: 0.0066 - acc: 0.9981 - val_loss: 0.1343 - val_acc: 0.9780
Epoch 114/120
 - 2s - loss: 0.0059 - acc: 0.9982 - val_loss: 0.1218 - val_acc: 0.9796
Epoch 115/120
 - 2s - loss: 0.0074 - acc: 0.9979 - val_loss: 0.1266 - val_acc: 0.9771
Epoch 116/120
 - 2s - loss: 0.0063 - acc: 0.9981 - val_loss: 0.1001 - val_acc: 0.9819
Epoch 117/120
 - 2s - loss: 0.0063 - acc: 0.9980 - val_loss: 0.0945 - val_acc: 0.9819
Epoch 118/120
 - 2s - loss: 0.0082 - acc: 0.9976 - val_loss: 0.1334 - val_acc: 0.9751
Epoch 119/120
 - 2s - loss: 0.0073 - acc: 0.9976 - val_loss: 0.1341 - val_acc: 0.9735
Epoch 120/120
 - 2s - loss: 0.0072 - acc: 0.9977 - val_loss: 0.1004 - val_acc: 0.9794
# 可视化指标
fig = plt.figure()
plt.subplot(2,1,1)
plt.plot(history3.history['acc'])
plt.plot(history3.history['val_acc'])
plt.title('Model Accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='lower right')

plt.subplot(2,1,2)
plt.plot(history3.history['loss'])
plt.plot(history3.history['val_loss'])
plt.title('Model Loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='upper right')
plt.tight_layout()

plt.show()

在这里插入图片描述

# 保存模型
import os
import tensorflow.gfile as gfile

save_dir = "/content/drive/model/v3/"

if gfile.Exists(save_dir):
    gfile.DeleteRecursively(save_dir)
gfile.MakeDirs(save_dir)

model_name = 'keras_traffic_3.h5'
model_path = os.path.join(save_dir, model_name)

model3.save(model_path)
print('Saved trained model at %s ' % model_path)
Saved trained model at /content/drive/model/v3/keras_traffic_3.h5 
# 加载模型
from keras.models import load_model

traffic_model = load_model(model_path)
# 统计模型在测试集上的分类结果
loss_and_metrics = traffic_model.evaluate(X_test_normalized, Y_test, verbose=2,batch_size=256)
    
print("Test Loss: {}".format(loss_and_metrics[0]))
print("Test Accuracy: {}%".format(loss_and_metrics[1]*100))

predicted_classes = traffic_model.predict_classes(X_test_normalized)

correct_indices = np.nonzero(predicted_classes == y_test)[0]
incorrect_indices = np.nonzero(predicted_classes != y_test)[0]
print("Classified correctly count: {}".format(len(correct_indices)))
print("Classified incorrectly count: {}".format(len(incorrect_indices)))
Test Loss: 0.2989197100426409
Test Accuracy: 95.88281867056732%
Classified correctly count: 12110
Classified incorrectly count: 520

4.2层卷积池化层+1层展开层+3层全连接层

from keras.models import Sequential
from keras.layers import Dense,Dropout,Flatten
from keras.layers import Conv2D,MaxPooling2D

model4 = Sequential()

# layers1
model4.add(Conv2D(filters=32,
                 kernel_size=(3,3),
                 input_shape=X_train_normalized.shape[1:],
                 activation="relu"))
model4.add(MaxPooling2D(pool_size=(2,2)))

# layers2
model4.add(Conv2D(filters=64,
                 kernel_size=(3,3),
                 activation="relu"))
model4.add(MaxPooling2D(pool_size=(2,2)))



# flattern
model4.add(Flatten())

# Dense
model4.add(Dense(512,activation="relu"))

# Dense
model4.add(Dense(100,activation="relu"))

# Dense
model4.add(Dense(n_classes,activation="softmax"))
# 查看模型的结构
model4.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_9 (Conv2D)            (None, 30, 30, 32)        320       
_________________________________________________________________
max_pooling2d_8 (MaxPooling2 (None, 15, 15, 32)        0         
_________________________________________________________________
conv2d_10 (Conv2D)           (None, 13, 13, 64)        18496     
_________________________________________________________________
max_pooling2d_9 (MaxPooling2 (None, 6, 6, 64)          0         
_________________________________________________________________
flatten_4 (Flatten)          (None, 2304)              0         
_________________________________________________________________
dense_7 (Dense)              (None, 512)               1180160   
_________________________________________________________________
dense_8 (Dense)              (None, 100)               51300     
_________________________________________________________________
dense_9 (Dense)              (None, 43)                4343      
=================================================================
Total params: 1,254,619
Trainable params: 1,254,619
Non-trainable params: 0
_________________________________________________________________
# 编译模型
model4.compile(loss="categorical_crossentropy",
              metrics=["accuracy"],
              optimizer="adam")
# 训练模型
history4 = model4.fit(X_train_normalized,
                    Y_train,
                    batch_size=256,
                    epochs=120,
                    verbose=2,
                    validation_data=(X_valid_normalized,Y_valid))                    
Train on 51690 samples, validate on 4410 samples
Epoch 1/120
 - 3s - loss: 0.9466 - acc: 0.7433 - val_loss: 0.4214 - val_acc: 0.8746
Epoch 2/120
 - 2s - loss: 0.1339 - acc: 0.9632 - val_loss: 0.3042 - val_acc: 0.9152
Epoch 3/120
 - 2s - loss: 0.0681 - acc: 0.9809 - val_loss: 0.2988 - val_acc: 0.9170
Epoch 4/120
 - 2s - loss: 0.0414 - acc: 0.9885 - val_loss: 0.3027 - val_acc: 0.9125
Epoch 5/120
 - 2s - loss: 0.0244 - acc: 0.9934 - val_loss: 0.2754 - val_acc: 0.9308
Epoch 6/120
 - 2s - loss: 0.0198 - acc: 0.9944 - val_loss: 0.2664 - val_acc: 0.9299
Epoch 7/120
 - 2s - loss: 0.0139 - acc: 0.9963 - val_loss: 0.3340 - val_acc: 0.9197
Epoch 8/120
 - 2s - loss: 0.0150 - acc: 0.9958 - val_loss: 0.2918 - val_acc: 0.9336
Epoch 9/120
 - 2s - loss: 0.0166 - acc: 0.9948 - val_loss: 0.2496 - val_acc: 0.9399
Epoch 10/120
 - 2s - loss: 0.0070 - acc: 0.9979 - val_loss: 0.2661 - val_acc: 0.9365
Epoch 11/120
 - 2s - loss: 0.0060 - acc: 0.9984 - val_loss: 0.3019 - val_acc: 0.9290
Epoch 12/120
 - 2s - loss: 0.0063 - acc: 0.9984 - val_loss: 0.2890 - val_acc: 0.9347
Epoch 13/120
 - 2s - loss: 0.0076 - acc: 0.9979 - val_loss: 0.2583 - val_acc: 0.9363
Epoch 14/120
 - 2s - loss: 0.0124 - acc: 0.9962 - val_loss: 0.3169 - val_acc: 0.9240
Epoch 15/120
 - 2s - loss: 0.0097 - acc: 0.9970 - val_loss: 0.2796 - val_acc: 0.9429
Epoch 16/120
 - 2s - loss: 0.0088 - acc: 0.9975 - val_loss: 0.3084 - val_acc: 0.9320
Epoch 17/120
 - 2s - loss: 0.0093 - acc: 0.9972 - val_loss: 0.3469 - val_acc: 0.9281
Epoch 18/120
 - 2s - loss: 0.0029 - acc: 0.9991 - val_loss: 0.2834 - val_acc: 0.9388
Epoch 19/120
 - 2s - loss: 9.1336e-04 - acc: 0.9998 - val_loss: 0.2210 - val_acc: 0.9535
Epoch 20/120
 - 2s - loss: 3.3410e-04 - acc: 0.9999 - val_loss: 0.2416 - val_acc: 0.9546
Epoch 21/120
 - 2s - loss: 4.8947e-05 - acc: 1.0000 - val_loss: 0.2395 - val_acc: 0.9556
Epoch 22/120
 - 2s - loss: 2.7690e-05 - acc: 1.0000 - val_loss: 0.2449 - val_acc: 0.9556
Epoch 23/120
 - 2s - loss: 2.0403e-05 - acc: 1.0000 - val_loss: 0.2481 - val_acc: 0.9556
Epoch 24/120
 - 2s - loss: 1.6893e-05 - acc: 1.0000 - val_loss: 0.2507 - val_acc: 0.9553
Epoch 25/120
 - 2s - loss: 1.4042e-05 - acc: 1.0000 - val_loss: 0.2534 - val_acc: 0.9553
Epoch 26/120
 - 2s - loss: 1.2080e-05 - acc: 1.0000 - val_loss: 0.2556 - val_acc: 0.9556
Epoch 27/120
 - 2s - loss: 1.0456e-05 - acc: 1.0000 - val_loss: 0.2577 - val_acc: 0.9551
Epoch 28/120
 - 2s - loss: 9.1271e-06 - acc: 1.0000 - val_loss: 0.2589 - val_acc: 0.9560
Epoch 29/120
 - 2s - loss: 8.0037e-06 - acc: 1.0000 - val_loss: 0.2610 - val_acc: 0.9549
Epoch 30/120
 - 2s - loss: 7.1773e-06 - acc: 1.0000 - val_loss: 0.2630 - val_acc: 0.9560

Epoch 110/120
 - 2s - loss: 1.2023e-07 - acc: 1.0000 - val_loss: 0.3727 - val_acc: 0.9533
Epoch 111/120
 - 2s - loss: 1.2010e-07 - acc: 1.0000 - val_loss: 0.3727 - val_acc: 0.9537
Epoch 112/120
 - 2s - loss: 1.1994e-07 - acc: 1.0000 - val_loss: 0.3716 - val_acc: 0.9535
Epoch 113/120
 - 2s - loss: 1.1984e-07 - acc: 1.0000 - val_loss: 0.3747 - val_acc: 0.9535
Epoch 114/120
 - 2s - loss: 1.1972e-07 - acc: 1.0000 - val_loss: 0.3758 - val_acc: 0.9535
Epoch 115/120
 - 2s - loss: 1.1968e-07 - acc: 1.0000 - val_loss: 0.3763 - val_acc: 0.9533
Epoch 116/120
 - 2s - loss: 1.1957e-07 - acc: 1.0000 - val_loss: 0.3789 - val_acc: 0.9528
Epoch 117/120
 - 2s - loss: 1.1953e-07 - acc: 1.0000 - val_loss: 0.3783 - val_acc: 0.9531
Epoch 118/120
 - 2s - loss: 1.1947e-07 - acc: 1.0000 - val_loss: 0.3796 - val_acc: 0.9528
Epoch 119/120
 - 2s - loss: 1.1943e-07 - acc: 1.0000 - val_loss: 0.3805 - val_acc: 0.9535
Epoch 120/120
 - 2s - loss: 1.1942e-07 - acc: 1.0000 - val_loss: 0.3811 - val_acc: 0.9533
# 可视化指标
fig = plt.figure()
plt.subplot(2,1,1)
plt.plot(history4.history['acc'])
plt.plot(history4.history['val_acc'])
plt.title('Model Accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='lower right')

plt.subplot(2,1,2)
plt.plot(history4.history['loss'])
plt.plot(history4.history['val_loss'])
plt.title('Model Loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='upper right')
plt.tight_layout()

plt.show()

在这里插入图片描述

# 保存模型
import os
import tensorflow.gfile as gfile

save_dir = "/content/drive/model/v4/"

if gfile.Exists(save_dir):
    gfile.DeleteRecursively(save_dir)
gfile.MakeDirs(save_dir)

model_name = 'keras_traffic_4.h5'
model_path = os.path.join(save_dir, model_name)

model4.save(model_path)
print('Saved trained model at %s ' % model_path)

Saved trained model at /content/drive/model/v4/keras_traffic_4.h5 
# 加载模型
from keras.models import load_model

traffic_model = load_model(model_path)
# 统计模型在测试集上的分类结果
loss_and_metrics = traffic_model.evaluate(X_test_normalized, Y_test, verbose=2,batch_size=256)
    
print("Test Loss: {}".format(loss_and_metrics[0]))
print("Test Accuracy: {}%".format(loss_and_metrics[1]*100))

predicted_classes = traffic_model.predict_classes(X_test_normalized)

correct_indices = np.nonzero(predicted_classes == y_test)[0]
incorrect_indices = np.nonzero(predicted_classes != y_test)[0]
print("Classified correctly count: {}".format(len(correct_indices)))
print("Classified incorrectly count: {}".format(len(incorrect_indices)))
Test Loss: 0.61759698928016
Test Accuracy: 93.18289788016608%
Classified correctly count: 11769
Classified incorrectly count: 861

5.对上述模型进行改进增加3层Dropout层

# 改进模型
from keras.models import Sequential
from keras.layers import Dense,Dropout,Flatten
from keras.layers import Conv2D,MaxPooling2D

model5 = Sequential()

# layers1
model5.add(Conv2D(filters=32,
                 kernel_size=(3,3),
                 input_shape=X_train_normalized.shape[1:],
                 activation="relu"))
model5.add(MaxPooling2D(pool_size=(2,2)))



# layers2
model5.add(Conv2D(filters=64,
                 kernel_size=(3,3),
                 activation="relu"))
model5.add(MaxPooling2D(pool_size=(2,2)))

# Dropout
model5.add(Dropout(0.5))

# flattern
model5.add(Flatten())

# Dense
model5.add(Dense(512,activation="relu"))

# Dropout
model5.add(Dropout(0.5))

# Dense
model5.add(Dense(100,activation="relu"))

# Dropout
model5.add(Dropout(0.5))

# Dense
model5.add(Dense(n_classes,activation="softmax"))
model5.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_11 (Conv2D)           (None, 30, 30, 32)        320       
_________________________________________________________________
max_pooling2d_10 (MaxPooling (None, 15, 15, 32)        0         
_________________________________________________________________
conv2d_12 (Conv2D)           (None, 13, 13, 64)        18496     
_________________________________________________________________
max_pooling2d_11 (MaxPooling (None, 6, 6, 64)          0         
_________________________________________________________________
dropout_5 (Dropout)          (None, 6, 6, 64)          0         
_________________________________________________________________
flatten_5 (Flatten)          (None, 2304)              0         
_________________________________________________________________
dense_10 (Dense)             (None, 512)               1180160   
_________________________________________________________________
dropout_6 (Dropout)          (None, 512)               0         
_________________________________________________________________
dense_11 (Dense)             (None, 100)               51300     
_________________________________________________________________
dropout_7 (Dropout)          (None, 100)               0         
_________________________________________________________________
dense_12 (Dense)             (None, 43)                4343      
=================================================================
Total params: 1,254,619
Trainable params: 1,254,619
Non-trainable params: 0
_________________________________________________________________
# 编译模型
model5.compile(loss="categorical_crossentropy",
              metrics=["accuracy"],
              optimizer="adam")
# 训练模型
history5 = model5.fit(X_train_normalized,
                    Y_train,
                    batch_size=256,
                    epochs=120,
                    verbose=2,
                    validation_data=(X_valid_normalized,Y_valid))                    

Train on 51690 samples, validate on 4410 samples
Epoch 1/120
 - 3s - loss: 2.0740 - acc: 0.4183 - val_loss: 0.5267 - val_acc: 0.8590
Epoch 2/120
 - 2s - loss: 0.5917 - acc: 0.8149 - val_loss: 0.2372 - val_acc: 0.9395
Epoch 3/120
 - 2s - loss: 0.3512 - acc: 0.8919 - val_loss: 0.1723 - val_acc: 0.9508
Epoch 4/120
 - 2s - loss: 0.2560 - acc: 0.9214 - val_loss: 0.1449 - val_acc: 0.9583
Epoch 5/120
 - 2s - loss: 0.2048 - acc: 0.9382 - val_loss: 0.1341 - val_acc: 0.9590
Epoch 6/120
 - 2s - loss: 0.1682 - acc: 0.9497 - val_loss: 0.1183 - val_acc: 0.9655
Epoch 7/120
 - 2s - loss: 0.1406 - acc: 0.9573 - val_loss: 0.1070 - val_acc: 0.9698
Epoch 8/120
 - 2s - loss: 0.1288 - acc: 0.9604 - val_loss: 0.1037 - val_acc: 0.9667
Epoch 9/120
 - 2s - loss: 0.1175 - acc: 0.9641 - val_loss: 0.1056 - val_acc: 0.9685
Epoch 10/120
 - 2s - loss: 0.1016 - acc: 0.9690 - val_loss: 0.0935 - val_acc: 0.9696
Epoch 11/120
 - 2s - loss: 0.0940 - acc: 0.9709 - val_loss: 0.0856 - val_acc: 0.9741
Epoch 12/120
 - 2s - loss: 0.0896 - acc: 0.9729 - val_loss: 0.0901 - val_acc: 0.9741
Epoch 13/120
 - 2s - loss: 0.0857 - acc: 0.9744 - val_loss: 0.0879 - val_acc: 0.9719
Epoch 14/120
 - 2s - loss: 0.0803 - acc: 0.9757 - val_loss: 0.0894 - val_acc: 0.9723
Epoch 15/120
 - 2s - loss: 0.0740 - acc: 0.9782 - val_loss: 0.1040 - val_acc: 0.9705
Epoch 16/120
 - 2s - loss: 0.0708 - acc: 0.9796 - val_loss: 0.1073 - val_acc: 0.9683
Epoch 17/120
 - 2s - loss: 0.0652 - acc: 0.9800 - val_loss: 0.0791 - val_acc: 0.9753
Epoch 18/120
 - 2s - loss: 0.0660 - acc: 0.9801 - val_loss: 0.0794 - val_acc: 0.9751
Epoch 19/120
 - 2s - loss: 0.0571 - acc: 0.9828 - val_loss: 0.0925 - val_acc: 0.9705
Epoch 20/120
 - 2s - loss: 0.0573 - acc: 0.9828 - val_loss: 0.0692 - val_acc: 0.9791
Epoch 21/120
 - 2s - loss: 0.0532 - acc: 0.9834 - val_loss: 0.0726 - val_acc: 0.9785
Epoch 22/120
 - 2s - loss: 0.0548 - acc: 0.9837 - val_loss: 0.0824 - val_acc: 0.9741
Epoch 23/120
 - 2s - loss: 0.0529 - acc: 0.9841 - val_loss: 0.0747 - val_acc: 0.9789
Epoch 24/120
 - 2s - loss: 0.0544 - acc: 0.9839 - val_loss: 0.0710 - val_acc: 0.9776
Epoch 25/120
 - 2s - loss: 0.0470 - acc: 0.9859 - val_loss: 0.0687 - val_acc: 0.9789
Epoch 26/120
 - 2s - loss: 0.0459 - acc: 0.9860 - val_loss: 0.0710 - val_acc: 0.9769
Epoch 27/120
 - 2s - loss: 0.0482 - acc: 0.9859 - val_loss: 0.0718 - val_acc: 0.9764
Epoch 28/120
 - 2s - loss: 0.0456 - acc: 0.9862 - val_loss: 0.0744 - val_acc: 0.9812
Epoch 29/120
 - 2s - loss: 0.0469 - acc: 0.9861 - val_loss: 0.0883 - val_acc: 0.9762
Epoch 30/120
 - 2s - loss: 0.0445 - acc: 0.9863 - val_loss: 0.0757 - val_acc: 0.9757

Epoch 110/120
 - 2s - loss: 0.0217 - acc: 0.9941 - val_loss: 0.0600 - val_acc: 0.9832
Epoch 111/120
 - 2s - loss: 0.0243 - acc: 0.9936 - val_loss: 0.0716 - val_acc: 0.9800
Epoch 112/120
 - 2s - loss: 0.0204 - acc: 0.9941 - val_loss: 0.0740 - val_acc: 0.9794
Epoch 113/120
 - 2s - loss: 0.0178 - acc: 0.9948 - val_loss: 0.0669 - val_acc: 0.9828
Epoch 114/120
 - 2s - loss: 0.0184 - acc: 0.9949 - val_loss: 0.0569 - val_acc: 0.9850
Epoch 115/120
 - 2s - loss: 0.0224 - acc: 0.9943 - val_loss: 0.0703 - val_acc: 0.9791
Epoch 116/120
 - 2s - loss: 0.0203 - acc: 0.9944 - val_loss: 0.0762 - val_acc: 0.9789
Epoch 117/120
 - 2s - loss: 0.0182 - acc: 0.9945 - val_loss: 0.0705 - val_acc: 0.9798
Epoch 118/120
 - 2s - loss: 0.0204 - acc: 0.9944 - val_loss: 0.0603 - val_acc: 0.9819
Epoch 119/120
 - 2s - loss: 0.0188 - acc: 0.9950 - val_loss: 0.0544 - val_acc: 0.9848
Epoch 120/120
 - 2s - loss: 0.0198 - acc: 0.9947 - val_loss: 0.0593 - val_acc: 0.9857
# 可视化指标
fig = plt.figure()
plt.subplot(2,1,1)
plt.plot(history5.history['acc'])
plt.plot(history5.history['val_acc'])
plt.title('Model Accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='lower right')

plt.subplot(2,1,2)
plt.plot(history5.history['loss'])
plt.plot(history5.history['val_loss'])
plt.title('Model Loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='upper right')
plt.tight_layout()

plt.show()

在这里插入图片描述

# 保存模型
import os
import tensorflow.gfile as gfile

save_dir = "/content/drive/model/v5/"

if gfile.Exists(save_dir):
    gfile.DeleteRecursively(save_dir)
gfile.MakeDirs(save_dir)

model_name = 'keras_traffic_5.h5'
model_path = os.path.join(save_dir, model_name)

model5.save(model_path)
print('Saved trained model at %s ' % model_path)

Saved trained model at /content/drive/model/v5/keras_traffic_5.h5 
# 加载模型
from keras.models import load_model

traffic_model = load_model(model_path)
# 统计模型在测试集上的分类结果
loss_and_metrics = traffic_model.evaluate(X_test_normalized, Y_test, verbose=2,batch_size=256)
    
print("Test Loss: {}".format(loss_and_metrics[0]))
print("Test Accuracy: {}%".format(loss_and_metrics[1]*100))

predicted_classes = traffic_model.predict_classes(X_test_normalized)

correct_indices = np.nonzero(predicted_classes == y_test)[0]
incorrect_indices = np.nonzero(predicted_classes != y_test)[0]
print("Classified correctly count: {}".format(len(correct_indices)))
print("Classified incorrectly count: {}".format(len(incorrect_indices)))
Test Loss: 0.15594110083032578
Test Accuracy: 96.76167853182493%
Classified correctly count: 12221
Classified incorrectly count: 409

补充单张图片预测

# 加载模型
from keras.models import load_model

traffic_model = load_model(model_path)
# 加载预测图片

import os
import cv2
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import numpy as np

image_path = "/content/drive/image/"
filenames = os.listdir(image_path)

X_predict = []

for filename in filenames:
  if filename.endswith(".jpg"):
    img = cv2.imread(image_path+filename)
    img = cv2.resize(img,(32,32),cv2.INTER_LINEAR)
    X_predict.append(img)
    plt.imshow(img)

# 封装数据预处理的方法
import cv2

def preprocess_features(X, equalize_hist=True):
    normalized_X = []
    for i in range(len(X)):
        # Convert from RGB to YUV
        yuv_img = cv2.cvtColor(X[i], cv2.COLOR_RGB2YUV)
        yuv_img_v = X[i][:, :, 0]
        # equalizeHist
        yuv_img_v = cv2.equalizeHist(yuv_img_v)
        # expand_dis
        yuv_img_v = np.expand_dims(yuv_img_v, 2)
        normalized_X.append(yuv_img_v)
    # normalize
    normalized_X = np.array(normalized_X, dtype=np.float32)
    normalized_X = (normalized_X-128)/128
    # normalized_X /= (np.std(normalized_X, axis=0) + np.finfo('float32').eps)
    return normalized_X
# 对数据进行处理
X_predict_normalized = preprocess_features(X_predict)
# 数据维度及数据类型
print(X_predict_normalized.shape,type(X_predict_normalized))
# 模型预测
y_predict = traffic_model.predict_classes(X_predict_normalized)
print(id_to_name(y_predict[0]))
基于卷积神经网络的交通标志识别系统的设计与实现 随着智能交通技术的发展,自动识别交通标志变得越来越重要,它不仅有助于自动驾驶汽车的安全,还可以增强驾驶辅助系统的功能和提升交通流量的管理。(一)搭建卷积神经网络(CNN),搭建的卷积神经网络卷积层与池化层反复堆叠,然后经过全连接层,最后用softmax映射为每个类别的概率,概率最大的即为识别结果。构建一个高效的交通标志识别系统,能够在不同环境和复杂条件下准确识别28种类型的交通标志,通过web页面上传图片,点击【点击预测】进行识别,在网页上将识别结果显示。增加训练数据的多样性和丰富性。 阅读详情

相关推荐

基于Tensorflow卷积神经网络(CNN)交通标志识别系统

一、项目背景与意义随着智能交通系统(ITS)的快速发展,交通标志的自动识别成为了提高交通安全性和交通管理效率的重要手段。传统的交通标志识别方法往往依赖于人工设计和提取特征,这种方式不仅耗时耗力,而且难以应对复杂多变的交通环境。因此,利用深度学习技术,特别是卷积神经网络(CNN),实现交通标志的自动识别和分类,具有重要的实际应用价值。二、技术方案本项目采用Tensorflow深度学习框架,结合卷积神经网络(CNN),设计并实现了一个交通标志识别系统。具体方案如下:数据准备。

qq1744828575的博客 1246

基于深度学习,机器学习,卷积神经网络,OpenCV的交通标志识别交通标志检测

在本文中,使用Python编程语言和库Keras和OpenCV建立CNN模型,成功地对交通标志分类器进行分类,准确率达96%。开发了一款交通标志识别应用程序,该应用程序具有图片识别和网络摄像头实时识别两种工作方式。 写作目的 近年来,计算机视觉是现代技术发展的一个方向。这个方向的主要任务是对照片或摄像机中的物体进行分类。在通常的问题中,使用基于案例的机器学习方法来解决。本文介绍了利用机器学习算法进行计算机视觉在交通标志识别中的应用。路标是一种外形固定的扁平人造物体。道路标志识别算法应用于两个实际问题。第一个

9637

卷积神经网络案例程序源代码 CNN-Tensorflow交通标志识别 CNN训练人脸识别 CNN通感图像配准 kddcup 数据两层CNN入设检测 Tensorflow,OpenCY实现的CNN车

CNN卷积神经网络案例程序源代码合集matlab/Python等 1、深入理解CNN(包括CNN的过程显示和前向后向推倒,以及CNN的应用举例。) 2、kerasttensorflow CNN(CNN_python程序集.rar) 3、CNN-Tensorflow交通标志识别 4、CNN手写识别deao(采用了MatConvNet工具箱,matlab2015以下版本有可能出错) 5、CNN(nat lab源程序)(手写数字识别mat lab程序,包含详细的讲解) 6、GA优化CNN python 7、can

m0_68308718的博客 1266

神经网络之路标识别

参考了一下链接的博客 https://yq.aliyun.com/articles/67167 https://www.jianshu.com/p/d8feaddc7bdf 成功实现了神经网络模型的训练和路标图片的识别。文末附有源码。1、环境问题原作者在docker里配有环境,所以为了简便我直接用作者的环境。yum install docker docker search waleedka

梦之马 2503

基于卷积神经网络的交通标志识别系统(通过TensorFlow构建LeNet-5模型,并使用GTSRB德国交通标志数据集进行训练)

数据集共包含50,000多张图像,分为训练集和测试集,每张图片都标注了对应的交通标志类型、位置和大小信息。基于卷积神经网络的交通标志识别系统,通过TensorFlow构建LeNet-5模型,并使用GTSRB德国交通标志数据集进行训练,实现了较高的识别准确率和较强的鲁棒性。因此,利用深度学习技术,特别是卷积神经网络(CNN),实现交通标志的自动识别和分类,具有重要的实际应用价值。交通标志识别系统旨在通过图像处理和机器学习技术,自动识别道路上的交通标志,从而辅助驾驶员或自动驾驶系统做出正确的决策。

白话机器学习 1193

高效CNN识别交通标志

本文提出一种新型卷积神经网络,用于交通标志识别。相比先前方法,该网络参数减少27%,计算效率显著提升,采用Leaky ReLU激活函数降低乘法运算次数,并通过可视化分析表明网络聚焦于象形图信息。在德国交通标志基准数据集上准确率达99.51%,超越人类性能。

n4o5p6q7r的博客 753

Python交通标志识别基于卷积神经网络的保姆级教程(Tensorflow)

TensorFlow2.X 搭建卷积神经网络(CNN),实现交通标志识别。搭建的卷积神经网络是类似VGG的结构(卷积层与池化层反复堆叠,然后经过全连接层,最后用softmax映射为每个类别的概率,概率最大的即为识别结果)。

qq_34184505的博客 1万+

基于CNN和GTSRB的交通标志识别实战

德国交通标志识别基准(German Traffic Sign Recognition Benchmark,简称GTSRB)数据集是由德国不莱梅大学的研究人员构建,旨在为研究者提供一个标准的数据集,以便于开发和评估交通标志识别算法。该数据集包含了多种交通标志的图像,覆盖了实际行驶环境中可能遇到的所有主要类型,被广泛用于计算机视觉和机器学习领域的研究。GTSRB的构建目的是为了促进计算机视觉领域的研究,特别是在图像识别与分类任务中。

weixin_42465332的博客 1096

交通标志识别系统-卷积神经网络

使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Django框架,开发网页端操作平台,实现用户上传一张图片识别其名称。

子午的博客 1109

基于CNN深度学习的交通标志识别系统设计与实现

图像分类是计算机视觉中的核心任务之一,其目标是将一张图像分配到预定义的类别中。以交通标志识别为例,系统需要将输入的图像识别为“限速30”、“禁止停车”或“直行”等具体类别。图像分类流程通常包括以下几个步骤:图像输入:获取原始图像数据,通常为RGB三通道图像。预处理:包括归一化、尺寸调整、色彩空间转换等。特征提取:使用卷积神经网络提取图像的高层语义特征。分类决策:通过全连接层和分类器(如Softmax)将特征映射到类别标签。输出结果:返回分类结果及其置信度。

weixin_28729843的博客 970

MATLAB CNN交通标志识别:完整的项目指南与实战

卷积神经网络(CNN)是一种深度学习架构,它在图像识别、视频分析、自然语言处理等领域中取得了巨大的成功。CNN的核心思想是通过卷积层提取输入数据的特征,这使得它特别适用于处理具有网格状拓扑结构的数据。在图像识别中,CNN能够自动且有效地学习空间层次结构。MATLAB深度学习工具箱是MathWorks公司推出的一款强大的深度学习开发环境。它提供了一系列函数和应用来设计、训练和部署深度神经网络。它支持GPU加速,能够显著提高训练和预测速度。

weixin_30700095的博客 301

使用卷积神经网络识别交通标志

什么是卷积神经网络 以下解释来源于ujjwalkarn的技术博客: 卷积神经网络(ConvNets 或者 CNNs)属于神经网络的范畴,在图像识别和分类领域具有高效的能力。卷积神经网络可以成功识别人脸、物体和交通信号,从而为机器人和自动驾驶汽车提供视力。 在上图中,卷积神经网络可以识别场景,也可以提供相关的标签,比如“桥梁”、“火车”和“网球”;而下图展示了卷积神经网络可以用来识别日常物体、人和...

实验楼--动手做实验,轻松学IT! 3847

VS2015+C++实战:手把手教你用海康MVS里的Demo搞定多相机同步采图与保存

本文详细解析了在VS2015+C++环境下,利用海康威视MVS工业相机SDK实现多相机同步采图与保存的全流程。从环境准备、SDK选择到多相机初始化、同步采图方案,再到异常处理与性能优化,提供了实战技巧和代码示例,帮助开发者快速掌握工业相机二次开发的核心技术。

weixin_29170327的博客 280

用CNN算法对交通标志进行识别的步骤是什么?

使用卷积神经网络(CNN)对交通标志进行识别主要包括以下步骤:

weixin_70682362的博客 1090

Qualcomm工具的使用

简介   由于我们公司主要是以高通平台为主,所以工具的使用是必不可少的,包括QPST、QRCT3、QXDM、QDART等。   高通工具顾名思义就是,对于高通平台的软件开发进行软件的烧录,软件的调试,软件的Log的抓取和分析过程,像我们平常用的大致就是烧版本、改NV、制作QCN、然后校准、强发强收等操作。 QPST   QPST主要是用来做一些参数的配置,包括EFS文件的编辑,QCN的导入和备份与...

Jimmy 2万+

AutoModelForCausalLM 加载失败:flash_attn 缺失的三种解决方案

本文针对使用AutoModelForCausalLM加载大语言模型时因缺失flash_attn依赖而报错的问题,提供了三种实用解决方案。最推荐通过修改模型配置文件或代码动态指定注意力实现为“eager”模式来绕过检查,也介绍了临时修改库源码的应急方法,并解释了flash_attn的作用及正确安装指南。

html8的博客 269

【Tensorflow】基于卷积神经网络(CNN)交通标志图像识别系统(完整系统源码+数据库+开发笔记+详细部署教程+启动教程)✅

深度学习框架使用TensorFlow或PyTorch作为深度学习框架,构建和训练卷积神经网络模型,支持高效的计算和灵活的模型设计。卷积神经网络(CNN)应用CNN技术进行图像分类和特征提取,利用多层卷积、池化和全连接层提升模型的识别能力。数据增强技术采用图像增强技术(如旋转、缩放、裁剪等)扩展训练数据集,提升模型的鲁棒性和泛化能力。计算机视觉算法集成计算机视觉算法(如边缘检测、图像分割等)提高交通标志的检测精度,辅助识别过程。用户界面开发。

qq_64605578的博客 1939

JavaFx之集成FontAwesomeFX与JFoenix(十五)

本文详细介绍了如何在JavaFx项目中同时集成JFoenix和FontAwesomeFX,以创建现代化、美观的桌面应用界面。通过Maven依赖配置、动态代码创建和FXML静态声明两种方式,演示了如何将JFoenix的Material Design控件与FontAwesomeFX的丰富矢量图标完美结合,并提供了实战案例展示如何构建一个功能完善的现代化工具栏。

pepsi的博客 437

95%准确率!CNN交通标志识别系统开源

本项目实现了一个基于CNN的交通标志识别系统,使用Keras框架构建神经网络模型,训练准确率达95%。系统包含完整的开发流程:从数据预处理、模型训练到图形界面开发,支持用户上传图片自动识别交通标志。项目详细介绍了环境搭建步骤(Anaconda+Pycharm)、数据集获取方式以及两种运行模式:使用预训练模型或自定义训练模型。代码已开源在GitHub和Gitee平台,适合深度学习初学者学习实践。系统兼容Windows和Mac平台,提供了详细的配置说明和开发文档。

灯火不休时 1274

【AI智能体】Coze 搭建个人旅游规划助手实战详解

本文将详细介绍如何使用Coze平台搭建个人旅游规划助手。首先概述了AI智能体如何简化传统复杂任务的开发流程,然后重点介绍了Coze工作流的作用和核心节点类型(包括大模型、插件、知识库等)。通过实际操作演示,从创建智能体到配置多级工作流,逐步实现旅游规划功能:解析用户输入时间地点、查询必玩景点、获取景点详细信息等。该教程展示了如何利用Coze的可视化编排能力,即使非技术人员也能快速构建专业级AI应用。最终呈现的旅游助手可提供天气查询、行程建议等一站式服务。

Hello, New World! 2113

ArcMap新手必看:Shape属性中的点ZM值到底是什么?如何快速处理

本文深入解析ArcMap中Shape属性中的点ZM值,揭示其在GIS数据中的隐藏维度作用,包括Z值(高程值)和M值(测量值)。针对ZM值可能引发的服务发布问题,提供三种高效处理方案,帮助新手快速掌握数据导入时的ZM值管控策略及精准去除方法。

weixin_42561476的博客 431

基于CNN卷积神经网络交通标志识别系统【源码47期】

本文介绍了一个基于MATLAB的交通标志识别系统,采用卷积神经网络(CNN)实现。系统包含模型训练和GUI交互两大模块:训练模块使用112×112×3的彩色图像输入,构建含卷积、批归一化等层的6分类CNN网络,经25轮SGDM优化训练后保存模型;GUI界面支持用户选择BMP图像进行实时识别,并显示分类结果及测试集整体准确率(平均80%)。系统具有操作简便、识别准确的特点,适用于教学演示,未来可通过扩充数据集、优化网络结构进一步提升性能。提供完整MATLAB源码及技术支持服务。

2401_87395509的博客 394

Robot Framework 7.0 报告解析

本文深入解析 Robot Framework 7.0 新增的 JSON 报告功能,手把手教你如何从 output.xml 转换为结构清晰的 output.json,并通过 Python 脚本提取关键测试指标。文章附完整示例、命令、解析脚本,支持导出为 CSV 和 Markdown,方便接入可视化看板、群通知和 CI 流程。适用于测试自动化、质量平台建设和回归趋势分析场景。

点点寒彬的博客 264

基于python深度学习的交通标志图像识别设计与实现,卷积神经网络(CNN)作为主要架构

数据集里面的图像具有不同大小,光照条件,遮挡情况下的43种不同交通标志符号,图像的成像情况与你实际在真实环境中不同时间路边开车走路时看到的交通标志的情形非常相似。训练集包括大约39,000个图像,而测试集大约有12,000个图像。图像不能保证是固定的尺寸,标志不一定在每个图像中都是居中。每个图像包含实际交通标志周围10%左右的边界。对于图像的成像亮度通过直方图均衡化(Histogram equalization)可以轻松的调整深度学习的卷积网络真的对图像的识别有很好的效果。

weixin_49081159的博客 1901

YOLOv13改进策略【Neck】| GSConv+Slim Neck:混合深度可分离卷积和标准卷积的轻量化网络设计

实时检测器架构的轻量级设计GsConv。

Limiiiing的博客 91

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【交通标志识别】深度学习CNN交通标志识别【含GUI Matlab源码 XYXZ003期】

深度学习CNN交通标志识别 完整代码,包运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版)或下载付费资源,可赠送奶茶价版付费专栏指定代码1份; 663

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: 【比赛篇】TinyMind人民币面值 - 热身赛
下一篇: 【实战】深度学习构建人脸面部表情识别系统
mind_programmonkey
mind_programmonkey 领域专家: 算法与数据结构技术领域 领域专家: 算法与数据结构技术领域
博客等级 码龄9年 4435粉丝 1111原创
评论 80
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mind_programmonkey

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值