yolov5 c++ 识别工件
记录一下训练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++ 识别工件相关推荐
- YOLOv5火焰识别
YOLOv5火焰识别 代码版本:YOLOv5-5.0 YOLO烟雾检测数据集: https://download.csdn.net/download/weixin_51154380/85190134 ...
- yolov5昆虫识别模型测试
yolov5昆虫识别模型测试 代码链接: 链接:https://pan.baidu.com/s/12Q81DGH5Jo3RxsC-VtB_tA 提取码:sdfo 复制这段内容后打开百度网盘手机App, ...
- Yolov5训练日记~如何用Yolov5训练识别自己想要的模型~
目录 一.数据集准备 二.标签设置 三.模型训练 四.模型测试 最近尝试了Yolov5训练识别人体,用的是自己尝试做的训练集.见识到Yolo的强大后,决定分享给大家. 一.数据集准备 数据集是从百度图 ...
- 【目标检测】YOLOv5能识别英雄和小兵?原理解析~
目录 一.简介 二.模型结构 1.整体结构图 2.Backbone(CSPDarknet) 3.SPPF(Spatial Pyramid Pooling - Fast) 4.Neck(FPN+PAN) ...
- 23年 yolov5车辆识别+行人识别+车牌识别+车速检测代码(python)
行人识别yolov5和v7对比 yolo车距 yolo车距1 代码:yolov5车辆检测代码 已有1503人下载 代码无需更改,直接可以预测!!! 流程:
- 谈yolov5车辆识别
目录 **前言** 一.YOLOv5算法简介 二.YOLOv5在车辆识别中的应用 1. 车辆检测 2. 车型分类 3. 车辆跟踪 三.YOLOv5的优点 1. 快速准确 2. 高效性能 3. ...
- Yolov5 更改识别窗口大小
启动yolov5时,会因为像素太大导致占据整个桌面,这样非常影响使用和操作,我们可以通过opencv中的resize函数来修改识别窗口的像素大小,这样操作就方便多了. 原代码中 通过修改cv2.res ...
- YOLOv5电车识别 电瓶车识别
主要使用的技术 开发软件 pycharm anaconda 开发语言 Python 开发框架 pytorch 主要开源库:OpenCV numpy 等 主要技术:yolov5 gpu加速:cuda c ...
- yolov5车牌识别(2023年毕业设计+python源码)
源码链接在文末 一.yolov5 模板下载 第一步:将整个代码从github上下载下来, 网址: ONNX > CoreML > TFLite">GitHub - ultr ...
最新文章
- python的工作方向-python最赚钱的4个方向,你最心动的是哪个?
- 项目遇到的问题或处理办法
- 天翼云从业认证课后习题(3.3天翼云网络产品)
- 什么是java常量?
- 数据库设计对性能的影响
- jzoj6800-NOIP2020.9.19模拟spongebob【枚举】
- android 开发 gradle 自己会容易混淆的东西
- 如何通过JNI在Java中调用C库函数
- 奇怪,有的Python函数或方法调用需要两对括号?
- Flash中图片的逐步加载
- 网工七大计策掌握网络管理中的实战技术(转)
- 开源公告|腾讯 PAG 动画组件对外开源
- mp4 joiner linux,MP4Joiner怎么用?使用MP4Joiner快速合并多个mp4视频文件的方法介绍
- web登录实现带php
- login登录服务器
- 由标明空子树的先序遍历序列创建二叉树
- Mac鼠标滚轮控制浏览器
- 时空穿梭 探寻高端存储架构的前世今生
- readv和writev
- 贪吃蛇之智能蛇的实现