【图像分割】记录1:unet, yolov8_seg

图像分割笔记

  • 1、数据部分
  • 2、模型部分
    • [2.1 Unet模型复现记录](#2.1 Unet模型复现记录)
      • [2.1.1 代码和数据获取](#2.1.1 代码和数据获取)
      • [2.1.2 环境配置](#2.1.2 环境配置)
      • [2.1.3 参数修改](#2.1.3 参数修改)
      • [2.1.4 bug解决](#2.1.4 bug解决)
      • [2.1.5 模型推理部分](#2.1.5 模型推理部分)
  • 3、部署部分
    • [3.1 android-yolov8-seg-onnx部署](#3.1 android-yolov8-seg-onnx部署)
      • [3.1.1 软件和配置](#3.1.1 软件和配置)
        • 3.1.1.1安装andorid_studio
        • [3.1.1.2 安装jdk](#3.1.1.2 安装jdk)
        • [3.1.1.3 项目结构配置](#3.1.1.3 项目结构配置)
        • [3.1.1.4 文件内参数设置(参考)](#3.1.1.4 文件内参数设置(参考))
      • [3.1.2 参考链接](#3.1.2 参考链接)

1、数据部分

图像分割任务通常涉及两种不同级别的标注方式,在精细度和应用场景上有明显区别:

1.1 像素级分割(Pixel-level Segmentation)

  • 最精细的标注级别,每个像素都被分类
  • 主要类型:
    • 语义分割(Semantic Segmentation):为每个像素分配类别标签(如"人"、"车"),不区分同类实例
    • 实例分割(Instance Segmentation):区分同类物体的不同实例(如区分多个人)
    • 全景分割(Panoptic Segmentation):结合语义和实例分割,标注所有像素且区分实例

1.2 检测框级分割(Bounding Box-level)

  • 用矩形框标注物体大致范围
  • 常见变体:
    • 常规检测框(Axis-aligned Bounding Box)
    • 旋转检测框(Rotated Bounding Box)
    • 多边形近似(Polygon Annotation):用多边形逼近物体轮廓

关键区别:

特征 像素级分割 检测框级分割
精度 亚像素级 物体级
标注成本 高(需逐像素标注) 较低(框选即可)
适用场景 医疗影像、自动驾驶等精细场景 通用物体检测
计算复杂度 高 较低
输出结果 精确轮廓 大致位置和范围

混合应用场景:

  1. 一些框架(如Mask R-CNN)会同时输出检测框和像素级掩码
  2. 弱监督学习中常用检测框作为初始标注,再生成像素级标签
  3. 工业界常用检测框预标注+人工像素级修正的工作流程

最新趋势:

  • 交互式分割(如点击引导的GrabCut算法)
  • 基于SAM等大模型的零样本分割
  • 点标注、涂鸦标注等弱监督方式

选择建议:

  • 需要精确形状分析(如医学肿瘤分割)必须用像素级
  • 只需物体定位和计数的场景(如零售货架检测)可用检测框
  • 资源有限时可考虑检测框标注配合分割算法生成伪标签

2、模型部分

2.1 Unet模型复现记录

2.1.1 代码和数据获取

python 复制代码
git clone https://github.com/milesial/Pytorch-UNet.git

数据获取:https://blog.csdn.net/shinuone/article/details/143382947

2.1.2 环境配置

python 复制代码
conda create -n unet python=3.8 -y
conda activate unet
pip install -r requirements.txt
pip install torch==2.2.0 torchvision==0.17.0 torchaudio==2.2.0 --index-url https://download.pytorch.org/whl/cu118
conda install cudatoolkit=11.8.0
cudnn安装路径修改:E:\software_install\miniconda\envs\unet\Library; 文件夹替换

2.1.3 参数修改

(1)train.py中训练文件夹路径

修改成对应文件夹下的路径

2.1.4 bug解决

1、问题1:数据处理过程中存在的问题

C:\actions-runner_work\pytorch\pytorch\builder\windows\pytorch\aten\src\ATen\native\cuda\NLLLoss2d.cu:104: block: 1,0,0, thread: 127,0,0 Assertion t >= 0 && t < n_classes failed.

解决方案,修改data_loading.py中,img数组的值判定结果

python 复制代码
    @staticmethod
    def preprocess(mask_values, pil_img, scale, is_mask):
        w, h = pil_img.size
        newW, newH = int(scale * w), int(scale * h)
        assert newW > 0 and newH > 0, 'Scale is too small, resized images would have no pixel'
        pil_img = pil_img.resize((newW, newH), resample=Image.NEAREST if is_mask else Image.BICUBIC)
        img = np.asarray(pil_img)

        if is_mask:
            img = np.asarray(pil_img).copy()  # 加 .copy() 变成可写
            img[img > 0] = 1  # 所有非0都设为1(仅二分类)
            mask = np.zeros((newH, newW), dtype=np.int64)
            for i, v in enumerate(mask_values):
                if img.ndim == 2:
                    mask[img == v] = i
                else:
                    mask[(img == v).all(-1)] = i

            return mask

2.1.5 模型推理部分

参数修改

3、部署部分

3.1 android-yolov8-seg-onnx部署

3.1.1 软件和配置

3.1.1.1安装andorid_studio

(1) SDK Platforms

(2) SDK Tools



3.1.1.2 安装jdk
3.1.1.3 项目结构配置

AGP和Gradle的版本设置为8.2.1

3.1.1.4 文件内参数设置(参考)
文件名 层级 职责
build.gradle (Project) 项目级 配置项目全局构建,如仓库、Gradle 插件版本
build.gradle (Module: app) 模块级 配置 app 模块构建,如编译版本、依赖、签名、混淆等
gradle-wrapper.properties 项目级 指定 Gradle 版本及下载路径,实现 Gradle 版本统一管理
local.properties 本地级 配置本地环境路径(如 SDK 路径),不提交版本控制
settings.gradle 项目级 声明项目包含的模块,定义项目结构范围

build.gradle (Project)

python 复制代码
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:8.2.1' // 使用最新的稳定版本
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

build.gradle (Module: app)

python 复制代码
apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    // buildToolsVersion "29.0.2"

    defaultConfig {
        applicationId "com.tencent.yolov8ncnn"
        archivesBaseName = "$applicationId"

        minSdkVersion 24

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        // 添加abiFilters
        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11 -frtti -fexceptions"
                abiFilters 'arm64-v8a'
                //arguments "-DANDROID_STL=c++_shared"
            }
        }    
        // 添加abiFilters
        ndk {
            abiFilters 'arm64-v8a'
        }
    }

    // 设置jniLibs
    // sourceSets {
    //     main {
    //         jniLibs.srcDirs = ['src/main/jniLibs']
    //     }
    // }

    externalNativeBuild {
        cmake {
            version "3.10.2"
            path file('src/main/jni/CMakeLists.txt')
        }
    }

    dependencies {
        implementation 'com.android.support:support-v4:24.0.0'
    }

    ndkVersion '24.0.8215888'
    namespace "com.tencent.yolov8ncnn"
}

gradle-wrapper.properties

python 复制代码
#Fri Jul 25 08:37:19 CST 2025
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

local.properties

python 复制代码
## This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Thu Jul 24 13:39:13 CST 2025
sdk.dir=C\:\\Users\\Administrator\\AppData\\Local\\Android\\Sdk
ndk.dir=C\:\\Users\\Administrator\\AppData\\Local\\Android\\Sdk\\ndk\\24.0.8215888
cmake.dir=C\:\\Users\\Administrator\\AppData\\Local\\Android\\Sdk\\cmake\\3.10.2.4988404

settings.gradle

python 复制代码
include ':app'

3.1.2 参考链接

(1)android_yolov8_seg:
https://www.bilibili.com/video/BV1u1421Q7xZ?spm_id_from=333.788.videopod.episodes&vd_source=8d7b08caa2ce5bc9e61e3d1e486ddca5&p=2

(2)https://github.com/Digital2Slave/ncnn-android-yolov8-seg.git

相关推荐
志尊宝1 小时前
Vue3 零基础每日笔记(073):keep-alive 页面缓存实战——列表页返回不丢状态
vue.js·笔记·缓存·#vue #前端 #前端开发·#javascript·#vue.js
Raspberry_Pi_官方账号2 小时前
观察、理解与响应:Raspberry Pi 5 上的低功耗 CNN、VLM 和 SLM 工作负载
人工智能·神经网络·cnn·树莓派·raspberrypi
AI日报派送佬2 小时前
2026年10月8日AI行业日报|GPT-6可视化UI全面上线、AI PC硬件革新、智能体安全与商业化提速
人工智能·gpt·openai·谷歌·deepseek·ai日报·智能体技术
MobotStone2 小时前
做了几个 Agent 项目后,我发现:真正拉开 AI 产品经理差距的,不是技术
人工智能·架构
孟健2 小时前
Qwen3.8-27B 本地推理实测:从 14 tok/s 到 159 tok/s 的投机解码调优
人工智能·llm·ai编程
思无邪663 小时前
用 AI 做 JS 逆向:从抓包到复现的完整方法论
开发语言·javascript·人工智能
KeyAction66663 小时前
AI改写战争规则,也在改写商业规则:体系对抗时代已经到来
大数据·人工智能
weixin_448119943 小时前
Datawhale Easy Data × AI:笔记1 已重做,看新的笔记
笔记
小蒋观天下3 小时前
专项方案:大场景港口AI安防、多干扰环境下的算法调优与落地实操
人工智能·深度学习·算法·安全·机器学习·计算机视觉·ai大模型
冬奇Lab3 小时前
一天一个开源项目(第231篇):MiniMind —— 花3块钱、2小时,从零训练一个 64M 参数的大语言模型
人工智能·开源·资讯