在机器学习和人工智能领域,图像识别是一项基础且重要的任务。通过训练模型来识别和分类图像中的内容,可以广泛应用于安防监控、医疗诊断、自动驾驶等多个领域。本文将介绍如何使用Roboflow平台进行图像识别模型的预测,包括本地图片和网络图片的预测方法。
在开始之前,确保已经安装了Roboflow库,并且拥有一个有效的API密钥。可以通过Roboflow的官方网站获取API密钥。此外,如果打算在Node.js环境中进行预测,还需要安装axios库来发送HTTP请求。
首先,将学习如何预测本地图像。以下是一个使用Python语言进行预测的示例代码。这段代码首先导入了Roboflow库,并使用API密钥创建了一个Roboflow对象。然后,通过指定模型的端点和版本号,加载了相应的模型。最后,使用模型的predict方法对本地图像进行预测,并打印出预测结果。
from roboflow import Roboflow
rf = Roboflow(api_key="API_KEY")
project = rf.workspace().project("MODEL_ENDPOINT")
model = project.version(VERSION).model
# 预测本地图像
print(model.predict("your_image.jpg").json())
如果想可视化预测结果,可以使用model.predict方法的save函数将预测结果保存为图片。此外,如果图像已经托管在网络其他地方,也可以通过指定URL的方式进行预测。
在Node.js环境中,可以使用axios库来发送POST请求,对本地图像进行预测。以下是一个示例代码。这段代码首先导入了axios和fs库,然后使用fs库读取本地图像文件,并将其编码为base64格式。接着,使用axios库发送POST请求,将编码后的图像数据发送到Roboflow的预测接口。最后,打印出预测结果。
const axios = require("axios");
const fs = require("fs");
const image = fs.readFileSync("YOUR_IMAGE.jpg", {
encoding: "base64"
});
axios({
method: "POST",
url: "https://classify.roboflow.com/your-model/42",
params: {
api_key: "YOUR_KEY"
},
data: image,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
}
})
.then(function(response) {
console.log(response.data);
})
.catch(function(error) {
console.log(error.message);
});
在这段代码中,首先读取本地图像文件,并将其编码为base64格式。然后,使用axios库发送POST请求,将编码后的图像数据发送到Roboflow的预测接口。在请求的参数中,需要指定API密钥和模型的版本号。最后,打印出预测结果。
除了预测本地图像外,Roboflow还支持预测网络图像。以下是一个使用Python语言进行网络图像预测的示例代码。这段代码首先导入了UIKit库,然后使用UIKit库加载网络图像,并将其编码为base64格式。接着,创建一个URLRequest对象,指定预测接口的URL,并设置请求方法为POST。最后,使用URLSession的dataTask方法发送请求,并打印出预测结果。
import UIKit
// 加载图像并转换为Base64
let image = UIImage(named: "your-image-path")
let imageData = image?.jpegData(compressionQuality: 1)
let fileContent = imageData?.base64EncodedString()
let postData = fileContent!.data(using: .utf8)
// 初始化推理服务器请求
var request = URLRequest(url: URL(string: "https://classify.roboflow.com/your-model/your-model-version?api_key=YOUR_APIKEY&name=YOUR_IMAGE.jpg")!, timeoutInterval: Double.infinity)
request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
request.httpBody = postData
// 执行POST请求
URLSession.shared.dataTask(with: request, completionHandler: { data, response, error in
// 解析响应为字符串
guard let data = data else {
print(String(describing: error))
return
}
// 将响应字符串转换为字典
do {
let dict = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
} catch {
print(error.localizedDescription)
}
// 打印字符串响应
print(String(data: data, encoding: .utf8)!)
})
.resume()
在这段代码中,首先加载网络图像,并将其编码为base64格式。然后,创建一个URLRequest对象,指定预测接口的URL,并设置请求方法为POST。在请求的参数中,需要指定API密钥和模型的版本号。最后,使用URLSession的dataTask方法发送请求,并打印出预测结果。
Roboflow的预测接口返回一个JSON对象,其中包含了预测结果的详细信息。对于单标签分类任务,JSON对象包含以下属性:
对于多标签分类任务,JSON对象的格式略有不同,除了包含上述属性外,还包含predicted_classes属性,表示模型预测的所有类别(标签/类别)的列表。
要使用推理API,需要向以下URL发送POST请求:
POST https://classify.roboflow.com/:datasetSlug/:versionNumber
可以直接将base64编码的图像数据POST到模型端点,或者在查询字符串中传递URL作为image参数,如果图像已经托管在其他地方。
路径参数:
查询参数:
状态码:
以下是一个示例JSON响应对象,展示了单标签分类任务的预测结果:
{
"predictions": {
"bird": {
"confidence": 0.5282308459281921
},
"cat": {
"confidence": 0.5069406032562256
},
"dog": {
"confidence": 0.49514248967170715
}
},
"predicted_classes": [
"bird",
"cat"
]
}
以下是一个示例JSON响应对象,展示了多标签分类任务的预测结果:
{
"time": 0.19291414400004214,
"image": {
"width": 113,
"height": 210
},
"predictions": {
"dent": {
"confidence": 0.5253503322601318
},
"severe": {
"confidence": 0.5804202556610107
}
},
"predicted_classes": [
"dent",
"severe"
],
"image_path": "/car-model-343.jpg",
"prediction_type": "ClassificationModel"
}