可以做线路板网站的背景图网站的更新频率
可以做线路板网站的背景图,网站的更新频率,网站服务器暂时不可用怎么办,做一个网站的计划书YOLO12 API接口文档#xff1a;POST /predict 的multipart/form-data规范详解
1. 为什么你需要读懂这个接口规范
你刚部署好 ins-yolo12-independent-v1 镜像#xff0c;WebUI#xff08;7860端口#xff09;点几下就能看到检测效果——但真正要把YOLO12集成进你的业务系…YOLO12 API接口文档POST /predict 的multipart/form-data规范详解1. 为什么你需要读懂这个接口规范你刚部署好ins-yolo12-independent-v1镜像WebUI7860端口点几下就能看到检测效果——但真正要把YOLO12集成进你的业务系统靠点鼠标可不行。你得调API。而/predict这个接口是整个YOLO12服务对外输出能力的唯一图像入口。它不接受base64、不认JSON body、不解析URL参数里的图片链接——它只认一种格式multipart/form-data。很多开发者第一次调用失败不是模型没加载、不是GPU没启动而是卡在了“传图方式不对”用curl -d发送二进制数据→ 400 Bad Request把图片转成base64塞进JSON字段→ 422 Unprocessable Entity用Postman选错Body类型选了raw而非form-data→ 返回空响应或500这不是YOLO12的bug是HTTP协议层的“语言不通”。本文不讲YOLO原理不跑训练代码就聚焦一件事让你用任意编程语言100%正确地把一张图送进/predict拿到结构化检测结果。所有细节包括字段名、边界符、编码陷阱、常见报错全部摊开讲。2. POST /predict 接口核心行为与约束2.1 接口基础信息项目值HTTP方法POST路径/predict协议HTTP/1.1支持HTTPS若反向代理配置了SSL响应格式application/jsonUTF-8编码超时设置默认30秒从接收到完整请求体开始计时最大上传尺寸16MB由FastAPI默认限制不可热修改关键提醒该接口不校验文件扩展名但会尝试用PIL打开图像。上传.txt或损坏的.jpg会导致500错误日志显示UnidentifiedImageError。务必确保上传的是有效图像文件。2.2 multipart/form-data 的真实结构别被“表单数据”这个词骗了——它和网页里填用户名密码的form不是一回事。它的本质是把二进制文件和文本参数用一串特殊分隔符boundary打包成一个HTTP body。一个合法的请求体长这样已简化仅保留关键部分POST /predict HTTP/1.1 Host: 192.168.1.100:8000 Content-Type: multipart/form-data; boundary----WebKitFormBoundary7MA4YWxkTrZu0gW Accept: application/json ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; namefile; filenametest.jpg Content-Type: image/jpeg 这里是test.jpg的原始二进制字节流无任何编码 ------WebKitFormBoundary7MA4YWxkTrZu0gW--注意三个硬性要求Content-Type头必须包含boundary参数且值要与body中实际使用的分隔符完全一致namefile是固定字段名不能写成image、img或uploadfilename属性可有可无但若存在其值不应影响处理逻辑YOLO12只读取二进制内容Content-Type子部分即image/jpeg建议填写准确MIME类型但非强制传application/octet-stream也能成功。2.3 支持的图像格式与预处理规则YOLO12 API接收图像后会自动执行以下标准化流程步骤操作说明1. 解码使用PIL.Image.open()支持JPG/JPEG、PNG、WEBPBMP需额外安装pillow-simd不推荐2. 转模式.convert(RGB)灰度图、RGBA图均转为3通道RGB避免通道数不匹配3. Resize等比缩放补黑边 →640×640保持宽高比短边缩至640长边超出部分用黑色填充YOLO标准letterbox4. 归一化pixel / 255.0输入张量值域变为[0,1]符合PyTorch模型预期实测验证上传一张1920×1080的PNG人像图返回的bbox坐标是基于640×640推理分辨率的。如需映射回原图坐标需按比例反算见第4节。3. 各语言调用示例避开最常见坑3.1 Pythonrequests库——最简可靠版import requests url http://192.168.1.100:8000/predict # 替换为你的实例IP image_path /path/to/test.jpg # 正确直接传file对象requests自动构造multipart with open(image_path, rb) as f: files {file: (test.jpg, f, image/jpeg)} # (filename, file_obj, mime_type) response requests.post(url, filesfiles, timeout30) # 错误示范常见 # files {file: f.read()} # 传bytes会丢失filename和mime导致422 # files {file: open(image_path, rb)} # 缺少filename某些旧版requests会失败 if response.status_code 200: result response.json() print(f检测到 {len(result[predictions])} 个目标) for pred in result[predictions]: print(f- {pred[class_name]}: {pred[confidence]:.2f} [{pred[x1]}, {pred[y1]}, {pred[x2]}, {pred[y2]}]) else: print(f请求失败: {response.status_code} - {response.text})3.2 JavaScriptFetch API——浏览器/Node.js通用async function predictImage(fileInput) { const url http://192.168.1.100:8000/predict; const formData new FormData(); // 正确使用input.files[0]保留原始文件名和类型 formData.append(file, fileInput.files[0]); try { const response await fetch(url, { method: POST, body: formData, // 自动设置Content-Type和boundary // 不要手动设置headers否则会覆盖boundary }); if (!response.ok) throw new Error(HTTP ${response.status}); const result await response.json(); console.log(检测结果:, result); return result; } catch (err) { console.error(调用失败:, err); } } // 调用示例绑定到HTML input typefile document.getElementById(upload).addEventListener(change, (e) { predictImage(e.target); });3.3 cURL命令行——调试黄金组合# 终极可靠写法显式指定boundary兼容所有curl版本 curl -X POST http://192.168.1.100:8000/predict \ -H accept: application/json \ -F file/path/to/test.jpg;typeimage/jpeg \ -v # 加-v看详细请求头和body # 危险写法易出错 # curl -X POST ... -d test.jpg # 传的是raw body不是multipart # curl -X POST ... -H Content-Type: multipart/form-data # 缺少boundary服务无法解析调试技巧加-v参数后curl会打印完整的请求头和body。重点检查Content-Type: multipart/form-data; boundary------------------------...是否存在body中是否有Content-Disposition: form-data; namefile; filenametest.jpg行二进制数据前是否有空行\r\n\r\n4. 响应JSON结构详解与坐标映射指南4.1 标准响应字段说明成功响应HTTP 200返回标准JSON结构如下{ status: success, predictions: [ { class_id: 0, class_name: person, confidence: 0.924, x1: 128.3, y1: 45.7, x2: 210.8, y2: 320.1 }, { class_id: 2, class_name: car, confidence: 0.871, x1: 412.5, y1: 288.9, x2: 598.2, y2: 375.6 } ], input_size: { width: 640, height: 640 } }字段类型说明statusstring固定为success失败时返回其他状态码如400/500predictionsarray检测到的所有目标列表按置信度降序排列class_idintegerCOCO类别ID0person, 1bicycle, 2car...class_namestring对应的英文类别名小写无空格confidencefloat检测置信度0.0~1.0受请求时conf参数影响x1,y1,x2,y2float边界框左上角(x1,y1)和右下角(x2,y2)坐标单位像素input_sizeobject模型实际接收的输入尺寸恒为{width:640,height:640}4.2 如何把640×640坐标映射回原图YOLO12返回的坐标是基于640×640推理图的。如果你的原图是1280×720需要做逆letterbox变换def map_bbox_to_original(pred, orig_w, orig_h): # 1. 计算letterbox填充比例 r min(640 / orig_w, 640 / orig_h) # 缩放比例 new_unpad_w int(round(orig_w * r)) new_unpad_h int(round(orig_h * r)) pad_w 640 - new_unpad_w # 左右总填充 pad_h 640 - new_unpad_h # 上下总填充 # 2. 去除填充坐标平移 x1 max(0, (pred[x1] - pad_w / 2) / r) y1 max(0, (pred[y1] - pad_h / 2) / r) x2 min(orig_w, (pred[x2] - pad_w / 2) / r) y2 min(orig_h, (pred[y2] - pad_h / 2) / r) return {x1: x1, y1: y1, x2: x2, y2: y2} # 示例原图1280×720预测框在640×640图上是[100,50,200,150] orig_bbox map_bbox_to_original( {x1:100, y1:50, x2:200, y2:150}, orig_w1280, orig_h720 ) print(orig_bbox) # {x1: 200.0, y1: 100.0, x2: 400.0, y2: 300.0}关键结论YOLO12不做“智能缩放”它严格遵循YOLO标准letterbox流程。只要按此公式反算100%还原原图坐标。5. 高级用法置信度阈值与模型切换控制5.1 动态调整置信度阈值conf虽然WebUI提供滑块但API也支持运行时控制——通过URL查询参数# 将置信度阈值设为0.4更严格减少误检 curl -X POST http://192.168.1.100:8000/predict?conf0.4 \ -F filetest.jpg # 设为0.1更宽松召回更多目标 curl -X POST http://192.168.1.100:8000/predict?conf0.1 \ -F filetest.jpgconf参数范围0.01~0.99超出范围将被截断为最近合法值未提供时默认值为0.25与WebUI初始值一致该参数不影响模型加载或显存占用纯CPU侧过滤无性能损耗5.2 模型规格切换需重启服务注意模型切换不是API参数而是服务启动时的环境变量配置。这意味着你不能在一次API请求中指定“这次用nano下次用xlarge”所有API请求共享同一个已加载的模型实例切换模型必须修改环境变量 → 重启服务 → 等待权重加载完成约3-5秒。操作步骤在镜像内终端执行# 1. 设置新模型例如切到small版 export YOLO_MODELyolov12s.pt # 2. 重启服务自动加载新权重 bash /root/start.sh # 3. 验证是否生效查看日志末尾 tail -n 10 /root/logs/start.log # 成功日志Loaded model: yolov12s.pt (19.2MB) on cuda:0验证技巧调用API后检查响应中的input_size不变但predictions数量和置信度分布会变化——small版通常比nano版多检出10%~15%的低置信目标。6. 故障排查清单5分钟定位90%问题遇到调用失败按此顺序快速检查现象可能原因快速验证方法解决方案HTTP 400 Bad Requestfile字段名拼错、未传文件、文件为空curl -v看请求体是否含namefile检查代码中files键名确认文件对象非NoneHTTP 422 Unprocessable EntityContent-Type头缺失或错误、boundary不匹配curl -v确认header含multipart/form-data; boundary删除手动设置的Content-Type头让客户端自动生成HTTP 500 Internal Server Error图片损坏、非支持格式、内存不足查看/root/logs/api.log末尾错误栈用file test.jpg确认格式换一张已知正常的图重试响应为空或超时实例未启动、端口被防火墙拦截、GPU显存不足curl -I http://IP:8000/docs看是否返回200检查实例状态nvidia-smi看GPU内存netstat -tuln | grep 8000检测结果为空[]图像全黑/全白、目标过小16px、置信度过高降低conf参数至0.1重试用WebUI上传同一张图对比调整conf确认图像内容符合COCO类别终极诊断命令在镜像内执行# 查看API服务实时日志滚动跟踪 tail -f /root/logs/api.log # 检查模型是否加载成功 grep Loaded model /root/logs/start.log # 测试本地API连通性绕过网络 curl -X POST http://localhost:8000/predict -F file/root/test.jpg7. 总结掌握接口规范就是掌握集成主动权你不需要成为YOLO专家也能把目标检测能力稳稳接入自己的系统。本文拆解的不是抽象概念而是可立即验证、可逐行调试、可跨语言复用的具体规范multipart/form-data不是玄学它就是带boundary的二进制包裹namefile是唯一钥匙所有坐标都基于640×640但逆letterbox公式给你原图精度conf参数让你在灵敏度和准确率间自由滑动无需改一行模型代码模型切换虽需重启但5秒加载软链设计让A/B测试成本趋近于零。当你下次面对安防摄像头流、电商商品图、工业质检样本时心里清楚只要构造对那个file字段剩下的交给YOLO12。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。