【R言語】クラスタリングで不良品画像を自動でグルーピング
画像データをクラスタリングで自動でグルーピング
カラー画像のデータ以下の図のような構成となっている。
簡単に言うと座標それぞれに対して、RGBの輝度データが入力されている。
画像データの構造・画素・RAWデータについて解説 | だえうホームページ
すなわち画像は[ピクセル数×3]次元のデータである。
画像のサイズをフリーソフトRalpha Image Resizerでサイズを統一した。
またリサイズして次元数を削減する 1枚当たり6063データポイントでテストした。
大量の不良品画像を自動でグルーピングできたので防備メモとしておく。
ちなみにクラスタリングのアルゴリズムはk-means法を使用した。処理時間が早くて便利である。
library(tidyverse) library(jpeg) #jpeg読み込み # パスを指定してディレクトリ・ファイルパスを取得。 path <- "C:/Users/XXXX/YYYYY/ZZZZZ/" imagelistname <- list.files(path,full.names=T)#ファイル名のフルパスを取得する #空のデータフレームを用意して読み込み df_imagefull <- NULL i <- 1 for (i in 1:length(imagelistname)){ imagedata <- load.image(imagelistname[i]) ##フルパスからファイル名のみ抽出。 #古フルパスから60文字目から79文字目がファイル名 (正規表現使えば改善できる) filename <- substring(imagelistname[i],60,79) df_imagedata <- as.data.frame(imagedata) #列名作成 names(df_imagedata)[4] <- filename #読み込んだファイルをジョインしていく if( i==1 ){ df_imagefull <- df_imagedata }else{ df_imagefull <- inner_join(df_imagefull,df_imagedata) } } df_temp <- df_imagefull[4:ncol(df_imagefull)] #行と列を入れ替える 観測値=行数 kmdf <- t(df_temp) #matrixからデータフレームに変換 kmdf_df <- as_data_frame(kmdf) #環境変数が大きければ削除する #rm(df_temp) #rm(df_imagefull) #print(object.size(kmdf_df), units = "auto") #kmeans方は初期値に依存するのでset.seed(123)で乱数を固定した方がよい km <- kmeans(kmdf_df,12) #結果を確認 km$cluster ########################################################## #名前とクラスが対応したリスト(データフレーム)を作成する #空のデータフレーム用意 name <- NA classnum <- NA filenamelist <- data.frame(name,classnum) #name列にファイル名を代入していく i <- 1 for (i in 1:length(imagelistname)){ filenamelist[i,1] <- substring(imagelistname[i],61,80) } #ファイル名とクラスタが対応した表が完成 filenamelist$classnum <- km$cluster #クラスが数字だとわかりにくいのでアルファベットに変換する classnum <- seq(1,12) classmoji <- c("A","B","C","D","E","F","G","H","I","J","K","L") classmojilist <- data.frame(classnum,classmoji) filenamelist <- left_join(filenamelist,classmojilist,by="classnum") #リストを書き出す write.csv(filenamelist,"filelist8class_fullimage2.csv") #エクセルマクロで「ファイル名」から「クラス+ファイル名」に変換。その後考察