Membuat API menggunakan Flask
API merupakan kepanjangan dari Application Program Interface. API yang kita buat digunakan untuk menerima gambar/image dan server akan merespond nya dengan mengeluarkan JSON.Sebagai gambaran awal, kita akan menggunakan opencv untuk operasi blob. Tugas dari server yaitu mendapatkan lokasi blob object berupa lokasi XY dari gambar. Mengingat respond dari server hanya bisa menggunakan XML dan JSON atau string based maka solusi yang dapat kita kerjakan yaitu server akan mengirimkans JSON dari lokasi XY gambar.
Keungguan dari API yaitu client dapat menggunakan protokol HTTP sehingga client bebas akan menggunakan bahasa apapun sepanjang bisa menggunakan protokol HTTP untuk memanggil API. Berikut template HTML jika langsung menggunakan HTML atau berbasis WEB sebagai antar mukanya, yang kita simpan dalam folder templates/upload.html
<html> <head> <title>upload the file image:</title> </head> <body> <form action = "/predict" method = "post" enctype="multipart/form-data"> <input type="file" name="file" /> <input type = "submit" value="Upload"> </form> </body> </html>
Kemudian kita akan membuat flask dengan kode berikut, misalkan kita beri nama main_app.py
import os import cv2 import jsonpickle import numpy as np import json import pandas as pd from flask import Flask, flash, request, redirect, url_for from flask import * from flask import Flask, request, Response app = Flask(__name__) @app.route('/') def main(): return render_template("upload.html") @app.route('/predict',methods=['POST']) def predict(): file = None if request.method == 'POST': file = request.files['file'] file.save(file.filename) gray = cv2.imread(file.filename,0) thresh = cv2.threshold(gray, 0, 255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1] analysis2 = cv2.connectedComponentsWithStats(thresh,8,cv2.CV_32S) (totalLabels2, label_ids2, stats2, centroid2) = analysis2 xy_dict = list() for k in range(1,label_ids2.max()): xy = np.where(label_ids2==k) for i in range(0,len(xy[0])): buff = {'x':xy[0][i],'y':xy[1][i],'value':k} xy_dict.append(buff) j = pd.DataFrame(xy_dict).to_json(orient="split") return Response(response= j, status=200, mimetype="application/json") else: return file app.run()
mari kita panggil dengan perintah berikut
python main_app.py
kemudian kita browser untuk uji coba dengan lokasi 127.0.0.1:5000
* Serving Flask app '1. flask_latihan' * Debug mode: off 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
Misalkan untuk operasi gambar berikut
Berikut hasil yang ditampilkan
Memanggil API via request
from json import loads, dumps import requests import numpy as np from matplotlib import pyplot as plt resp = requests.post("http://localhost:5000/predict", files = {"file": open('/Users/user/Downloads/blob.png','rb')}) # print(resp.text) df = resp.text ab = loads(df) ac = ab['data'] ad = np.array(ac) g = np.zeros([600,600]) g[ad[:,0],ad[:,1]]=255 print("jumlah objek: ",ad[:,2].max()+1) plt.figure() plt.imshow(np.uint8(g),cmap='gray') plt.show()
hasilnya Membuat API menggunakan Flask telah bekerja dengan baik
(base) user@192 Uji Coba R Mask Beras Streamlit % python "2. request.py" jumlah objek: 8
selain menggunakan Flask, kalian bisa juga menggunakan fastapi yang lebih ringkas. Pembahasan mengenai fastapi akan dilanjutkan pada kesempatan lain saja.
Menggunakan Curl
Kalian juga bisa kok langsung menggunakan curl via terminal
curl -F "file=@blob.png" http://localhost:5000/predict