{"id":19001312,"url":"https://github.com/oneflow-inc/oneflow_yolov3","last_synced_at":"2025-04-22T17:28:31.996Z","repository":{"id":55229473,"uuid":"250780656","full_name":"Oneflow-Inc/oneflow_yolov3","owner":"Oneflow-Inc","description":null,"archived":false,"fork":false,"pushed_at":"2021-01-06T02:33:30.000Z","size":4050,"stargazers_count":4,"open_issues_count":4,"forks_count":3,"subscribers_count":53,"default_branch":"master","last_synced_at":"2025-04-17T07:17:46.986Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Oneflow-Inc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-03-28T11:45:38.000Z","updated_at":"2024-02-27T12:15:55.000Z","dependencies_parsed_at":"2022-08-14T17:11:44.374Z","dependency_job_id":null,"html_url":"https://github.com/Oneflow-Inc/oneflow_yolov3","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oneflow-Inc%2Foneflow_yolov3","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oneflow-Inc%2Foneflow_yolov3/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oneflow-Inc%2Foneflow_yolov3/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oneflow-Inc%2Foneflow_yolov3/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Oneflow-Inc","download_url":"https://codeload.github.com/Oneflow-Inc/oneflow_yolov3/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250286797,"owners_count":21405504,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-08T18:10:43.428Z","updated_at":"2025-04-22T17:28:31.976Z","avatar_url":"https://github.com/Oneflow-Inc.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# oneflow_yolov3\n## 1.简介\n\n[YOLO](https://pjreddie.com/darknet/yolo/)系列的算法(经典的v1~v3)，是单阶段目标检测网络的开山鼻祖，YOLO—You only look once，表明其单阶段的特征，正是由于网络简单，单阶段的效率较快，使其区别于Faster-RCNN为代表的两阶段目标检测器，从一开始推出至今，便以速度快和较高的准确率而风靡目标检测领域，受到广泛使用和好评。\n\n而Yolov3是其中的经典和集大成者(当然官方最近也推出了yolov4)，其以融合了残差网络的Darknet-53为骨干网络，融合了多尺度，3路输出的feature map，上采样等特点，使其模型精度和对小目标检测能力都大为提升。\n\n\n\u003cdiv align=\"center\"\u003e\n    \u003cimg src=\"data/detected_000004.jpg\" align='center'/\u003e\n\u003c/div\u003e\n\n\n本文，我们提供了YoloV3的OneFlow版实现，和其他版本实现的区别在于，我们将输出特征的nms过程写进了c++代码中，通过自定义user op的方式来调用，当然，我们也同时支持直接使用python代码处理nms。\n\n\n\n## 2.快速开始\n\n开始前，请确保您已正确安装了[oneflow](https://github.com/Oneflow-Inc/oneflow)，并且在python3环境下可以成功import oneflow。\n\n1.git clone[此仓库](https://github.com/Oneflow-Inc/oneflow_yolov3)到本地\n\n```shell\ngit clone --recursive https://github.com/Oneflow-Inc/oneflow_yolov3.git\n```\n\n2.安装python依赖库\n\n```shell\n   pip install -r requirements.txt\n```\n\n3.在项目root目录下，执行:\n\n```\n./scripts/build.sh\n```\n\n执行此脚本，将cpp代码中自定义的op算子编译成可调用执行的.so文件，您将在项目路径下看到：\n\n- libdarknet.so\n\n- liboneflow_yolov3.so\n\n\n\n### 预训练模型\n\n我们使用了yolov3原作者提供的预训练模型—[yolov3.weight](https://pjreddie.com/media/files/yolov3.weights) ，经转换后生成了OneFlow格式的模型。下载预训练模型：[of_yolov3_model.zip](https://oneflow-public.oss-cn-beijing.aliyuncs.com/model_zoo/of_model_yolov3.zip)  ，并将解压后的of_model文件夹放置在项目root目录下，即可使用。\n\n\n\n## 3. 预测/推理\n\n运行：\n\n```shell\nsh yolo_predict.sh\n```\n\n或者：\n\n```shell\nsh yolo_predict_python_data_preprocess.sh\n```\n\n运行脚本后，将在data/result下生成检测后带bbox标记框的图片：\n\n\u003cdiv align=\"center\"\u003e\n    \u003cimg src=\"data/detected_kite.jpg\" align='center'/\u003e\n\u003c/div\u003e\n\n参数说明\n\n- --pretrained_model    预训练模型路径\n\n- --label_path                  coco类别标签路径(coco.name)\n\n- --input_dir                    待检测图片文件夹路径\n\n- --output_dir\t              检测结构输出路径\n\n- --image_paths              单个/多个待检测图片路径，如：\n\n  --image_paths  'data/images/000002.jpg'  'data/images/000004.jpg' \n\n训练同样很简单，准备好数据集后，只需要执行：`sh yolo_train.sh`即可，数据集制作过程见下文【数据集制作】部分。\n\n\n\n## 4. 数据集制作\n\nYoloV3支持任意目标检测数据集，下面我们以[COCO2014](http://cocodataset.org/#download)制作过程为例，介绍训练/验证所需的数据集制作，其它数据集如[PASCAL VOC](http://host.robots.ox.ac.uk/pascal/VOC/)或自定义数据集等，都可以采用相同格式。\n\n### 资源文件\n\n下载COCO2014训练集和验证集图片，将解压后的train2014和val2014放在data/COCO/images目录下\n\n（如果本地已下载过COCO2014数据集，可以ln软链接images至本地train2014和val2014的父目录）\n\n准备资源文件：labels，5k.part，trainvalno5k.part\n\n```shell\nwget -c https://pjreddie.com/media/files/coco/5k.part\nwget -c https://pjreddie.com/media/files/coco/trainvalno5k.part\nwget -c https://pjreddie.com/media/files/coco/labels.tgz\n```\n\n### 脚本\n\n在data/COCO目录下执行脚本：\n\n```shell\n# get label file\ntar xzf labels.tgz\n\n# set up image list\npaste \u003c(awk \"{print \\\"$PWD\\\"}\" \u003c5k.part) 5k.part | tr -d '\\t' \u003e 5k.txt\npaste \u003c(awk \"{print \\\"$PWD\\\"}\" \u003ctrainvalno5k.part) trainvalno5k.part | tr -d '\\t' \u003e trainvalno5k.txt\n\n# copy label txt to image dir\nfind labels/train2014/ -name \"*.txt\"  | xargs -i cp {} images/train2014/\nfind labels/val2014/   -name \"*.txt\"  | xargs -i cp {} images/val2014/\n```\n\n执行脚本将自动解压缩labels.tgz文件，并在当前目录下生成5k.txt和trainvalno5k.txt，然后将labels/train2014和labels/val2014的的所有label txt文件复制到对应的训练集和验证集文件夹中( **保证图片和label在同一目录** )。\n\n至此，完成整个数据集的准备过程。\n\n\n\n## 5.训练\n\n修改yolo_train.sh脚本中的参数，令：--image_path_file=\"data/COCO/trainvalno5k.txt\"并执行：\n\n```shell\nsh yolo_train.sh\n```\n\n即可开始训练过程，更详细的参数介绍如下：\n\n- --gpu_num_per_node    每台机器使用的gpu数量\n- --batch_size  batch         批大小\n- --base_lr                           初始学习率\n- --classes                           目标类别数量（COCO 80；VOC 20）\n- --model_save_dir            模型存放文件夹路径\n- --dataset_dir                    训练/验证集文件夹路径\n- --num_epoch                   迭代总轮数\n- --save_frequency            指定模型保存的epoch间隔\n\n\n## 说明\n\n目前如果调用yolo_predict.sh执行，数据预处理部分对darknet有依赖，其中：predict decoder中调用load_image_color、letterbox_image函数  \ntrain decoder中调用load_data_detection函数  \n主要涉及以下操作，在后续的版本中会使用oneflow decoder ops替换  \n\n- image read  \n- nhwc -\u003e nchw  \n- image / 255  \n- bgr2rgb  \n- resize_image  \n- fill_image   \n- random_distort_image  \n- clip image  \n- random flip image and box  \n- randomize_boxes   \n- correct_boxes  \n\n## 支持的数据格式\n\n1. 如果网络初始化前可以确定要做推理的图片\n\n- 可以将文件路径写入一个文件filename中，配置image_list_path参数执行\n- 也可以直接传图片路径列表，配置image_path_list参数执行\n  可参考yolo_predict.sh\n\n2. 如果网络初始化前不能确定推理的图片\n\n- 每次执行时传入图片路径执行\n  可参考yolo_predict_python_data_preprocess.sh\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foneflow-inc%2Foneflow_yolov3","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foneflow-inc%2Foneflow_yolov3","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foneflow-inc%2Foneflow_yolov3/lists"}