【图像分割】记录1:unet, yolov8_seg
图像分割笔记
- 1、数据部分
- 2、模型部分
- 2.1 Unet模型复现记录
- 2.1.1 代码和数据获取
- 2.1.2 环境配置
- 2.1.3 参数修改
- 2.1.4 bug解决
- 2.1.5 模型推理部分
- 3、部署部分
- 3.1 android-yolov8-seg-onnx部署
- 3.1.1 软件和配置
- 3.1.1.1安装andorid_studio
- 3.1.1.2 安装jdk
- 3.1.1.3 项目结构配置
- 3.1.1.4 文件内参数设置(参考)
- 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):用多边形逼近物体轮廓
关键区别:
特征 | 像素级分割 | 检测框级分割 |
---|---|---|
精度 | 亚像素级 | 物体级 |
标注成本 | 高(需逐像素标注) | 较低(框选即可) |
适用场景 | 医疗影像、自动驾驶等精细场景 | 通用物体检测 |
计算复杂度 | 高 | 较低 |
输出结果 | 精确轮廓 | 大致位置和范围 |
混合应用场景:
- 一些框架(如Mask R-CNN)会同时输出检测框和像素级掩码
- 弱监督学习中常用检测框作为初始标注,再生成像素级标签
- 工业界常用检测框预标注+人工像素级修正的工作流程
最新趋势:
- 交互式分割(如点击引导的GrabCut算法)
- 基于SAM等大模型的零样本分割
- 点标注、涂鸦标注等弱监督方式
选择建议:
- 需要精确形状分析(如医学肿瘤分割)必须用像素级
- 只需物体定位和计数的场景(如零售货架检测)可用检测框
- 资源有限时可考虑检测框标注配合分割算法生成伪标签
2、模型部分
2.1 Unet模型复现记录
2.1.1 代码和数据获取
git clone https://github.com/milesial/Pytorch-UNet.git
数据获取:https://blog.csdn.net/shinuone/article/details/143382947
2.1.2 环境配置
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数组的值判定结果
@staticmethoddef preprocess(mask_values, pil_img, scale, is_mask):w, h = pil_img.sizenewW, 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] = ielse:mask[(img == v).all(-1)] = ireturn 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)
// 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)
apply plugin: 'com.android.application'android {compileSdkVersion 24// buildToolsVersion "29.0.2"defaultConfig {applicationId "com.tencent.yolov8ncnn"archivesBaseName = "$applicationId"minSdkVersion 24testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"// 添加abiFiltersexternalNativeBuild {cmake {cppFlags "-std=c++11 -frtti -fexceptions"abiFilters 'arm64-v8a'//arguments "-DANDROID_STL=c++_shared"}} // 添加abiFiltersndk {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
#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
## 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
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