简介
TensorFlow是由Google团队开发的一个开源深度学习框架,完全基于Python语言设计。它的初衷是以最简单的方式实现机器学习和深度学习的概念,结合了计算代数的优化技术,使计算许多数学表达式变得简单。
优势:
- 强大的计算能力,支持多种硬件和分布式计算
- 灵活的数据流模型,便于构建复杂的模型
- 丰富的 社区资源和生态系统
tf.keras库
该库是一个高阶api库,提供了很多训练模型时需要使用的工具
tf.keras.models.Sequential:用于顺序地堆叠模型的各个层。
tf.keras.layers.Dense:用于定义全连接层。
tf.keras.layers.Flatten:用于将多维数组转换为一维数组。
tf.keras.losses:提供了各种损失函数。
tf.keras.optimizers:提供了优化器。
tf.keras.metrics:提供了评估指标,如准确率、精确率等
构建模型的方式
- Sequential 模型:使用 tf.keras.Sequential 类可以按顺序堆叠层来构建模型。这是一种简单的模型构建方式,适用于层之间是线性关系的情况
- 函数式 API:使用函数式 API 可以构建更复杂、具有分支和合并的模型结构。这种方式允许你创建具有多个输入和输出的模型
- 子类化模型:通过继承 tf.keras.Model 类,并自定义 init 和 call 方法来构建模型。这种方式提供了更大的灵活性,可自定义模型的计算图
使用Sequential 构建模型
import tensorflow as tf
# Sequential 模型
model = tf.keras.models.Sequential([# tf.keras.layers.Dense 构建全连接层 64表示数据类型unit64 relu表示激活函数tf.keras.layers.Dense(64,activation="relu",input_shape=(784,)),tf.keras.layers.Dense(64,activation="relu"),tf.keras.layers.Dense(10,activation="softmax"),
])# 编译模型
model.compile(optimizer="adam", # 指定优化器loss="sparse_categorical_crossentropy", # 指定损失函数metrics=['accuracy'] # 指定评估指标)
- 开始训练
# 开始训练
history = model.fit(train_data_x, # 训练数据集validation_data = test_data_x, # 验证集epochs=10 # 根据需要设置训练轮数
)model.evaluate(test_data_y) # 使用测试集测试模型
这样可以降低测试集的损失和收敛情况,以保证模型不容易过拟合
拿到代码之后修改算法的几种方案
- 第一种:多加几层卷积层、池化层和全连接层
tf.teras.Sequential([layers.lambda((lambda x : tf_fn(process_base64_image,x,fn_output_signaturetf.TensorSpec(shape=(int(img_height),int(img_width),3),dtype=tf.float32))),name="image_decode_png"),layers.ConV2D(32,(3,3),activation='relu'),layers.MaxPooling2D(2,2),layers.ConV2D(64,(3,3),activation='relu'),layers.MaxPooling2D(2,2),layers.ConV2D(128,(3,3),activation='relu')layers.Flatten(),layers.Dense(128,activation='relu'),layers.Dense(class_nums,activation="softmax")
])
- 第二种:使用vgg网络
from tensorflow.keras.applications.vgg16 import VGG16
# 构建vgg16网络并使其预置参数冻结
base_model = VGG16(weights="imagenet",include_top=False,input_shape=(int(img_height),int(image_width,3)))
for layer in base_model.layers:layer.trainable = Falseinput_layer = base_model.input # 获取vgg的输入层
x = layers.Flatten()(input_layer)
x = layers.Dense(128,activation='relu')(x)
outputs = layers.Dense(class_nums,activation="softmax")(x)# 构建完整的模型
tf.keras.Sequential([layers.lambda(),base_model,outputs
])
- 第三种:使用残差网络
from tensorflow.keras.applications.resnet50 import ResNet50
# 构建ResNet50模型并使其预置参数冻结base_model = ResNet50(weights='imagenet',include_top=False,input_shape=(int(img_height),int(img_width),3))
for layer in base_model.layers:layer.trainable = Falsex = base_model.output
x = layers.GlobalAveragePoolMax2D()(x)
x = layers.Dense(1024,activation='relu')(x)
output = layers.Dense(class_nums,activation='sotfmax')(x)# 构建完整模型
model = tf.keras.Sequential([layers.lambda(),base_model,output
])
模型导出
# 模型导出
import pytz
from datetime import datetime
model_version = datetime.now(pytz.timezone("Asia/Shanghai")).strftime("%Y%m%d%H%M%S")tf.keras.models.save_model(model,f'/model/slot1/{model_version}',overwrite=True)
模型的使用(部署)
导出模型之后就需要使用这个模型,一共有两种方法来使用这个模型
- TensotFlow-Serving
- 使用tf自带的包加载
本帖只讲解TensorFlow-Serving使用模型的方式
TensorFlow-Serving是一种灵活的高性能服务系统,适用于机器学习模型,专为生产环境而设计。TensotFlow Serving 可以轻松部署新算法和实验,同时保持相同的服务器架构和构。TensorFlow-Serving提供与TensorFlow模型的开箱即用集成,但可以轻松扩展以提供类型的模型和数据。
重点:通过api部署
TensorFlow中的图像预处理
有一些图像预处理的方法是万能通用的:
-
归一化处理
将像素值缩放到0到1之间,或者-1到1之间,以消除由于光照条件不同而导致的亮度差异。这可以通过减去所有像素值的平均值,然后除以标准差来实现 -
数据增强
通过旋转、翻转、平移、裁剪等操作来增加数据集的大小,从而提高模型的泛化能力。
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator# 创建一个ImageDataGenerator对象,设置旋转、翻转、平移等操作
datagen = ImageDataGenerator(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' # 填充新创建像素的方法
)# 加载图片
img = tf.keras.preprocessing.image.load_img('R.jpg')
x = tf.keras.preprocessing.image.img_to_array(img)
x = x.reshape((1,) + x.shape)# 使用ImageDataGenerator生成增强后的图片
i = 0
for batch in datagen.flow(x, batch_size=1):i += 1if i > 20: # 生成20张增强后的图片breakimage = tf.keras.preprocessing.image.array_to_img(batch[0])image.save('save/augmented_image_' + str(i) + '.jpg')
图片处理方式及其理由
- 将图像转换为灰度图
理由:将彩色图像转为灰度图像,可以减少数据量,简化计算,降低图像处理的复杂度,提高图像的处理速度和准确性。
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
- 增强图像对比度
理由: 图像对比度提高,图像中的物体边缘和细节就会变得容易识别,从而提高图像识别和分析的准确性
alpha = 1.5
beta = 0
img = cv2.convertScaleAbs(gray_img, alpha=alpha, beta=beta)
- 锐化图像
理由:锐化图像可以增强图像的边缘和细节,提高图像的清晰度和对比度,从而可能提高模型准确度。
kernel = np.array([[0, -1, 0], [-1, 5,-1], [0, -1, 0]])
img = cv2.filter2D(img, -1, kernel)
软件调试流程
进入到Kimage软件之后就是点击设备 (从左往右数第三个)
点击比赛使用的设备
点击回原点
移动点位,将画板移动到笔的正下方,笔尖轻触画纸
调整完毕后,点击第二个按钮进入主流程
点击初始位置,改变画笔下降高度为刚刚轻触在纸上的高度 速度调到50
进入MVVIEWER软件 网口配置好之后连接摄像头 在连接的同时调整亮度,保证在软件中看的清楚图像的画面
打开图像识别客户端 查看配置可以看到图像识别客户端所在的网口 是2网段,所以工控机和相机连接的网口也一定是要2网段
在自己电脑运行虚拟机 并且在浏览器中进入大数据平台
在图像检测客户端中点击开始 运行训练模式
相机会拍摄四张照片
接着人工截取四个工件并标记合格与不合格
点击提交(提交前要更换下一张纸)
训练完成后就可以在云平台查看标注的图片数据 也可以用程序根据接口
访问查找数据