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
Setellah itu perlu menginstall library python untuk pyngrok sedangkan flask sudah tersedia secara default
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, jsonifyimport cv2import numpy as npimport timefrom pyngrok import ngrokimport threading# Replace 'your_authtoken' with your actual authtoken from ngrok dashboardngrok.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 Imagesdef detect_objects(img):starting_time = time.time()height, width, channels = img.shape# # Detecting objectsblob = 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 = personcenter_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 = 0mob = 0mot = 0for i in range(len(boxes)):if i in indexes:if class_ids[i] == 0:org = org + 1label = 'orang : ' + repr(org)elif class_ids[i] == 2:mob = mob + 1label = 'mobil : ' + repr(mob)elif class_ids[i] == 3:mot = mot + 1label = '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_timeprint("\"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 timestart_time = time.time()result = detect_objects(image)# Measure end timeend_time = time.time()# Calculate processing timeprocessing_time = end_time - start_timeresult['processing_time'] = float(processing_time) # Ensure it's a floatreturn jsonify(result)# Function to run Flask serverdef run_flask():app.run(port=5000)# Start Flask server in a separate threadflask_thread = threading.Thread(target=run_flask)flask_thread.start()# Set up ngrok tunnelpublic_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"
0 komentar:
Posting Komentar