Skip to main content

🚰🔌 āļĢāļ°āļšāļšāļ­āđˆāļēāļ™āļ•āļąāļ§āđ€āļĨāļ‚āļšāļ™āļĄāļīāđ€āļ•āļ­āļĢāđŒāđ„āļŸāļŸāđ‰āļēāđāļĨāļ°āļĄāļīāđ€āļ•āļ­āļĢāđŒāļ™āđ‰āļģ (Power / Water Meter OCR)

🚰🔌 āļĢāļ°āļšāļšāļŠāļģāļŦāļĢāļąāļšāļ­āđˆāļēāļ™āļ•āļąāļ§āđ€āļĨāļ‚āļšāļ™āļĄāļīāđ€āļ•āļ­āļĢāđŒāđ„āļŸāļŸāđ‰āļēāđāļĨāļ°āļĄāļīāđ€āļ•āļ­āļĢāđŒāļ™āđ‰āļģ

Version Status

Water Meter OCR āļ„āļ·āļ­āļšāļĢāļīāļāļēāļĢ AI āļ‚āļ­āļ‡āđ„āļ­āđāļ­āļžāļžāđŒāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ—āļĩāđˆāļ­āđˆāļēāļ™āđāļĨāļ°āđāļ›āļĨāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āļąāļ§āđ€āļĨāļ‚āļšāļ™āļĄāļīāđ€āļ•āļ­āļĢāđŒāļ™āđ‰āļģāđāļĨāļ°āļĄāļīāđ€āļ•āļ­āļĢāđŒāđ„āļŸāļŸāđ‰āļēāđ‚āļ”āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī āļšāļĢāļīāļāļēāļĢāļ™āļĩāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļˆāļąāļšāđāļĨāļ°āļ”āļķāļ‡āļ•āļąāļ§āđ€āļĨāļ‚āļˆāļēāļāļĄāļīāđ€āļ•āļ­āļĢāđŒāđāļšāļšāļāļĨāļĄāđāļĨāļ°āđāļšāļšāļŠāļĩāđˆāđ€āļŦāļĨāļĩāđˆāļĒāļĄāđ„āļ”āđ‰

āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđƒāļŠāđ‰āļ‡āļēāļ™â€‹

  1. āļ‚āđ‰āļ­āļāļģāļŦāļ™āļ”āđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™

    • API key āļˆāļēāļāđ„āļ­āđāļ­āļžāļžāđŒāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩ
    • āļĢāļđāļ›āļ āļēāļžāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ™āđ‰āļģ/āļĄāļīāđ€āļ•āļ­āļĢāđŒāđ„āļŸāļŸāđ‰āļēāļ—āļĩāđˆāļŠāļąāļ”āđ€āļˆāļ™
    • āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ­āļīāļ™āđ€āļ—āļ­āļĢāđŒāđ€āļ™āđ‡āļ•
  2. āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ­āļĒāđˆāļēāļ‡āļĢāļ§āļ”āđ€āļĢāđ‡āļ§

    • āļāļēāļĢāļˆāļ”āļˆāļģāļ•āļąāļ§āđ€āļĨāļ‚āļĄāļīāđ€āļ•āļ­āļĢāđŒāļ­āļĒāđˆāļēāļ‡āļĢāļ§āļ”āđ€āļĢāđ‡āļ§
    • āļĢāļ­āļ‡āļĢāļąāļšāļĄāļīāđ€āļ•āļ­āļĢāđŒāļŦāļĨāļēāļĒāļ›āļĢāļ°āđ€āļ āļ—
    • āļ­āļīāļ™āđ€āļ—āļ­āļĢāđŒāđ€āļŸāļ‹ API REST āļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™āļ‡āđˆāļēāļĒ
  3. āļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļīāļŦāļĨāļąāļ

    • āļāļēāļĢāļ•āļĢāļ§āļˆāļˆāļąāļšāļāļēāļĢāļ­āđˆāļēāļ™āļĄāļīāđ€āļ•āļ­āļĢāđŒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī
    • āļāļēāļĢāļˆāļ”āļˆāļģāļ•āļąāļ§āđ€āļĨāļ‚āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāđāļĄāđˆāļ™āļĒāļģāļŠāļđāļ‡
    • āđ€āļ§āļĨāļēāļ•āļ­āļšāļŠāļ™āļ­āļ‡āļ—āļĩāđˆāļĢāļ§āļ”āđ€āļĢāđ‡āļ§
    • āļāļēāļĢāļœāļŠāļēāļ™āļĢāļ§āļĄāļ—āļĩāđˆāļ‡āđˆāļēāļĒāļ”āļēāļĒ
  4. āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāđāļĨāļ°āļāļēāļĢāļ›āļāļīāļšāļąāļ•āļīāļ•āļēāļĄāļāļŽāļĢāļ°āđ€āļšāļĩāļĒāļš

    • āļ›āļāļīāļšāļąāļ•āļīāļ•āļēāļĄ GDPR āđāļĨāļ° PDPA
    • āđ„āļĄāđˆāļĄāļĩāļāļēāļĢāđ€āļāđ‡āļšāļĢāļąāļāļĐāļēāļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļĨāļąāļ‡āļˆāļēāļāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ
āļ§āļīāļ˜āļĩāļāļēāļĢāļ‚āļ­ API Key?

āļāļĢāļļāļ“āļēāđ€āļĒāļĩāđˆāļĒāļĄāļŠāļĄ iApp AI Portal āđ€āļžāļ·āđˆāļ­āļ”āļđ API key āļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāļŦāļĢāļ·āļ­āļ‚āļ­ API key āđƒāļŦāļĄāđˆ

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡â€‹

āļĄāļīāđ€āļ•āļ­āļĢāđŒāđ„āļŸāļŸāđ‰āļēāđāļĨāļ°āļĄāļīāđ€āļ•āļ­āļĢāđŒāļ™āđ‰āļģāđƒāļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļˆāļĢāļīāļ‡â€‹

1. āļĄāļīāđ€āļ•āļ­āļĢāđŒāļ™āđ‰āļģāđāļšāļšāļāļĨāļĄâ€‹

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 1 Power and Water Meter Example 1

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 2 Power and Water Meter Example 2

2. āļĄāļīāđ€āļ•āļ­āļĢāđŒāļ™āđ‰āļģāđāļšāļšāļŠāļĩāđˆāđ€āļŦāļĨāļĩāđˆāļĒāļĄâ€‹

Power and Water Meter Example 3

āļ„āļģāļ‚āļ­â€‹

curl --location --request POST 'https://api.iapp.co.th/meter-number-ocr/file' \
--header 'apikey: ----Your API Key----' \
--form 'file=@"/Users/id_1016_value_367_003.jpg"'

āļāļēāļĢāļ•āļ­āļšāļŠāļ™āļ­āļ‡â€‹

{
"infer_time": 0.16,
"label": "024963",
"message": "success",
"status": 200
}

āļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļīāđāļĨāļ°āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–​

āļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļīāļŦāļĨāļąāļâ€‹

  • āļāļēāļĢāļ•āļĢāļ§āļˆāļˆāļąāļšāļŦāļ™āđ‰āļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī (āđāļšāļšāļāļĨāļĄāđāļĨāļ°āđāļšāļšāļŠāļĩāđˆāđ€āļŦāļĨāļĩāđˆāļĒāļĄ)
  • āļāļēāļĢāļˆāļ”āļˆāļģāļ•āļąāļ§āđ€āļĨāļ‚āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāđāļĄāđˆāļ™āļĒāļģāļŠāļđāļ‡
  • āđ€āļ§āļĨāļēāđƒāļ™āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ—āļĩāđˆāļĢāļ§āļ”āđ€āļĢāđ‡āļ§
  • āļĢāļ­āļ‡āļĢāļąāļšāļĢāļđāļ›āđāļšāļšāļ āļēāļžāļŦāļĨāļēāļĒāļĢāļđāļ›āđāļšāļš

āļŸāļīāļĨāļ”āđŒāļ—āļĩāđˆāļĢāļ­āļ‡āļĢāļąāļšâ€‹

  • āļ•āļąāļ§āđ€āļĨāļ‚āļāļēāļĢāļ­āđˆāļēāļ™āļĄāļīāđ€āļ•āļ­āļĢāđŒ
  • āļāļēāļĢāļ•āļĢāļ§āļˆāļˆāļąāļšāļ›āļĢāļ°āđ€āļ āļ—āļŦāļ™āđ‰āļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ

āļ‚āđ‰āļ­āļĄāļđāļĨāļ­āđ‰āļēāļ‡āļ­āļīāļ‡ API​

āļˆāļļāļ”āļŠāļīāđ‰āļ™āļŠāļļāļ”​

POST https://api.iapp.co.th/meter-number-ocr/file

āļŠāđˆāļ§āļ™āļŦāļąāļ§â€‹

āļŠāļ·āđˆāļ­āļ›āļĢāļ°āđ€āļ āļ—āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ
apikeystringAPI key āļ‚āļ­āļ‡āļ„āļļāļ“

āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļĢāđ‰āļ­āļ‡āļ‚āļ­â€‹

āļŠāļ·āđˆāļ­āļ›āļĢāļ°āđ€āļ āļ—āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ
fileimageāļĢāļđāļ›āļ āļēāļžāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļŠāļąāļ”āđ€āļˆāļ™

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”​

Python​

import requests

url = "https://api.iapp.co.th/meter-number-ocr/file"

payload = {}
files=[
('file',('{YOUR UPLOADED FILE NAME}',open('{YOUR UPLOADED FILE PATH}','rb'),'image/png'))
]
headers = {
'apikey': '{YOUR_API_KEY}'
}

response = requests.request("POST", url, headers=headers, data=payload, files=files)

print(response.text)

JavaScript​

const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
let data = new FormData();
data.append('file', fs.createReadStream('{YOUR UPLOADED FILE PATH}'));

let config = {
method: 'post',
maxBodyLength: Infinity,
url: 'https://api.iapp.co.th/meter-number-ocr/file',
headers: {
'apikey': '{YOUR_API_KEY}',
...data.getHeaders()
},
data : data
};

axios.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});

PHP​

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.iapp.co.th/meter-number-ocr/file',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => array('file'=> new CURLFILE('{YOUR UPLOADED FILE PATH}')),
CURLOPT_HTTPHEADER => array(
'apikey: {YOUR_API_KEY}'
),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

Swift​

let parameters = [
[
"key": "file",
"src": "{YOUR UPLOADED FILE PATH}",
"type": "file"
]] as [[String: Any]]

let boundary = "Boundary-\(UUID().uuidString)"
var body = Data()
var error: Error? = nil
for param in parameters {
if param["disabled"] != nil { continue }
let paramName = param["key"]!
body += Data("--\(boundary)\r\n".utf8)
body += Data("Content-Disposition:form-data; name=\"\(paramName)\"".utf8)
if param["contentType"] != nil {
body += Data("\r\nContent-Type: \(param["contentType"] as! String)".utf8)
}
let paramType = param["type"] as! String
if paramType == "text" {
let paramValue = param["value"] as! String
body += Data("\r\n\r\n\(paramValue)\r\n".utf8)
} else {
let paramSrc = param["src"] as! String
let fileURL = URL(fileURLWithPath: paramSrc)
if let fileContent = try? Data(contentsOf: fileURL) {
body += Data("; filename=\"\(paramSrc)\"\r\n".utf8)
body += Data("Content-Type: \"content-type header\"\r\n".utf8)
body += Data("\r\n".utf8)
body += fileContent
body += Data("\r\n".utf8)
}
}
}
body += Data("--\(boundary)--\r\n".utf8);
let postData = body


var request = URLRequest(url: URL(string: "https://api.iapp.co.th/meter-number-ocr/file")!,timeoutInterval: Double.infinity)
request.addValue("{YOUR_API_KEY}", forHTTPHeaderField: "apikey")
request.addValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

request.httpMethod = "POST"
request.httpBody = postData

let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data else {
print(String(describing: error))
return
}
print(String(data: data, encoding: .utf8)!)
}

task.resume()

Kotlin​

val client = OkHttpClient()
val mediaType = "text/plain".toMediaType()
val body = MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("file","{YOUR UPLOADED FILE NAME}",
File("{YOUR UPLOADED FILE PATH}").asRequestBody("application/octet-stream".toMediaType()))
.build()
val request = Request.Builder()
.url("https://api.iapp.co.th/meter-number-ocr/file")
.post(body)
.addHeader("apikey", "{YOUR_API_KEY}")
.build()
val response = client.newCall(request).execute()

Java​

OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("file","{YOUR UPLOADED FILE NAME}",
RequestBody.create(MediaType.parse("application/octet-stream"),
new File("{YOUR UPLOADED FILE PATH}")))
.build();
Request request = new Request.Builder()
.url("https://api.iapp.co.th/meter-number-ocr/file")
.method("POST", body)
.addHeader("apikey", "{YOUR_API_KEY}")
.build();
Response response = client.newCall(request).execute();

Dart​

var headers = {
'apikey': '{YOUR_API_KEY}'
};
var request = http.MultipartRequest('POST', Uri.parse('https://api.iapp.co.th/meter-number-ocr/file'));
request.files.add(await http.MultipartFile.fromPath('file', '{YOUR UPLOADED FILE PATH}'));
request.headers.addAll(headers);

http.StreamedResponse response = await request.send();

if (response.statusCode == 200) {
print(await response.stream.bytesToString());
}
else {
print(response.reasonPhrase);
}

āļ„āļ§āļēāļĄāđāļĄāđˆāļ™āļĒāļģāđāļĨāļ°āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžâ€‹

āļāļēāļĢāļ›āļĢāļ°āđ€āļĄāļīāļ™āļœāļĨāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāđ‚āļ”āļĒāđƒāļŠāđ‰āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļžāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ™āđ‰āļģāļ—āļąāđ‰āļ‡āđāļšāļšāļŠāļĩāđˆāđ€āļŦāļĨāļĩāđˆāļĒāļĄāđāļĨāļ°āđāļšāļšāļāļĨāļĄ (107 āļ āļēāļž)

āļāļēāļĢāļ›āļĢāļ°āđ€āļĄāļīāļ™āđāļšāļšāļˆāļģāļĨāļ­āļ‡â€‹

āđāļšāļšāļˆāļģāļĨāļ­āļ‡āļ„āļģāļ­āļ˜āļīāļšāļēāļĒāļ„āļ§āļēāļĄāđāļĄāđˆāļ™āļĒāļģ (%)
āđāļšāļšāļˆāļģāļĨāļ­āļ‡āļāļēāļĢāļ•āļĢāļ§āļˆāļˆāļąāļšāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ™āđ‰āļģāļ•āļĢāļ§āļˆāļˆāļąāļšāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ™āđ‰āļģāļˆāļēāļāļ āļēāļžāļ›āđ‰āļ­āļ™āđ€āļ‚āđ‰āļē96.22
āđāļšāļšāļˆāļģāļĨāļ­āļ‡ OCRāļˆāļ”āļˆāļģāļ•āļąāļ§āđ€āļĨāļ‚76.47
āļ„āļ§āļēāļĄāđāļĄāđˆāļ™āļĒāļģāđ‚āļ”āļĒāļĢāļ§āļĄāļ„āļ§āļēāļĄāđāļĄāđˆāļ™āļĒāļģāđ‚āļ”āļĒāļĢāļ§āļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļš73.58

āļāļēāļĢāļ›āļĢāļ°āđ€āļĄāļīāļ™āļ­āļąāļāļ‚āļĢāļ°â€‹

āļ•āļąāļ§āđ€āļĨāļ‚āļˆāļģāļ™āļ§āļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļˆāļģāļ™āļ§āļ™āļ—āļĩāđˆāļ–āļđāļāļ•āđ‰āļ­āļ‡āļ„āļ§āļēāļĄāđāļĄāđˆāļ™āļĒāļģ (%)
019718895.43
1858094.12
2585391.38
3696391.3
4656295.38
5575087.72
6514384.31
7524892.31
8484083.33
9595084.75

āļ„āļ§āļēāļĄāđāļĄāđˆāļ™āļĒāļģāđ‚āļ”āļĒāļĢāļ§āļĄāđ‚āļ”āļĒāļ­āļīāļ‡āļˆāļēāļāļāļēāļĢāļ•āļĢāļ§āļˆāļˆāļąāļšāļ•āļąāļ§āđ€āļĨāļ‚āļ—āļĩāđˆāļ–āļđāļāļ•āđ‰āļ­āļ‡ = 90 %

āļ›āļĢāļ°āļ§āļąāļ•āļī/āļšāļąāļ™āļ—āļķāļāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡â€‹

āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 1.0 - 2021-10-05​

āđ€āļžāļīāđˆāļĄ

  • āđ€āļ›āļīāļ”āļ•āļąāļ§āļĢāļ°āļšāļš OCR āļĄāļīāđ€āļ•āļ­āļĢāđŒāļ™āđ‰āļģāļ‚āļ­āļ‡āđ„āļ­āđāļ­āļžāļžāđŒ
  • āļĢāļ­āļ‡āļĢāļąāļšāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ™āđ‰āļģāļ—āļļāļāļ›āļĢāļ°āđ€āļ āļ—

āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 1.1 - 2021-12-02​

āđāļāđ‰āđ„āļ‚

  • āļāļēāļĢāļ•āļĢāļ§āļˆāļˆāļąāļš 2 āļŦāļĨāļąāļāđƒāļ™āļžāļīāļāļąāļ” x āđ€āļ”āļĩāļĒāļ§āļāļąāļ™
  • āđ€āļžāļīāđˆāļĄāļ„āļ§āļēāļĄāđāļĄāđˆāļ™āļĒāļģāļˆāļēāļ 62.26 āđ€āļ›āđ‡āļ™ 73.58