文章目录
- 团队开发
- git提交
- 提交方法
- 注意细节
- Byte-compiled / optimized / DLL files
- C extensions
- Distribution / packaging
- PyCharm files
- Jupyter Notebook
- Unit test / coverage reports
- Sphinx documentation
- Django
- Flask
- :thinking:协同开发
- 细节
- 模块管理
- 根目录
- train.py
- pred.py
- data
- 配置
- argparse
- yaml
- 项目依赖管理
- 文档
- README文档
- 背景
- 项目目录介绍
- 安装
- 快速开始
- 数据集
- 方法和技术
- 结果和可视化
- 参考资料
- 日志配置
- docs(可选)
团队开发
git提交
提交方法
第1次提交方法:
需配置邮箱、git账号密码、在git上创建秘钥、在git上创建仓库
git init
git add .
git commit -m “提交代码备注”
git push
第2+次提交方法
git add .
git commit -m “提交代码备注”
git push
注意细节
上传代码应保证简洁、保证项目安全,按照本规范要求,会产生数据文件、环境配置、日志等。
因此需要额外增加.gitignore做好管理,使用方法
- 在.gitignore文件中指定要忽略的文件和目录。例如,如果您要忽略所有.log文件和node_modules目录,您可以在.gitignore文件中输入以下内容:
*.log
node_modules/
- 保存并关闭.gitignore文件。
- 打开Git Bash或其他终端,并进入您的Git项目的根目录。
- 使用以下命令将.gitignore文件添加到Git仓库中:
git add .gitignore
一份.gitignore文件示例。这个示例中包含了一些常见的规则,用于忽略Python项目中一些不必要的文件和目录,例如编译后的文件、Python虚拟环境、打包文件、IDE生成的文件等等。可以根据你的项目需要进行修改和定制。请注意,此示例可能并不适用于所有的Python项目,因此请根据你具体情况进行修改。
🤔协同开发
pycharm专业版可以联合开发
细节
模块管理
项目下如需分配应有以下几个包:
根目录
程序运行的唯一地方,应简洁,且只包含少量文件,至少包括以下文件,其中py文件都需要在开头有文档注释。
train.py
pred.py
data
/数据集类别,所有数据集的文件夹命名只能使用英文
/script --如数据源来自某种下载方式,应在script中放入下载的sh脚本
/描述文档
配置
配置由yaml和argparse完成,区别是
yaml首先可以将全部参数都设置一个默认值,比如网络的层数,激活函数用哪个等等,大多是模型内相关的参数以及train和test使用的数据的地址。
argparse通常设置几个train和test时经常更改的参数,比如训练的epoch,batch_size,learning_rate…
argparse
如下就是标准的argparse用法,每个参数都应有help说明
yaml
argparse接收的是命令行的输入,所以优先级应该是会高一些;假如argparse和yaml文件中都有相同的参数,如果命令行指定了参数,那么代码运行时使用的参数是命令行输入的参数。
推荐使用yaml对需要做配置的模块做配置,将yaml文件放置于根目录下。
如下就是标准的yaml文件
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# VisDrone2019-DET dataset https://github.com/VisDrone/VisDrone-Dataset by Tianjin University
# Example usage: python train.py --data VisDrone.yaml
# parent
# ├── yolov5
# └── datasets
# └── VisDrone ← downloads here (2.3 GB)# 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/VisDrone # dataset root dir
train: VisDrone2019-DET-train/images # train images (relative to 'path') 6471 images
val: VisDrone2019-DET-val/images # val images (relative to 'path') 548 images
test: VisDrone2019-DET-test-dev/images # test images (optional) 1610 images# Classes
names:0: pedestrian1: people2: bicycle3: car4: van5: truck6: tricycle7: awning-tricycle8: bus9: motor# Download script/URL (optional) ---------------------------------------------------------------------------------------
download: |from utils.general import download, os, Pathdef visdrone2yolo(dir):from PIL import Imagefrom tqdm import tqdmdef convert_box(size, box):# Convert VisDrone box to YOLO xywh boxdw = 1. / size[0]dh = 1. / size[1]return (box[0] + box[2] / 2) * dw, (box[1] + box[3] / 2) * dh, box[2] * dw, box[3] * dh(dir / 'labels').mkdir(parents=True, exist_ok=True) # make labels directorypbar = tqdm((dir / 'annotations').glob('*.txt'), desc=f'Converting {dir}')for f in pbar:img_size = Image.open((dir / 'images' / f.name).with_suffix('.jpg')).sizelines = []with open(f, 'r') as file: # read annotation.txtfor row in [x.split(',') for x in file.read().strip().splitlines()]:if row[4] == '0': # VisDrone 'ignored regions' class 0continuecls = int(row[5]) - 1box = convert_box(img_size, tuple(map(int, row[:4])))lines.append(f"{cls} {' '.join(f'{x:.6f}' for x in box)}\n")with open(str(f).replace(os.sep + 'annotations' + os.sep, os.sep + 'labels' + os.sep), 'w') as fl:fl.writelines(lines) # write label.txt# Downloaddir = Path(yaml['path']) # dataset root dirurls = ['https://github.com/ultralytics/yolov5/releases/download/v1.0/VisDrone2019-DET-train.zip','https://github.com/ultralytics/yolov5/releases/download/v1.0/VisDrone2019-DET-val.zip','https://github.com/ultralytics/yolov5/releases/download/v1.0/VisDrone2019-DET-test-dev.zip','https://github.com/ultralytics/yolov5/releases/download/v1.0/VisDrone2019-DET-test-challenge.zip']download(urls, dir=dir, curl=True, threads=4)# Convertfor d in 'VisDrone2019-DET-train', 'VisDrone2019-DET-val', 'VisDrone2019-DET-test-dev':visdrone2yolo(dir / d) # convert VisDrone annotations to YOLO labels
项目依赖管理
正式上线推荐使用Poetry而不是requirements.txt,因为它会更方便部署,包括自动创建虚拟环境等
使用方法
-
使用
poetry init
生成基本的pyproject.toml
文件。你可以在这个过程中跳过依赖的添加,因为我们将在下一步添加所有依赖。poetry init
-
添加依赖库:
bashCopy code poetry add package_name
-
添加依赖库:
poetry add package_name
这将把指定的库添加到项目的
pyproject.toml
文件中。 -
移除依赖库:
poetry remove package_name
这将从项目的
pyproject.toml
文件中移除指定的库。 -
安装项目依赖:
poetry install
这将根据
pyproject.toml
文件中的依赖创建一个虚拟环境,并在其中安装库。 -
更新项目依赖:
poetry update
这将根据
pyproject.toml
文件中的依赖更新poetry.lock
文件,并重新安装虚拟环境中的库。 -
运行项目中的脚本:
poetry run python your_script.py
这将在虚拟环境中运行指定的 Python 脚本。
-
打包项目:
poetry build
这将为项目创建一个源代码分发包(.tar.gz
)和一个轮子分发包(.whl
)。
文档
README文档
项目至少要有一个README文档,放置于项目根目录下,来解释项目的结构、作用、运行方式。
若代码与机理性强挂钩或数据集复杂,至少再加一个描述性文件对其进行说明
若模块复杂,应在模块下加上README的描述
日志配置
docs(可选)
由于数据分析项目与数据、应用强相关性,看是否有必要在项目的背景说明等,格式为md
本文链接:https://my.lmcjl.com/post/11502.html
4 评论