【图像分割】记录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 分钟前
Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现轮船检测识别(C#代码UI界面版)
人工智能·深度学习·数码相机·yolo·视觉检测
alex10010 分钟前
AI Agent开发学习系列 - langchain之LCEL(5):如何创建一个Agent?
人工智能·python·语言模型·langchain·prompt·向量数据库·ai agent
Gession-杰12 分钟前
OpenCV图像梯度、边缘检测、轮廓绘制、凸包检测大合集
人工智能·opencv·计算机视觉
JackieZeng52715 分钟前
Dynamic Model in RL
人工智能
计算机sci论文精选21 分钟前
CVPR 2024 3D传感框架实现无监督场景理解新纪元
人工智能·机器学习·计算机视觉·3d·cvpr·传感技术
小白iP代理24 分钟前
动态IP+AI反侦测:新一代爬虫如何绕过生物行为验证?
人工智能·爬虫·tcp/ip
钟屿30 分钟前
Multiscale Structure Guided Diffusion for Image Deblurring 论文阅读
论文阅读·图像处理·人工智能·深度学习·计算机视觉
聚客AI37 分钟前
🚀深度解析Agentic RAG:如何突破模型的知识边界
人工智能·llm·掘金·日新计划
吕永强43 分钟前
AI 在金融:重塑金融服务的智能革命
人工智能·金融·科普
Shining05961 小时前
Datawhale AI 夏令营—科大讯飞AI大赛(大模型技术)—让大模型理解表格数据(列车信息表)
人工智能·学习·其他