Zero45
Posted on July 4, 2024
Tentang Program
Saya mencoba membuat aplikasi pendeteksian di dalam monitor sebagai bentuk skripsi dari perkuliahan saya, dengan cara kerja menangkap bytes yang ada di layar monitor > clone image from bytes > convert numpy array > plot/detect(YOLOv8) > clone image from array > show result.
*Sekedar sharing project, diharapkan saya mendapatkan beberapa masukkan terkait project. Terima kasih sudah membaca.
Model: YOLOv8
- Mendeteksi tidak pakai helm, sarung tangan dan jacket.
General User Interface
- Tkinter
Screen Orientation
- 1680x1050
- 1600x900 (recommended)
- 1440x900
- 1400x1050
List Button
- Play button : menjalankan pendeteksian
- Pause button : memberhentikan pendeteksian(sebagai limiter while loop).
- Disable Screen button : Set screen menjadi default(saat awal di buka).
- Sharpen button : Membuat image menjadi sharpen dengan cv2.
- Nightvis button : Membuat image menjadi BGR2HLS dengan cv2.
- Save Button : Untuk sekarang masih save dalam bentuk foto .png (*Next akan di coba update untuk save video .mp4). 7 Update Button : Untuk mengkonfigurasi inference dari model yang sudah di latih (accuracy : imgsz, IoU, Conf).
- Reset Button : Untuk mengreset konfigurasi inference menjadi nilai default.
- Quit Button : Untuk keluar dari program.
Preview Program
Kondisi awal mulai
Detect Normal
Detect Sharpen
Detect Sharpen + Nightvis
Code
Bagian ini saya akan menjelaskan apa yang saya tulis di dalam code.
Line 1 - 9 adalah beberapa packages yang dibutuhkan dalam menjalankan program.
- Multiprocessing < diadakan untuk menghindari program memiliki window lebih dari yang dibuat. (*Masih belum pasti)
- Ultralytics < untuk pendeteksian pada numpy array yang dimiliki sebagai data.
- Tkinter < untuk GUI
- Numpy < numpy array
- cv2 < untuk konfigurasi image (filter, konversi warna)
- os.path < untuk pengecekan file pada proses save image agar tidak overwrite.
- mss < untuk menangkap bytes dari monitor yang digunakan.
- PIL < untuk mengclone image dari bytes dan dari array.
- random < untuk membuat angka random
wdw adalah window utama yang akan digunakan untuk menampilkan pendeteksian. beberapa variable di set false dikarnakan pendeteksian diawali dengan deteksi normal. setiap variable bisa saja berubah sesuai input user.
window utama memiliki title, dan icon. Hal yang perlu di perhatikan adalah mendapatkan nilai yang sebenarnya dari screen monitor (display orientation) di aplikasi ini saya pakai .winfo_screenwidth() dan .winfo_screenheight(). beberapa variable digunakan untuk starting position, dan lebar, tinggi dari window app.
karna button divisualisasikan dengan image, maka perlu beberapa image untuk button. variable listwidget digunakan untuk menampung semua button yang sudah dibuat, agar tidak terjadi overwrite.
iou, conf, dan acu variable disiapkan untuk tampungan nilai dari sliders pada aplikasi.
withdraw() untuk menyembunyikan main window (sebagai salah satu cara membuat splash screen).
kumpulan function untuk membuat button, sliders, dan label yang memiliki beberapa parameter yang dibutuhkan. untuk button memerlukan 3 argument : argument pertama image, argument kedua perintah untuk menjalankan function yang di tugaskan pada button, argument ketiga letak frames.
labelinfo hanya 1 argument : argument untuk pesan string. sliders 3 argument : argument pertama untuk variable yang akan di tampung nilai dari sliders, argument kedua untuk nama sliders, argument ketiga untuk posisi start sesuai default inference argument YOLOv8 Detect.
mengresize semua image yang akan digunakan pada pembuatan button.
function yang digunakan untuk membuat window splashscreen, dimana window ini akan tampil diawal saat program dijalankan selama beberapa detik. dan di dalam nya terdapat beberapa kata motivasi untuk tetap hidup dan berjuang.
window ini di tampilkan di tengah layar dengan ketentuan nilai tertentu(tidak adaptive ke berbagai resolusi). Diperlukan pengurangan dengan width dan height dari window splash screen agar window splash screen berada di tengah.
semua yang dibutuhkan main window terload up > munculkan splash screen > tunggu 5 detik. splashscreen dihancurkan dan main window ditampilkan kembali.
Kedua gambar diatas adalah inti dari program dimana program membuat sebuah jaring penangkap bytes dengan mss. starting position jaring top(0), left(0), lebar jaring, tinggi jaring. setelah mendapatkan bytes, clone image dari bytes, dan buat kernel untuk sharpen image.
di normal detection tidak menggunakan kernel, kernel dipakai jika variabel sharpeOn bernilai True. hasil dari clone image > numpy array untuk melakukan pendeteksian YOLO dan plotting > hasil pendeteksian dibuat clone image dari array > kedalam variable yang akan mengupdate image pada label tkinter.
[UPDATED] di dalam code ini terdapat perubahan pada tangkapan gambar, dikarnakan ketika diubah dari BGRA menjadi RGB pendeteksian jadi tidak bagus, maka ditetapkan BGRA menjadi BGR > gunakan data sebagai bahan untuk mempredict > setelah itu convert dan tampilkan dalam warna RGB.
Untuk perintah tombol start jalankan detect() dan config state dari beberapa tombol "active" / "disable" untuk mengurangi kemungkinan bug yang akan terjadi karna user input.
Untuk memberhentikan detect()/sebagai limiter dari while loop(wdw.after())
disable button memiliki perintah hampir sama dengan pause, hanya membuat program kembali ke state awal saat dijalankan(layar pendeteksian).
untuk button sharpen dan nightvis bersifat togle dengan tujuan memberikan nilai True / False, yang nantinya akan mempengaruhi detect().
melakukan pengecekan if dengan nama file, agar tidak terjadi overwrite data dan save image hasil clone image menjadi .png
update model ini digunakan ketika button update model di tekan, mengubah nilai default dari imgsz(accuracy), conf, dan iou sesuai input user dari sliders.
*nilai imgsz harus bisa dibagi 2^5 dan menghasilkan int. karna hal ini akan mempengaruhi backbone dari YOLO.
Reset model untuk mengembalikan nilai ke default dari model yang sudah diupdate imgsz, Conf, dan IoU.
Quit program dengan membalikan layar utama ke initial state dan memberi jeda 3 detik untuk hancurkan window utama lalu exit program.
gambar diatas merupakan kumpulan frame(untuk tata letak) dan widget yang di butuhkan main window untuk melakukan tugas nya dalam mendeteksi. setiap line di eksekusi ketika main window dalam keadaan hide agar saat splash screen dihancurkan dan main window di tampilkan, semua dalam keadaan siap.
[UPDATED] saya sudah mencoba dengan dual monitor dengan display orientation 1600x900 di kedua layar dengan file dtctdbl.py
FULL CODE
https://github.com/Alfin45/YOLOv8-Screen-Capture-Detection-App
Posted on July 4, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.