最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Windows環(huán)境下Docker部署YOLOv8并集成Spring?Boot的完整步驟記錄

 更新時間:2026年07月24日 09:15:07   作者:張道寧  
這篇文章主要介紹了Windows環(huán)境下Docker部署YOLOv8并集成Spring Boot的完整步驟,本文手把手教你用Docker在Windows上部署YOLOv8,并無縫集成到SpringBoot項目,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

前言

在 AI 目標檢測領域,YOLO(You Only Look Once)系列模型以其高效、精準的特點成為主流選擇,而 Spring Boot 作為 Java 生態(tài)最流行的 Web 開發(fā)框架,能輕松將 YOLO 的檢測能力封裝為可復用的接口。本文將全程還原 Windows 環(huán)境下,通過 Docker 部署 YOLOv8 模型,并集成到 Spring Boot 項目的完整流程,包含環(huán)境準備、問題排查、代碼集成、接口測試,適合有一定 Java 和 Docker 基礎的開發(fā)者參考。

一、前言:為什么選擇 Docker + Spring Boot + YOLOv8?

在本地部署 YOLO 模型時,常常會遇到環(huán)境依賴復雜、版本沖突、跨平臺兼容性差等問題,而 Docker 能完美解決這些痛點——通過容器化封裝 YOLO 運行所需的所有依賴,實現(xiàn)“一次構建,到處運行”。

結合 Spring Boot 的優(yōu)勢,我們可以將 YOLO 的圖片檢測能力封裝為 HTTP 接口,支持前端上傳圖片、后端返回檢測結果,輕松集成到小程序、APP、管理系統(tǒng)等各類業(yè)務場景中,實現(xiàn)“檢測能力接口化、業(yè)務集成輕量化”。

本文核心目標:在 Windows 環(huán)境下,完成 Docker 部署 YOLOv8 → 解決部署過程中的常見問題 → 將 YOLO 檢測能力集成到 Spring Boot 項目 → 提供可直接調(diào)用的圖片檢測接口。

二、環(huán)境準備(必看)

2.1 基礎環(huán)境清單

  • 操作系統(tǒng):Windows 10/11(建議開啟 WSL2,提升 Docker 性能)
  • Docker:Docker Desktop(版本 20.0 以上)
  • JDK:17(Spring Boot 3.2.x 要求)
  • Maven:3.6+(項目構建)
  • Spring Boot:3.2.4
  • YOLO 模型:YOLOv8n(輕量版,適合 CPU 運行,無需 GPU 加速)

2.2 前置環(huán)境配置

2.2.1 Docker Desktop 配置(關鍵)

  1. 安裝 Docker Desktop 后,開啟 WSL2 后端(性能優(yōu)于 Hyper-V):

    • 打開 Docker Desktop → Settings → General → 勾選 “Use the WSL 2 based engine”
    • 重啟 Docker Desktop,確保服務正常啟動(右下角 Docker 圖標顯示綠色)
  2. 配置文件共享(避免掛載目錄權限問題):

    • 打開 Docker Desktop → Settings → Resources → File Sharing
    • 點擊 “+” 按鈕,添加本地目錄 D:\yolo_test(用于掛載 Docker 容器,存儲圖片和檢測結果),保存后重啟 Docker

2.2.2 項目基礎準備

本文基于已有的 Spring Boot 項目(原有功能包含 Ollama 大模型集成、PGvector 向量存儲、阿里云語音識別等),核心是在原有項目基礎上新增 YOLO 圖片檢測模塊,無需從零搭建 Spring Boot 項目。

三、Docker 部署 YOLOv8 模型(全程實操+問題排查)

這一步是核心基礎,我們將通過 Docker 拉取 YOLOv8 官方鏡像,運行容器并完成圖片檢測,解決部署過程中最常見的“文件找不到”“掛載失敗”等問題。

3.1 拉取 YOLOv8 官方 Docker 鏡像

打開 PowerShell(管理員模式),執(zhí)行以下命令拉取官方鏡像(內(nèi)置 YOLOv8 所有依賴,無需手動配置):

docker pull ultralytics/ultralytics:latest

鏡像拉取完成后,執(zhí)行 docker images 可查看鏡像是否存在。

3.2 運行 Docker 容器并掛載本地目錄

核心命令(掛載本地 D:\yolo_test 到容器內(nèi) /yolo_data,實現(xiàn)本地與容器文件互通):

docker run -it --rm -v /d/yolo_test:/yolo_data ultralytics/ultralytics:latest

命令說明

  • -it:交互式終端,方便在容器內(nèi)執(zhí)行命令
  • --rm:容器退出后自動刪除,避免殘留
  • -v /d/yolo_test:/yolo_data:目錄掛載(Windows 路徑需用 /d/ 替代 D:\,Docker 才能識別)

3.3 執(zhí)行 YOLOv8 圖片檢測(首次實操)

3.3.1 準備測試圖片

在本地 D:\yolo_test 目錄下,放入一張測試圖片,命名為 test.jpg注意:文件名和后綴必須完全匹配,避免大小寫錯誤,如 Test.jpg、test.jpeg 都會導致失?。?/p>

3.3.2 執(zhí)行檢測命令

在容器內(nèi)(命令行顯示 root@xxx:/ultralytics#),執(zhí)行以下命令:

yolo detect predict model=yolov8n.pt source=/yolo_data/test.jpg save=True

命令說明

  • model=yolov8n.pt:使用 YOLOv8 輕量版模型(n=納米版,適合 CPU 運行,體積小、速度快)
  • source=/yolo_data/test.jpg:檢測源為容器內(nèi)掛載目錄下的 test.jpg
  • save=True:保存檢測結果(帶檢測框的圖片)

3.4 常見問題排查(重點?。?/h3>

首次運行大概率會遇到以下問題,本文全程還原排查過程,幫你快速解決。

問題1:FileNotFoundError: /yolo_data/test.jpg does not exist

報錯原因:容器內(nèi)找不到指定圖片,核心是兩個原因之一:

  1. 本地 D:\yolo_test 目錄下沒有 test.jpg,或文件名/后綴錯誤
  2. 目錄掛載失敗,容器內(nèi) /yolo_data 目錄為空

解決步驟

  1. 先在容器內(nèi)執(zhí)行 ls /yolo_data,查看掛載目錄是否有文件:

    • 如果輸出為空:說明掛載失敗,重新執(zhí)行容器運行命令(確保路徑是 /d/yolo_test,而非 D:\yolo_test
    • 如果輸出 yolo_data(子目錄):說明圖片放在了 D:\yolo_test\yolo_data 下,需修改命令為 source=/yolo_data/yolo_data/test.jpg
  2. 確認本地 D:\yolo_test 下有 test.jpg,重新執(zhí)行檢測命令

問題2:檢測結果保存到容器內(nèi),本地看不到

報錯現(xiàn)象:檢測成功,但本地 D:\yolo_test 目錄下沒有檢測結果

原因:YOLO 默認將結果保存到容器內(nèi) /ultralytics/runs/detect/predict,而非掛載目錄

解決方法

  1. 手動復制結果到掛載目錄(容器內(nèi)執(zhí)行):

    cp -r /ultralytics/runs/detect/predict /yolo_data/
    
  2. 下次檢測直接指定保存路徑(推薦),修改命令為:

    yolo detect predict model=yolov8n.pt source=/yolo_data/test.jpg save=True project=/yolo_data/runs name=detect
    

    這樣結果會直接保存到 /yolo_data/runs/detect,對應本地 D:\yolo_test\runs\detect

3.5 檢測成功驗證

檢測成功后,容器內(nèi)會輸出類似以下日志:

image 1/1 /yolo_data/test.jpg: 640x480 1 cup, 1 tv, 1 mouse, 1 refrigerator, 1 book, 63.4ms
Speed: 4.6ms preprocess, 63.4ms inference, 8.6ms postprocess per image at shape (1, 3, 640, 480)
Results saved to /yolo_data/runs/detect

此時打開本地 D:\yolo_test\runs\detect 目錄,會看到帶檢測框的 test.jpg,圖片上會標注出識別到的物體(如杯子、電視、鼠標等),說明 Docker 部署 YOLOv8 成功!

四、Spring Boot 集成 YOLOv8 檢測能力(完整代碼)

Docker 部署 YOLOv8 成功后,我們將其集成到 Spring Boot 項目,提供 HTTP 接口,支持前端上傳圖片、后端返回檢測結果(識別的物體、數(shù)量、耗時、結果圖片路徑)。

4.1 項目改造:pom.xml 依賴新增

在原有 pom.xml 基礎上,新增文件操作、命令執(zhí)行相關依賴(用于處理圖片上傳、調(diào)用 Docker 命令):

<!-- 新增依賴版本定義 -->
<properties>
    <commons-io.version>2.15.1</commons-io.version>
    <commons-lang3.version>3.14.0</commons-lang3.version>
</properties>

<!-- 新增依賴 -->
<dependencies>
    <!-- 文件操作工具類 -->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>${commons-io.version}</version>
    </dependency>
    
    <!-- 字符串/日期工具類 -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>${commons-lang3.version}</version>
    </dependency>
    
    <!-- 命令執(zhí)行相關 -->
    <dependency>
        <groupId>ch.ethz.ganymed</groupId>
        <artifactId>ganymed-ssh2</artifactId>
        <version>262</version>
    </dependency>
</dependencies>

:原有依賴(Spring Boot Web、Ollama、PGvector、阿里云語音等)全部保留,無需修改。

4.2 項目改造:application.yml 配置新增

在原有配置基礎上,新增 YOLO 和 Docker 相關配置,同時補充文件上傳限制:

# 新增 YOLO 配置
yolo:
  # Docker 本地掛載目錄(對應本地 D:\yolo_test)
  docker-mount-path: D:\yolo_test
  # 容器內(nèi)掛載路徑
  container-mount-path: /yolo_data
  # YOLO 模型名稱(默認 yolov8n.pt)
  model-name: yolov8n.pt
  # 檢測結果保存目錄(容器內(nèi))
  container-result-path: /yolo_data/runs/detect
  # 本地臨時文件存儲目錄
  local-temp-path: D:\yolo_test\temp
  # Docker 鏡像名稱
  docker-image: ultralytics/ultralytics:latest

# 原有配置保留,補充文件上傳配置
spring:
  servlet:
    multipart:
      max-file-size: 10MB  # 單文件最大10MB
      max-request-size: 50MB  # 總請求最大50MB

4.3 新增核心代碼(可直接復制使用)

新增 4 個核心類,實現(xiàn)圖片上傳、Docker 命令調(diào)用、檢測結果解析、接口提供,全部放在 com.ruoyi 包下(與原有項目包結構一致)。

4.3.1 配置類:YoloConfig.java(讀取 YOLO 配置)

package com.ruoyi.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * YOLO 配置類,讀取 application.yml 中的 yolo 相關配置
 */
@Data
@Component
@ConfigurationProperties(prefix = "yolo")
public class YoloConfig {
    /**
     * Docker 本地掛載目錄
     */
    private String dockerMountPath;

    /**
     * 容器內(nèi)掛載路徑
     */
    private String containerMountPath;

    /**
     * YOLO 模型名稱
     */
    private String modelName;

    /**
     * 容器內(nèi)檢測結果保存路徑
     */
    private String containerResultPath;

    /**
     * 本地臨時文件存儲目錄
     */
    private String localTempPath;

    /**
     * Docker 鏡像名稱
     */
    private String dockerImage;
}

4.3.2 實體類:YoloDetectResult.java(封裝檢測結果)

package com.ruoyi.entity;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * YOLO 檢測結果返回實體,用于接口返回 JSON 格式數(shù)據(jù)
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class YoloDetectResult {
    /**
     * 檢測是否成功
     */
    private boolean success;

    /**
     * 錯誤信息(失敗時返回)
     */
    private String errorMsg;

    /**
     * 檢測到的目標列表
     */
    private List<DetectObject> detectObjects;

    /**
     * 檢測耗時(毫秒)
     */
    private long costTime;

    /**
     * 檢測結果圖片路徑(本地)
     */
    private String resultImagePath;

    /**
     * 檢測目標實體(單個物體的信息)
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class DetectObject {
        /**
         * 目標類別(如 cup、tv、mouse)
         */
        private String className;

        /**
         * 目標數(shù)量
         */
        private int count;

        /**
         * 置信度(0-1),越大越精準
         */
        private float confidence;
    }
}

4.3.3 工具類:YoloDetectUtil.java(核心檢測邏輯)

package com.ruoyi.util;

import com.ruoyi.config.YoloConfig;
import com.ruoyi.entity.YoloDetectResult;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * YOLO 圖片檢測工具類,封裝 Docker 命令調(diào)用、結果解析邏輯
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class YoloDetectUtil {
    private final YoloConfig yoloConfig;

    // 匹配檢測結果的正則表達式(如:1 cup, 1 tv, 1 mouse)
    private static final Pattern DETECT_PATTERN = Pattern.compile("(\\d+)\\s+([a-zA-Z_]+)");

    /**
     * 上傳圖片并執(zhí)行 YOLO 檢測
     * @param file 上傳的圖片文件
     * @return 檢測結果(包含識別的物體、耗時、結果路徑)
     */
    public YoloDetectResult detectImage(MultipartFile file) {
        long startTime = System.currentTimeMillis();
        try {
            // 1. 校驗文件是否為空
            if (file.isEmpty()) {
                return YoloDetectResult.builder()
                        .success(false)
                        .errorMsg("上傳的圖片文件為空")
                        .build();
            }

            // 2. 校驗圖片格式(僅支持 jpg/jpeg/png/bmp)
            String originalFilename = file.getOriginalFilename();
            if (originalFilename == null || !originalFilename.matches(".*\\.(jpg|jpeg|png|bmp)$")) {
                return YoloDetectResult.builder()
                        .success(false)
                        .errorMsg("僅支持 jpg/jpeg/png/bmp 格式的圖片")
                        .build();
            }

            // 3. 創(chuàng)建臨時目錄(用于存儲上傳的圖片)
            File tempDir = new File(yoloConfig.getLocalTempPath());
            if (!tempDir.exists()) {
                boolean mkdirs = tempDir.mkdirs();
                if (!mkdirs) {
                    log.error("創(chuàng)建臨時目錄失敗:{}", yoloConfig.getLocalTempPath());
                    return YoloDetectResult.builder()
                            .success(false)
                            .errorMsg("創(chuàng)建臨時目錄失敗")
                            .build();
                }
            }

            // 4. 保存上傳的圖片到本地掛載目錄(Docker 可訪問)
            String fileName = UUID.randomUUID() + "_" + originalFilename;
            String localImagePath = yoloConfig.getDockerMountPath() + File.separator + fileName;
            File localImageFile = new File(localImagePath);
            file.transferTo(localImageFile);
            log.info("上傳的圖片已保存到:{}", localImagePath);

            // 5. 構建 Docker 命令(調(diào)用 YOLO 檢測)
            String containerImagePath = yoloConfig.getContainerMountPath() + "/" + fileName;
            String dockerCmd = String.format(
                    "docker run --rm -v %s:%s %s yolo detect predict model=%s source=%s save=True project=%s name=detect",
                    yoloConfig.getDockerMountPath().replace("\\", "/"), // Windows 路徑轉(zhuǎn)換為 Docker 可識別格式
                    yoloConfig.getContainerMountPath(),
                    yoloConfig.getDockerImage(),
                    yoloConfig.getModelName(),
                    containerImagePath,
                    yoloConfig.getContainerResultPath()
            );
            log.info("執(zhí)行 Docker 命令:{}", dockerCmd);

            // 6. 執(zhí)行 Docker 命令,獲取輸出結果
            Process process = Runtime.getRuntime().exec(new String[]{"cmd", "/c", dockerCmd});
            int exitCode = process.waitFor();
            if (exitCode != 0) {
                // 讀取錯誤信息,返回失敗結果
                String errorMsg = new String(process.getErrorStream().readAllBytes());
                log.error("執(zhí)行 YOLO 檢測失敗,錯誤碼:{},錯誤信息:{}", exitCode, errorMsg);
                return YoloDetectResult.builder()
                        .success(false)
                        .errorMsg("執(zhí)行檢測失?。? + errorMsg)
                        .build();
            }

            // 7. 解析命令輸出,提取檢測到的物體信息
            String output = new String(process.getInputStream().readAllBytes());
            log.info("YOLO 檢測命令輸出:{}", output);
            List<YoloDetectResult.DetectObject> detectObjects = parseDetectResult(output);

            // 8. 拼接檢測結果圖片路徑(本地可訪問)
            String resultImagePath = yoloConfig.getDockerMountPath() + File.separator + "runs" + File.separator + "detect" + File.separator + "detect" + File.separator + fileName;
            long costTime = System.currentTimeMillis() - startTime;

            // 9. 返回成功結果
            return YoloDetectResult.builder()
                    .success(true)
                    .detectObjects(detectObjects)
                    .costTime(costTime)
                    .resultImagePath(resultImagePath)
                    .build();

        } catch (IOException e) {
            log.error("圖片檢測 IO 異常", e);
            return YoloDetectResult.builder()
                    .success(false)
                    .errorMsg("IO 異常:" + e.getMessage())
                    .build();
        } catch (InterruptedException e) {
            log.error("檢測命令執(zhí)行被中斷", e);
            Thread.currentThread().interrupt();
            return YoloDetectResult.builder()
                    .success(false)
                    .errorMsg("檢測被中斷:" + e.getMessage())
                    .build();
        } catch (Exception e) {
            log.error("圖片檢測異常", e);
            return YoloDetectResult.builder()
                    .success(false)
                    .errorMsg("檢測異常:" + e.getMessage())
                    .build();
        }
    }

    /**
     * 解析 YOLO 檢測命令輸出,提取目標信息(類別、數(shù)量)
     * @param output 命令輸出字符串
     * @return 檢測目標列表
     */
    private List<YoloDetectResult.DetectObject> parseDetectResult(String output) {
        List<YoloDetectResult.DetectObject> result = new ArrayList<>();
        if (output == null || output.isEmpty()) {
            return result;
        }

        // 匹配 "1 cup, 1 tv, 1 mouse" 格式的字符串
        Matcher matcher = DETECT_PATTERN.matcher(output);
        Map<String, Integer> countMap = new HashMap<>();

        while (matcher.find()) {
            int count = Integer.parseInt(matcher.group(1));
            String className = matcher.group(2);
            countMap.put(className, countMap.getOrDefault(className, 0) + count);
        }

        // 轉(zhuǎn)換為 DetectObject 列表(置信度默認 0.9,可根據(jù)實際輸出優(yōu)化)
        for (Map.Entry<String, Integer> entry : countMap.entrySet()) {
            result.add(YoloDetectResult.DetectObject.builder()
                    .className(entry.getKey())
                    .count(entry.getValue())
                    .confidence(0.9f)
                    .build());
        }

        return result;
    }
}

4.3.4 控制器:YoloController.java(提供 HTTP 接口)

package com.ruoyi.controller;

import com.ruoyi.entity.YoloDetectResult;
import com.ruoyi.util.YoloDetectUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

/**
 * YOLO 圖片檢測控制器,提供 HTTP 接口供前端調(diào)用
 */
@Slf4j
@RestController
@RequestMapping("/api/yolo")
@RequiredArgsConstructor
public class YoloController {
    private final YoloDetectUtil yoloDetectUtil;

    /**
     * 圖片目標檢測接口
     * @param file 上傳的圖片文件
     * @return 檢測結果(JSON 格式)
     */
    @PostMapping("/detect")
    public ResponseEntity<YoloDetectResult> detectImage(@RequestParam("file") MultipartFile file) {
        try {
            YoloDetectResult result = yoloDetectUtil.detectImage(file);
            return ResponseEntity.ok(result);
        } catch (Exception e) {
            log.error("圖片檢測接口異常", e);
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body(YoloDetectResult.builder()
                            .success(false)
                            .errorMsg("接口異常:" + e.getMessage())
                            .build());
        }
    }
}

4.4 啟動類驗證(確保組件掃描)

確保 Spring Boot 啟動類掃描到新增的配置類、控制器等組件,修改啟動類(如已有則無需新增):

package com.ruoyi;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

@Slf4j
@SpringBootApplication(scanBasePackages = "com.ruoyi") // 掃描 com.ruoyi 下所有組件
@EnableConfigurationProperties
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
        log.info("Spring Boot 應用啟動成功,端口:8889");
    }
}

五、接口測試(驗證集成效果)

項目啟動成功后,我們通過 Postman 測試圖片檢測接口,驗證集成效果。

5.1 測試準備

  1. 啟動 Docker Desktop(確保 Docker 服務正常運行)
  2. 啟動 Spring Boot 應用(端口 8889)
  3. 準備一張測試圖片(jpg/png 格式)

5.2 Postman 測試步驟

  1. 新建 POST 請求,地址:http://localhost:8889/api/yolo/detect
  2. 請求類型選擇 form-data,key 填寫 file,value 選擇“文件”,上傳測試圖片
  3. 點擊發(fā)送請求,查看返回結果

5.3 成功返回示例

{
    "success": true,
    "errorMsg": null,
    "detectObjects": [
        {
            "className": "cup",
            "count": 1,
            "confidence": 0.9
        },
        {
            "className": "tv",
            "count": 1,
            "confidence": 0.9
        },
        {
            "className": "mouse",
            "count": 1,
            "confidence": 0.9
        }
    ],
    "costTime": 1200,
    "resultImagePath": "D:\\yolo_test\\runs\\detect\\detect\\xxx_test.jpg"
}

返回結果說明

  • success: true:檢測成功
  • detectObjects:識別到的物體列表(類別、數(shù)量、置信度)
  • costTime:檢測耗時(毫秒)
  • resultImagePath:本地帶檢測框的圖片路徑,可直接打開查看結果

六、常見問題與優(yōu)化建議

6.1 常見問題

問題可能原因解決方案
接口調(diào)用失敗,提示“Docker 命令執(zhí)行失敗”Docker 未啟動檢查 Docker Desktop 是否正常運行
接口調(diào)用失敗,提示“執(zhí)行檢測失敗”掛載目錄權限問題檢查 Docker Desktop 文件共享配置是否正確
檢測速度慢模型較大或 CPU 性能不足使用更輕量的 YOLOv8n 模型,或考慮開啟 GPU 加速
結果圖片無法打開結果圖片路徑不正確檢查 resultImagePath 是否正確,確認 Docker 檢測結果已保存到掛載目錄
圖片上傳失敗,提示文件過大文件大小超出限制調(diào)整 application.yml 中的 max-file-size 配置

6.2 優(yōu)化建議

1. 優(yōu)化檢測速度

  • 開啟 Docker GPU 加速(需安裝 NVIDIA 顯卡驅(qū)動和 Docker GPU 插件)
  • 使用更輕量的 YOLO 模型(如 YOLOv8n 已是最輕量,可考慮模型量化壓縮)
  • 圖片預處理:上傳前對圖片進行壓縮,減小分辨率

2. 增強接口安全性

  • 添加 API Key 權限校驗,防止匿名調(diào)用
  • 添加接口限流,避免 Docker 容器被壓垮
  • 文件類型嚴格校驗,防止惡意文件上傳

3. 拓展功能

  • 支持批量圖片檢測(上傳壓縮包,異步處理)
  • 檢測結果持久化:將檢測結果存入數(shù)據(jù)庫(如 PostgreSQL),支持歷史記錄查詢
  • 前端可視化:新增前端頁面,實現(xiàn)圖片上傳、檢測結果可視化
  • 視頻流檢測:支持 RTSP 視頻流實時目標檢測

七、總結

本文全程還原了 Windows 環(huán)境下,通過 Docker 部署 YOLOv8 模型,并集成到 Spring Boot 項目的完整流程,從環(huán)境準備、問題排查到代碼集成、接口測試,每一步都提供了詳細的實操步驟和解決方案。

核心亮點

  1. 通過 Docker 容器化部署 YOLOv8,避免環(huán)境依賴沖突,實現(xiàn)快速部署
  2. 完整解決了 Windows 下 Docker 掛載目錄、文件找不到等常見問題
  3. 將 YOLO 檢測能力封裝為 Spring Boot 接口,可直接集成到各類業(yè)務系統(tǒng)
  4. 代碼可直接復用,適配原有 Spring Boot 項目(無需從零搭建)

后續(xù)拓展方向

基于本文的基礎,可以進一步拓展:

  • 視頻流實時目標檢測
  • 批量圖片異步處理
  • 檢測結果可視化 Dashboard
  • 模型訓練與迭代優(yōu)化

讓 YOLO 目標檢測能力更好地服務于實際業(yè)務場景。如果在實操過程中遇到問題,可參考本文的問題排查部分,或留言交流。

到此這篇關于Windows環(huán)境下Docker部署YOLOv8并集成Spring Boot的完整步驟的文章就介紹到這了,更多相關Docker部署YOLOv8集成SpringBoot內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java使用正則表達式匹配并替換字符串中的IP地址

    Java使用正則表達式匹配并替換字符串中的IP地址

    在 Java 開發(fā)中,正則表達式是處理字符串匹配、查找、替換的神器,尤其在數(shù)據(jù)清洗、格式校驗、文本處理場景中不可或缺,今天我們通過一道經(jīng)典的編程題 ——匹配并替換字符串中的 IP 地址,從零拆解正則表達式的核心用法,需要的朋友可以參考下
    2026-06-06
  • Java中成員方法與成員變量訪問權限詳解

    Java中成員方法與成員變量訪問權限詳解

    在Java學習過程中,在寫類經(jīng)常為用到public,private和protected,我個人的經(jīng)驗是一般類的成員變量都是用private,方法用public,類的內(nèi)部用protected方法,如果是存在子類的,那我就會把父類中的成員變量變?yōu)閜rotected。(其余的看具體實際情 況而定)
    2015-08-08
  • 基于SpringBoot后端導出Excel文件的操作方法

    基于SpringBoot后端導出Excel文件的操作方法

    這篇文章給大家介紹了基于SpringBoot后端導出Excel文件的操作方法,文中通過代碼示例給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • Tomcat和Spring中的事件機制深入講解

    Tomcat和Spring中的事件機制深入講解

    這篇文章主要給大家介紹了關于Tomcat和Spring中事件機制的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧
    2018-12-12
  • Spring Boot 整合 RocketMQ 的全流程(消息發(fā)送、消費、重試)

    Spring Boot 整合 RocketMQ 的全流程(消息發(fā)送、消費、重試)

    本文詳細介紹了 Spring Boot 整合 RocketMQ 的全流程,包括環(huán)境搭建、依賴配置、消息發(fā)送(同步 / 異步 / 單向)、消息消費(集群 / 廣播、并發(fā) / 順序)、消息重試與死信隊列處理,并提供了完整的代碼示例,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • 在項目中集成jetty server步驟解析

    在項目中集成jetty server步驟解析

    這篇文章主要介紹了在項目中集成jetty server步驟解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • mybatis打印SQL,并顯示參數(shù)的實例

    mybatis打印SQL,并顯示參數(shù)的實例

    這篇文章主要介紹了mybatis打印SQL,并顯示參數(shù)的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Elasticsearch刪除索引字段方法總結(附實例代碼)

    Elasticsearch刪除索引字段方法總結(附實例代碼)

    在Elasticsearch管理過程中,刪除索引是常見的運維操作,下面這篇文章主要介紹了Elasticsearch刪除索引字段方法的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2026-01-01
  • 使用JAVA實現(xiàn)http通信詳解

    使用JAVA實現(xiàn)http通信詳解

    本文給大家匯總介紹了幾種java實現(xiàn)http通訊的方法,非常的簡單實用,有需要的小伙伴可以參考下。
    2015-08-08
  • Spring配置文件如何使用${username}

    Spring配置文件如何使用${username}

    這篇文章主要介紹了Spring配置文件如何使用${username},文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02

最新評論

平阴县| 合江县| 东乡| 阿瓦提县| 门源| 临安市| 夏津县| 荣成市| 玉环县| 乌兰察布市| 河曲县| 宽城| 郑州市| 石家庄市| 华池县| 临沭县| 文安县| 华宁县| 鄂托克旗| 中宁县| 突泉县| 乳山市| 沂水县| 望城县| 云安县| 陆丰市| 凤山县| 岫岩| 洛浦县| 峨山| 都安| 汨罗市| 祁阳县| 东乌珠穆沁旗| 乐至县| 南乐县| 荣成市| 拉萨市| 衡阳市| 西藏| 黎城县|