Deteksi cacat permukaan otomatis (Automated surface defect detection) dari data gambar adalah kemampuan penting dalam kegiatan manufaktur. Traditional Image Processing berguna dalam memecahkan kelas masalah tertentu. Namun, teknik ini kurang mampu dalam menangani gambar dengan noise, variasi kondisi pencahayaan pada dataset, dan background dengan tekstur yang kompleks. Belakangan ini, Deep Learning telah banyak dieksplorasi untuk digunakan dalam otomatisasi defect detection.
Deteksi cacat berbasis Deep Learning memberikan fleksibilitas dalam hal membuat model network untuk mendeteksi cacat permukaan besi berdasarkan dataset-nya. Selain itu, parameter yang telah dipelajari untuk satu network tersebut dapat digunakan untuk network lain yang serupa untuk memberikan probabilitas keberhasilan yang tinggi ke depannya dalam mendeteksi cacat permukaan pada besi. Selain itu, tidak perlu kita membuat kode khusus lagi untuk melatih berbagai jenis cacat. Data berlabel untuk cacat yang berbeda dengan jaringan yang sesuai menyediakan mekanisme deteksi cacat yang fleksibel secara signifikan.
Defect detection secara tradisional dapat dikerjakan oleh manusia secara langsung, namun hal ini membutuhkan banyak tenaga manusia dengan keahlian yang tersertifikasi/berpengalaman dan juga membutuhkan waktu yang lama untuk mendeteksi seluruh cacat pada permukaan besi di suatu manufacturing site. Dengan menggunakan metode deep learning, perusahaan dapat memangkas biaya tenaga ahli dan mempercepat proses deteksi serta mencegah terjadinya kerugian materiil dan kecelakaan kerja di tempat produksi.
Kegunaan Defect Detection sangat luas dan dapat diterapkan pada banyak bidang industri, namun yang paling utama adalah dapat membantu dalam mengambil keputusan lebih dini apakah perlu dilakukan penggantian pada bagian yang terdeteksi mengalami cacat atau cukup dilakukan maintaining tanpa perlu mengganti keseluruhan bagian yang cacat. Hal ini tentu akan sangat berpengaruh pada besaran biaya yang dikeluarkan nantinya oleh perusahaan.
Target: memprediksi permukaan pipa besi di production/manufacturing site cacat atau tidak features: data gambar cacat permukaan besi
Permasalahan yang coba diselesaikan disini adalah membuat metode/ model deep learning yang dapat membantu mempercepat pekerjaan dalam mendeteksi defect pada permukaan besi.
Data yang digunakan sudah sesuai untuk kebutuhan menjawab business problem di atas, yaitu dataset foto cacat pada permukaan besi. Data foto tersebut sangat berguna untuk men-training model Deep Learning yang dibuat nanti dengan tujuan untuk memprediksi ada cacat pada permukaan besi atau tidak. Data gambar tersebut didapat dari kompetisi yang diselenggarakan di Kaggle dan memuat kumpulan foto cacat pada permukaan besi dengan format .jpg yang akan diconvert menjadi .jpeg/.png. Sumber data: https://www.kaggle.com/c/severstal-steel-defect-detection/data
Output dari project ini adalah sebuah dashboard yang akan menampilkan status kondisi besi yang akan ditest mengalami cacat atau tidak dengan memasukkan data gambar real dalam format .csv ke dalam dashboard tersebut dan akan keluar data berupa klasifikasi data foto permukaan besi mana yang mengalami defect. Kurang lebih seperti ini visualisasi referensi dashborad yang akan dibuat.
Menyiapkan library yang akan digunakan
# Data wrangling
library(tidyverse)
# Image manipulation
library(imager)
# Deep learning
library(keras)
# Model Evaluation
library(caret)
options(scipen = 999)
folder_list <- list.files("train_png/")
head(folder_list)
## [1] "0002cc93b.png" "00031f466.png" "000418bfc.png" "000789191.png"
## [5] "0007a71bf.png" "000a4bcdd.png"
folder_path <- paste0("train_png/", folder_list)
head(folder_path)
## [1] "train_png/0002cc93b.png" "train_png/00031f466.png"
## [3] "train_png/000418bfc.png" "train_png/000789191.png"
## [5] "train_png/0007a71bf.png" "train_png/000a4bcdd.png"
# Get file name
file_name <- map(folder_path,
function(x) paste0(x, list.files(x))
) %>%
unlist()
# first 6 file name
head(file_name)
## [1] "train_png/0002cc93b.png" "train_png/00031f466.png"
## [3] "train_png/000418bfc.png" "train_png/000789191.png"
## [5] "train_png/0007a71bf.png" "train_png/000a4bcdd.png"
tail(file_name)
## [1] "train_png/ffe93442c.png" "train_png/fff0295e1.png"
## [3] "train_png/fff02e9c5.png" "train_png/fffe98443.png"
## [5] "train_png/ffff4eaa8.png" "train_png/ffffd67df.png"
length(file_name)
## [1] 12568
**NOTE: Saya mengalami kendala di bawah ini, format gambar telah saya ubah
#Randomly select image
set.seed(123)
sample_image <- sample(file_name, 6)
# Load image into R
img <- map(sample_image, load.image)
# Plot image
par(mfrow = c(2, 3)) # Create 2 x 3 image grid
map(img, plot)
## [[1]]
## Image. Width: 1600 pix Height: 256 pix Depth: 1 Colour channels: 3
##
## [[2]]
## Image. Width: 1600 pix Height: 256 pix Depth: 1 Colour channels: 3
##
## [[3]]
## Image. Width: 1600 pix Height: 256 pix Depth: 1 Colour channels: 3
##
## [[4]]
## Image. Width: 1600 pix Height: 256 pix Depth: 1 Colour channels: 3
##
## [[5]]
## Image. Width: 1600 pix Height: 256 pix Depth: 1 Colour channels: 3
##
## [[6]]
## Image. Width: 1600 pix Height: 256 pix Depth: 1 Colour channels: 3
# Full Image Description
img <- load.image(file_name[1])
img
## Image. Width: 1600 pix Height: 256 pix Depth: 1 Colour channels: 3
dim(img)
## [1] 1600 256 1 3
# Function for acquiring width and height of an image
get_dim <- function(x){
img <- load.image(x)
df_img <- data.frame(height = height(img),
width = width(img),
filename = x
)
return(df_img)
}
get_dim(file_name[1])
set.seed(123)
sample_file <- sample(file_name, 1200)
# Run the get_dim() function for each image
file_dim <- map_df(sample_file, get_dim)
head(file_dim, 10)
summary(file_dim)
## height width filename
## Min. :256 Min. :1600 Length:1200
## 1st Qu.:256 1st Qu.:1600 Class :character
## Median :256 Median :1600 Mode :character
## Mean :256 Mean :1600
## 3rd Qu.:256 3rd Qu.:1600
## Max. :256 Max. :1600
#Desired height and width of images
target_size <- c(256, 64)
# Batch size for training the model
batch_size <- 32
Karena file yang digunakan diambil secara random 10% dari keseluruhan data, maka kita perkaya data tersebut
# Image Generator
train_data_gen <- image_data_generator(rescale = 1/255, # Scaling pixel value
horizontal_flip = T, # Flip image horizontally
vertical_flip = T, # Flip image vertically
rotation_range = 45, # Rotate image from 0 to 45 degrees
zoom_range = 0.25, # Zoom in or zoom out range
validation_split = 0.2 # 20% data as validation data
)
# Training Dataset
train_image_array_gen <- flow_images_from_directory(directory = "train_png/", # Folder of the data
target_size = target_size, # target of the image dimension (64 x 64)
color_mode = "rgb", # use RGB color
batch_size = batch_size ,
seed = 123, # set random seed
subset = "training", # declare that this is for training data
generator = train_data_gen
)
# Validation Dataset
val_image_array_gen <- flow_images_from_directory(directory = "train_png/",
target_size = target_size,
color_mode = "rgb",
batch_size = batch_size ,
seed = 123,
subset = "validation", # declare that this is the validation data
generator = train_data_gen
)
# Number of training samples
train_samples <- train_image_array_gen$n
# Number of validation samples
valid_samples <- val_image_array_gen$n
# Number of target classes/categories
output_n <- n_distinct(train_image_array_gen$classes)
# Get the class proportion
table("\nFrequency" = factor(train_image_array_gen$classes)
) %>%
prop.table()
## numeric(0)
Selanjutnya akan dilakukan permodelan menggunakan metode CNN. Namun sebelum masuk ke tahap itu, masih terdapat PR untuk memperbaiki 2 chunk di atas. Sekian pemaparan proposal untuk project Steel Defect Detection.