機械学習実装 スポット溶接の品質予測


今日の論文は『 機械学習を活用した抵抗スポット溶接条件 -ナゲット形状関係の整理 』です。

論文の説明

自動車車体での主要な溶接方法であるスポット溶接について、溶接条件と品質の関係を機械学習で予測した例です。

溶接品質とは

溶接部の品質とは強度のことです。強度が低いと車の衝突安全性が低下してしまうので、設計上問題のない強度を確保することが必要です。

しかし、生産現場で強度試験を行うことは稀なので、検査が簡単なほかの指標が用いられています。スポット溶接では溶接部の直径を品質の指標にしていて、ナゲット径と呼ばれています。

溶接条件とは

スポット溶接は鉄板に電流を流して溶接を行う手法なので、電流値や通電する時間を調節して目標の溶接部寸法(ナゲット径)を得ます。

さらに、鉄板を挟む電極の力(加圧力)も主要な条件の一つです。これは、電極の先端が丸くなっているため、電極が鋼板にめり込む量が変化することで鋼板と電極の接触面積が大きくなることが関係しています。


加圧力とナゲット形成の関係:加圧力が大きいと溶接部が形成されにくいので、電流値を大きくして対応する(※引用元:http://www.dengen.co.jp/spold-max/welding_condition/spot/spot.html

鋼板と電極の接触面積が大きくなると、電気抵抗値が低下することが知られています。すると発熱しにくくなるため鋼板が溶けず、溶接部寸法(ナゲット径)も小さくなってしまいます。

データ

P.56に予測する対象のナゲット径のデータがあります。このデータは電流値と通電時間、加圧力の3つの条件を変えて取得したデータです。

加圧力300kgfのときの 電流値とナゲット径の関係: 電流値に比例してナゲット径が大きくなる

グラフを数値に直したファイルを用意して機械学習のプログラムを作成しました。ファイルはこちら。

プログラム

今回は、ナゲット径が3.8mm以上をOKの判定、以下をNGとして分類するモデルを作りました。

モデルは決定木ベースのLightBGMとニューラルネットワークの2つを試しました。

LightGBM

########################  やること
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import lightgbm as lgb
from sklearn.model_selection import *


#################  データ読み込み ########################


data = pd.read_csv(r"ファイルのパス")
# print(data.head())
# print(data.index)

reg_index = data[data['ナゲット径']>4.4].index

data['判定'] = 0
data.loc[reg_index, '判定'] = 1


y = data['判定']
X = data.drop(['判定', 'ナゲット径'], axis=1)

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    test_size=0.2, shuffle=False)


# LightGBM parameters
lgb_clf = lgb.LGBMClassifier(max_depth=5)
lgb_clf.fit(X_train, y_train)
# y_pred = lgb_clf.predict(X_test, num_iteration=gbm.best_iteration)
y_pred = lgb_clf.predict(X_test)


# accuracy
from sklearn.metrics import accuracy_score
acc = accuracy_score(y_pred, y_test)
print(acc)

正答率は92%でした。


ニューラルネットワーク

########################  やること
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.utils import np_utils
import numpy as np

#################  データ読み込み ########################


data = pd.read_csv(r"ファイルのパス")
# print(data.head())
# print(data.index)

reg_index = data[data['ナゲット径']>3.8].index

data['判定'] = 0
data.loc[reg_index, '判定'] = 1


y = data['判定']
X = data.drop(['判定', 'ナゲット径'], axis=1)

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    test_size=0.2, shuffle=False)


####################  モデル作成  ##########################
model = Sequential()
model.add(Dense(4, activation='relu', input_shape=(len(X.columns),)))
model.add(Dense(8, activation='relu'))
model.add(Dense(4, activation='relu'))
model.add(Dense(1))
model.add(Activation('softmax'))
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['acc'])

# train
model.fit(X_train, y_train, epochs=200)
loss, accuracy = model.evaluate(X_test, y_test,batch_size=4)
print(loss, accuracy)

y_pred = model.predict(X_test)
#print(y_pred)

# accuracy
from sklearn.metrics import accuracy_score
acc = accuracy_score(y_pred, y_test)
print(acc)

正答率は52%でした。

以上です。

この記事が気に入ったらサポートをしてみませんか?