系列文章
手把手教你:基於粒子群優化算法(PSO)優化卷積神經網絡(CNN)的文本分類
@
一、項目簡介
本文主要介紹如何使用python搭建:一個基於YOLOv3的鐵路異物侵入的圖像目標檢測系統。
項目只是用鐵路異物檢測作為拋磚引玉,其中包含了圖像分類圖像檢測的相關代碼。
如各位童鞋需要更換訓練數據,完全可以根據源碼將圖像和標注文件更換即可直接運行。
博主也參考過網上圖像檢測和圖像分類的文章,但大多是理論大於方法。很多同學肯定對原理不需要過多了解,只需要搭建出一個預測系統即可。
本文只會告訴你如何快速搭建一個基於yolov3的圖像分類系統並運行,原理的東西可以參考其他博主。
也正是因為我發現網上大多的帖子只是針對原理進行介紹,功能實現的相對很少。
如果您有以上想法,那就找對地方了!
本次項目涉及2個步驟:
- 第一步通過一個cnn的分類器,區分出哪些是異常圖片哪些是正常圖片。
- 第二步針對異常圖片進行目標檢測。
不多廢話,直接進入正題!
二、項目檢測結果



三、環境安裝
1.環境要求
本項目開發IDE使用的是:Anaconda中的jupyter notebook,大家可以直接csdn搜索安裝指南非常多,這里就不再贅述。
因為本項目基於TensorFlow因此需要以下環境:
- tensorflow >= 2.0
- pandas
- scikit-learn
- numpy
- OpenCV2
- matplotlib
2.環境安裝示例
環境都可以通過pip進行安裝。如果只是想要功能跑起來,這邊建議tensorflow安裝cpu版的。
如果沒使用過pycharm通過pip安裝包的同學可以參考如下:

點開“終端”,然后通過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為無異物的正常圖片。
完成數據增強后數量:

1.2 分類模型訓練

1.3 分類模型評估

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查看訓練進度:

3.目標檢測結果

五、訓練自己的數據
1.項目目錄如下

2.分類模型訓練
需要將自己的數據集整理后放入以下項目目錄中:
./data/img/
下目錄設置,一個類別的圖片放入一個文件夾中,如下:

然后執行
1分類識別模型訓練.ipynb
即可開始分類模型訓練
3.目標檢測模型訓練
需要將自己的數據集整理后放入以下項目目錄中:
./data/yolo_data/

其中:
- 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
六、完整代碼地址
由於項目代碼量和數據集較大,感興趣的同學可以下載完整代碼,使用過程中如遇到任何問題可以在評論區評論或者私信我,我都會一一解答。
完整代碼下載:
【代碼分享】手把手教你:鐵路異物侵入的目標檢測系統
