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