原文地址
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
@TOC
</font>
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
一、项目简介
本文主要介绍如何使用python搭建:一个基于YOLOv3的铁路异物侵入的图像目标检测系统。
项目只是用铁路异物检测作为抛砖引玉,其中包含了图像分类图像检测的相关代码。
如各位童鞋需要更换训练数据,完全可以根据源码将图像和标注文件更换即可直接运行。
<font color=#999AAA >博主也参考过网上图像检测和图像分类的文章,但大多是理论大于方法。很多同学肯定对原理不需要过多了解,只需要搭建出一个预测系统即可。</font>
本文只会告诉你如何快速搭建一个基于yolov3的图像分类系统并运行,原理的东西可以参考其他博主。
也正是因为我发现网上大多的帖子只是针对原理进行介绍,功能实现的相对很少。
如果您有以上想法,那就找对地方了!
本次项目涉及2个步骤:
- 第一步通过一个cnn的分类器,区分出哪些是异常图片哪些是正常图片。
- 第二步针对异常图片进行目标检测。
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
<font color=#999AAA >不多废话,直接进入正题!
二、项目检测结果
[图片上传失败...(image-b0f6b5-1649984110815)]
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
[图片上传失败...(image-53b7-1649984110815)]
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
[图片上传失败...(image-4ed13d-1649984110815)]
三、环境安装
1.环境要求
本项目开发IDE使用的是:Anaconda中的jupyter notebook,大家可以直接csdn搜索安装指南非常多,这里就不再赘述。
因为本项目基于TensorFlow因此需要以下环境:
- tensorflow >= 2.0
- pandas
- scikit-learn
- numpy
- OpenCV2
- matplotlib
2.环境安装示例
环境都可以通过pip进行安装。如果只是想要功能跑起来,这边建议tensorflow安装cpu版的。
<font color=#999AAA >如果没使用过pycharm通过pip安装包的同学可以参考如下:
[图片上传失败...(image-62112a-1649984110815)]
点开“终端”,然后通过pip进行安装tensorflow,其他环境包也可以通过上面的方法安装。
四、重要代码介绍
环境安装好后就可以打开jupyter notebook开始愉快的执行代码了。由于代码众多,博客中就不放入最终代码了,有需要的童鞋可以在博客最下方找到下载地址。
1.图像分类
本项目涉及2个步骤并有一定对比,第一步是根据给定的图像对图像进行分类,找出有异物的图像。
1.1 加载图像数据,预处理,图像数据增强
#数据预处理
#图片加载
# 读取图片+数据处理函数
def read_img(path):
print("数据集地址:"+path)
imgs = []
labels = []
for root, dirs, files in os.walk(path):
for file in tqdm(files):
# print(path+'/'+file+'/'+folder)
# 读取的图片
img = cv2.imread(os.path.join(root, file))
# skimage.transform.resize(image, output_shape)改变图片的尺寸
img = cv2.resize(img, (w, h))
# 将读取的图片数据加载到imgs[]列表中
imgs.append(img)
# 将图片的label加载到labels[]中,与上方的imgs索引对应
labels.append(str(os.path.basename(root)))
return imgs,labels
# 调用读取图片的函数,得到图片和labels的数据集
data1, label1 = read_img(train_img_url)
原始图片数量:
1: 1090, 0: 572
其中0为有异物的图片,1为无异物的正常图片。
完成数据增强后数量:
[图片上传失败...(image-b6ddf3-1649984110815)]
1.2 分类模型训练
[图片上传失败...(image-7efeb1-1649984110815)]
1.3 分类模型评估
[图片上传失败...(image-69c0db-1649984110815)]
2.图像检测
完成图像分类后,我们可以使用图像检测的结果做个对比,验证同样数据集情况下,分类和检测哪个效果更好。
1.目标检测数据构建
"""
设置相关文件位置
"""
data_dir = 'data/yolo_data'
# 生成训练数据
split = 'train'
output_file = 'data/tf_data/my_train_dlsb.tfrecord'
classes = 'data/yolo_data/ImageSets/my_class.names'
FLAGS = flags.FLAGS
FLAGS([sys.argv[0]])
FLAGS.data_dir = data_dir
FLAGS.split = split
FLAGS.output_file = output_file
FLAGS.classes = classes
# 生成tf数据集
create_data()
2.目标检测模型训练
# 预训练权重
weights = 'function/yolov3/checkpoints/yolov3.tf'
weights_num_classes = 80
# flags设置
FLAGS.dataset = dataset
FLAGS.val_dataset = val_dataset
FLAGS.classes = classes
FLAGS.num_classes = num_classes
FLAGS.mode = mode
FLAGS.transfer = transfer
FLAGS.batch_size = batch_size
FLAGS.epochs = epochs
FLAGS.weights = weights
FLAGS.weights_num_classes = weights_num_classes
try:
history,model = run_model_train()
except SystemExit:
pass
训练过程中我们可以打开tensorboard查看训练进度:
[图片上传失败...(image-9982e1-1649984110815)]
3.目标检测结果
[图片上传失败...(image-2390f5-1649984110815)]
五、训练自己的数据
1.项目目录如下
[图片上传失败...(image-e6978e-1649984110815)]
2.分类模型训练
需要将自己的数据集整理后放入以下项目目录中:
./data/img/
下目录设置,一个类别的图片放入一个文件夹中,如下:
[图片上传失败...(image-1208f1-1649984110815)]
然后执行
1分类识别模型训练.ipynb
即可开始分类模型训练
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
3.目标检测模型训练
需要将自己的数据集整理后放入以下项目目录中:
./data/yolo_data/
[图片上传失败...(image-46aaa3-1649984110815)]
其中:
- Annotations:放入图像标注的xml文件,命名方式为:图片名.xml
- ImageSets:图像预处理后生成的文件,放数据时不用管它。
- JPEGImages:图像数据,命名方式:图片名.jpg
需要注意的是Annotations中xml文件需要和JPEGImages中图片文件名一一对应。
图片标注的xml文件格式如下:
object中:
name为标注的名称
矩形框为:xmin,ymin,xmax,ymax。分别代表标注矩形框左上角坐标和右下角坐标。
<annotation>
<folder>异物</folder>
<filename>abnormal (1).jpg</filename>
<path></path>
<source>
<database>Unknown</database>
</source>
<size>
<width>720</width>
<height>720</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>Plastic board</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>268</xmin>
<ymin>422</ymin>
<xmax>536</xmax>
<ymax>536</ymax>
</bndbox>
</object>
</annotation>
按格式整理好数据后执行:
3目标检测数据预处理.ipynb
六、完整代码地址
由于项目代码量和数据集较大,感兴趣的同学可以下载完整代码,使用过程中如遇到任何问题可以在评论区评论或者私信我,我都会一一解答。
完整代码下载:
【代码分享】手把手教你:铁路异物侵入的目标检测系统