当Docker容器里跑起了我的第一个计算机视觉Demo

DevAI
2026-08-09 14:19
阅读 602

那个让我加班到凌晨三点的需求

产品经理提出要自动识别用户上传装修照片中的房间类型和主要家具。组里没人搞过计算机视觉,我硬着头皮接了下来。

在Docker里折腾模型服务的那几天

我选择了轻量的YOLOv8,但它要求Python 3.8以上,而公司服务器是CentOS 7配Python 3.6。直接升级系统环境会带来巨大风险,Docker完美解决了环境隔离问题。

首次构建镜像时漏装libgl1-mesa-glx导致OpenCV导入失败。模型文件过大,直接打包镜像体积近2GB,改为volume挂载宿主机模型文件。

FROM python:3.10-slim

WORKDIR /app

RUN apt-get update && apt-get install -y \
    libgl1-mesa-glx \
    libglib2.0-0 \
    && rm -rf /var/lib/apt/lists/*

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY app.py .

CMD ["python", "app.py"]
version: '3.8'
services:
  vision-service:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - ./model:/app/model
      - ./uploads:/app/uploads
    environment:
      - MODEL_PATH=/app/model/yolov8n.pt
    deploy:
      resources:
        limits:
          memory: 2G

知识库救了我这条老命

YOLOv8能识别家具,但无法判断房间类型。公司内部知识库里,一位离职同事的项目总结提供了思路:通过检测到的物体组合推断场景。

def infer_room_type(detections):
    """根据检测到的物体推断房间类型"""
    labels = [d['label'] for d in detections]
    
    if 'bed' in labels:
        confidence = 0.9
        if 'wardrobe' in labels or 'nightstand' in labels:
            confidence = 0.95
        return 'bedroom', confidence
    
    if 'sofa' in labels:
        if 'tv' in labels or 'coffee table' in labels:
            return 'living_room', 0.85
        return 'living_room', 0.7
    
    if 'refrigerator' in labels or 'oven' in labels:
        return 'kitchen', 0.8
    
    return 'unknown', 0.5

上线那天差点翻车

上线后内存占用飙到3G,服务响应极慢。原因是模型被重复加载到内存。改用单例模式,全局仅加载一次,内存稳定在1.5G。

from functools import lru_cache

@lru_cache(maxsize=1)
def get_model():
    """全局单例模型,避免重复加载"""
    from ultralytics import YOLO
    return YOLO(os.getenv('MODEL_PATH', 'yolov8n.pt'))

写在最后

这个功能让我找回了写代码的乐趣。技术不能光看不练,Docker、模型部署、逻辑串联起来并不可怕。我在知识库里补充了踩坑记录,希望后来者能少走弯路。下步打算研究ONNX Runtime优化推理速度。

评论 0

最热最新
暂无评论
DevAILv.1
0
影响力
0
文章
0
粉丝