1 Latar Belakang

Indonesia adalah bangsa yang besar, bangsa yang terdiri dari banyak pulau dari Sabang sampai Merauke dimana setiap pulau memiliki kebudayaan sendiri-sendiri, seperti alat musik, busana, bahkan juga makanan tradisional. Dengan ragam kultur budayanya, Indonesia memiliki banyak jenis makanan dan memiliki ciri khas yang berbeda antara daerah yang satu dengan yang lainnya. Makanan tradisional Jawa Tengah misalnya terkenal dengan cita rasanya yang manis, masyarakat dari kota Manado dan Lombok yang suka dengan rasa pedas, dan lain sebagainya. Makanan tradisional Indonesia sangat beragam, seiring dengan beragamnya etnik dan wilayah multikulturalnya. Makanan tradisional Indonesia mengandung beragam rempah-rempah, memiliki aneka teknik memasak dan berbahan-bahan lokal yang sebagian terpengaruh dari India, China, Timur Tengah, dan Eropa.

Menurut Marwanti (2000: 112), makanan tradisional mempunyai pengertian makanan rakyat sehari-hari, baik yang berupa makanan pokok, makanan selingan, atau sajian khusus yang sudah turun-temurun dari zaman nenek moyang. Cara pengolahan pada resep makanan tradisional dan cita rasanya umumnya sudah bersifat turun temurun sehingga makanan tradisional disetiap tempat atau daerah berbeda-beda.

Dari pengertian di atas, dapat dikatakan bahwa makanan tradisional merupakan makanan yang diperoleh secara turun temurun dan di setiap daerah mempunyai ciri khas yang berbeda-beda. Makanan tradisional Indonesia sangat banyak macamnya, berdasarkan tingkat eksistensinya dalam masyarakat hingga saat ini. Keanekaragaman makanan tradisional yang ada dipengaruhi oleh keadaan daerah atau tempat tinggal dan budaya yang ada di daerah tersebut. Dengan banyaknya keanekaragaman makanan tradisional dalam suatu daerah, tidak sedikit pula makanan tradisional yang hampir terlupakan oleh masyarakat saat ini.

Menurut Murdijati (2017), makanan tradisional ini dapat dikategorikan menjadi tiga kelompok, antara lain:

  1. Makanan tradisional yang hampir punah. Makanan tradisional yang hampir punah ini langka dan hampir jarang dapat ditemui mungkin disebabkan karena ketersediaan bahan dasarnya mulai sulit atau 10 masyarakat pembuatnya mulai tidak mengerjakan lagi atau terdesak oleh produk makanan lain, contohnya karangan, cethot, entog-entog, getas, es semlo, dan hawuk-hawuk.
  2. Makanan tradisional yang kurang populer. Kelompok makanan tradisional yang kurang populer adalah makanan tradisional yang masih mudah ditemui, tetapi makin tidak dikenal dan cenderung berkurang penggemarnya, dianggap mempunyai status sosial lebih rendah dalam masyarakat, contohnya kethak, adrem, wedang tahu, lemet, bothok sembukan, dan bajigur.
  3. Makanan tradisional yang populer (tetap eksis). Kelompok makanan tradisional yang populer merupakan makanan tradisional yang tetap disukai masyarakat dengan bukti banyak dijual, laku, dan dibeli oleh konsumen bahkan beberapa menjadi ikon daerah tertentu seperti gudeg, emping melinjo, gatot, thiwul, tempe benguk, kipo, dan sate klathak.

Cara pengolahan pada resep makanan tradisional dan cita rasanya umumnya sudah bersifat turun temurun, serta sedikit sekali adanya inovasi produk. Menurut Sosroningrat (1991), makanan tradisional mempunyai ciri-ciri antara lain:

  1. Resep makanan yang diperoleh secara turun-temurun dari generasi pendahulunya,
  2. Penggunaan alat tradisional tertentu di dalam pengolahan masakan tersebut (misalnya masakan harus diolah dengan alat dari tanah liat),
  3. Teknik olah masakan merupakan cara pengolahan yang harus dilakukan untuk mendapatkan rasa maupun rupa yang khas dari suatu masakan.

Bahkan berdasarkan tulisan artikel dari website Kementerian Luar Negeri berikut ini (https://kemlu.go.id/portal/id/read/4771/berita/citra-rasa-kuliner-indonesia-menjadi-daya-tarik-tersendiri-di-tengah-perayaan-warisan-budaya-asia-amerika-di-san-francisco), Indonesia dikenal dengan kekayaan kulinernya karena memiliki lebih dari 5 ribu resep kuliner tradisional sehingga menjadikan Indonesia memiliki jumlah resep makanan terbanyak di dunia.

Makanan tradisional sebagai salah satu aspek budaya suatu bangsa dapat mencirikan identitas bangsa tersebut. Kita sebagai warga negara Indonesia perlu melakukan pelestarian makanan tradisional dengan meningkatkan kualitas produk agar mampu bersaing dan memuaskan wisatawan lokal maupun asing. Selain itu, dapat juga dilakukan dengan cara memperkenalkannya kepada generasi muda ditengah-tengah banyaknya kuliner dari kebudayaan barat yang sekarang sudah merajalela di Indonesia. Bahkan kita juga harus bangga memperkenalkan makanan tradisional ini kepada wisatawan asing karena makanan Indonesia dibuat dari rempah-rempah yang kualitasnya salah satu yang terbaik di seluruh dunia.

Sebagai warga negara Indonesia yang lahir dan besar di Indonesia, saya memiliki kecintaan dan kebanggaan kepada kebudayaan Indonesia, salah satunya adalah makanan tradisional. Menurut saya, makanan tradisional Indonesia tidak hanya enak dan istimewa, tetapi juga memiliki banyak ragam rasa dan jenis yang menjadi khas daerah masing-masing dan menjadikannya sebagai hidangan tradisional populer di daerahnya. Indonesia terus berupaya menjadi salah satu destinasi wisata dunia terus berupaya meningkatkan diri agar mampu bersaing dengan negara lain.

Oleh karena itu, saya ingin sekali memperkenalkan makanan tradisional Indonesia kepada seluruh masyarakat khususnya wisatawan lokal maupun asing yang mungkin tidak tahu banyak mengenai hal ini. Dengan demikian akan semakin banyak wisatawan yang ingin berkunjung ke Indonesia dan menikmati kebudayaan khususnya makanan tradisional Indonesia.

2 Pemahaman Masalah

Seperti kita ketahui di atas bahwa makanan tradisional di Indonesia, sebagai salah satu aspek budaya Indonesia, sangat banyak dan beragam. Kita sebagai warga Indonesia mungkin hanya mengetahui beberapa jenis makanan tradisional atau makanan yang berasal dari daerah asal kita saja. Hal ini terbukti dari pengalaman pribadi saya, saat saya ingin makan salah satu makanan tradisional daerah, namun saya tidak mengetahui nama makanan tersebut. Saya percaya hal ini juga sering dialami oleh banyak orang Indonesia, apalagi generasi muda saat ini yang mungkin lebih mengenal makanan dari luar negeri.

Sebagai bentuk pelestarian budaya Indonesia yaitu makanan tradisional, saya mempunyai keinginan untuk memperkenalkan makanan tradisional Indonesia kepada masyarakat maupun wisatawan asing yang ingin mengetahui lebih dalam mengenai makanan tradisional tersebut. Inilah yang menjadi dasar bagi saya membuat sebuah dashboard yang mampu mengenali makanan tradisional Indonesia yang difoto atau di-upload gambarnya tersebut.

Dashboard yang saya buat ini akan memberitahukan nama makanan beserta informasi mengenai makanan tersebut dari gambar / foto makanan yang di-upload oleh user. Dashboard ini dikembangkan dengan menggunakan machine learning berbasis Neural Network untuk dapat melakukan klasifikasi atas gambar makanan tradisional.

3 Business Impact

Project ini menampilkan dashboard yang berisi fitur-fitur tentang makanan tradisional Indonesia beserta informasi singkat mengenai makanan tersebut dengan cara meng-upload foto atau gambar makanan ke dalam dashboard. Yang menjadi business impact utama pada dashboard ini adalah:

  • Memperkenalkan jenis makanan tradisional Indonesia melalui gambar / foto makanan yang di-upload oleh user.
  • Sosialisasi serta edukasi atas informasi makanan tradisional kepada user seperti asal daerah dan penjelasan singkat mengenai makanan tersebut.

Jika sebelumnya saat kita tidak tahu jenis makanan, kita hanya bertanya kepada orang yang tahu kemudian mencarinya di mesin pencarian seperti Google. Bahkan mungkin, saat ini Google juga sudah memiliki fitur image recognition untuk mengenali makanan yang di-upload. Namun, yang menjadi kelebihan dashboard ini adalah penggunaan dashboard ini sangat praktis karena antara fitur yang satu dengan yang lain saling terintegrasi. Hanya dengan meng-upload suatu gambar makanan maka user dapat memperoleh informasi-informasi lain yang bermanfaat untuk menambah pengetahuan seperti bagaimana mengucapkan atau melafalkan nama makanan tersebut, bagaimana nama makanan tersebut dituliskan dalam aksara-aksara bahasa lain bahkan asal daerah dari makanan tradisional tersebut yang divisualisasikan dalam bentuk maps Indonesia.

Dashboard ini sangat cocok untuk pengguna introvert dan memiliki curiosity yang tinggi pada dunia kuliner, yaitu seseorang yang sangat mencintai dunia kuliner dan selalu tertarik dengan makanan-makanan yang baru dikenal, seperti makanan tradisional Indonesia yang beragam ini. Jika orang seperti itu menemui makanan tradisional yang baru pertama kali dilihatnya saat berkunjung ke suatu daerah, dan ingin mencari tahu makanan tersebut, namun malu atau tidak berani bertanya kepada orang lain, maka dengan teknologi pada dashboard ini yang mampu mengenali makanan di depannya dan mendapatkan banyak informasi atas makanan tersebut.

Melalui fitur-fitur tersebut, dashboard ini ke depannya juga bisa dimanfaatkan dan dikembangkan juga oleh restoran di tiap-tiap kota asal makanan tradisional tersebut serta penjual bumbu masak siap saji yang menjual bumbu makanan tradisional sehingga dapat meningkatkan perekonomian. Juga dengan melihat maps Indonesia, maka user bisa mendapatkan gambaran tentang luasnya negara Indonesia yang berpotensi juga dapat mengenali kebudayaan Indonesia yang sangat kaya. Hal ini dapat membuat user tertarik untuk mempelajari kebudayaan-kebudayaan dari kota-kota di Indonesia yang nantinya dapat memungkinkan juga untuk menjalin kerjasama dengan agen travel misalnya, dimana hal tersebut dapat mendorong pariwisata Indonesia. Contohnya: jika user upload makanan Ayam Betutu dan dashboard mampu mengenali makanan Ayam Betutu tersebut, dashboard juga dapat terintegrasi dengan platform kuliner seperti gofood, sehingga memberikan rekomendasi restoran yang autentik menjual Ayam Betutu di Bali yang merupakan daerah asal dari makanan tradisional tersebut.

4 Target User

Target user untuk project ini adalah masyarakat umum khususnya generasi muda dan wisatawan asing yang ingin mengenal lebih dalam mengenai makanan tradisional indonesia baik itu informasi mengenai makanan tersebut maupun jika tertarik untuk membelinya pada saat berkunjung ke suatu daerah wisata.

Misalnya user adalah wisatawan asing yang baru pertama kali datang ke Indonesia dan mendapatkan makanan tradisional kemudian tertarik dengan makanan tersebut seperti namanya dan informasi lainnya, maka user dapat masuk ke dashboard ini kemudian mengupload foto dari makanan tersebut, kemudian dashboard ini akan menampilkan output berupa nama makanan beserta informasi-informasi mengenai makanan tersebut yang berguna untuk menambah pengetahuan user tentang kuliner tradisional Indonesia serta menimbulkan minat lebih terhadap makanan tradisional dari daerah-daerah lain di Indonesia dan tertarik juga untuk melakukan wisata atau kunjungan ke daerah tersebut sehingga dapat meningkatkan pariwisata Indonesia.

User yang tertarik mengetahui informasi mengenai makanan tradisional dapat menggunakan dashboard ini karena lebih efisien dalam memberikan informasi dibandingkan dengan melakukan pencarian via website seperti google atau bertanya kepada orang lain (dalam hal ini warga indonesia) yang mungkin saja juga tidak tahu detail mengenai makanan tradisional tersebut. Karena jika mencari via website maka hasil dari pencarian google terlalu luas karena hanya berdasarkan keyword yang dimasukkan. Tetapi jika menggunakan dashboard ini maka hanya dengan memasukkan foto suatu makanan maka dashboard ini dapat menampilkan informasi yang spesifik mengenai makanan tersebut.

Target user dapat ditambahkan yaitu restoran atau pelaku bisnis kuliner yang ingin mempromosikan makanan tradisional mereka juga bisa menjadi target yang potensial.

5 Implementasi ke Business Serupa

Implementasi dashboard pengenalan gambar untuk kebudayaan Indonesia yang lain seperti alat musik tradisional, jenis-jenis batik, dan pakaian daerah.

6 Tujuan/Output dari Project

Dashboard klasifikasi gambar untuk mengenali jenis makanan dengan langkah seperti berikut:

  • User input gambar makanan dengan cara klik tombol upload
  • Dashboard mengeluarkan output berupa nama makanan Indonesia beserta informasinya

7 Data Collection

Saya menggunakan data gambar tentang makanan tradisional Indonesia yang diambil dari website Kaggle dengan judul Traditional Food Knowledge of Indonesia (https://www.kaggle.com/datasets/arizbw/traditional-food-knowledge-of-indonesia/data). Data Food sudah terbagi ke dalam data dev, data train dan data test. Dataset ini terdiri dari 1150 baris dan 38 kolom. 1150 menunjukkan jumlah data makanan pada dataset ini yang nantinya hanya terbagi menjadi 35 jenis makanan saja. 38 kolom terdiri dari Image.Index, Patient.ID, Finding.Labels dan 35 jenis makanan.

Berikut ini merupakan data gambar dari masing-masing dataset baik itu data dev, data train, data test yang sudah dibagi ke dalam folder-folder di bawah ini:

Dan untuk setiap masing-masing folder data tersebut memiliki gambar seluruh jenis makanan yang ada pada dataset. Berikut adalah isi dari masing-masing folder tersebut:

Namun pada project ini kita hanya fokus pada data train dan data test saja.

Berikut ini salah satu contoh gambar dari salah satu jenis makanan pada dataset tersebut, yaitu gambar gado-gado.

Terkait proses berikutnya untuk memperkaya jumlah gambar agar performa model lebih baik, akan dilakukan proses data augmentation pada tahapan data pre-processing sebelum masuk pembuatan model.

Kita mulai dengan membaca dataset data train.csv dan test.csv dan kita simpan dalam variabel train dan test.

train <- read.csv("train.csv")
test <- read.csv("test.csv")

Kita coba lihat beberapa data pertama dari data train.

# your code here
head(train)

8 Data Preparation

8.1 Library And Setup

Disini kita akan menginstal package pillow di conda environment untuk memanipulasi data gambar. Berikut instruksi singkat tentang cara membuat conda environment baru dengan tensorflow dan pillow di dalamnya.

  1. Buka terminal, baik di command prompt anaconda atau langsung di RStudio.

  1. Buat conda environment baru dengan menjalankan perintah berikut:

conda create -n tf_image python=3.7

  1. Aktifkan conda environment dengan menjalankan perintah berikut:

conda activate tf_image

  1. Install package tensorflow ke environment dengan menjalankan perintah berikut:

conda install -c conda-forge tensorflow=2

  1. Pasang package pillow dengan menjalankan perintah berikut:

pip install pillow

  1. Langkah selanjutnya cukup panggil conda environment menggunakan fungsi reticulate::use_python() dan masukkan lokasi python dari environment tf_image. Path atau lokasi environment dapat ditemukan dengan cara mengetik conda env list di terminal.

library(reticulate)

# Use python in your anaconda3 environment folder
reticulate::use_python("C:/Users/hp/miniconda3/envs/tf_image", required = T)

Kita panggil setiap library yang dibutuhkan untuk membangun dan mengevaluasi klasifikasi gambar:

# EDA
library(dplyr)
library(tidyverse)

# Image manipulation
library(imager)

# Neural Network
library(keras)
library(tensorflow)

# Model evaluation
library(caret)

Untuk memastikan berapa jumlah baris dan kolom pada data train dan data test menggunakan fungsi dim().

# your code here (cek dimensi)
dim(train)
#> [1] 1150   38

Kemudian kita cek setiap tipe data dengan fungsi glimpse.

glimpse(train)
#> Rows: 1,150
#> Columns: 38
#> $ Image.Index          <chr> "IMG_6886.jpg", "IMG_7701.jpg", "IMG_7023.jpg", "…
#> $ Patient.ID           <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
#> $ Finding.Labels       <chr> "gado-gado", "soto-banjar", "rujak-cingur", "kue-…
#> $ asinan.jakarta       <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0…
#> $ ayam.betutu          <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ ayam.bumbu.rujak     <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ ayam.goreng.lengkuas <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ bika.ambon           <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0…
#> $ bir.pletok           <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ bubur.manado         <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ cendol               <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ es.dawet             <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ gado.gado            <int> 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1…
#> $ gudeg                <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ gulai.ikan.mas       <int> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ keladi               <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0…
#> $ kerak.telor          <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0…
#> $ klappertart          <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ kolak                <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ kue.lumpur           <int> 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ kunyit.asam          <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ laksa.bogor          <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ lumpia.semarang      <int> 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ mie.aceh             <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ nagasari             <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ nasi.goreng.kampung  <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ papeda               <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ pempek.palembang     <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ rawon.surabaya       <int> 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ rendang              <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ rujak.cingur         <int> 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0…
#> $ sate.ayam.madura     <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0…
#> $ sate.lilit           <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ sate.maranggi        <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ soerabi              <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ soto.ayam.lamongan   <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ soto.banjar          <int> 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ tahu.telur           <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…

Membuang kolom yang tidak diperlukan yaitu kolom Patient.ID pada data train dan data test:

train <- train %>% select(-Patient.ID)
train
test <- test %>% select(-Patient.ID)
test

Berikut ini adalah penjelasan terkait variabel-variabel tersebut:

  • Image.Index : nama file dari gambar dataset
  • Finding.Labels : kelas jenis makanan
  • Kolom sisanya menjelaskan tentang kelas jenis makanan yang direpresentasikan dalam bentuk one-hot-encoding untuk setiap baris datanya.

Yang menjadi target adalah kolom Finding.Labels.

Yang menjadi prediktor adalah data gambar pada folder train yang direferensikan pada kolom Image.Index.

Disini kita akan menghitung jumlah data gambar berdasarkan kelas target yaitu Finding.Labels pada data train:

train %>% 
  group_by(Finding.Labels) %>% 
  summarise(Jumlah_gambar = n()) %>% 
  ungroup()

Disini kita akan menghitung jumlah data gambar berdasarkan kelas target yaitu Finding.Labels pada data test:

test %>% 
  group_by(Finding.Labels) %>% 
  summarise(Jumlah_gambar = n()) %>% 
  ungroup()

Data tersebut sudah sesuai dengan tujuan project yang saya buat yaitu untuk melakukan klasifikasi jenis makanan dengan menggunakan data gambar

Karena data yang tersedia adalah data gambar dalam bentuk .jpg atau .png, dan bukan dalam bentuk pixel, oleh karena itu tahapan yang dilakukan pada proses data preparation antara lain: menggunakan fungsi flow_images_from_directory.

Untuk penggunaan flow_images_from_directory akan dilakukan pada tahapan data pre-processing setelah exploratory data analysis (EDA).

Cara untuk mempersiapkan datanya adalah meletakkan gambar yang memiliki kelas yang sama di satu folder yang sama (yaitu sebanyak 34 jenis makanan sesuai dengan data). Misalnya seperti ini:

9 Data Exploration

Mari kita jelajahi datanya terlebih dahulu sebelum membuat model. Dalam masalah klasifikasi gambar, merupakan praktik umum untuk meletakkan setiap gambar pada folder terpisah berdasarkan kelas/label target. Misalnya, di dalam folder train terdapat 34 folder berbeda. Dimana penjelasan mengenai proses foldering data-data tersebut sudah dijelaskan pada tahapan data collection.

Mari kita coba mendapatkan nama file setiap gambar. Pertama, kita perlu mencari folder masing-masing kelas target. Kode berikut akan memberikan nama folder di dalam folder train.

folder_list <- list.files("data/train/")

folder_list
#>  [1] "asinan-jakarta"       "ayam-betutu"          "ayam-bumbu-rujak"    
#>  [4] "ayam-goreng-lengkuas" "bika-ambon"           "bir-pletok"          
#>  [7] "bubur-manado"         "cendol"               "es-dawet"            
#> [10] "gado-gado"            "gudeg"                "gulai-ikan-mas"      
#> [13] "keladi"               "kerak-telor"          "klappertart"         
#> [16] "kolak"                "kue-lumpur"           "kunyit-asam"         
#> [19] "laksa-bogor"          "lumpia-semarang"      "mie-aceh"            
#> [22] "nagasari"             "nasi-goreng-kampung"  "papeda"              
#> [25] "pempek-palembang"     "rawon-surabaya"       "rendang"             
#> [28] "rujak-cingur"         "sate-ayam-madura"     "sate-lilit"          
#> [31] "sate-maranggi"        "soerabi"              "soto-ayam-lamongan"  
#> [34] "soto-banjar"          "tahu-telur"

Menggabungkan nama folder dengan path (lokasi file) atau direktori folder train untuk mengakses konten di dalam setiap folder.

folder_path <- paste0("data/train/", folder_list, "/")

folder_path
#>  [1] "data/train/asinan-jakarta/"       "data/train/ayam-betutu/"         
#>  [3] "data/train/ayam-bumbu-rujak/"     "data/train/ayam-goreng-lengkuas/"
#>  [5] "data/train/bika-ambon/"           "data/train/bir-pletok/"          
#>  [7] "data/train/bubur-manado/"         "data/train/cendol/"              
#>  [9] "data/train/es-dawet/"             "data/train/gado-gado/"           
#> [11] "data/train/gudeg/"                "data/train/gulai-ikan-mas/"      
#> [13] "data/train/keladi/"               "data/train/kerak-telor/"         
#> [15] "data/train/klappertart/"          "data/train/kolak/"               
#> [17] "data/train/kue-lumpur/"           "data/train/kunyit-asam/"         
#> [19] "data/train/laksa-bogor/"          "data/train/lumpia-semarang/"     
#> [21] "data/train/mie-aceh/"             "data/train/nagasari/"            
#> [23] "data/train/nasi-goreng-kampung/"  "data/train/papeda/"              
#> [25] "data/train/pempek-palembang/"     "data/train/rawon-surabaya/"      
#> [27] "data/train/rendang/"              "data/train/rujak-cingur/"        
#> [29] "data/train/sate-ayam-madura/"     "data/train/sate-lilit/"          
#> [31] "data/train/sate-maranggi/"        "data/train/soerabi/"             
#> [33] "data/train/soto-ayam-lamongan/"   "data/train/soto-banjar/"         
#> [35] "data/train/tahu-telur/"

Kita akan menggunakan fungsi map() untuk mengulang atau mengulangi dan mengumpulkan nama file untuk setiap folder (rawon, gado-gado, rujak cingur). Map() akan mengembalikan daftar jadi jika kita ingin menggabungkan nama file dari 3 folder berbeda kita cukup menggunakan fungsi unlist().

# Get file name
file_name <- map(folder_path, 
                 function(x) paste0(x, list.files(x))
                 ) %>% 
  unlist()

# first 6 file name
head(file_name)
#> [1] "data/train/asinan-jakarta/IMG_7841.jpg"
#> [2] "data/train/asinan-jakarta/IMG_7843.jpg"
#> [3] "data/train/asinan-jakarta/IMG_7844.jpg"
#> [4] "data/train/asinan-jakarta/IMG_7846.jpg"
#> [5] "data/train/asinan-jakarta/IMG_7847.jpg"
#> [6] "data/train/asinan-jakarta/IMG_7848.jpg"

Kita juga dapat memeriksa 6 gambar terakhir.

# last 6 file name
tail(file_name)
#> [1] "data/train/tahu-telur/IMG_8609.jpg" "data/train/tahu-telur/IMG_8610.jpg"
#> [3] "data/train/tahu-telur/IMG_8611.jpg" "data/train/tahu-telur/IMG_8614.jpg"
#> [5] "data/train/tahu-telur/IMG_8616.jpg" "data/train/tahu-telur/IMG_8618.jpg"

Mari kita periksa berapa banyak gambar yang kita miliki.

length(file_name)
#> [1] 1150

Untuk memeriksa isi file, kita dapat menggunakan fungsi load.image() dari paket imager. Misalnya, mari kita visualisasikan 15 gambar dari data secara acak.

# Randomly select image
set.seed(99)
sample_image <- sample(file_name, 15)

# Load image into R
img <- map(sample_image, load.image)

# Plot image
par(mfrow = c(3, 5)) # Create 3 x 5 image grid
map(img, plot)

#> [[1]]
#> Image. Width: 1326 pix Height: 711 pix Depth: 1 Colour channels: 3 
#> 
#> [[2]]
#> Image. Width: 1915 pix Height: 1123 pix Depth: 1 Colour channels: 3 
#> 
#> [[3]]
#> Image. Width: 1796 pix Height: 1682 pix Depth: 1 Colour channels: 3 
#> 
#> [[4]]
#> Image. Width: 2937 pix Height: 3006 pix Depth: 1 Colour channels: 3 
#> 
#> [[5]]
#> Image. Width: 2322 pix Height: 1643 pix Depth: 1 Colour channels: 3 
#> 
#> [[6]]
#> Image. Width: 2043 pix Height: 1692 pix Depth: 1 Colour channels: 3 
#> 
#> [[7]]
#> Image. Width: 2498 pix Height: 2260 pix Depth: 1 Colour channels: 3 
#> 
#> [[8]]
#> Image. Width: 2163 pix Height: 1349 pix Depth: 1 Colour channels: 3 
#> 
#> [[9]]
#> Image. Width: 2207 pix Height: 1082 pix Depth: 1 Colour channels: 3 
#> 
#> [[10]]
#> Image. Width: 2462 pix Height: 1572 pix Depth: 1 Colour channels: 3 
#> 
#> [[11]]
#> Image. Width: 1183 pix Height: 1042 pix Depth: 1 Colour channels: 3 
#> 
#> [[12]]
#> Image. Width: 2941 pix Height: 1565 pix Depth: 1 Colour channels: 3 
#> 
#> [[13]]
#> Image. Width: 1521 pix Height: 976 pix Depth: 1 Colour channels: 3 
#> 
#> [[14]]
#> Image. Width: 1521 pix Height: 976 pix Depth: 1 Colour channels: 3 
#> 
#> [[15]]
#> Image. Width: 2012 pix Height: 1374 pix Depth: 1 Colour channels: 3

9.1 Check Image Dimension

Salah satu aspek penting dalam klasifikasi gambar adalah memahami dimensi input gambar. Kita perlu mengetahui distribusi dimensi gambar untuk membuat input dimensi yang tepat untuk membangun model deep learning. Mari kita periksa properti gambar pertama.

# Full Image Description
img <- load.image(file_name[1])
img
#> Image. Width: 3421 pix Height: 3046 pix Depth: 1 Colour channels: 3

Kita bisa mendapatkan informasi tentang dimensi gambar. Tinggi dan lebar mewakili tinggi dan lebar gambar dalam pixel. Colour channels mewakili apakah warna dalam format skala abu-abu (colour channels = 1) atau dalam format RGB (colour channels = 3). Untuk mendapatkan nilai setiap dimensi, kita bisa menggunakan fungsi dim(). Ini akan mengembalikan tinggi, lebar, depth, dan channels.

# Image Dimension
dim(img)
#> [1] 3421 3046    1    3

Jadi kita sudah berhasil memasukkan gambar dan mendapatkan dimensi gambarnya. Pada kode berikut, kita akan membuat fungsi yang akan langsung mendapatkan tinggi dan lebar gambar dan mengubahnya menjadi data.frame.

# 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])

Sekarang kita akan mengambil sampel 100 gambar dari nama file dan mendapatkan tinggi dan lebar gambar. Kami menggunakan sampling di sini karena akan memakan waktu yang cukup lama untuk memuat semua gambar.

# Randomly get 100 sample images
set.seed(123)
sample_file <- sample(file_name, 100)

# Run the get_dim() function for each image
file_dim <- map_df(sample_file, get_dim)

head(file_dim, 10)

Sekarang mari kita dapatkan statistik untuk dimensi gambar.

summary(file_dim)
#>      height         width        filename        
#>  Min.   : 711   Min.   : 902   Length:100        
#>  1st Qu.:1118   1st Qu.:1600   Class :character  
#>  Median :1560   Median :2000   Mode  :character  
#>  Mean   :1644   Mean   :2003                     
#>  3rd Qu.:2060   3rd Qu.:2334                     
#>  Max.   :3214   Max.   :3414

Data gambar memiliki variasi dimensi yang besar. Beberapa gambar memiliki tinggi dengan minimal 711 pixel dan lebar dengan minimal 902 pixel, sementara gambar lainnya memiliki tinggi dengan maksimal hingga 3214 pixel dan lebar dengan maksimal hingga 3414 pixel. Memahami dimensi gambar akan membantu kita pada bagian proses selanjutnya yaitu data pre-processing.

10 Product Design

  • Menggunakan algoritma Neural Network untuk melakukan klasifikasi gambar.

  • Fitur yang akan ada di dashboard adalah:

10.1 Dashboard klasifikasi

Dashboard klasifikasi gambar untuk mengenali jenis makanan dengan langkah seperti berikut:

  • User input gambar makanan dengan cara klik tombol upload
  • Dashboard mengeluarkan output berupa nama makanan Indonesia beserta informasinya

10.2 Dashboard voice

Dashboard yang menampilkan suara pelafalan dari nama makanan yang keluar sebagai hasil klasifikasi. Skenarionya adalah ketika user memilih jenis makanan melalui dropdown menu misalnya rendang, kemudian ada tombol yang mampu mengeluarkan suara “rendang” (contohnya seperti google translate, ketika kita mengetikkan sebuah kata ada tombol icon sound dan ketika klik mengeluarkan suara pelafalan dari kata tersebut). Tujuannya adalah memudahkan wisatawan asing yang ingin membeli makanan tradisional tersebut tetapi tidak mengetahui bagaimana cara mengucapkan/melafalkan kata atau nama dari makanan tersebut.

10.3 Dashboard aksara

Dashboard yang menampilkan fitur aksara bahasa lain atas hasil klasifikasi jenis makanan. Datanya akan saya ambil dengan menggunakan google translate atas 34 jenis makanan tersebut. Hasil google translatenya saya simpan dalam bentuk gambar. Jadi skenarionya, user memilih jenis makanan melalui dropdown menu, misalnya soto, kemudian akan muncul aksara bahasa lain yg ditampilkan, misalnya dalam aksara mandarin, jepang, dll. Tujuannya adalah untuk wisatawan asing yang baru berkunjung ke Indonesia yang membutuhkan nama makanan dalam tulisan asli mereka seperti jepang, mandarin, thailand, dll.

10.4 Dashboard maps

Dashboard yang menampilkan maps Indonesia. Terdapat menu untuk memilih jenis makanan, misalnya saat user memilih jenis makanan rawon, akan keluar informasi rawon berasal dari kota surabaya. Kemudian ada visualisasi yang menunjukkan titik kota surabaya pada sebuah maps. Tujuannya memberikan edukasi kepada user dimana letak kota asal dari makanan tradisional tersebut sehingga memungkinkan user yang ingin mengunjungi daerah tersebut sehingga juga mendorong pariwisata Indonesia.