记录一下训练yolov5识别工件,并用c++调用模型的过程
操作系统:Ubuntu18.04

训练过程

准备数据

使用网站https://app.roboflow.com/cv-rbynj进行数据标注。
创建一个新的工程,新建好的工程如下图所示

然后上传文件,点击上传好的图片,开始标注,框选出物体,并在左上角的框里写入物体的类别,这里为了识别工件,输入workpiece。

当数据都标注好了,点击左上角的白色返回按钮

然后点击右上角finish uploading

然后可以按照自己的需求进行设置,yolov5一般默认图片尺寸为640*640,所以可以把resize修改一下。这里全部当做训练集到出,后面再从训练集中取出一部分作为测试集

设置完成后点generate

然后点击export导出数据,导出时选择 Pascal VOC格式。


VOC格式下,jpg和xml文件会混在一起,将jpg和xml分到不同的文件夹下,可以使用如下代码:

import os
# from PIL import Image
import shutil
folder = "/home/victor/yolov5/workpiece.v1i.voc/train" #原始的路径
new_path_image = "/home/victor/yolov5/workpiece.v1i.voc/image" #图片路径
new_path_xml = "/home/victor/yolov5/workpiece.v1i.voc/xml" #xml文件路径
for index, i in enumerate(sorted(os.listdir(folder))):filename1 = os.path.splitext(i)[1]  # 读取文件后缀名filename0 = os.path.splitext(i)[0]  # 读取文件名print(filename1)# m = filename1 == '.xml'# print(m)if filename1 == '.xml':full_path = os.path.join(folder, i)despath = os.path.join(new_path_xml, i)shutil.move(full_path, despath)elif filename1 == '.jpg':full_path = os.path.join(folder, i)despath = os.path.join(new_path_image, i)shutil.move(full_path, despath)else:pass

数据处理主要参考:链接
训练时会报错:AssertionError: train: No labels in /home/robot410/code/yolov5/data/ImageSets/Main/train.cache. Can not train without labels.类似的错误
然后修改Main.py文件

"""
2021.01.19
author:alian
function: create train.txt and test.txt in ImageSets\Main
"""
import os
import randomtrainval_percent = 0.2   # 可自行进行调节(设置训练和测试的比例是8:2)
train_percent = 1
xmlfilepath = 'Annotations'
txtsavepath = 'ImageSets\Main'
total_xml = os.listdir(xmlfilepath)num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)#ftrainval = open('ImageSets/Main/trainval.txt', 'w')
ftest = open('ImageSets/Main/test.txt', 'w')
ftrain = open('ImageSets/Main/train.txt', 'w')
#fval = open('ImageSets/Main/val.txt', 'w')for i in list:name = total_xml[i][:-4] + '.jpg'+'\n'if i in trainval:#ftrainval.write(name)if i in train:ftest.write('/home/robot410/code/yolov5/data/images/' + name)#else:#fval.write(name)else:ftrain.write('/home/robot410/code/yolov5/data/images/' + name)#ftrainval.close()
ftrain.close()
#fval.close()
ftest.close()

主要是name那得加上+‘.jpg‘,以及ftest.write和ftrain.write要加上绝对路径,使其可以找到正确图像训练和测试路径,再运行一下:

python Main.py

训练命令参考:

python train.py --data data/workpiece.yaml --cfg models/yolov5s.yaml --weights weights/yolov5s.pt --batch-size 16 --epochs 100 --device 0

workpiece.yaml中的内容如下:

# train and val datasets (image directory or *.txt file with image paths)
train: /home/robot410/code/yolov5/data/ImageSets/Main/train.txt  # 上一步我们生成的train.txt,根据自己的路径进行更改(建议用全路径)
val: /home/robot410/code/yolov5/data/ImageSets/Main/test.txt  # 上一步我们生成的test.txt
#test: ../coco/test-dev2017.txt  # 20k images for submission to https://competitions.codalab.org/competitions/20794# number of classes
nc: 1   # 训练的类别# class namesdata
names: ['workpiece']

weights选择yolo提供的几种模型中的一个即可。
训练好之后。测试命令参考:

python detect.py --weight /home/robot410/code/yolov5/runs/train/exp10/weights/best.pt --source /home/robot410/code/yolov5/2021-12-1/2021-12-10-16-35/rgb

weight后是训练好的模型的路径,source是测试图片的根目录,文件默认保存在runs/detect下。

C++下的部署主要参考https://github.com/UNeedCryDear/yolov5-opencv-dnn-cpp
适配于yolov5-6.0,这个代码是Windows系统下的代码,环境只依赖opencv,需要4.5及以上版本,这里附上自己的CMakeLists:

cmake_minimum_required(VERSION 2.8)
project(yolo)IF(NOT CMAKE_BUILD_TYPE)SET(CMAKE_BUILD_TYPE Release)
ENDIF()MESSAGE("Build type: " ${CMAKE_BUILD_TYPE})set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall  -O3 -march=native ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall   -O3 -march=native")# Check C++11 or C++0x support
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")add_definitions(-DCOMPILEDWITHC11)message(STATUS "Using flag -std=c++11.")
elseif(COMPILER_SUPPORTS_CXX0X)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")add_definitions(-DCOMPILEDWITHC0X)message(STATUS "Using flag -std=c++0x.")
else()message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules)set(OpenCV_DIR "/home/robot410/software/opencv-4.5.4/build")
find_package(OpenCV REQUIRED)
#if(NOT OpenCV_FOUND)
#    find_package(OpenCV 2.4.3 QUIET)
#    if(NOT OpenCV_FOUND)
#        message(FATAL_ERROR "OpenCV > 2.4.3 not found.")
#    endif()
#endif()message( ${OpenCV_INCLUDE_DIRS})
message( ${OpenCV_LIBS})
#find_package(Eigen3 3.1.0 REQUIRED)
#find_package(Pangolin REQUIRED)include_directories(${PROJECT_SOURCE_DIR}
#        ${PROJECT_SOURCE_DIR}/include
#        ${EIGEN3_INCLUDE_DIR}
#        ${Pangolin_INCLUDE_DIRS}
)
add_library(${PROJECT_NAME} SHAREDyolo.cpp)target_link_libraries(${PROJECT_NAME}${OpenCV_LIBS})
add_executable(mainmain.cpp)
target_link_libraries(main ${PROJECT_NAME})

需要将yolo训练好的pt模型转换成onnx模型才可以用c++的opencv调用,yolov5中的export.py文件可以直接拿来用,其中的opset需要设置成12(原来默认的是13,在opencv下面会报错),运行代码参考:

python export.py --weights /home/robot410/code/yolov5/runs/train/exp10/weights/best.pt --img 640 --include onnx

onnx模型默认会在pt模型的相同目录下
Ubuntu没有stdafx.h文件,直接把含有#include"stdafx.h"的都注释掉,不影响
修改main.cpp中的模型路径和测试图片路径,这里的测试路径最好用绝对路径,使用原本默认的相对路径会有问题

string img_path = "/home/robot410/code/yolov5/2021-12-1/2021-12-10-16-35/rgb/000066.png";string model_path = "/home/robot410/yolov5-opencv-dnn-cpp/best.onnx";

yolo.h中的类型需要做相对应的修改:

std::vector<std::string> className = { "workpiece" };

然后对c++文件进行编译

mkdir build
cd build
cmake ..
make

最后运行:

./main

运行效果如下:

yolov5 c++ 识别工件相关推荐

  1. YOLOv5火焰识别

    YOLOv5火焰识别 代码版本:YOLOv5-5.0 YOLO烟雾检测数据集: https://download.csdn.net/download/weixin_51154380/85190134 ...

  2. yolov5昆虫识别模型测试

    yolov5昆虫识别模型测试 代码链接: 链接:https://pan.baidu.com/s/12Q81DGH5Jo3RxsC-VtB_tA 提取码:sdfo 复制这段内容后打开百度网盘手机App, ...

  3. Yolov5训练日记~如何用Yolov5训练识别自己想要的模型~

    目录 一.数据集准备 二.标签设置 三.模型训练 四.模型测试 最近尝试了Yolov5训练识别人体,用的是自己尝试做的训练集.见识到Yolo的强大后,决定分享给大家. 一.数据集准备 数据集是从百度图 ...

  4. 【目标检测】YOLOv5能识别英雄和小兵?原理解析~

    目录 一.简介 二.模型结构 1.整体结构图 2.Backbone(CSPDarknet) 3.SPPF(Spatial Pyramid Pooling - Fast) 4.Neck(FPN+PAN) ...

  5. 23年 yolov5车辆识别+行人识别+车牌识别+车速检测代码(python)

    行人识别yolov5和v7对比 yolo车距 yolo车距1 代码:yolov5车辆检测代码 已有1503人下载 代码无需更改,直接可以预测!!! 流程:

  6. 谈yolov5车辆识别

    目录 **前言** 一.YOLOv5算法简介 二.YOLOv5在车辆识别中的应用 1.  车辆检测 2.  车型分类 3.  车辆跟踪 三.YOLOv5的优点 1.  快速准确 2.  高效性能 3. ...

  7. Yolov5 更改识别窗口大小

    启动yolov5时,会因为像素太大导致占据整个桌面,这样非常影响使用和操作,我们可以通过opencv中的resize函数来修改识别窗口的像素大小,这样操作就方便多了. 原代码中 通过修改cv2.res ...

  8. YOLOv5电车识别 电瓶车识别

    主要使用的技术 开发软件 pycharm anaconda 开发语言 Python 开发框架 pytorch 主要开源库:OpenCV numpy 等 主要技术:yolov5 gpu加速:cuda c ...

  9. yolov5车牌识别(2023年毕业设计+python源码)

    源码链接在文末 一.yolov5 模板下载 第一步:将整个代码从github上下载下来, 网址: ONNX > CoreML > TFLite">GitHub - ultr ...

最新文章

  1. python的工作方向-python最赚钱的4个方向,你最心动的是哪个?
  2. 项目遇到的问题或处理办法
  3. 天翼云从业认证课后习题(3.3天翼云网络产品)
  4. 什么是java常量?
  5. 数据库设计对性能的影响
  6. jzoj6800-NOIP2020.9.19模拟spongebob【枚举】
  7. android 开发 gradle 自己会容易混淆的东西
  8. 如何通过JNI在Java中调用C库函数
  9. 奇怪,有的Python函数或方法调用需要两对括号?
  10. Flash中图片的逐步加载
  11. 网工七大计策掌握网络管理中的实战技术(转)
  12. 开源公告|腾讯 PAG 动画组件对外开源
  13. mp4 joiner linux,MP4Joiner怎么用?使用MP4Joiner快速合并多个mp4视频文件的方法介绍
  14. web登录实现带php
  15. login登录服务器
  16. 由标明空子树的先序遍历序列创建二叉树
  17. Mac鼠标滚轮控制浏览器
  18. 时空穿梭 探寻高端存储架构的前世今生
  19. readv和writev
  20. 贪吃蛇之智能蛇的实现

热门文章

  1. MessageBox函数介绍
  2. 利用Python调用pastebin.com API自动创建paste
  3. js获取当前的操作系统
  4. Hyper-V 使用ISO文件安装windows7
  5. Docker 在 M1 Mac arm64架构上构建 amd64镜像。
  6. C++-Bigo笔试题
  7. 【洛谷P1313 计算系数】
  8. python实现胡萝卜路径追踪算法
  9. better-scroller使用
  10. 天涯明月刀7月4号服务器维护,天涯明月刀手游11月4日更新了什么?停服维护内容一览[多图]...