目标检测算法caffe训练代码总结

1数据需求

目标检测算法一般都是根据voc2007目录格式进行编辑,目录的框架如下图:
VOC2007
        - -Annotations
        - -ImageSets
        - -JPEGImages
将你所有的图片放入JPEGImages,但一般来说xml文件需要我们自己生成这就要编写代码如下:

import os
from PIL import Image
import cv2
out0 ='''<?xml version="1.0" encoding="utf-8"?>
<annotation>
    <folder>None</folder>
    <filename>%(name)s</filename>
    <source>
        <database>None</database>
        <annotation>None</annotation>
        <image>None</image>
        <flickrid>None</flickrid>
    </source>
    <owner>
        <flickrid>None</flickrid>
        <name>None</name>
    </owner>
    <segmented>0</segmented>
    <size>
        <width>%(width)d</width>
        <height>%(height)d</height>
        <depth>3</depth>
    </size>
'''
out1 = '''  <object>
        <name>%(class)s</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>%(xmin)d</xmin>
            <ymin>%(ymin)d</ymin>
            <xmax>%(xmax)d</xmax>
            <ymax>%(ymax)d</ymax>
        </bndbox>
    </object>
'''

out2 = '''</annotation>
'''
def txt2xml(txt_path):
    source={}
    label={}
    pic_name=txt_path.split("/")[-1][:-4]+".jpg"
    pic_path="/disk3/face_detect/beijing/sfd_head_train/head_data1/img_data/head_voc_data/JPEGImages/"+pic_name
    img=cv2.imread(pic_path)
    if img is None:
        return 0
    h,w,_=img.shape[:]
    fxml=pic_path.replace('JPEGImages','Annotations')
    fxml=fxml.replace(".jpg",".xml")
    with open(fxml,"w") as fxml1:
        image_name=pic_name
        source["name"]=image_name
        source["width"]=w
        source["height"]=h
        fxml1.write(out0%source)
        lines=[]
        with open(txt_path,"r") as f:
            lines=[i.replace("\n","") for i in f.readlines()]
        for box in lines:
            box=box.split(",")
            label["class"]="head"
            xmin=int(float(box[0]))
            ymin=int(float(box[1]))
            xmax=int(float(box[0])+float(box[2]))
            ymax=int(float(box[1])+float(box[3]))
            label["xmin"]=max(xmin,0)
            label["ymin"]=max(ymin,0)
            label["xmax"]=min(xmax,w-1)
            label["ymax"]=min(ymax,h-1)
            if label["xmin"]>=w or label["ymin"]>=h:
                continue
            if label["xmax"]<0 or label["ymax"]<0:
                continue
            fxml1.write(out1%label)
        fxml1.write(out2)
    return 1
    i=0
for txt_name in os.listdir(path):
    i=i+1
    if i%10000==0:
        print(i)
    else:
        txt_path=os.path.join(path,txt_name)
        if i%10==0:
            if (txt2xml(txt_path)==1):
                with open("/disk3/face_detect/beijing/sfd_head_train/head_data1/img_data/head_voc_data/ImageSets/Main/test.txt","a+") as ftest:
                    ftest.write(txt_name[:-4]+"\n")

        else:
            if(txt2xml(txt_path))==1:
                with open("/disk3/face_detect/beijing/sfd_head_train/head_data1/img_data/head_voc_data/ImageSets/Main/trainval.txt","a+") as ftrain:
                    ftrain.write(txt_name[:-4]+"\n")

    

2生成lmdb

得到上述文件夹后还需要用bash脚本进行操作,一是create_list.sh,另一个是create_data.sh。
list的作用是生成两个个txt文件trianval.txt和test_name_size.txt.trianval.txt文件里的内容如下:

JPEGImages/1562654399100016456146.jpg  Annotations/1562654399100016456146.xml

test_name_size.txt文件内容如下:

1562654399100016456146 h  w

个人不是很熟悉bash语法,所以用python代替了。
下边的creat_dara.sh其实就是调用了scripts/create_annoset.py函数,往其中传递一些参数。

caffe_root=/disk3/face_detect/caffe_s3fd-ssd
root_dir=/disk3/face_detect/beijing/sfd_head_train
LINK_DIR=$root_dir/head_data1/lmdb_data1
cd $root_dir
redo=1
db_dir="$root_dir/head_data1/lmdb_data"
data_root_dir="$root_dir/head_data1/img_data/head_voc_data"
dataset_name="trian"
mapfile="/disk3/face_detect/beijing/labelmap_head.prototxt"
anno_type="detection"
db="lmdb"
min_dim=0
max_dim=0
width=0
height=0

extra_cmd="--encode-type=jpg --encoded"
if [ $redo ]
then
  extra_cmd="$extra_cmd --redo"
fi
for subset in trainval
do
  python $caffe_root/scripts/create_annoset.py --anno-type=$anno_type --label-map-file=$mapfile --min-dim=$min_dim --max-dim=$max_dim --resize-width=$width --resize-height=$height --check-label $extra_cmd $data_root_dir /disk3/trianval.txt $db_dir/$db/$dataset_name"_"$subset"_"$db $LINK_DIR/$dataset_name
done

3训练

训练没有什么好说的主要是solover.prototxt和trainval.prototxt。
首先solover.prototxt的讲解参考solover参数优化器
trianval.prototxr即使网络的连接方式,里面的层很多,不一一列举了遇到了不会的goole就可以。要修改网络结构的话一定要读懂论文。推荐一个可视化模型的软件Netron

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
训练自己的数据集,需要进行以下步骤: 1. 首先,复制原有的训练脚本,以便修改适应你的数据集。在终端中输入以下命令: ``` cd ~/work/ssd cd examples/ssd cp ssd_pascal.py ssd_traffic.py ``` 这将会复制原有的训练脚本`ssd_pascal.py`并将其命名为`ssd_traffic.py`。你可以根据自己的需要修改这个脚本。 2. 修改训练脚本`ssd_traffic.py`来适应你的数据集。你可以通过编辑这个脚本来修改数据集的路径、标签格式以及其他相关配置。 3. 下载并配置最新的SSD代码。在终端中输入以下命令: ``` git clone https://github.com/weiliu89/caffe ~/work/ssd cd ~/work/ssd git checkout ssd ``` 这将会下载最新的SSD代码并切换到SSD分支。 4. 准备你的数据集。确保你的数据集符合SSD的要求,包括使用标签XML格式和使用PyTorch模型。你可以根据自己的需要下载和准备疲劳驾驶目标检测数据集和训练好的模型,比如`fdd-dataset.zip`和`ssd300_VOC_100000.pth`等。 5. 根据你的数据集和训练脚本的配置,运行训练脚本以训练你的数据集。在终端中输入以下命令: ``` python ssd_traffic.py ``` 这将会开始训练过程,使用你的数据集和配置文件进行目标检测模型训练。你可以根据需要进行参数的调整和训练过程的监控。 注意:以上步骤假设你已经安装了相关的依赖和环境,并且已经正确配置了SSD代码和数据集路径。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [目标检测算法SSD之训练自己的数据集](https://blog.csdn.net/weixin_34026484/article/details/85889493)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [疲劳驾驶目标检测数据集和训练好的模型](https://download.csdn.net/download/qq_30803353/87612804)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小涵涵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值