Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

  • IC Timer 555 yang Multifungsi

    IC timer 555 adalah sirkuit terpadu (chip) yang digunakan dalam berbagai pembangkit timer, pulsa dan aplikasi osilator. Komponen ini digunakan secara luas, berkat kemudahan dalam penggunaan, harga rendah dan stabilitas yang baik

  • Ayo Migrasi TV Digital

    Kami bantu anda untuk memahami lebih jelas mengenai migrasi tv digital, apa sebabnya dan bagaimana efek terhadap kehidupan. Jasa teknisi juga tersedia dan siap membantu instalasi - setting perangkat - pengaturan antena dan distribusi televisi digital ke kamar kos / hotel

  • Bermain DOT Matrix - LOVEHURT

    Project Sederhana dengan Dot Matrix dan Attiny2313. Bisa menjadi hadiah buat teman atau pacarmu yang ulang tahun dengan tulisan dan animasi yang dapat dibuat sendiri.

  • JAM DIGITAL 6 DIGIT TANPA MICRO FULL CMOS

    Jika anda pencinta IC TTL datau CMOS maka project jam digital ini akan menunjukkan bahwa tidak ada salahnya balik kembali ke dasar elektronika digital , sebab semuanya BISA dibuat dengan teknologi jadul

  • Node Red - Kontrol Industri 4.0

    Teknologi kontrol sudah melampaui ekspektasi semua orang dan dengan kemajuan dunia elektronika, kini semakin leluasa berkreasi melalui Node Red

Jumat, 19 Juli 2024

Breaking News : LoRaWan Antares Migrasi Ke Telkomiot.id

 



Betapa galaunya beberapa mahasiswa yang mengambil topik skripsi LoRawan di 15 juli 2024 ...Pak..gak bisa kirim data !! Gak cuman mahasiswa bimbingan saya, namun dari kampus lain pun mengalami hal serupa dan memenuhi whatsapp saya.


Jadi ingat beberapa bulan yang lalu ada mahasiswa dari mataram yang bertanya namun menggunakan console bukan antares, dan mengaku diberikan oleh dosennya yang baru pulang dari pelatihan di telkom bandung. Dan console itu berupa tampilan dari web telkomiot.id



BTS LoRaWan di Telkom Mataram


Oprek-oprek lah saya dan sempat berkeliling melakukan test apakah lorawan-nya sudah bisa konek seperti antares, dan hasilnya di bulan mei itu masih zonk. Begitu juga dengan beberapa koneksi MQTT - Rest API dll masih mengalami error yang sangat fundamental. Jadi saat itu saya menemukan topik MQTT nya masih ngawur dan data bisa dikirimkan kemana saja asal topiknya berupa alamat dari device. Setelah itu saya tinggalkan aja karena sepertinya belum di configure dengan bagus. Mau men-review ujungnya saya jadi kepo dan nyinyir gak karuan.

Kembali ke Lorawan di pertengahan juli 2024, dimana antares mulai ngaco, akhirnya saya teringat akan telkomiot.id ini, mungkin firasat saya tepat karena dinihari 19 juli setelah mumet bersama beberapa mahasiswa di siang nya, saya entah kenapa kembali mengambil alat lorawan yang tadi saya pake keliling dan mengganti parameter lorawan nya ke telkomiot. Hasilnya terdapat uplink data berupa ini:



   

Datanya yang diterima ternyata berupa hexa padahal yg saya kirim tulisan, sehingga harus di terjemahkan dulu di hexa to ascii via web:




Dan jika ingin mengirimkan data yg benar, maka data dikirim dalam format json {"key": value} seperti contoh script oprekan saya disini :


void LoRa_sendMessage()
{
  String text = "{\"cobafrek\":" + String(LoRa_frek_INA_923) +"}";
  LoRa_TxMode();
  LoRaWanPacket.clear();
  
  LoRaWanPacket.print(text);
  
  if (LoRaWanPacket.encode()) 
  {
    LoRa.beginPacket();
    LoRa.write(LoRaWanPacket.buffer(), LoRaWanPacket.length());
    LoRa.endPacket();
  }

  if( LoRa_frek_INA_923 >= LoRa_frek_INA_923_end ) LoRa_frek_INA_923 = LoRa_frek_INA_923_start;
  else LoRa_frek_INA_923 += LoRa_frek_step;
}


Hasilnya lumayan benar deh sekarang





Telkomiot ini masih gratis sejak bulan mei dan meng-claim memberikan trial 1 tahun GRATIS. Wahhh ayo dicoba saja deh mumpung kayaknya habis migrasi ini akan mulai berbayar. Selanjutnya saya akan mencoba kirim-kiriman data menggunakan LoRaWan telkom ini karena sepertinya saya tertarik untuk DOWNLINK data..Mumpung masih free tidak terbatas kayak antares dulu ! Tunggu yaa...

Share:

Senin, 15 Juli 2024

[raspi - yolo] Pendeteksi Orang Pada CCTV Menggunakan Raspi-Yolov5

 


Wah ternyata yolov5 sangat cocok digunakan pada raspberry pi 3 (baca disini dulu), jadi semangat nihh berbagi kegembiraan bersama pembaca. Jadi seperti yang dulu saat saya belajar yolo v3, ujungnya adalah deteksi orang pada cctv yang bisa dibaca disini. Langsung aja kita akan buat script untuk mengetestnya melalui cctv yang ada di kota malang yang lebih ringan daripada di jogja, alamat untuk memilih titiknya di: http://cctv.malangkota.go.id/




Dan script gabungan dari beberapa tulisan sebelumnya saya bagikan seperti berikut :


import sys
import time
import json
import torch
import cv2
import os
import contextlib
from pathlib import Path

os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = '/usr/lib/x86_64-linux-gnu/qt5/plugins'


def draw_boxes(frame, results):
    # Get the bounding boxes, labels, and confidence scores
    bboxes = results.xyxyn[0][:, :-1].numpy()
    labels = results.xyxyn[0][:, -1].numpy()
    confidences = results.xyxyn[0][:, -2].numpy()

    # Define the COCO class label for 'person'
    PERSON_LABEL = 0

    # Draw boxes for persons only
    for bbox, label, confidence in zip(bboxes, labels, confidences):
        if label == PERSON_LABEL:
            x1, y1, x2, y2 = bbox[:4]
            x1 = int(x1 * frame.shape[1])
            y1 = int(y1 * frame.shape[0])
            x2 = int(x2 * frame.shape[1])
            y2 = int(y2 * frame.shape[0])
            cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
            cv2.putText(frame, f'Orang {confidence:.2f}', (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (200, 255, 0), 2)


def main(stream_source):
    start_time = time.time()
    # Load YOLOv5 model
    model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)

    # Open the video stream
    cap = cv2.VideoCapture(stream_source)
    if not cap.isOpened():
        print(f"Error: Could not open video stream {stream_source}")
        return

   # start_time = time.time()
    ret, frame = cap.read()
    if not ret:
        print("Error: Could not read frame")
        cap.release()
        return

    # Perform inference
    results = model(frame)

    # Extract bounding boxes and labels
    labels = results.xyxyn[0][:, -1].numpy()
    n_persons = sum(1 for label in labels if label == 0)  # label '0' typically corresponds to 'person' in COCO dataset

    # Calculate processing time
    processing_time = time.time() - start_time

    # Output results as JSON
    output = {
        "orang": n_persons,
        "time": round(processing_time, 2)
    }
    print(json.dumps(output))

    # Save the frame with bounding boxes as JPEG
   
    draw_boxes(frame, results)
    output_image_path = "/home/lampuku/yolov5/output.jpg"
    #results.render()  # This function draws bounding boxes on the frame
    cv2.imwrite(output_image_path, frame)

    cap.release()

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Usage: python single_detect.py <stream_source>")
    else:
        stream_source = sys.argv[1]
        main(stream_source)

Hasilnya seperti berikut :



Waktu processing memang terlihat lama 23 detik, namun ini adalah waktu yg menunjukkan proses awal fusing layer dari yolov5. Namun jika melakukan deteksi selanjutnya cukup cepat ketika saya mencoba loop detect seperti berikut ini :




Wow dibawah 5 detik, cukup cepat deteksinya lhooo...Kalau ada yg berminat bisa menggabungkannya dengan node-red untuk membuat webui seperti gambar paling atas.




Share:

[raspi - yolo] Menguji Kemampuan Raspberry pi 3B Untuk Pengolahan Gambar Yolo V5

 


Setelah memanfaatkan kekuatan cloud computing untuk pengolahan gambar yolo v3, karena raspberry pi zero w resource nya terbatas (baca dulu disini), maka kini saatnya melakukan upgrade ke seri raspberry pi yang lebih tinggi yaitu raspi 3B yang memang support komputasi 64bit. Jadi berdasarkan bantuan chatGPT disarankan untuk mencoba yolo v5 dimana berbasis engine TORCH sehingga pas dijalankan di arm 64 bit. Jadi jangan lupa instal versi raspbbery pi melalui imagernya yaitu OS lite legacy (bullseye) 64 bit tanpa desktop. Jadi jangan sampai salah install OS karena memang sangat terbatas resource raspi 3B yang quad core CPU 64bit 1.2 Ghz dengan ram 1GB saja.

Jika sudah sukses instalasi OS maka bisa lanjut menghubungkan ke wifi dan gunakan putty untuk ssh ke ip raspi kamu dan jalankan urutan perintah berikut :


1. Update raspi kamu

sudo apt-get update
sudo apt-get upgrade

2. Install python, pip dan git

sudo apt-get install python3
sudo apt-get install python3-pip

sudo apt-get install git

3. Install yolo v5 beserta script requirements-nya

git clone https://github.com/ultralytics/yolov5
cd yolov5

pip3 install -r requirements.txt


4. Install pytorch beserta turunannya

sudo apt-get install libopenblas-dev libblas-dev m4 cmake cython python3-yaml

wget https://github.com/nmilosev/pytorch-arm-builds/releases/download/v1.4/pytorch-1.4.0a0+6bfc3e0-cp37-cp37m-linux_armv7l.whl
pip3 install torch-1.4.0a0+6bfc3e0-cp37-cp37m-linux_armv7l.whl


Kemudian jika instalasi selesai maka dapat menjalankan script contoh detect.py dan usahakan ukuran gambarnya tidak besar.

python detect.py --source nolkm.jpg


Hasilnya sebagai berikut, sangat memuaskan :



Hasil diatas mungkin bisa berbeda jika ada dependencies atau library yang gagal instal atau bahkan salah instal. Saya sangat mengandalkan chatGPT setiap ada kesalahan yang saya temukan dan agak lupa apa saja error yg muncul itu. Dan yang paling penting adalah menggunakan CPU untuk pengolahan gambar karena raspberry pi tidak punya GPU sekelas Nvidia untuk menjalankan torch.

Salah satu error yang saya ingat adalah, karena OS saya tanpa desktop maka runtime QT untuk menampilkan gambar akan selalu dianggap error :


qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "/home/lampuku/.local/lib/python3.9/site-packages/cv2/qt/plugins" even though it was found. This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.


Jadi hal ini disolusikan oleh chatGPT dengan melakukan instalasi manual "headless" sebagai berikut :


1. Install QT dan Xwindows environment. Ini mungkin tidak di perlukan jika kamu menggunakan desktop pada raspberry pi 3 kamu


sudo apt-get update
sudo apt-get install libgl1-mesa-glx libxcb-xinerama0
2. Jangan lupa menambahkan ini jika ingin menjalankan yolov5 pada script python


export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/x86_64-linux-gnu/qt5/plugins  # Adjust path as necessary

3. Jika diperlukan install open cv dengan headless environment


pip install opencv-python-headless

4. Lakukan pengecekan instalasi dengan script testing dibawah ini :


import torch
from PIL import Image

# Load YOLOv5 model
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)

# Set image path
image_path = 'path/to/your/image.jpg'

# Perform inference
results = model(image_path)

# Display results
results.show()  # Displays the image with bounding boxes

# Optionally, save the results
results.save(save_dir='results/')  # Saves results in the 'results' directory

Dan jika hasilnya muncul seperti dibawah ini berarti instalasi sudah benar

Fusing layers...
YOLOv5s summary: 213 layers, 7225885 parameters, 0 gradients, 16.4 GFLOPs
Adding AutoShape...

Selanjutnya kita akan mendeteksi orang pada kamera cctv pada tulisan berikutnya disini.

Share:

Minggu, 14 Juli 2024

[raspi - yolo] Google Colab & Ngrok - Mengolah Gambar Untuk Raspi Zero W

 


Cloud computing adalah hal yang cukup lumrah kita temui untuk membantu semua pekerjaan komputasi kita secara jarak jauh dan dimanapun. Saya sering menggunakan vps - google cloud - aws untuk membatu banyak pekerjaan saya dan kali ini saya akan gunakan google colab yang memiliki kemampuan menjalankan script python pada cloud. Permasalahannya adalah jika kita ingin mengakses google colab secara http API /Post /Get maka tidak akan ada IP public yang diberikan oleh google. Sehingga kita membutuhkan fasilitas tunneling "Gratis" bernama NGROK

Ngrok adalah alat yang memungkinkan pengembang untuk mengekspos server lokal ke internet dengan cara yang aman. Ini sangat berguna untuk pengembangan dan pengujian aplikasi web, terutama ketika perlu memeriksa bagaimana aplikasi tersebut berinteraksi dengan layanan eksternal atau perangkat lain yang tidak berada di jaringan lokal. 

Silahkan daftar dengan akun google kamu dan jangan lupa dapatkan authtoken tunneling untuk praktek yang aakan saya contohkan dibawah.



Pada google colab, setelah terkoneksi dengan benar, maka dibutuhkan mengunduh file konfigurasi yolo v3 seperti berikut ini 

!wget https://pjreddie.com/media/files/yolov3.weights
!wget https://raw.githubusercontent.com/pjreddie/darknet/master/cfg/yolov3.cfg
!wget https://raw.githubusercontent.com/pjreddie/darknet/master/data/coco.names

Setellah itu perlu menginstall library python untuk  pyngrok sedangkan flask sudah tersedia secara default

!pip install pyngrok

Dan response nya seperti berikut

Collecting pyngrok Downloading pyngrok-7.1.6-py3-none-any.whl (22 kB) Requirement already satisfied: PyYAML>=5.1 in /usr/local/lib/python3.10/dist-packages (from pyngrok) (6.0.1) Installing collected packages: pyngrok Successfully installed pyngrok-7.1.6

Brikut ini adalah script python untuk mengolah gambar via flask yang mirip dengan tulisan sebelumnya disini . Jangan lupa mengambil authtoken tunnel di dashbor ngrok


from flask import Flask, request, jsonify
import cv2
import numpy as np
import time
from pyngrok import ngrok
import threading



# Replace 'your_authtoken' with your actual authtoken from ngrok dashboard
ngrok.set_auth_token('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')

app = Flask(__name__)


yolo = cv2.dnn.readNet("yolov3.weights", "yolov3.cfg")
classes = []

with open("coco.names", "r") as file:
    classes = [line.strip() for line in file.readlines()]


layer_names = yolo.getLayerNames()
output_layers = [layer_names[i - 1] for i in yolo.getUnconnectedOutLayers()]

colorRed = (0,0,255)
colorGreen = (0,255,0)

# #Loading Images
def detect_objects(img):
    starting_time = time.time()
    height, width, channels = img.shape

    # # Detecting objects
    blob = cv2.dnn.blobFromImage(img, 0.00392, (255, 255), (0, 0, 0), True, crop=False)

    yolo.setInput(blob)
    outputs = yolo.forward(output_layers)

    class_ids = []
    confidences = []
    boxes = []
    for output in outputs:
        for detection in output:
            scores = detection[5:]
            class_id = np.argmax(scores)
            confidence = scores[class_id]
            if confidence > 0.4 and class_id == 0 : # 0 = person
                center_x = int(detection[0] * width)
                center_y = int(detection[1] * height)
                w = int(detection[2] * width)
                h = int(detection[3] * height)

                x = int(center_x - w / 2)
                y = int(center_y - h / 2)

                boxes.append([x, y, w, h])
                confidences.append(float(confidence))
                class_ids.append(class_id)


    indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)
    org = 0
    mob = 0
    mot = 0

    for i in range(len(boxes)):
        if i in indexes:
            if class_ids[i] == 0:
                org = org + 1
                label = 'orang : ' + repr(org)
            elif class_ids[i] == 2:
                mob = mob + 1
                label = 'mobil : ' + repr(mob)
            elif class_ids[i] == 3:
                mot = mot + 1
                label = 'motor : ' + repr(mot)
            x, y, w, h = boxes[i]
            #label = str(classes[class_ids[i]]) + ', x=' +repr(x) + ',y=' +repr(y)
            #label = str(classes[class_ids[i]]) + '- no: ' + repr(i+1)
            cv2.rectangle(img, (x, y), (x + w, y + h), colorGreen, 3)
            cv2.putText(img, label, (x, y -5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,255) )




    print("{")
    print(f"\"Jumlah Orang\": {org},")
    print(f"\"Jumlah Mobil\": {mob},")
    print(f"\"Jumlah Motor\": {mot},")

    elapsed_time = time.time() - starting_time
    print("\"processing time\":" + repr(elapsed_time)  )
    print("}")
    #cv2.imshow("Image", img)
    cv2.imwrite("output.jpg",img)
    #cv2.waitKey(0)
    #cv2.destroyAllWindows()
    return {"Orang": org, "Mobil": mob, "Motor": mot, "time": elapsed_time }

@app.route("/detect", methods=["POST"])
def detect():
    file = request.files["image"]
    npimg = np.fromfile(file, np.uint8)
    image = cv2.imdecode(npimg, cv2.IMREAD_COLOR)

    # Measure start time
    start_time = time.time()

    result = detect_objects(image)

    # Measure end time
    end_time = time.time()

    # Calculate processing time
    processing_time = end_time - start_time
    result['processing_time'] = float(processing_time)  # Ensure it's a float

    return jsonify(result)


# Function to run Flask server
def run_flask():
    app.run(port=5000)

# Start Flask server in a separate thread
flask_thread = threading.Thread(target=run_flask)
flask_thread.start()

# Set up ngrok tunnel
public_url = ngrok.connect(5000)
print("Flask server is running at:", public_url)

Sedangkan script pada raspberry pi zero tetap sama dengan tulisan sebelumnya. Jalankan script pada google colab sampai muncul alamat public dari ngrok tunneling.


 * Serving Flask app '__main__'
 * Debug mode: off
INFO:werkzeug:WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
INFO:werkzeug:Press CTRL+C to quit
Flask server is running at: NgrokTunnel: "https://029a-34-105-62-129.ngrok-free.app" -> "http://localhost:5000"


Hasilnya luar biasa cepat dan gratis pula !




Dikarenakan alamat publik dari tunneling ngrok berubah setiap kali script dijalankan pada google colab, maka saya sudah berhasil mengakalinya dengan memanfaatkan MQTT sebagai pengirim alamat tunnel nya dan dapat digunakan oleh banyak pengguna semisal banyak raspberry pi zero w + cam di beberapa titik lampu. Ini akan saya bahas jika ada yang tertarik dengan tulisan saya ini (by request).

SELAMAT BELAJAR !
Share:

Kontak Penulis



12179018.png (60×60)
+628155737755

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (14) antares (11) arduino (28) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (26) euro2020 (13) gcc (1) gsm (1) iklan (1) infrared (2) Input Output (3) iot (76) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (11) lorawan (2) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (2) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (33) proyek (1) python (8) radio (28) raspberry pi (9) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) telkomiot (5) transistor (2) troubleshoot (3) tulisan (94) tutorial (108) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3) yolo (7)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika