在国产芯片上实现YOLOv5/v8图像AI识别-【1.3】YOLOv5的介绍及使用(训练、导出)更多内容见视频
本专栏主要是提供一种国产化图像识别的解决方案,专栏中实现了YOLOv5/v8在国产化芯片上的使用部署,并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。
B站配套视频:https://www.bilibili.com/video/BV1or421T74f
数据训练
上一篇博客里面我们已经获得了标注好的数据以及图片,接下来我们就要开始训练过程。
数据整备阶段
首先在yolov5的目录下创建一个datasets目录,这一步是个人习惯,我们将要训练的数据都会放在这里。
所有的数据需要按照目录规范进行放置,通常train、val的分配比例为8:2,images和labels里面的内容需要对应。
yaml文件准备阶段
编写数据说明文件和结构说明文件,找到data目录下创建一个yaml文件,此处以我个人创建的举例。
数据yaml文件
可以直接复制目录中的coco128.yaml进行修改,将其中的download部分删掉。然后更具自己数据的存放路径进行配置。
train 写训练图片的完整路径,经过多次尝试,写相对路径会有问题。
val 写验证图片的完整路径。系统会自动找到对应的labels目录。
test 可以不用写,对训练结果不会有影响。
nc 写你需要识别的数量。
names 写你需要识别的类别,此处循序一定要注意。
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# COCO128 dataset https://www.kaggle.com/ultralytics/coco128 (first 128 images from COCO train2017) by Ultralytics
# Example usage: python train.py --data coco128.yaml
# parent
# ├── yolov5
# └── datasets
# └── coco128 ← downloads here (7 MB)# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
# path: ../datasets/cx # dataset root dir
train: /app/docs/yolov5_v7.0/datasets/cx/images/train # train images (relative to 'path') 128 images
val: /app/docs/yolov5_v7.0/datasets/cx/images/train # val images (relative to 'path') 128 images
test: # test images (optional)# Classes
nc: 2 # number of classes
names: ['good','bad'] # class names
结构yaml文件
打开model目录,找到下面的yaml文件,此处系统已经默认了一些模型文件。通常不需要进行模型魔改的情况下可以基于pt训练,如果需要魔改模型需要自己重新设置一个yaml文件。此处举例看一下。
下文是一个修改后的s模型文件,主要修改的就是nc,其他内容如果没有学习过模型魔改就不要动。
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parameters
nc: 2 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
anchors:- [10,13, 16,30, 33,23] # P3/8- [30,61, 62,45, 59,119] # P4/16- [116,90, 156,198, 373,326] # P5/32# YOLOv5 v6.0 backbone
backbone:# [from, number, module, args][[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2[-1, 1, Conv, [128, 3, 2]], # 1-P2/4[-1, 3, C3, [128]],[-1, 1, Conv, [256, 3, 2]], # 3-P3/8[-1, 6, C3, [256]],[-1, 1, Conv, [512, 3, 2]], # 5-P4/16[-1, 9, C3, [512]],[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32[-1, 3, C3, [1024]],[-1, 1, SPPF, [1024, 5]], # 9]# YOLOv5 v6.0 head
head:[[-1, 1, Conv, [512, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]], # cat backbone P4[-1, 3, C3, [512, False]], # 13[-1, 1, Conv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 4], 1, Concat, [1]], # cat backbone P3[-1, 3, C3, [256, False]], # 17 (P3/8-small)[-1, 1, Conv, [256, 3, 2]],[[-1, 14], 1, Concat, [1]], # cat head P4[-1, 3, C3, [512, False]], # 20 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 10], 1, Concat, [1]], # cat head P5[-1, 3, C3, [1024, False]], # 23 (P5/32-large)[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)]
启动训练
训练其实很简单,就是要根据自己的实际电脑配置进行训练参数的调整。如果是常规训练参考以下参数就可以了,参数weights和cfg选择一个配置就可以。
python ./train.py --data ./data/coco_bz.yaml --weights ./weights/yolov5s.pt --cfg ./models/yolov5s_bz.yaml --batch-size 48 --epochs 200 --workers 0 --name 754-200 --project yolo5_bz_s
python ./train.py 是官方写好的训练搅拌文件
– data 指向数据整备的yaml文件
–weights 指向已经训练好的模型,这个参数主要两个作用,一个是基于模型结构训练,另一个是训练大型模型异常终端可以接续训练
–cfg 指向模型配置文件
–batch-size 单次训练的的数据量大小,理论是越大越好,要根据实际电脑配置调整,此处注意v5和v8这个参数同一台电脑也不同
–epochs 总过训练多少轮,设置特别大没有太大意义,代码在发现最后几次训练模型没有改进会自动停止
–workers 此项也是根据显卡性能调整,如果不知道怎么设置可以直接设置成0,系统会自动配置
–name 代表本次定义的名字,默认会写exp,重复训练会自动加上后缀
–project 代表本次工程名字,默认会写runs
启动之后会显示以下内容,如果是第一次训练系统会需要下载几个文件可能比较慢,一个是文字格式文件,一个是yolov5模型用来进行数据处理的。
root@935f1467d228:/app/docs/yolov5_v7.0# python ./train.py --data ./data/coco_bz.yaml --cfg ./models/yolov5n_bz.yaml --batch-size 48 --epochs 200 --workers 0 --name 754-200 --project yolo5_bz_ntrain: weights=yolov5s.pt, cfg=./models/yolov5n_bz.yaml, data=./data/coco_bz.yaml, hyp=data/hyps/hyp.scratch-low.yaml, epochs=200, batch_size=48, imgsz=640, rect=False, resume=False, nosave=False, noval=False, noautoanchor=False, noplots=False, evolve=None, bucket=, cache=None, image_weights=False, device=, multi_scale=False, single_cls=False, optimizer=SGD, sync_bn=False, workers=0, project=yolo5_bz_n, name=754-200, exist_ok=False, quad=False, cos_lr=False, label_smoothing=0.0, patience=100, freeze=[0], save_period=-1, seed=0, local_rank=-1, entity=None, upload_dataset=False, bbox_interval=-1, artifact_alias=latest
remote: Enumerating objects: 390, done.
remote: Counting objects: 100% (273/273), done.
remote: Compressing objects: 100% (96/96), done.
remote: Total 390 (delta 204), reused 217 (delta 177), pack-reused 117
Receiving objects: 100% (390/390), 476.92 KiB | 599.00 KiB/s, done.
Resolving deltas: 100% (261/261), completed with 88 local objects.
From https://github.com/ultralytics/yolov5920c721e..8003649c master -> origin/master* [new branch] refactor-20240717220233 -> origin/refactor-20240717220233* [new branch] snyk-fix-19a9bd869ca677b68dcdaf5f4affcd24 -> origin/snyk-fix-19a9bd869ca677b68dcdaf5f4affcd24* [new branch] snyk-fix-f5bfc0187c0599da5db2839fa7a5f8f5 -> origin/snyk-fix-f5bfc0187c0599da5db2839fa7a5f8f5
github: ⚠️ YOLOv5 is out of date by 345 commits. Use `git pull` or `git clone https://github.com/ultralytics/yolov5` to update.
YOLOv5 🚀 v7.0-0-g915bbf29 Python-3.8.12 torch-1.12.0a0+2c916ef CUDA:0 (NVIDIA GeForce RTX 3060, 12022MiB)hyperparameters: lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=0.05, cls=0.5, cls_pw=1.0, obj=1.0, obj_pw=1.0, iou_t=0.2, anchor_t=4.0, fl_gamma=0.0, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, mosaic=1.0, mixup=0.0, copy_paste=0.0
ClearML: run 'pip install clearml' to automatically track, visualize and remotely train YOLOv5 🚀 in ClearML
Comet: run 'pip install comet_ml' to automatically track and visualize YOLOv5 🚀 runs in Comet
TensorBoard: Start with 'tensorboard --logdir yolo5_bz_n', view at http://localhost:6006/from n params module arguments 0 -1 1 1760 models.common.Conv [3, 16, 6, 2, 2] 1 -1 1 4672 models.common.Conv [16, 32, 3, 2] 2 -1 1 4800 models.common.C3 [32, 32, 1] 3 -1 1 18560 models.common.Conv [32, 64, 3, 2] 4 -1 2 29184 models.common.C3 [64, 64, 2] 5 -1 1 73984 models.common.Conv [64, 128, 3, 2] 6 -1 3 156928 models.common.C3 [128, 128, 3] 7 -1 1 295424 models.common.Conv [128, 256, 3, 2] 8 -1 1 296448 models.common.C3 [256, 256, 1] 9 -1 1 164608 models.common.SPPF [256, 256, 5] 10 -1 1 33024 models.common.Conv [256, 128, 1, 1] 11 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest'] 12 [-1, 6] 1 0 models.common.Concat [1] 13 -1 1 90880 models.common.C3 [256, 128, 1, False] 14 -1 1 8320 models.common.Conv [128, 64, 1, 1] 15 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest'] 16 [-1, 4] 1 0 models.common.Concat [1] 17 -1 1 22912 models.common.C3 [128, 64, 1, False] 18 -1 1 36992 models.common.Conv [64, 64, 3, 2] 19 [-1, 14] 1 0 models.common.Concat [1] 20 -1 1 74496 models.common.C3 [128, 128, 1, False] 21 -1 1 147712 models.common.Conv [128, 128, 3, 2] 22 [-1, 10] 1 0 models.common.Concat [1] 23 -1 1 296448 models.common.C3 [256, 256, 1, False] 24 [17, 20, 23] 1 9471 models.yolo.Detect [2, [[10, 13, 16, 30, 33, 23], [30, 61, 62, 45, 59, 119], [116, 90, 156, 198, 373, 326]], [64, 128, 256]]
YOLOv5n_bz summary: 214 layers, 1766623 parameters, 1766623 gradients, 4.2 GFLOPsTransferred 57/349 items from yolov5s.pt
AMP: checks passed ✅
optimizer: SGD(lr=0.01) with parameter groups 57 weight(decay=0.0), 60 weight(decay=0.000375), 60 bias
train: Scanning /app/docs/yolov8/ultralytics/datasets/bz_754/labels/train... 754 images, 0 backgrounds, 0 corrupt: 100%|██████████| 754/754 00:00
train: New cache created: /app/docs/yolov8/ultralytics/datasets/bz_754/labels/train.cache
val: Scanning /app/docs/yolov8/ultralytics/datasets/bz_754/labels/val... 200 images, 0 backgrounds, 0 corrupt: 100%|██████████| 200/200 00:00
val: New cache created: /app/docs/yolov8/ultralytics/datasets/bz_754/labels/val.cacheAutoAnchor: 5.75 anchors/target, 1.000 Best Possible Recall (BPR). Current anchors are a good fit to dataset ✅
Plotting labels to yolo5_bz_n/754-2002/labels.jpg...
Image sizes 640 train, 640 val
Using 0 dataloader workers
Logging results to yolo5_bz_n/754-2002
Starting training for 200 epochs...Epoch GPU_mem box_loss obj_loss cls_loss Instances Size0/199 5.74G 0.1083 0.1563 0.02792 1076 640: 19%|█▉ | 3/16 00:08
完成训练
完成训练后我们会获得以下目录,其中weights中就有我们最优的模型和最后一次训练模型,通常使用best,其他参数信息我会在视频讲解中和大家说明。视频链接见博客顶部。
导出模型
执行以下指令就可以导出我们onnx的模型,这里面
python export.py --weights weights/yolov5s.pt --include onnx --opset 11
使用Netron就可以看到整体模型的内容,Netron的安装地址 https://github.com/lutzroeder/netron
相关文章:
在国产芯片上实现YOLOv5/v8图像AI识别-【1.3】YOLOv5的介绍及使用(训练、导出)更多内容见视频
本专栏主要是提供一种国产化图像识别的解决方案,专栏中实现了YOLOv5/v8在国产化芯片上的使用部署,并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。 B站配套视频:https://www.bilibili.com/video/BV1or421T74f 数据…...
逻辑门的题目怎么做?
FPGA语法练习——二输入逻辑门,一起来听~~ FPGA语法练习——二输入逻辑门 题目介绍:F学社-全球FPGA技术提升平台 (zzfpga.com)...
CentOS 7报错:yum命令报错 “ Cannot find a valid baseurl for repo: base/7/x86_6 ”
参考连接: 【linux】CentOS 7报错:yum命令报错 “ Cannot find a valid baseurl for repo: base/7/x86_6 ”_centos linux yum search ifconfig cannot find a val-CSDN博客 Centos7出现问题Cannot find a valid baseurl for repo: base/7/x86_64&…...
51单片机STC89C52RC——18.1 HC-SR04超声波测距
目的/效果 独立按键K1按下后开始测距,LCD显示距离(mm) 一,STC单片机模块 二,HC-SR04 超声波测距 2.1 HC-SR04 简介 HC-SR04超声波测距模块提供2cm~400cm的测距功能,精度达3mm。 2.2 时序 以上时序图表明…...
WordPress与 wp-cron.php
WordPress 傲居全球最流行的内容管理系统(CMS)之位,占据了互联网约43%的网站后台,这主要得益于其直观易用的用户界面以及丰富的扩展功能,特别是为新手用户提供了极大的便利。 然而,在畅享WordPress带来的便…...
bb-------
社保费申报及缴纳...
数据挖掘与分析部分实验与实训项目报告
一、机器学习算法的应用 1. 朴素贝叶斯分类器 相关代码 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB, MultinomialNB from sklearn.metrics import accuracy_score # 将数据加载到DataFrame中&a…...
Python中使用SpeechLib实现文本转换语音朗读的示例(修正bug)
一、修正SpeechLib的导入包顺序后的代码: from comtypes.client import CreateObjectengine CreateObject(SAPI.SpVoice) stream CreateObject(SAPI.SpFileStream)from comtypes.gen import SpeechLibinfile E:\\语音文档\\易经64卦读音.txt outfile E:\\demo.…...
政安晨【零基础玩转各类开源AI项目】基于Ubuntu系统部署Hallo :针对肖像图像动画的分层音频驱动视觉合成
政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 零基础玩转各类开源AI项目 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 本文目标:在Ubuntu系统上部署Hallo&#x…...
Spring Boot1(概要 入门 Spring Boot 核心配置 YAML JSR303数据校验 )
目录 一、Spring Boot概要 1. SpringBoot优点 2. SpringBoot缺点 二、Spring Boot入门开发 1. 第一个SpringBoot项目 项目创建方式一:使用 IDEA 直接创建项目 项目创建方式二:使用Spring Initializr 的 Web页面创建项目 (了解&#…...
电脑屏幕录制怎么弄?分享3个简单的电脑录屏方法
在信息爆炸的时代,屏幕上的每一个画面都可能成为我们生活中不可或缺的记忆。作为一名年轻男性,我对于录屏软件的需求可以说是既挑剔又实际。今天,我就为大家分享一下我近期体验的三款录屏软件:福昕录屏大师、转转大师录屏大师和OB…...
idea双击没有反应,打不开
问题描述 Error opening zip file or JAR manifest missing : /home/IntelliJ-IDEA/bin/jetbrains-agent.jar解决方案...
关于UniApp使用的个人笔记
UniApp 开发者中心 用于注册应用以及申请对应证书 https://dev.dcloud.net.cn/pages/app/list https://blog.csdn.net/fred_kang/article/details/124988303 下载证书后,获取SHA1关键cmd keytool -list -v -keystore test.keystore Enter keystore password…...
autoware.universe源码略读(3.16)--perception:object_range_splitter
autoware.universe源码略读3.16--perception:object_range_splitter Overviewnode(Class Constructor)ObjectRangeSplitterNode::ObjectRangeSplitterNode(mFunc)ObjectRangeSplitterNode::objectCallback Overview 这里处理的依…...
深度学习落地实战:人脸五官定位检测
前言 大家好,我是机长 本专栏将持续收集整理市场上深度学习的相关项目,旨在为准备从事深度学习工作或相关科研活动的伙伴,储备、提升更多的实际开发经验,每个项目实例都可作为实际开发项目写入简历,且都附带完整的代码与数据集。可通过百度云盘进行获取,实现开箱即用 …...
270-VC709E 基于FMC接口的Virtex7 XC7VX690T PCIeX8 接口卡
一、板卡概述 本板卡基于Xilinx公司的FPGA XC7VX690T-FFG1761 芯片,支持PCIeX8、两组 64bit DDR3容量8GByte,HPC的FMC连接器,板卡支持各种FMC子卡扩展。软件支持windows,Linux操作系统。 二、功能和技术指标: 板卡功…...
【go】Excelize处理excel表 带合并单元格、自动换行与固定列宽的文件导出
文章目录 1 简介2 相关需求与实现2.1 导出带单元格合并的excel文件2.2 导出增加自动换行和固定列宽的excel文件 1 简介 之前整理过使用Excelize导出原始excel文件与增加数据校验的excel导出。【go】Excelize处理excel表 带数据校验的文件导出 本文整理使用Excelize导出带单元…...
uniapp自定义tabBar
uniapp自定义tabBar 1、在登录页中获取该用户所有的权限 getAppFrontMenu().then(res>{if(res.length > 0){// 把所有权限存入缓存中let firstPath res.reverse()[0].path;uni.setStorageSync(qx_data, res);uni.switchTab({url: firstPath,})// 方法二 通过uni.setTabB…...
IDEA2023版本创建JavaWeb项目及配置Tomcat详细步骤!
一、创建JavaWeb项目 第一步 之前的版本能够在创建时直接选成Web项目,但是2023版本在创建项目时没有该选项,需要在创建项目之后才能配置,首先先创建一个项目。 第二步 在创建好的项目中选中项目后(一定要注意选中项目名称然后继…...
WPF中MVVM常用的框架
在WPF开发中,MVVM(Model-View-ViewModel)是一种广泛使用的设计模式,它有助于分离应用程序的用户界面(View)、业务逻辑(Model)和数据表现层(ViewModel)。以下是…...
Mysql----内置函数
前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、日期函数 日期:年月日 时间:时分秒 查询:当前时间,只显示当前日期 注意:如果类型为date或者datetime。表中数据类型为date,你插入时…...
去除重复字母
题目链接 去除重复字母 题目描述 注意点 s 由小写英文字母组成1 < s.length < 10^4需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置) 解答思路 本题与移掉 K 位数字类似,需要注意的是,并不是每个字母都能…...
Xcode进行真机测试时总是断连,如何解决?
嗨。大家好,我是兰若姐姐。最近我在用真机进行app自动化测试的时候,经常会遇到xcode和手机断连,每次断连之后需要重新连接,每次断开都会出现以下截图的报错 当这种情况出现时,之前执行的用例就相当于白执行了ÿ…...
Redis的使用(五)常见使用场景-分布式锁实现原理
1.绪论 为了解决并发问题,我们可以通过加锁的方式来保证数据的一致性,比如java中的synchronize关键字或者ReentrantLock,但是他们只能在同一jvm进程上加锁。现在的项目基本上都是分布式系统,如何对多个java实例进行加锁ÿ…...
AppML 案例:Products
AppML 案例:Products AppML(Application Markup Language)是一种创新的、基于XML的标记语言,旨在简化Web应用程序的开发。它允许开发者通过声明性的方式定义应用程序的界面和数据绑定,从而提高开发效率和减少代码量。…...
数据库端口LookUp功能:从数据库中获取并添加数据到XML
本文将为大家介绍如何使用知行之桥EDI系统数据库端口的Lookup功能,从数据库中获取数据,并添加进输入的XML中。 使用场景:期待以输入xml中的值为判断条件从数据库中获取数据,并添加进输入xml中。 例如:接收到包含采购…...
视频联网共享平台LntonCVS视频监控汇聚平台视频云解决方案
LntonCVS流媒体平台是一款遵循国家GB28181标准协议的先进视频监控与云服务平台。该平台设计独特,能够同时接入并处理多路设备的视频流,支持包括RTSP、RTMP、FLV、HLS、WebRTC在内的多种视频流格式的分发。其功能丰富多样,涵盖了视频直播监控、…...
深入探索Python中的`__slots__`类属性:优化内存与限制灵活性
深入探索Python中的__slots__类属性:优化内存与限制灵活性 在Python编程的广阔领域中,性能优化总是开发者们关注的焦点之一。特别是在处理大量对象或资源受限的环境中,减少内存占用和提高访问速度显得尤为重要。Python的__slots__类属性正是…...
llama 2 改进之 RMSNorm
RMSNorm 论文:https://openreview.net/pdf?idSygkZ3MTJE Github:https://github.com/bzhangGo/rmsnorm?tabreadme-ov-file 论文假设LayerNorm中的重新居中不变性是可有可无的,并提出了均方根层归一化(RMSNorm)。RMSNorm根据均方根(RMS)将…...
Matlab【光伏预测】基于雪融优化算法SAO优化高斯过程回归GPR实现光伏多输入单输出预测附代码
% 光伏预测 - 基于SAO优化的GPR % 数据准备 % 假设有多个输入特征 X1, X2, …, Xn 和一个目标变量 Y % 假设数据已经存储在 X 和 Y 中,每个变量为矩阵,每行表示一个样本,每列表示一个特征 % 参数设置 numFeatures size(X, 2); % 输入特征的…...
网站后台上传图片脚本错误/semicircle
1)实验平台:ALIENTEK NANO STM32F411 V1开发板2)摘自《正点原子STM32F4 开发指南(HAL 库版》关注官方微信号公众号,获取更多资料:正点原子第六章 跑马灯实验STM32 最简单的外设莫过于 IO 口的高低电平控制了,本章将通过一个经典的…...
网站开发界面设计用什么工具/seo网站免费优化软件
在使用CAD看图软件查看DWG图纸的过程中,当图纸中的CAD标注文字太小的时候该怎么修改其大小呢?浩辰CAD看图王电脑版中,提供了多种标注方法,包含线性标注、对齐标注、角度标注、坐标标注等,标注主要就是将标注内容显示在…...
wordpress 2012主题/福州短视频seo公司
抓取目标:就是我自己的博客:http://www.cnblogs.com/ghostwu/ 需要实现的功能: 抓取博客所有的文章标题,超链接,文章摘要,发布时间 需要用到的库: node.js自带的http库 第三方库:cheerio&a…...
做啥英文网站赚钱/阿里云域名注册万网
你好!有什么我可以帮助你的?...
珠海十大网站建设公司哪家好/东莞网站推广优化网站
这篇不是我想的,是博客园的老赵想的,很是不错.俺就借过来了.原文是您善于使用匿名函数吗? 我只是把重用的地方封装到一个类里面了 public static class CacheHelper { public delegate bool CacheGetter<TData>(out TData data); public delegate TDa…...
专门做国外家具书籍的网站/百度网站排名优化
育软件、程序设计软件、网络软件、工具软件。(三)Word文字处理【教学目的与要求】1、通过本部分的学习,了解Word窗口的组成部分;了解在Word中插入与编辑公式的方法;2、理解Word文字排版中的常见概念;理解word中表格的行、列、单元…...