一、项目背景
笔者在2023年做了一个预研型的项目:用AI技术来提高注塑机的效率。简单的说就是优化注塑机工艺参数来减小成型周期。这个项目的意义在于:对于集团来讲,一旦能落地应用,总共1100台注塑机能节约很大的成本。
二、方案过程
2.1 业务调研
2.1.1 工艺机理
注塑机的原理简单来说是将塑料颗粒融化然后推进模具中,冷却成型后即成为塑料件。注塑五大要素:时间、压力、速度、温度、位置。注塑成型工艺与其他高端制造业来讲并不复杂(不像高精度机加工或大型流程工业),但是它的难点是既要满足小批量的灵活性同时保证质量最稳和效率最高,生产一个合格的塑料件不是什么 难事,难的是生产一亿个还能保持高稳定。
2.1.2 数据
公司大部分注塑机是海天的120吨和150吨两种。注塑机本身都有数据接口,能够从中获得数据,但是数据采集系统并没有存储工艺设定值,并且还有一些系统bug。这些bug导致后面一系列问题。
2.2 AI技术选型
这个项目本质上是计算最优工艺参数,既能保证质量又能减小生产周期。我所知有两种AI技术路径:1、深度强化学习 2、深度学习+启发式算法。在前期我是倾向于用深度强化学习,但是这会面对一个非常困难的问题:如何构建注塑机的机理环境。注塑件工艺通常是由moldflow等软件来进行仿真,仿真程序的底层逻辑本质上是复杂的流体力学方程。如果把moldflow作为环境来交互,首先这个工程化的问题我还解决不了,就算能解决,它也仅仅是个仿真,与真实环境还是有一定距离。综合考虑下来放弃了强化学习这条路,采用常规的神经网络+遗传算法的套路来解决。
2.3 数据采集
由于是优化工艺参数的设定值,所以需要收集设定值,初步先收集2个月的数据;质量数据稍微复杂一些,由于车间是采取巡检的方式,每四个小时检验一次,然后将检验结果上传到MES中。
2.4 数据清洗
整个项目中最难的其实就是这一块,绝大部分时间都是在这。简单来说,为了获得工艺参数与成型周期和质量结果的对应数据集,要从各个数据库中把不同维度、粒度的数据整合、拼接、过滤、去重等等操作后才能未给模型训练。由于过程太过复杂这里不再赘述。
2.5 建模
2.5.1 质量模型。 最开始是用神经网络来拟合工艺参数与质量,但是由于质量的数据样本特别少,且其中不合格的样本更少。神经网络在验证集效果不是很理想(因为神经网络模型对数据的数量和质量要求较高,数据不行跑出来的模型绝对不会好)。最终采用随机森林来拟合。
下面附上主要代码:
# pra-quantity 随机森林
data1 = merged_quantity_pra #quantity
data1 = data1.drop("changed", axis=1)
data1 = np.array(data1)
data1 = np.nan_to_num(data1, copy=False)
# 确保 data 是一个二维数组
if len(data1.shape) == 1:
data1 = data1.reshape(-1, 1)
# 提取最后一列数据
Y1 = data1[:, -1]
X1 = data1[:, 0:-1]
train_x, test_x, train_y, test_y = train_test_split(X1, Y1, test_size=0.2)
clf = RandomForestRegressor(n_estimators=100,max_depth=9)
clf.fit(train_x, train_y)
y_pred = clf.predict(test_x)
mse = mean_squared_error(test_y, y_pred)
r_mse = np.sqrt(mse)
print("Mean Squared Error:", mse)
print("ROOT Mean Squared Error:", r_mse)
plt.plot(test_y)
plt.plot(y_pred)
plt.show()
拟合效果:
Y轴为质量分数,1为合格,小于1的情况是有质量问题;
X轴为样本编号。
RMSE:0.014。从这个指标来看,随机森林是非常好的拟合了工艺参数对质量的关系。
2.5.2 成型周期模型。 采用经典的BP神经网络拟合。
对910个样本进行训练,(每小时存储一次工艺参数,有时候会停产几天,两个 月只能收集不到1000条)。
下面附上主要代码:
scaler = MinMaxScaler(feature_range=(0, 1))
scaled = scaler.fit_transform(data)
Y = scaled[:, -1]
X = scaled[:, 0:-1]
train_x, test_x, train_y, test_y = train_test_split(X, Y, test_size=0.2)
model = tf.keras.Sequential()
input = X.shape[1]
model.add(layers.Dense(256, input_shape=(input,)))
model.add(layers.Activation('relu'))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(256, input_shape=(input,)))
model.add(layers.Activation('relu'))
model.add(layers.Dense(256, input_shape=(input,)))
model.add(layers.Activation('relu'))
model.add(layers.Dense(256, input_shape=(input,)))
model.add(layers.Activation('swish'))
model.add(layers.Dense(128, input_shape=(input,)))
model.add(layers.Activation('swish'))
model.add(layers.Dense(1))
model.compile(loss='mean_squared_error', optimizer=Adam())
learning_rate_reduction = ReduceLROnPlateau(monitor='val_loss', patience=10, verbose=1, factor=0.5, min_lr=0.00001)
earlyStop = EarlyStopping(monitor='val_loss', min_delta=0, patience=20, mode='auto', verbose=1,restore_best_weights=True)
history = model.fit(train_x,
train_y,
epochs=500,
batch_size=16,
validation_data=(test_x, test_y),
verbose=2,
shuffle=False,
callbacks=[learning_rate_reduction, earlyStop])
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='test')
pyplot.title('Model loss')
pyplot.ylabel('Loss')
pyplot.xlabel('Epoch')
pyplot.legend()
pyplot.show()
拟合效果:
Y轴为成型周期,X轴为样本编号,RMSE=0.21。
从拟合效果来看,神经网络也是较好的拟合了。特别是异常值33,神经网络对于这种没见过的样本也能有较好的泛化性。
2.5.3 遗传算法
将质量模型和成型周期模型的预测值作为适应度函数,放入遗传算法中进行优化,得到次优解可以看做是优化后的成型周期。这里我用了一个小技巧:先建三个模型,然后去三个预测值的平均值作为计算适应度函数的依据。这个方法可以让预测值更加稳定。
下面附上主要代码
def targe1(p):
costly_function()
p = np.array(p) # 先将入参转成数组
d = np.tile(start_answer_copy, (p.shape[0], 1))
for i in range(len(p)):
for j in range(len(index_list)):
d[i][index_list[j]] = p[i][j]
scaled_b = scaler.transform(d)
test_x = scaled_b[:, 0:-1]
result_pre0 = loaded_model_cycletime_0.predict(test_x)
result_pre1 = loaded_model_cycletime_1.predict(test_x)
result_pre2 = loaded_model_cycletime_2.predict(test_x)
#反归一化
def b_pre(pre):
inv_yhat0 = concatenate((test_x, pre), axis=1)
inv_yhat1 = scaler.inverse_transform(inv_yhat0)
inv_yhat = inv_yhat1[:, -1]
return inv_yhat
avg_pre = (b_pre(result_pre0) + b_pre(result_pre1) + b_pre(result_pre2)) / 3 # 三个模型的预测值求平均cycletime
d0 = d[:, 0:-1]
result_pre_q0 = loaded_model_quantity_0.predict(d0)
result_pre_q1 = loaded_model_quantity_1.predict(d0)
result_pre_q2 = loaded_model_quantity_2.predict(d0)
avg_pre_q = (result_pre_q0 + result_pre_q1 + result_pre_q2) / 3 # 三个模型的预测值求平均quantity分
x = (1 - avg_pre_q) * 10
end_value = avg_pre + exponential_function(x)
return end_value
mode = 'vectorization'
set_run_mode(targe1, 'vectorization')
ga = GA(func=targe1, n_dim=19, size_pop=200, max_iter=100, prob_mut=0.005,
lb=middle_low,
ub=middle_high,
precision=[1e-2, 1e-1, 1, 1, 1, 1, 1, 1, 1, 1e-1, 1e-1, 1e-1, 1, 1, 1,1e-1,1e-1,1,1e-1])
best_x, best_y, = ga.run()
print('best_x:', best_x, '\n', 'best_y:', best_y)
三、验证模型
以上工作完成后,接下来是实际验证。选择了一台注塑机进行实际测试,该机台共有130个参数,但是技术员在实际操作中只会对30个以内的参数进行调整。为了保持机台稳定,我在遗传算法的代码中只设定了15个常用的参数
储料时间 | 开模位置 | 关模四段压力 | 关模四段速度 | 开模一段压力 | 开模一段速度 | 冷却时间 | 托模时间 | 取件时间 | 保压一段压力 | 保压二段时间 | 射出二段位置 | 射出四段位置 | 射出时间 | 转保压位置 |
取件时间 | 保压一段压力 | 保压二段时间 | 射出二段位置 | 射出四段位置 | 射出时间 | 转保压位置 |
,优化后的参数交给技术员进行调整,然后观察效果。
下图是实验之前的成型周期情况:
成型周期为31.5秒
下图是将优化后的参数输入进注塑机后的情况(稳定之后的观测值):
成型周期为31.08秒
从实际结果来看,优化后的工艺参数使得成型周期减少了0.42秒(31.5-31.08),效率提升了1.3%
四、总结
4.1 用两个月的数据训练出的模型能提升1.3%其实是一个不错的结果,如果能采集到更多数据,效率提升10%也是有可能的。
4.2 在之前提到的数据采集系统bug ,其实在数据清洗和数据建模过程中造成了很多麻烦。有的参数取不到,有的参数取出的值是错的,这些非常隐蔽的错误之前没有人发现过,我提出来并询问MES工程师,得到的答复是厂家在下次程序升级时会更正bug 。我在评估数据完整性后得出结论:以目前的数据条件无法继续研究该项目,暂停直到修复bug。
4.3 注塑机的工艺优化其实在学术界已经有了很多成果,不少大学的研究团队在实验注塑机上都取得了不错的成果,但是在实际制造业却鲜有类似的应用,原因大概有两点:1、注塑企业对注塑机在自动化程度关注比较多,很少对其数据有非常深刻的应用。2、企业本身没有算法工程师能挖掘这些数据。
4.4 本项目还可以继续拓展:1、在质量可控的情况下,优化工艺参数减小能耗,2、在质量可控的情况下,优化工艺参数减小原材料消耗。
4.5 对于注塑企业来说,技术员的经验是一笔无形的财富,如果离职,那么他调参数的经验也带走了,新来的员工要大量时间磨合;通过AI技术其实把技术员的经验变成了可量化的模型,哪怕人离职了,他的操作知识还是留在了公司。
4.6 我们公司的注塑环节还有一个难点,就是频繁的换型(切换模具),每次更换都需要技术员调机,根据工艺难度每次需要0.5小时到2小时。通过模型其实可以快速给出工艺参数,节约技术员时间。
最后:从整个项目的过程和结果来看,AI技术在注塑行业大有可为,只要有足够的数据,AI技术能够提升注塑机的效率、节约能耗、节约材料、提高技术员工作效率。