项目需求+锻炼自己,尝试用yolov2跑自己的数据集,中间遇到了很多问题,记下来防止忘记

一、数据集

首先发现由于物体特殊没有合适的现成的数据集使用,所以只好自己标注,为了减少工作量,先用opencv标记连通域

(环境 ubuntu qt opencv)

在qt中创建console类型工程,需要对test.pro进行如下配置

QT -= gui
QT += core
CONFIG += c++11
CONFIG += console
CONFIG -= app_bundle
TARGET = test
TEMPLATE = app DEFINES += QT_DEPRECATED_WARNINGS SOURCES += main.cpp INCLUDEPATH+=/home/opencv-3.4.4/include\
/home/opencv-3.4.4/include\opencv\
/home/opencv-3.4.4/include\opencv2
LIBS+=-L/home/opencv-3.4.4/build/lib\
-lopencv_core\
-lopencv_imgcodecs\
-lopencv_highgui\
-lopencv_imgproc

路径按照自己电脑中的路径,test图片要放入debug文件夹内,或者写绝对路径

头文件也需要注意

 #include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
using namespace cv;

头文件包含不足够会出现 returned 1 status问题

###接下来对图片处理

首先转为灰度图,接着用floodfill函数,OTSU算法,利用OTSU算法得到的阈值进行二值化处理(具体不再展开)

【用函数threshold,其中type选择THRESH_OTSU】

之后像素反转,因为一般习惯物体(前景)黑色,背景白色

标记连通域可以用函数findcontours 和 drawcontours,并且可以输出代码数量作为参考

 vector <vector<Point>> contours;
findContours(reverseImage,
contours,
CV_RETR_CCOMP,//外轮廓
CV_CHAIN_APPROX_NONE);//存储所有轮廓点 Mat result(reverseImage.size(),CV_8U,Scalar());
drawContours(result,
contours,
-,//画所有轮廓
Scalar(),//黑色
);
namedWindow("contours");
imshow("contours",result);
cout<<"contours:"<<contours.size()<<endl;

为了避免没用的连通域,需要对其进行筛选,其过滤过大过小连通域

 unsigned int cmin=;
unsigned int cmax=;
vector<vector<Point>>::const_iterator itc=contours.begin();
while(itc!=contours.end())
{
cout<<itc->size()<<endl;
if (itc->size() < cmin || itc->size() > cmax)
itc=contours.erase(itc);
else
++itc;
}
Mat result_erase(result.size(),CV_8U,Scalar());
drawContours(result_erase,
contours,
-,
Scalar(),
); namedWindow("contours_erase");
imshow("contours_erase",result_erase);
cout<<"contours:"<<contours.size()<<endl;

结果如下:

二、数据集准备

复杂的环境下识别连通域并不准确,所以最后还是决定手动标注,用的labelimg,方法非常简单

唯一的技巧可能就是选择自动保存,以及单一标注,标注前后的格式分别是jpg和xml

这是为了和VOC数据集格式相同,便于yolov2识别

需要注意的是如果没有bounding box,那么也没有相应图片的xml,一定要删除照片,否则之后训练时会出现问题

命名格式也可以按照VOC数据集的命名格式

VOC数据集包括三个文件夹,Annotations,ImageSets,JPEGImages,分别放xml,(layout,main,segmentation),jpg

其中main包括train.txt 用来存放照片的名称(无路径,无后缀)

【照片名称写入txt的步骤建议Python】

 import sys
import os
import random
file_path="/home/yjq/test_image"
path_list=os.listdir(file_path)
path_name=[]
for i in path_list:
path_name.append(i.split(".")[0]) path_name.sort() for file_name in path_name:
with open("/home/yjq/image_name.txt","a") as f:
f.write(file_name+"\n")
f.close()

三、配置yolov2

在darknet/scripts下建立文件夹,名字自取(如:VOCdevkit)

里面放入准备好的数据集

对voc_label.py进行修改

【进入pycharm的bin中,用终端打开,输入 sh ./pycharm.sh 打开py文件】

修改sets 和 classes 其他几乎不用修改,报错再相应修改

(事实上这里错了很多次,比如

修改时如果把sets中的year去掉,下面也要相应修改

路径不要出错)

修改后  cd ./darknet/scripts 进入文件夹后再 python voc_label.py

这时会生成labels文件夹,里面存有xml内容的txt文件,同时还有train.txt,存有图片的绝对路径

四、准备训练

这时距离训练只有几步之遥,仍需要修改几个文件

  • data/下修改voc.names  输入classes名称,或新建detection.names  只要对应修改就好
  • cfg/voc.data 修改classes,输入train.txt的路径和names路径,以及backup 放weights的路径,一定注意不可以有中文!
classes=
train = /home/yjq/darknet/scripts/VOCdevkit/train.txt
//valid = /home/pjreddie/data/voc/2007_test.txt
names = data/voc.names
backup = /home/yjq/darknet/results/
  • cfg/yolov2-voc.cfg 在region层下修改classes,以及上一层convolutional的filters 其中 filters=(classes+coords+1)*5

五、开始训练

在terminal输入

cd darknet
./darknet detector train cfg/voc.data cfg/yolov2-voc.cfg

就可以开始了

如果出现 cannot load image 问题可能出在train.txt,用notepad打开,确保最后一行只有换行符即可

或者一不小心路径输错也不是没有可能

默认每100 images 会存入results中,可以查看

【在此之前先从github上下载darknet,训练weights,再测试examples】

【希望一切顺利】

【参考:https://blog.csdn.net/hysteric314/article/details/54097845】

ubuntu yolov2 训练自己的数据集的更多相关文章

  1. YOLOv2训练自己的数据集(VOC格式)

    下周试试,参考:http://blog.csdn.net/ch_liu23/article/details/53558549 http://blog.csdn.net/sinat_30071459/a ...

  2. 可变卷积Deforable ConvNet 迁移训练自己的数据集 MXNet框架 GPU版

    [引言] 最近在用可变卷积的rfcn 模型迁移训练自己的数据集, MSRA官方使用的MXNet框架 环境搭建及配置:http://www.cnblogs.com/andre-ma/p/8867031. ...

  3. 【Tensorflow系列】使用Inception_resnet_v2训练自己的数据集并用Tensorboard监控

    [写在前面] 用Tensorflow(TF)已实现好的卷积神经网络(CNN)模型来训练自己的数据集,验证目前较成熟模型在不同数据集上的准确度,如Inception_V3, VGG16,Inceptio ...

  4. 目标检测算法SSD之训练自己的数据集

    目标检测算法SSD之训练自己的数据集 prerequesties 预备知识/前提条件 下载和配置了最新SSD代码 git clone https://github.com/weiliu89/caffe ...

  5. caffe训练自己的数据集

    默认caffe已经编译好了,并且编译好了pycaffe 1 数据准备 首先准备训练和测试数据集,这里准备两类数据,分别放在文件夹0和文件夹1中(之所以使用0和1命名数据类别,是因为方便标注数据类别,直 ...

  6. (转)理解YOLOv2训练过程中输出参数含义

    最近有人问起在YOLOv2训练过程中输出在终端的不同的参数分别代表什么含义,如何去理解这些参数?本篇文章中我将尝试着去回答这个有趣的问题. 刚好现在我正在训练一个YOLOv2模型,拿这个真实的例子来讨 ...

  7. 理解YOLOv2训练过程中输出参数含义

    原英文地址: https://timebutt.github.io/static/understanding-yolov2-training-output/ 最近有人问起在YOLOv2训练过程中输出在 ...

  8. 使用yolo3模型训练自己的数据集

    使用yolo3模型训练自己的数据集 本项目地址:https://github.com/Cw-zero/Retrain-yolo3 一.运行环境 1. Ubuntu16.04. 2. TensorFlo ...

  9. Win10中用yolov3训练自己的数据集全过程(VS、CUDA、CUDNN、OpenCV配置,训练和测试)

    在Windows系统的Linux系统中用yolo训练自己的数据集的配置差异很大,今天总结在win10中配置yolo并进行训练和测试的全过程. 提纲: 1.下载适用于Windows的darknet 2. ...

随机推荐

  1. UVA11997 K Smallest Sums

    思路 经典的k路归并问题 问题先转换为2路的有序表归并 先让A[1~k]都和B[1]相加,然后加入堆中,取出堆顶(A[x]+B[y])之后,再放入A[x]+B[y+1] 代码 #include < ...

  2. Linux I/O 调度算法

    IO调度器的总体目标是希望让磁头能够总是往一个方向移动,移动到底了再往反方向走,这恰恰就是现实生活中的电梯模型,所以IO调度器也被叫做电梯. (elevator)而相应的算法也就被叫做电梯算法.而Li ...

  3. JAVA中的责任链模式(CH02)

    对责任链CH01做出优化,解决耦合度太高问题 记得上一篇我们使用的是抽象类,然后用子类去继承的方法实现等级的桥接,从而发现了耦合度太高. 为了解决这个问题. 我们本次使用接口进行抽象,然后使用到一个” ...

  4. python 简单的串口收发数据

    # -*- coding: utf- -*- import serial #打开串口 serialPort="COM3" #串口 baudRate= #波特率 ser=serial ...

  5. Phonics 自然拼读法 s,a,t,i,p,n Teacher:Lamb

    # 音节(syllables)拆分 # 拆分练习 # LIoyd 分类法——“七步决” # 元音拆词法 # s,a,t,i,p,n S  A  T I P N # 自然拼音拼读练习表 a mat    ...

  6. django1

    * <pre>━━━━━━神兽出没━━━━━━ * ┏┓ ┏┓ * ┏┛┻━━━┛┻┓ * ┃ 王 ┃ * ┃   ┃ * ┃ ┳┛ ┗┳ ┃ * ┃ ┃ * ┃ ┻ ┃ * ┃ ┃ * ...

  7. Docker容器中找不到vim命令

    docker容器中,有的并未安装vi和vim,输入命令vim,会提示vim: command not found(如下图).此时我们就要安装vi命令 执行命令:apt-get update apt-g ...

  8. decltype typename

    decltype((variable))总是引用类型,但是decltype(variable)只有当variable是引用类型时才是引用类型. #include <iostream> #i ...

  9. CAD{绘制坡道)(绘制楼梯)5.26

    “楼梯其他”“坡道”编辑坡道的各项数据, 三维图中坡道反了.在平面图中镜像,“MI"镜像坡道.给坡道一个箭头引注, 绘制楼梯:”楼梯其他“”双跑楼梯“编辑参数,绘制楼梯,双击楼梯,改变成首层 ...

  10. react源码探索

    react核心部分为 虚拟dom对象 虚拟dom差异化算法 单向数据流渲染 组件生命周期 事件处理 1) 虚拟dom对象: reactDOM.render(args,element); 这个方法第一个 ...