1 Background

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.

2 Target and Features

Target: memprediksi permukaan pipa besi di production/manufacturing site cacat atau tidak features: data gambar cacat permukaan besi

3 Project Idea

Permasalahan yang coba diselesaikan disini adalah membuat metode/ model deep learning yang dapat membantu mempercepat pekerjaan dalam mendeteksi defect pada permukaan besi.

4 Business Impact

  • Menyelamatkan nyawa orang-orang di field dan mencegah terjadinya kecelakaan kerja
  • Cut production loss lebih dini

5 Problem scope

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

6 Output

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. *Dashboard Steel Defect Detection

*Contoh Warna dalam Mengkategorikan Defect *Contoh Hasil Klasifikasi *Contoh Hasil Klasifikasi

7 EDA

Menyiapkan library yang akan digunakan

# Data wrangling
library(tidyverse)

# Image manipulation
library(imager)

# Deep learning
library(keras)

# Model Evaluation
library(caret)

options(scipen = 999)

7.1 Membaca data train

  folder_list <- list.files("train_png/")

head(folder_list)
## [1] "0002cc93b.png" "00031f466.png" "000418bfc.png" "000789191.png"
## [5] "0007a71bf.png" "000a4bcdd.png"

7.2 Membuat folder path

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"

7.3 Melihat panjang data

length(file_name)
## [1] 12568

**NOTE: Saya mengalami kendala di bawah ini, format gambar telah saya ubah

7.4 Visualisasi 6 data secara random

#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

7.5 Cek dimensi data

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

8 Data Augmentation

8.1 Set Target Size dan Batch Size

#Desired height and width of images
target_size <- c(256, 64)

# Batch size for training the model
batch_size <- 32

8.2 Image Generator

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
                                       )

8.3 Mengubah ke array pixel

# 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.