图像分割笔记
- 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):用多边形逼近物体轮廓
关键区别:
特征 | 像素级分割 | 检测框级分割 |
---|---|---|
精度 | 亚像素级 | 物体级 |
标注成本 | 高(需逐像素标注) | 较低(框选即可) |
适用场景 | 医疗影像、自动驾驶等精细场景 | 通用物体检测 |
计算复杂度 | 高 | 较低 |
输出结果 | 精确轮廓 | 大致位置和范围 |
混合应用场景:
- 一些框架(如Mask R-CNN)会同时输出检测框和像素级掩码
- 弱监督学习中常用检测框作为初始标注,再生成像素级标签
- 工业界常用检测框预标注+人工像素级修正的工作流程
最新趋势:
- 交互式分割(如点击引导的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