話題のChatGPTが思っていたより便利だった件について(画像分類・異常検知)
イキサツ
ちょっとした頼まれごとで,料理画像とそれ以外を分類するプログラムを頼まれた.よくある頼まれごとだね!
今回はOne Class SVMという異常検知器を用いて画像を正常or異常を判断していきます(手法の詳細は調べてね).
ChatGPTとの出会い
異常検知の手法は決まったけど,どんな「画像の特徴量」が必要なのか?
また,それを抽出して異常検知するプログラムを作成せねば…
調査に時間かかって,実装は一瞬の面倒な作業だこれ!!
作業自体に面白みがあまりないのと,そんなに時間をかけたくなかったので最近話題のChatGPTを試すついでに作業を投げてみました.
プログラムと結果
ChatGPTとAzalea(私)のやり取りは,ちょっと長いので一番下に付録としてつけておきます.実際に得られたプログラムがこちら!
import os
import numpy as np
import cv2
from sklearn import svm
def extract_features(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = np.concatenate((cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=5), cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=5)), axis=1)
return edges.flatten()
# 画像のサイズを揃える
img_size = (64, 64)
# 学習用画像を読み込む
train_imgs = []
train_folder = 'train_images'
for filename in os.listdir(train_folder):
img = cv2.imread(os.path.join(train_folder, filename))
img = cv2.resize(img, img_size)
train_imgs.append(extract_features(img))
# One-Class SVMのモデルを訓練する
clf = svm.OneClassSVM(kernel='linear', nu=0.1)
clf.fit(train_imgs)
# 異常検知を行う
test_folder = 'test_images'
for filename in os.listdir(test_folder):
test_img = cv2.imread(os.path.join(test_folder, filename))
test_img = cv2.resize(test_img, img_size)
test_features = extract_features(test_img)
score = clf.decision_function([test_features])[0]
if score < 0:
print("{}: 異常画像".format(filename))
else:
print("{}: 正常画像".format(filename))
おぉ~!それっぽい!!
すごいぞChatGPT!!!
このプログラムに画像を投入した結果がこちら.
おぉ!ちゃんとできてる!!すごい!!!
ChatGPTえらい!
まとめ
今回は話題のAIツールであるChatGPTを使った簡単な画像分類を行いました.本作業のように,知識はあって方針は決まるが細かな作業があったり,時間がかかる作業は任せて活用するのが良い‼
皆様も様々な技術を活用してみてくださいね.
付録 : ChatGPTとの実際のやり取り
Azalea 「One class SVMで画像の異常検知を行うプログラムを書いて」
ChatGPT 「います。一般的に、One-Class SVMは外れ値検知タスクに使用されます。画像の異常検知には、この手法を使用することができます。以下は、Pythonで実装する方法の例です。」
import numpy as np
import cv2
from sklearn import svm
# 画像から特徴量を抽出する関数
def extract_features(img):
# 画像をグレースケールに変換
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 特徴量として縦・横方向のエッジを抽出
edges = np.concatenate((cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=5), cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=5)), axis=1)
return edges.flatten()
# 学習用画像を読み込む
train_imgs = []
for i in range(1, 11):
img = cv2.imread('train_{}.jpg'.format(i))
train_imgs.append(extract_features(img))
# One-Class SVMのモデルを訓練する
clf = svm.OneClassSVM(kernel='linear', nu=0.1)
clf.fit(train_imgs)
# 異常検知を行う
test_img = cv2.imread('test.jpg')
test_features = extract_features(test_img)
# スコアを算出する
score = clf.decision_function([test_features])[0]
# スコアが負の数であれば異常と判定する
if score < 0:
print("異常画像")
else:
print("正常画像")
ChatGPT「このプログラムでは、画像の特徴量として縦・横方向のエッジを抽出しています。 One-Class SVMを訓練し、テスト画像の特徴量からスコアを算出します。スコアが負の数であれば異常と判定されます。」
Azalea「フォルダ内の全ての画像をOne-class SVMに学習させて」
ChatGPT「、異常検知を行うにはどうすればよいですか?これは次のように実装できます:」
import os
import numpy as np
import cv2
from sklearn import svm
def extract_features(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = np.concatenate((cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=5), cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=5)), axis=1)
return edges.flatten()
# 学習用画像を読み込む
train_imgs = []
train_folder = 'train_images'
for filename in os.listdir(train_folder):
img = cv2.imread(os.path.join(train_folder, filename))
train_imgs.append(extract_features(img))
# One-Class SVMのモデルを訓練する
clf = svm.OneClassSVM(kernel='linear', nu=0.1)
clf.fit(train_imgs)
# 異常検知を行う
test_folder = 'test_images'
for filename in os.listdir(test_folder):
test_img = cv2.imread(os.path.join(test_folder, filename))
test_features = extract_features(test_img)
score = clf.decision_function([test_features])[0]
if score < 0:
print("{}: 異常画像".format(filename))
else:
print("{}: 正常画像".format(filename))
ChatGPT「このプログラムでは、学習用画像が格納されているtrain_imagesフォルダ内の画像と、異常検知を行うtest_imagesフォルダ内の画像をすべて読み込んでいます。各画像から特徴量を抽出し、One-Class SVMを訓練します。最後に、test_imagesフォルダ内の画像に対して異常検知を行い、結果を出力しています。」
Azalea「取り込んだ画像データを同じサイズに圧縮して」
ChatGPT「、学習させることができます。これは次のように実装できます:」
import os
import numpy as np
import cv2
from sklearn import svm
def extract_features(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = np.concatenate((cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=5), cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=5)), axis=1)
return edges.flatten()
# 画像のサイズを揃える
img_size = (64, 64)
# 学習用画像を読み込む
train_imgs = []
train_folder = 'train_images'
for filename in os.listdir(train_folder):
img = cv2.imread(os.path.join(train_folder, filename))
img = cv2.resize(img, img_size)
train_imgs.append(extract_features(img))
# One-Class SVMのモデルを訓練する
clf = svm.OneClassSVM(kernel='linear', nu=0.1)
clf.fit(train_imgs)
# 異常検知を行う
test_folder = 'test_images'
for filename in os.listdir(test_folder):
test_img = cv2.imread(os.path.join(test_folder, filename))
test_img = cv2.resize(test_img, img_size)
test_features = extract_features(test_img)
score = clf.decision_function([test_features])[0]
if score < 0:
print("{}: 異常画像".format(filename))
else:
print("{}: 正常画像".format(filename))
ChatGPT「この例では、画像サイズを(64, 64)に圧縮しています。また、他のサイズにすることもできます。」
この記事が気に入ったらサポートをしてみませんか?