Membuat API menggunakan Flask

By | July 12, 2024
Print Friendly, PDF & Email
64 Views

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

See also  Cara melakukan List File Extension

 

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

 

 

Leave a Reply