news 2026/10/1 20:56:54

YOLO泊车位目标检测数据集:真实场景标注与训练实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
YOLO泊车位目标检测数据集:真实场景标注与训练实践

简介:泊车位目标检测是自动驾驶与智慧停车场景中的常见任务,这套数据集面向需要训练YOLO系列模型的开发者与课程学员,提供1000张真实场景图片,并使用LabelImg完成高质量标注。标签同时包含VOC的xml、COCO的json和YOLO的txt三种格式,分别存放,可直接接入主流检测框架,省去格式转换环节。包内共2000个文件,除标注文件外,还搭配3个Python划分脚本,可灵活生成训练集、验证集和测试集;6个HTML教程覆盖Linux与Windows环境下的YOLO搭建、训练案例修改,另含1个yaml配置,方便快速复现。整个压缩包约238.49MB,结构清晰,适合入门到进阶使用。目前已有507人学习下载,配套博文中还提供了详情展示与更多数据集获取方式,对于正在做毕业设计、课程项目或竞赛准备的用户,这是一份即拿即用的实操型资料。若有其他类别或数量需求,也可联系博主进一步沟通。

1. YOLO泊车位目标检测数据集:真实场景下的1000张与三格式标签

泊车位检测这个任务,数据比模型更值钱。很多开源停车场数据集要么是俯视拍摄,要么场地干净得不像真实环境,模型训练完一上实际道路就翻车。这套YOLO泊车位目标检测数据集是1000张真实场景图片,用LabelImg逐张标注,同时产出VOC(xml)、COCO(json)、YOLO(txt)三套标签,直接省掉格式转换的麻烦。适合正在做YOLO系列目标检测落地、需要一套能直接喂给训练脚本的数据源,或者刚入门想完整走一遍“标注理解 → 数据划分 → 环境搭建 → 模型训练”全流程的从业者。

2. 三种标注格式的差异与选择:看懂XML、JSON和TXT

2.1 先看目录结构:拿到压缩包第一时间确认的事

解压rar之后,先别急着看那堆HTML教程,直接扫一眼数据文件夹的层次。这个数据集把三种格式标签分开放置,常见的组织方式是:

dataset/ ├── VOC/ │ ├── Annotations/ # 存放xml标签 │ └── JPEGImages/ # 存放jpg图片 ├── COCO/ │ ├── annotations/ # 存放json标签 │ └── images/ # 存放jpg图片 ├── YOLO/ │ ├── labels/ # 存放txt标签 │ └── images/ # 存放jpg图片 └── scripts/ # 三个划分脚本及说明

这里有一个关键信息:三个文件夹里放的是同一批图片,只是标签表示方法不同,不是三批数据。我见过有人以为数据集总共有3000张,其实就是1000张图配了三套标签。

目录结构本身也暗示了使用方式——你用YOLOv5/YOLOv8训练,路径直接指到YOLO/images;你要跑Faster R-CNN或MMDetection,就指到VOC或COCO。这种按框架区分目录的做法比把所有标签丢进一个文件夹里方便得多,缺点是如果你自己写数据加载器,需要同时考虑三个目录的路径拼接,容易混淆。

2.2 VOC格式:XML标签逐字段拆解

VOC格式是早期目标检测最通用的格式,每张图片对应一个同名的XML文件。用文本编辑器打开Annotations下的任意文件,结构大致是:

<annotation> <folder>JPEGImages</folder> <filename>parking_001.jpg</filename> <size> <width>1920</width> <height>1080</height> <depth>3</depth> </size> <object> <name>parking_space</name> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>320</xmin> <ymin>180</ymin> <xmax>860</xmax> <ymax>540</ymax> </bndbox> </object> </annotation>

几个字段需要拆开讲。filename必须和JPEGImages目录下的实际文件名完全一致,大小写和扩展名都不能差,否则训练时加载器按文件名索引会找不到图片。name是类别名,这套数据里统一是parking_space,单类检测任务最大的优势就是类别数少,模型复杂度可以做得很低。

bndbox里存的是绝对像素坐标,xmin/ymin是左上角,xmax/ymax是右下角。这里最常见的理解偏差是认为xmax/ymax是框的宽和高,实际不是,换算宽高需要自己做减法。另外difficult字段表示这个目标是否难以识别,默认是0,但如果你在原始XML里看到1,注意有些训练框架会把difficult=1的样本自动过滤掉,这直接影响最终训练样本数量。

2.3 COCO格式:JSON的categories与annotations对应关系

COCO格式是把所有图片的标注汇总到一个JSON文件里,运行任何训练脚本前必须搞懂三个顶层字段的关联。一个标准的标注JSON长这样:

{ "images": [ { "id": 1, "file_name": "parking_001.jpg", "width": 1920, "height": 1080 } ], "annotations": [ { "id": 1, "image_id": 1, "category_id": 1, "bbox": [320, 180, 540, 360], "area": 194400, "segmentation": [], "iscrowd": 0 } ], "categories": [ { "id": 1, "name": "parking_space" } ] }

最容易翻车的点集中在bbox字段。COCO的bbox是[x, y, width, height],而VOC是[xmin, ymin, xmax, ymax],两者不是直接替换关系,需要转换。area虽然是辅助字段,但有些评估脚本会校验这个值是否等于width * height,不匹配时mAP计算会出问题。

category_id从1开始,通过categories数组里的id和name映射到具体类别。注意不是按照数组下标来对应,而是按id值对应,如果一张图里有多个类别,标注里的category_id必须和categories里的完全匹配。很多人用脚本做VOC转COCO时只转换了坐标,忘了重新生成category_id,导致训练时所有框的类别都错。

2.4 YOLO格式:归一化坐标的计算与校验

YOLO格式每个txt文件对应一张图片,每行一个目标。数据集的YOLO/labels目录下就能看到类似内容:

0 0.3098958333333333 0.3333333333333333 0.4479166666666667 0.3333333333333333

这行五个数分别是class_id、x_center、y_center、width、height,全部是归一化到0~1之间的浮点数。归一化坐标的计算方式如下:

x_center = (xmin + xmax) / 2 / image_width y_center = (ymin + ymax) / 2 / image_height width = (xmax - xmin) / image_width height = (ymax - ymin) / image_height

这里有个血泪经验:归一化坐标和图片尺寸强绑定。如果你训练前对图片做了resize或裁剪,txt里的数值就全部失效,必须重新换算。另外,class_id是从0开始编号的,而VOC的name是字符串,两者之间的对应关系靠一个类别文件来维护(YOLOv5里叫data.yaml,YOLOv8里也是),顺序错一个,模型检测出来的框就全部张冠李戴。

拿到txt标签后,建议先跑一遍校验,确认坐标范围在0~1之间,class_id没有超出类别总数:

awk '{if($2<0||$2>1||$3<0||$3>1||$4<0||$4>1||$5<0||$5>1) print $0}' YOLO/labels/*.txt

如果这个awk命令有输出,说明存在非法标注,需要返回LabelImg重新修正。

2.5 三种格式的适用框架与转换思路

格式典型加载框架适用场景
VOCFaster R-CNN、SSD、MMDetection早期配置走VOC式训练流程
COCOMMDetection系列、Detectron2需要COCO评估指标
YOLOYOLOv5/YOLOv8/YOLOv11常规训练直接用官方仓库训练

转换的核心思路是:坐标体系从VOC的左上/右下像素坐标,到COCO的左上像素+宽高,再到YOLO的中心点+归一化宽高。三套格式的类别信息也要保证同序。这个数据集把三种格式都准备好了,省去的是最无聊的转换环节,把精力放在后面真正影响模型效果的环节上。

3. 划分脚本实战:从原始数据到训练集/验证集/测试集

3.1 三个脚本的区别:先选对再运行

这个资源包里最实用的部分,除了数据本身,就是三个划分脚本。很多模型训练项目死得不明不白,根本原因不是模型结构,而是训练集和验证集划分方式有问题。三个脚本应对三种不同需求:

脚本名称功能适用场景
训练集、验证集、测试集划分脚本(图片标签划分写入新文件夹).py按比例生成三个新文件夹,复制图片和标签需要严谨的测试集做最终评估
训练集、验证集划分脚本(图片标签划分写入新文件夹).py只生成train和val两个文件夹快速训练调试,不追求最终测试指标
split_train_val生成ImageSets下txt文件划分脚本.py生成ImageSets/Main下的txt文件,不移动文件兼容VOC系列加载器,不想复制数据

选脚本的逻辑很直接:如果打算用YOLOv5/v8这种自带数据划分机制的训练框架,用第二个脚本就够了,训练时在data.yaml里指定train和val路径,框架内部会做比例控制。如果用的是VOC老流程或者要在别的框架自定义数据加载,用第三个脚本生成txt索引文件,不会破坏原有文件结构,处理大文件时也更省磁盘。

3.2 图片和标签一起划分:脚本核心逻辑与参数解释

以“训练集、验证集、测试集划分脚本”为例,它的核心逻辑是读取图片文件名列表,按比例切分三个子集,然后同时复制图片和对应的标签到新目录。这里截取关键代码段做解释:

import os import random import shutil # 配置区 img_dir = 'YOLO/images' # 原始图片目录 label_dir = 'YOLO/labels' # 原始标签目录 target_dir = 'dataset_split' # 输出根目录 train_ratio = 0.8 # 训练集比例 val_ratio = 0.1 # 验证集比例 # 读取全部图片列表,打乱顺序 img_files = [f for f in os.listdir(img_dir) if f.endswith('.jpg')] random.seed(42) random.shuffle(img_files) # 按下标切分 train_files = img_files[:int(len(img_files) * train_ratio)] val_files = img_files[int(len(img_files) * train_ratio): int(len(img_files) * (train_ratio + val_ratio))] test_files = img_files[int(len(img_files) * (train_ratio + val_ratio)):] # 复制图片和标签到各自分区目录 for split, files in [('train', train_files), ('val', val_files), ('test', test_files)]: os.makedirs(os.path.join(target_dir, split, 'images'), exist_ok=True) os.makedirs(os.path.join(target_dir, split, 'labels'), exist_ok=True) for img in files: shutil.copy(os.path.join(img_dir, img), os.path.join(target_dir, split, 'images', img)) label = img.replace('.jpg', '.txt') if os.path.exists(os.path.join(label_dir, label)): shutil.copy(os.path.join(label_dir, label), os.path.join(target_dir, split, 'labels', label))

代码逻辑不复杂,但有几个参数值得说清楚。train_ratio=0.8意味着800张训练图,val_ratio=0.1是100张验证图,剩余100张自动归入测试集,这个比例对于1000张的数据量来说比较合理。random.seed(42)是给随机数生成器装一个固定种子,保证每次运行脚本划分结果一致——很多人划完分,前后两次训练用的训练集不一样,排查半天找不到原因,其实就是没固定种子。

脚本用shutil.copy复制而不是os.rename移动,这个细节很重要。复制能保留原始数据,划分完如果发现训练效果不对想重新划分,原始文件还在;如果直接移动,划分一次就永久改变了数据分布,没有后悔药。

3.3 生成ImageSets下txt的脚本:兼容VOC训练流程

第三个脚本的逻辑完全不同,它不复制任何文件,而是在ImageSets/Main下生成文本索引文件。运行方式:

python split_train_val生成ImageSets下txt文件划分脚本.py --data VOC --ratio 0.8 0.1 0.1

生成的train.txt内容如下:

parking_001 parking_002 parking_003 ...

每行是图片文件名去掉.jpg后的“stem”,不包含目录路径,也不带扩展名。VOC系列数据加载器拿到train.txt后,会自动去JPEGImages/{stem}.jpg找图片,去Annotations/{stem}.xml找标签。这种设计的好处是加载路径集中在一个txt里,坏处是如果你动了目录结构,所有索引全部失效。

使用这类脚本时,先确认--data VOC指向的目录下确实有Annotations和JPEGImages这两个子目录,而不是嵌套了一层。常见的翻车现场是:数据集解压后是VOC/VOC2007/Annotations这种深层次结构,脚本按VOC/Annotations找文件,直接报目录不存在。

3.4 划分完成后的目录检查清单

不管用哪种方式完成划分,训练前一定要做一次目录体检。我的习惯是按这个顺序检查:

# 统计每个目录下的图片数量和标签数量 find dataset_split/train/images -name "*.jpg" | wc -l find dataset_split/train/labels -name "*.txt" | wc -l # 抽查标签是否和图片同名 ls dataset_split/train/images/ | sed 's/.jpg//' > /tmp/img_list ls dataset_split/train/labels/ | sed 's/.txt//' > /tmp/lab_list diff /tmp/img_list /tmp/lab_list | head -20

第一个命令验证图片数量是否符合比例,第二个验证标签和图片名是否一一对应。如果diff有输出,说明存在有图无标签或有标签无图的情况,需要返工。这一步虽然枯燥,但能避免训练到一半才报错说找不到标注文件,那时候已经浪费了几个小时。

4. 环境搭建与训练:Linux和Windows两套流程

4.1 Linux环境搭建:从Ubuntu系统到YOLO依赖

资源包里预装了Linux和Windows两套环境的教程,这部分是给正在准备训练环境的人走的。Linux端的完整流程围绕四步展开:装Ubuntu → 装NVIDIA驱动和CUDA → 创建conda环境 → 安装PyTorch和YOLO依赖。

# 安装系统基础依赖 sudo apt update && sudo apt install -y build-essential git python3-pip # 创建conda环境,指定Python 3.8保证兼容性 conda create -n yolo python=3.8 -y conda activate yolo # 安装PyTorch,注意CUDA版本必须匹配 pip install torch==1.13.1 torchvision==0.14.1 --index-url https://download.pytorch.org/whl/cu117 # 克隆YOLOv5仓库并安装依赖 git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt

这里的版本组合是有讲究的。PyTorch 1.13.1配合CUDA 11.7是我踩坑后固定下来的一套稳定组合,兼容性好,遇到算子报错概率低。如果机器显存比较新、驱动版本高,直接装CUDA 12.x配最新PyTorch也没问题,但这时最好同步用YOLOv8或更新的版本,因为老版本YOLO的某些C++算子在新CUDA下需要重新编译。

一个常见的装包错误是漏了--index-url参数,系统默认从官方源装CPU版PyTorch,训练时检测不到GPU,速度慢到没法用。装完后用python -c "import torch; print(torch.cuda.is_available())"验证,输出True才说明CUDA打通了。

4.2 Windows环境搭建:路径与CUDA的兼容性

Windows端教程面向的是单机调试场景。相比Linux,Windows端的坑集中在两个地方:CUDA版本匹配和路径分隔符。操作顺序不复杂:

  1. 先装NVIDIA显卡驱动,然后装CUDA Toolkit,版本以驱动支持的最高CUDA版本为准
  2. 创建conda环境并安装PyTorch,选版本时要知道自己显卡算力和CUDA版本,再明确对应的pip安装命令
  3. 克隆YOLOv5或者直接下载release包
  4. 把项目路径里的反斜杠和正斜杠统一改成/,很多Windows下训练报FileNotFoundError就是路径分隔符搞的鬼

另一个Windows特有的问题是杀毒软件会拦截pip安装写权限,导致依赖装到一半就报错。我一般会先把conda环境和项目目录加入白名单,再执行安装命令,能省不少事。如果你在Windows上训练特别慢,先检查有没有开节能模式,NVIDIA显卡在电池模式下会降频,训练速度直接减半。

4.3 修改配置训练自己的数据集:data.yaml与超参

所谓“根据案例修改训练自己的数据集”,核心就是改data.yaml和训练命令。以YOLOv5为例,data.yaml需要改写为:

# data.yaml train: dataset_split/train/images val: dataset_split/val/images test: dataset_split/test/images nc: 1 names: ['parking_space']

这份配置文件告诉训练器三件事:训练集图片在哪里、验证集在哪里、要识别几个类别以及类别叫什么。nc和names必须和标签里的class_id对应上。标签中class_id为0,那么names列表里第0个位置就必须是parking_space,顺序错位是最隐蔽的坑。

训练启动命令:

python train.py --data data.yaml --weights yolov5s.pt --epochs 100 --batch-size 16 --imgsz 640

参数选择有实际依据。--weights yolov5s.pt是基于预训练权重微调,对于1000张数据的体量,从零开始训练很容易过拟合,预训练权重提供的底层特征能显著加速收敛。--epochs 100在这个数据量下足够观察到明显的loss下降趋势,如果100轮后mAP还在持续上升,可以加跑50轮。--batch-size按照显存容量调整,6GB显存建议16以下,8GB以上可以尝试32。

训练过程中留意两个输出位置:runs/train/exp/下的results.csv记录了每个epoch的metrics,可以拿来做实时曲线分析;权重文件存放在weights/目录,其中best.pt是验证集上表现最好的模型,last.pt是最后一轮的模型。做最终评估用best.pt,继续训练用last.pt。

4.4 训练完成的首次推理验证

训练完成后,用一张未参与训练的测试集图片做推理,验证模型真实表现:

python detect.py --weights runs/train/exp/weights/best.pt \ --source dataset_split/test/images/parking_035.jpg \ --conf-thres 0.35 --imgsz 640

--conf-thres 0.35是一个比较实用的置信度阈值。停车位检测场景里误检代价通常高于漏检,0.35-0.4之间能过滤掉大多数低置信度的假阳性框。如果检测结果里同一个车位出现多个重叠框,说明NMS阈值可能偏低,可以通过--iou-thres适当调高。第一次推理建议打开输出的标注图片,把检测框和原图对照着看,比只看数字指标更能发现标注质量和模型偏向的问题。

5. 常见问题排查:标注、划分、训练三个环节的坑

5.1 标签和图片数量对不上

现象:训练时控制台报错found 0 images in train path或者AssertionError: train set not found。 原因:最常见的是划分脚本执行过程中,标签名和图片名不匹配导致部分标签没有被复制。比如图片是parking_001.jpg,标签却命名成了parking_1.txt,按扩展名替换的逻辑就会漏掉。 解决:统一文件名格式。用批量重命名把标签名称对齐图片名称,或者重跑划分脚本前先在原始数据目录里执行:

ls images/ | sed 's/.jpg//' > /tmp/img_list ls labels/ | sed 's/.txt//' > /tmp/lab_list diff /tmp/img_list /tmp/lab_list

输出结果里多出来的行就是要处理的文件。对齐之后重跑划分脚本,多数情况下问题即解决。

5.2 训练时Loss不下降或剧烈波动

现象:训练跑了30个epoch,loss曲线一直在1.5~2.5之间反复震荡,完全没有收敛趋势。 原因:两类情况。一是学习率过大,导致参数更新跨度过大在最优值附近来回弹跳;二是训练数据里存在大量错标框,模型每次收敛都被错误样本打断。 解决:先把学习率降到0.0005观察2个epoch,如果曲线变稳定但依然不下降,基本可以断定是标注质量问题。打开YOLO/labels下的txt文件和图片做对应检查,重点看那些明显标错的框——比如框住整面墙而不是车位线、漏标了角落的车位。错误标注比例超过5%就需要用脚本清洗,不要抱有侥幸心理。

5.3 class_id和类别名称错位

现象:模型能检测出目标,可视化时所有框上的类别名都不对,或者出现训练时根本没有见过的类别名。 原因:txt标签里的class_id和训练配置data.yaml里的names顺序不一致。假设标签里写的是0,但names列表第0个位置是car,实际数据标的是parking_space,最终可视化就会错位。 解决:先统一标签体系。用命令快速统计训练集中的类别id分布:

awk '{print $1}' dataset_split/train/labels/*.txt | sort | uniq -c

如果输出只有0这个数字,说明类别id只有0号;如果出现大于等于1的数字,说明部分标注使用了其他id,需要回到标注工具修正。确认id分布后,再对照data.yaml里的names列表,保证顺序完全一致。

5.4 验证集表现好但测试集崩

现象:训练过程中val上的mAP稳步上升,但测试集上实测检测效果很差,漏检非常严重。 原因:数据划分时没有固定随机种子,每次运行划分脚本得到的训练集和验证集都不同,导致最终使用的训练集可能和模型训练时的分布不一致。更隐蔽的情况是数据集中存在重复图片——同一场景的多角度拍摄被当作了多张独立图片,这些图像同时出现在训练集和验证集里,验证集指标虚高。 解决:划分脚本必须固定random.seed,保证每次执行结果一致。同时建议对原始图片做一次去重:

md5sum images/*.jpg | sort | awk '{print $1}' | uniq -d

有重复hash输出的图片需要手动清理,再去重跑划分脚本。

5.5 训练中途OOM与显存不足

现象:训练到某个epoch控制台直接弹出CUDA out of memory,进程被杀,前面几个小时的训练全部白费。 原因:batch_size设置过大,或者开启了--cache参数把整个数据集预加载到显存。1000张640分辨率的图片全量缓存大约需要4-6GB显存,加上模型参数和中间激活值,小显存显卡根本扛不住。 解决:先把batch_size降到4,--workers降到2,再试跑10个epoch确认稳定性。如果依然OOM,就把--imgsz降到416,检测精度降低但对泊车位这类目标来说完全够用。记住一个原则:训练时间是宝贵的,数据加载慢一点可以接受,训练中途进程被杀才是真正的灾难。

6. 验证结果与进阶用法:mAP可视化与ONNX导出

训练结束后不要只看loss曲线,真正的性能评估要看验证集指标和可视化结果。YOLO训练过程自动生成的runs/train/exp/目录里,有几个文件值得重点关注:val_batch0_pred.jpg展示验证集图片的预测框可视化,confusion_matrix.png展示目标分类的混淆矩阵,results.csv记录了每个epoch的所有指标变化曲线。

其中PR_curve.png反映的是置信度阈值从高到底变化时Precision和Recall的权衡曲线。曲线整体越贴近右上角,模型越可靠。如果你看到曲线在置信度0.3-0.5区间突然掉头向下,说明模型对困难样本的处理不够好,可以尝试调低--conf-thres观察。

对部署场景而言,训练出的best.pt直接跑PyTorch推理不够高效,建议导出为ONNX格式:

python export.py --weights runs/train/exp/weights/best.pt --include onnx --img-size 640

ONNX模型在Jetson系列、树莓派或者普通的边缘盒子设备上都能获得比PyTorch原生推理快量级的性能,且不依赖完整的torch环境。导出完成后可以先用onnxruntime做一个快速推理测试,确保输出的检测框坐标和置信度与PyTorch版本一致。

在那以后我每次拿到新数据集,都强制走一遍固定流程:确认目录与标签格式 → 可视化抽查标注质量 → 固定种子划分数据 → 预训练权重起步训练 → 看PR曲线和混淆矩阵 → 导出ONNX做部署验证。这套循环下来,数据集本身的价值才能落到实际业务效果上。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 20:53:08

大数据架构图:从技术契约到故障预防的实战指南

1. 项目概述&#xff1a;一张图&#xff0c;为什么能决定大数据项目的生死&#xff1f;“大数据架构图”这五个字&#xff0c;听起来像PPT里一页翻过去就忘的配图&#xff0c;但在我带过的23个从0到1的大数据平台落地项目里&#xff0c;有7个在第三个月就卡死在“这张图到底画不…

作者头像 李华
网站建设 2026/10/1 20:52:36

PaddleOCR票据信息智能提取:检测、版面解析与字段后处理实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/1 20:51:35

计算机网络核心知识梳理:TCP/IP、子网划分与三次握手

前两天帮学弟划计算机网络期末重点&#xff0c;顺手把自己当年考研、做实验、刷题攒下的笔记又翻了一遍。说实话&#xff0c;这门课看着是纯理论&#xff0c;实际上一半靠“背”&#xff0c;一半靠“算”——背的是协议、端口、报文格式&#xff0c;算的是子网掩码、数据传输时…

作者头像 李华
网站建设 2026/10/1 20:50:55

重组小鼠VEGF165蛋白分子特征与信号调控特点

重组小鼠血管内皮生长因子 165&#xff08;Mouse VEGF165 Protein&#xff09;属于 VEGF‑A 家族重要亚型&#xff0c;成熟单体由 165 个氨基酸组成&#xff0c;预测分子量 19.3 kDa&#xff0c;大肠杆菌无标签表达。蛋白依靠二硫键组装成同源二聚体发挥完整生物学活性&#x…

作者头像 李华