とある技術者の徒然草

生産技術者の適当な日記(統計言語Rに関するメモがメイン)

【R言語】クラスタリングで不良品画像を自動でグルーピング

画像データをクラスタリングで自動でグルーピング


カラー画像のデータ以下の図のような構成となっている。 簡単に言うと座標それぞれに対して、RGBの輝度データが入力されている。
画像データの構造・画素・RAWデータについて解説 | だえうホームページ

f:id:M_taka072:20190206214657p:plain
rgb

すなわち画像は[ピクセル数×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")

#エクセルマクロで「ファイル名」から「クラス+ファイル名」に変換。その後考察