1用自己做的数据集(大概九张图片)用labelme类似于一个小程序,对图片上的信息进行标注,得到类似下图所示,标注好类别,保存得到.json文件。
2.写好所需的配置文件
在config中的creat_custom_model.sh利用git bash 软件(类似于一个cmd窗口)中输入bash creat_custom_model.sh 2(2是我这个自己制作的数据中的分类)(线用九张标注好的图片分为两类 Person,Cat) 会自动生成yolov3-custom.cfg配置文件
3.标签格式的转化
在labelme中生成的label(如果是矩形框的话应该是坐上角的(x1,y1)和右下角的(x2,y2)但是yolov3中需要的label应该是(中心点的x值,中心点的y值,矩形的长,矩形的宽)
利用json2yolo.py脚本将进行坐标转化
需要改动的地方:
①#在labelme中的标注的信息
name2id = {'Person':0,'Cat':1}
Name2id中改为自己数据集中的分类
②def decode_json(json_floder_path,json_name):
#转换好的标签存放的绝对路径
txt_name = 'F:\\YOlov3\\PyTorch-YOLOv3\\data\\custom\\labels\\' + json_name[0:-5] + '.txt'
txt_file = open(txt_name, 'w')
Decode_json中设置一个转换好的标签应该存放的位置
③if __name__ == "__main__":
#读取labelme标注生成的json文件的绝对路径
json_floder_path = 'F:\\YOlov3\\PyTorch-YOLOv3\\label_test'
json_names = os.listdir(json_floder_path)
主函数中将lanelme生成的.json文件读取进来
4.将数据(标注的图片放入相应的位置)注意名字和label里要一致
保存的位置在F:\YOlov3\PyTorch-YOLOv3\data\custom\images
将F:\YOlov3\PyTorch-YOLOv3\data\custom\classes.names
将这里改成类别名
更改config文件夹中的custom.data中的类别信息classes=2
5.在F:\YOlov3\PyTorch-YOLOv3\data\custom\train.txt
F:\YOlov3\PyTorch-YOLOv3\data\custom\val.txt中写好路径(可能会引起改动,看yolov3的datasets.py中是什么格式读取的,注意debug)
6.训练代码更改配置
1.train.py需要设置的参数
–model_def config/yolov3-custom.cfg
–data_config config/custom.data
–pretrained_weights weights/darknet53.conv.74 #看你想不想在人家基础上去做
7.预测操作
在detect.py中进行配置文件操作
–model_def config/yolov3-custom.cfg
–image_folder data/samples/ #把需要预测的数据放到这里
–checkpoint_model checkpoints/yolov3_ckpt_100.pth #训练好模型的路径
–class_path data/custom/classes.names #画图时候要把框上显示出来name
在预测时报错
出现classes[int(cls_pred)] list index out of range
经过检查发现 代码在训练是的确得到的是2分类的结果,但是在预测时却仍然用的是yolov3中80分类的结果,也就是加载模型出现了问题
将代码做了如下的改动:
① 将weight_path和checkpoint_model的默认改为空值
②
将原本的if_else语句 上图下方的框中的代码 改成上方的框中的代码(成功预测)
挑几张展示:(可以看到 效果并不是很好(甚至有的图片都没有检测框的) )
下面用yolov已经训练好的权重进行测试weights/yolov3.weights
得到结果(即直接在配置文件中输入–image_folder data/samples/ 不做其他更改)(效果还不错)
接在配置文件中输入–image_folder data/samples/ 不做其他更改)(效果还不错)