見出し画像

話題の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)に圧縮しています。また、他のサイズにすることもできます。」

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