Sunday, December 16, 2018

Mencari Perbedaan Citra Dengan OpenCV dan Python (Structural Similarity Index Measurement)

Tulisan berikut akan membahas bagaimana membedakan dua gambar yang hampir identik. Sebagai contoh terdapat uang kertas Rp.50.000,- seperti tampak di bawah ini:
Gambar 1. Uang Asli Rp. 50.000,-
Gambar 2. Uang Asli Rp. 50.000,- Dengan Perubahan

Dari dua gambar di atas terdapat 3 perbedaan, ayo coba cari! mungkin Anda membutuhkan waktu sebentar untuk mengetahuinya atau mungkin lama....

Mencari perbedaan gambar diperlukan untuk menentukan apakah suatu gambar itu asli atau tidak. Dengan ketrampilan seorang editor gambar yang semakin halus dan menawan dalam mengedit gambar tentu akan menyulitkan bagi kita untuk membedakan gambar asli dan gambar yang telah diedit dnegan photoshop.

Kita akan memanfaatkan teknik pengolahan citra digital dengan OpenCV dan Python untuk mendeteksi perbedaan dari dua gambar tersebut. So...lanjut....

Projek ini saya terapkan pada environment Google Colab, sedangkan data gambar dan lain-lain saya ambil dan letakkan di Google Drive Saya. Editor yang digunakan adalah Jupiter Notebook versi Colab. Semuanya dikerjakan secara remote.

Adapun keuntungan dari Google Colab banyak, antara lain:
  • Bisa mendapatkan GPU dengan performa tinggi.
  • Pre instal library dan program pendukung yang lengkap.
  • Anda bisa menginstal library baru ke colab dengan cara cloning (pip command), 
  • Penggunaannya gratis dan praktis, apalagi jika Anda memiliki google drive yang berafiliasi dengan pendidikan, space yang diperoleh unlimited.

Bagaimana teknik instalasinya google colab? silahkan kunjungi http://doditsuprianto.blogspot.com/2018/05/memnafaatkan-google-colabs-dan-google.html.

Baik sekarang dibahas potongan-potongan programnya:

# impor library yang diperlukan
from matplotlib import pyplot as plt
from skimage.measure import compare_ssim
import imutils
import cv2

# Load citra dari google drive
# Path sesuaikan dengan punya Anda
imageA = cv2.imread('drive/Deep_Learning_Latihan/Perbedaan_Gambar/uang50rb_asli.jpg')
imageB = cv2.imread('drive/Deep_Learning_Latihan/Perbedaan_Gambar/uang50rb_palsu.jpg')

# Konvert citra asli menjadi keabuan
grayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)
grayB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)

Potongan kode program pertama, kita meng-impor library yang dibutuhkan, antara lain matplotlib, scikit, imutils dan opencv. Selanjutnya kita loading citra/gambar dari google drive yang terdiri dari dua gambar yaitu "uang50rb_asli.jpg" dan "uang50rb_palsu.jpg". Untuk alamat path silahkan sesuaikan dengan kondisi environment masing-masing. Selanjutnya dari citra yang di-load diubah menjadi citra grayscale atau keabuan untuk mengurangi kedalaman warna dan mempercepat komputasi.

# Hitung Structural Similarity Index (SSIM) antara dua citra
# pastikan bahwa perbeddan citra dikembalikan nilainya
(score, diff) = compare_ssim(grayA, grayB, full=True)
diff = (diff * 255).astype("uint8")
print("SSIM: {} Rentang nilai -1 s/d 1 (nilai mendekati 1 berarti antar citra hampir sempurna sama)".format(score))

Potongan kode program kedua, adalah untuk menghitung perbedaan antar dua citra dengan menggunakan metode SSIM atau Structural Similarity Index Measurement.

Penggunaan fungsi compare_ssim dari scikit-image untuk menghitung score dan perbedaan citra diff.

score mewakili structural similirity index antara dua input citra. Nilai ini mempunyai rentang [-1, 1] dimana nilai satu mengindikasikan bahwa dua citra tersebut "hampir sama sempurna".

diff citra berisi perbedaan citra sesungguhnya antara dua citra input yang akan divisualisasikan. Perbedaan citra saat ini diwakili  sebgai data bertipe floating point dengan rentang [0, 1] sehingga harus dikonversikan menjadi array 8-bit unsigned integer dengan rentang [0, 255] sebelum  diproses lebih lanjut dengan OpenCV.

# threshold perbedaan citra, diikuti dengan pencarian kontur
# memperoleh area yang berbeda dari dua input citra
thresh = cv2.threshold(diff, 0, 255,
 cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
 cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)

Potongan kode program ketiga, kita melakukan threshold terhadap citra diff menggunakan cv2.THRESH_BINARY_INV dan cv2.THRESH_OTSU, kedua metode threshold tersebut diaplikasikan diwaktu yang sama dengan menggunakan simbol "OR" atau "|". Penjelasan detil pengaturan bimodal thresholding silahkan dibaca di OpenCV documentation.

Kemudian kita menemukan kontur dari thresh yang dinyatakan pada baris pernyataan cnts = imutils.grab_contours(cnts).

Gambar di bawah ini dengan jelas mengungkapkan ROI (Region of Interest) dari gambar yang telah dimanipulasi:
Sekarang kita memiliki kontur yang disimpan dalam daftar, mari gambar persegi panjang di sekitar wilayah yang berbeda pada setiap gambar, perhatiakan potongan kode program keempat berikut:

# perulangan pada kontur
for c in cnts:
 # menghitung batas kotak dari kontur dan menggambar
 # batas kotak pada citra input untuk mewakili dua citra yang berbeda
 (x, y, w, h) = cv2.boundingRect(c)
 cv2.rectangle(imageA, (x, y), (x + w, y + h), (0, 0, 255), 2)
 cv2.rectangle(imageB, (x, y), (x + w, y + h), (0, 0, 255), 2)

# tampilkan citra
plt.xticks([]), plt.yticks([])
plt.imshow(cv2.cvtColor(imageA, cv2.COLOR_BGR2RGB))
plt.title('Uang Kertas Rp. 50.000,- ASLI')
plt.show()

plt.xticks([]), plt.yticks([])
plt.imshow(cv2.cvtColor(imageB, cv2.COLOR_BGR2RGB))
plt.title('Uang Kertas Rp. 50.000,- PERUBAHAN')
plt.show()

plt.xticks([]), plt.yticks([])
plt.imshow(diff)
plt.title('Perbedaan')
plt.show()

plt.xticks([]), plt.yticks([])
plt.imshow(thresh)
plt.title('Threshold')
plt.show()

Kita melakukan perulangan kontur, cnts. Pertama, kita menghitung batas kotak di sekitar kontur menggunakan fungsi cv2.boundingRect. Kita menyimpan koordinat (x,y) yang relevan sebagai x dan y sekaligus lebar dan tinggi  kotak sebagai w dan h. Kemudian kita menggunakan nilai tersebut untuk menggambar kotak warna merah pada setiap citra dengan fungsi cv2.rectangle. Terakhir, kita menampilkan perbandingan citra dengan ditandai kotak untuk bagian yang berbeda.

Berikut ini kode program secara utuh:

# impor library yang diperlukan
from matplotlib import pyplot as plt
from skimage.measure import compare_ssim
import imutils
import cv2

# Load citra dari google drive
# Path sesuaikan dengan punya Anda
imageA = cv2.imread('drive/Deep_Learning_Latihan/Perbedaan_Gambar/uang50rb_asli.jpg')
imageB = cv2.imread('drive/Deep_Learning_Latihan/Perbedaan_Gambar/uang50rb_palsu.jpg')

# Konvert citra asli menjadi keabuan
grayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)
grayB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)

plt.xticks([]), plt.yticks([])
plt.imshow(grayA)
plt.title('Uang Kertas Rp. 50.000,- ASLI - Grayscale')
plt.show()

plt.xticks([]), plt.yticks([])
plt.imshow(grayB)
plt.title('Uang Kertas Rp. 50.000,- PERUBAHAN - Grayscale')
plt.show()

# Hitung Structural Similarity Index (SSIM) antara dua citra
# pastikan bahwa perbeddan citra dikembalikan nilainya
(score, diff) = compare_ssim(grayA, grayB, full=True)
diff = (diff * 255).astype("uint8")
print("SSIM: {} Rentang nilai -1 s/d 1 (nilai mendekati 1 berarti antar citra hampir sempurna sama)".format(score))

# threshold perbedaan citra, diikuti dengan pencarian kontur
# memperoleh area yang berbeda dari dua input citra
thresh = cv2.threshold(diff, 0, 255,
 cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
 cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)

# perulangan pada kontur
for c in cnts:

 # menghitung batas kotak dari kontur dan menggambar
 # batas kotak pada citra input untuk mewakili dua citra yang berbeda
 (x, y, w, h) = cv2.boundingRect(c)
 cv2.rectangle(imageA, (x, y), (x + w, y + h), (0, 0, 255), 2)
 cv2.rectangle(imageB, (x, y), (x + w, y + h), (0, 0, 255), 2)

# tampilkan citra
plt.xticks([]), plt.yticks([])
plt.imshow(cv2.cvtColor(imageA, cv2.COLOR_BGR2RGB))
plt.title('Uang Kertas Rp. 50.000,- ASLI')
plt.show()

plt.xticks([]), plt.yticks([])
plt.imshow(cv2.cvtColor(imageB, cv2.COLOR_BGR2RGB))
plt.title('Uang Kertas Rp. 50.000,- PERUBAHAN')
plt.show()

plt.xticks([]), plt.yticks([])
plt.imshow(diff)
plt.title('Perbedaan')
plt.show()

plt.xticks([]), plt.yticks([])
plt.imshow(thresh)
plt.title('Threshold')
plt.show()

Hasilnya sebagai berikut:

Kode program dapat di download di https://drive.google.com/open?id=1z_7OtBNUCrNJ35CkSvTZ9EavZQ5Dd1Gl dan https://colab.research.google.com/drive/1LkQBUd3ETB5OSsW9hQ-1hWM9GJ4AyBx1

Ilustrasi Google Colab:







-----------------  SEMOGA BERMANFAAT -----------------

Sunday, December 2, 2018

Project Management Life Cycle Model


1. Project Definition (Pendefinisian Proyek)
Mendefinisikan tujuan proyek dan faktor-faktor yang harus dipertimbangkan agar proyek yang dilaksanakan tersebut berhasil dengan kualitas yang diinginkan.

2. Project Initiation (Inisialisasi Proyek)
Perencanaan awal terhadap sumber daya yang akan digunakan sebelum suatu proyek dimulai.

3. Project Planning (Perencanaan Proyek)
Menguraikan dengan jelas bagaimana sebuah proyek harus dijalankan. Pada project planning ini, akan terlihat dengan jelas pentingnya segitiga manajemen proyek yaitu waktu, biaya, dan ruang lingkup suatu proyek.

4. Project Execution (Pelaksanaan Proyek)
Melakukan pekerjaan agar proyek yang dimaksud tersebut berhasil sesuai dengan keinginan.

5. Project Monitoring & Control (Pemantauan dan Pengendalian Proyek)
Pengambilan langkah-langkah yang diperlukan sehingga pengoperasian proyek berjalan dengan lancar.

6. Project Closure (Penutupan Proyek)
Menerima hasil akhir dari proyek dan menghentikan semua penggunaan sumber daya. 


1. Project Initiation
Dalam tahapan ini, Unit Bisnis atau Departemen dalam suatu organisasi mulai mengusulkan dan mengajukan proyek mereka yang berhubungan dengan penggunaan SI/TI kepada Divisi/ Departemen TI. Pengajuan proyek dilakukan secara resmi dengan mengisi dokumen yang telah ditentukan standarnya. Dokumen ini dikenal dengan istilah Business Case Document (BCD) atau Business Requirement Document (BRD). Dalam dokumen tersebut dijelaskan goal, objektif, ruang lingkup, risiko, dan alternatif opsi yang akan digunakan. BCD seharusnya dibuat dan dikerjakan oleh Unit Bisnis atau Departemen yang mengajukannya. Tetapi dalam praktiknya, ini lebih sering dilakukan oleh Project Management Officer (PMO) maupun Tim di Divisi/Departemen TI untuk mempercepat proses pengajuannya. Akibatnya, pengguna tidak terlalu mengerti apa yang mereka ajukan sehingga mereka juga tidak mengetahui apa yang menjadi kebutuhan dasar mereka. Hal ini tentu akan mempersulit dalam menentukan kriteria keberhasilan proyek. Padahal, selain sebagai bukti otentik pengajuan suatu proyek, fungsi lain dari pembuatan BCD ini adalah untuk meningkatkan rasa kepemilikan dan komitmen antara Divisi/Departemen TI dengan pengguna atau pemilik proyek dalam menjalankan proyeknya hingga selesai.Ketika BCD diserahkan kepada Divisi/Departemen TI, biasanya disertai dengan Job Request Form (JRF) yang menandakan bahwa usulan proyek dari unit bisnis/departemen lainnya sudah diserahkan ke Divisi/Departemen TI. JRF berisikan data yang mengajukan proyek serta nama dan deskripsi singkat proyek. Selanjutnya, Tim TI akan melakukan analisis terhadap pengajuan usulan tersebut berkenaan dengan ketersediaan resource di internal mereka seperti jumlah SDM yang tersedia, kemampuan SDM, kebutuhan perangkat keras, kebutuhan perangkat lunak(apakah memutuskan menggunakan software COTS atau membangun sendiri), dll.Penentuan project sponsor, project controller, dan project manager dapat dilakukan pada tahap ini. Project sponsor adalah orang yang mendanai dan mendukung proyek ini secara penuh. Biasanya yang bertindak sebagai project sponsor adalah Presiden Direktur/Direktur Utama/Direktur dari unit bisnis atau divisi terkait. Project controller adalah orang yang akan melakukan kontrol dan pengawasan terhadap jalannya proyek. Biasanya yang bertindak sebagai Project Controller adalah General Manager/Deputy General Manager/Kepala Divisi. Sedangkan project manager adalah orang yang ditunjuk untuk mengelola jalannya proyek. Project manager tidak harus seorang manajer, siapa pun bisa menjadi Project Manager.

2. Project Planning
Dalam tahapan ini, perencanaan dilakukan dengan membuat Tim inti proyek terlebih dahulu. Setelah itu membuat Work Breakdown Structure (WBS) berupa susunan pekerjaan-pekerjaan yang akan dilakukan dalam menyelesaikan proyek yang disajikan secara detail tanpa memperhatikan urutan pekerjaan. Setelah membuat WBS, Tim Proyek dapat membuat jadwal pekerjaan dalam bentuk Gantt Chart atau timeline, pemetaan SDM, dan perencanaan bujet. Kesemuanya itu dituangkan ke dalam dokumen project charter.Sebelum mengisi dokumen project charter, sejumlah pertemuan disusun untuk menyamakan persepsi dan mengetahui kebutuhan-kebutuhan bisnis secarai detail. Setiap pertemuan harus menghasilkan Minutes Of Meeting (MOM) yang mana merupakan rangkuman terhadap hasil pertemuan. MOM ini juga menjadi landasan dalam pengisian dokumen project charter. Jika membutuhkan bantuan pihak ketiga dalam pengerjaan ini baik untuk kebutuhan software maupun tenaga pengembang software, maka mekanisme tender juga dilakukan pada tahapan ini.Untuk memulai sebuah proyek, biasanya ditandai dengan Kick-off meeting. Pada saat kick-off meeting, project sponsor, dan project controller seharusnya hadir sebagai bentuk dukungan dan memotivasi tim dalam bekerja. Termasuk pihak ketiga yang dilibatkan dalam proyek. Dokumen project charter harus sudah selesai sebelum melakukan kick-off meeting karena pada saat pertemuan tersebut dokumen project charter harus disetujui. Dokumen project charter merupakan panduan dalam mengerjakan proyek. MOM Kick-off meeting juga dilampirkan bersama dokumen project charter.

3. Project Execution
Dalam tahapan ini, eksekusi dilakukan oleh Tim TI yang membangun dan mengembangkan aplikasi/sistem informasi dengan konsep SDLC.

a. Planning, dalam proses eksekusi pengembangan sistem yang termasuk kegiatan perencanaan meliputi analisis kebutuhan bisnis untuk memastikan bahwa Tim Pengembang maupun Analis Sistem sudah mengerti terhadap permintaan dalam dokumen project charter. Selain itu, penentuan penggunaan bahasa pemrograman, database, ketersediaan server, dan tools lainnya juga mulai disiapkan dalam tahapan ini. Jika kebutuhan perangkat belum tersedia, maka perlu dilakukan pengadaan barang untuk pemenuhan kebutuhan tersebut. Karena proses pengadaan barang membutuhkan waktu yang tidak sedikit.

b. Analysis, dalam proses eksekusi pengembangan sistem yang termasuk kegiatan analisis meliputi analisis dampak terhadap bisnis, mengidentifikasi potensial risiko yang mungkin ada, celah keamanan data, dan konsep High Availability (HA) jika diperlukan.

c. Design, dalam proses eksekusi pengembangan sistem yang termasuk kegiatan desain meliputi perancangan database, pembuatan Entity Relationship Diagram (ERD), pembuatan pseudocode, pembuatan Data Flow Diagram (DFD), pembuatan Use Case Diagram, pembuatan Activity Diagram (AD), HIPO diagram, desain theme, desain form, dll. Setelah proses desain selesai, Software Architecture Document (SAD) juga harus selesai dibuat. Pembuatan SAD dapat dicicil pada tahapan Analisis pada SDLC.

d. Implementation, dalam proses eksekusi pengembangan sistem yang termasuk kegiatan implementasi meliputi pembuatan code, pengujian, deploy, dan Go-Live. Pada tahapan implementasi, Test Scenario Document (TSD), Manual Guidance, dan Technical Document harus ada.
Dalam proses eksekusi ini akan menghasilkan aplikasi/sistem informasi yang diinginkan.





Berikut overview Software Kanbanchi, Trello dan Bitrix24