我主要是使用YOLO V3训练粮虫的自制数据集,该文主要是记录自己在复现YOLO V3中的疑问和程序运行的问题,并记录一下。
目录
- 1.制作数据集时,图片是否非要按照程序中要求的416*416进行制作?
- 2.YOLO V3中train.py文件中的main函数中,input_shape=(41.6,416),自己的数据集的图片大小不是这个,需要修改吗?
- 3.训练模型完成,最后模型保存时出现错误
- 4.在运行train.py训练自己的数据集时,第一次运行报错,报错信息为:Could not create cudnn handle: CUDNN_STATUS_ALLOC_FAILED
- 5.继上面的问题之后,报错信息failed to allocate ***G (**bytes) from device:CUDA_ERROR_OUT_OF_MEMORY
- 6.训练之后,需要进行模型验证,步骤如下
- 总结
1.制作数据集时,图片是否非要按照程序中要求的416*416进行制作?
根据我目前的自制数据集并程序运行来看,不需要图片按照特定大小,但是数据集中的图片大小尽量一致,图片大小不要太大,不然会造成运行速度慢,我的数据集中图片大小为640*480.
2.YOLO V3中train.py文件中的main函数中,input_shape=(41.6,416),自己的数据集的图片大小不是这个,需要修改吗?
不需要修改,数据集制作好了就可以跑train.py进行训练了,我使用的train.py不是原版程序中的,使用的是,这个博主提供的文件,亲测能用,但是需要进行修改,后面会进行修改。
3.训练模型完成,最后模型保存时出现错误
一定要在工程目录中创建logs文件夹,在文件加中创建000文件夹,不然花了好多训练的模型,最后保存时出现这个错误,白白浪费了时间,所以在训练前,一定要提前创建好模型保存的文件夹。
4.在运行train.py训练自己的数据集时,第一次运行报错,报错信息为:Could not create cudnn handle: CUDNN_STATUS_ALLOC_FAILED
这是使用keras-gpu版本训练时会遇见的问题,使用cpu进行训练时,不会出现这个问题,但是训练的速度很慢,所以根据查找的资料加上,就能解决这个问题了,在train.py开头的位置加上,加上之后如下图所示。
import os
import tensorflow as tf
os.environ["CUDA_VISIBLE_DEVICES"] = "1"
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
5.继上面的问题之后,报错信息failed to allocate ***G (**bytes) from device:CUDA_ERROR_OUT_OF_MEMORY
该问题CUDA_ERROR_OUT_OF_MEMORY出现,代表你的电脑显卡的内存不够,需要你调整batch_size的参数,源代码中batch_size = 32,一直向下调整,最终batch_size = 5时,程序就可以正常运行了,我的 epochs=50,原来是500,我刚开始训练过,发现val_loss下降的很快,所以我就改小到50,但是最终的效果还可以,数据集大小总共为252,测试集和训练集按照0.1和0.9的比例进行分配。
6.训练之后,需要进行模型验证,步骤如下
- 经过长时间的模型训练,最终在logs/000/文件夹中生成一个trained_weights.h5,需要把这个文件挪到model_data中,并修改名字为yolo.h5.如下图所示:
- 在yolo_video.py程序的开头添加
import os
import tensorflow as tf
os.environ["CUDA_VISIBLE_DEVICES"] = "1"
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
- 在terminal上输入
python yolo_video.py --image
,程序会自动运行,中间会有一些FutureWarning,这个不用理会,如下图所示
4.根据提示,输入图片路径,有两种方式,分别下图所示,然后会出现预测的结果
最终的预测结果,如下图所示。
总结
使用yolo v3训练自己的数据集,目前所遇到的问题已经一一解决,并记录下来,后面还需要继续调整网络结构,使更加符合粮虫的小目标识别目的。