手把手教你:鐵路異物侵入的目標檢測系統


系列文章

手把手教你:圖像識別的垃圾分類系統

手把手教你:人臉識別考勤系統

手把手教你:基於粒子群優化算法(PSO)優化卷積神經網絡(CNN)的文本分類


@



一、項目簡介

本文主要介紹如何使用python搭建:一個基於YOLOv3的鐵路異物侵入的圖像目標檢測系統

項目只是用鐵路異物檢測作為拋磚引玉,其中包含了圖像分類圖像檢測的相關代碼。

如各位童鞋需要更換訓練數據,完全可以根據源碼將圖像和標注文件更換即可直接運行。

博主也參考過網上圖像檢測和圖像分類的文章,但大多是理論大於方法。很多同學肯定對原理不需要過多了解,只需要搭建出一個預測系統即可。

本文只會告訴你如何快速搭建一個基於yolov3的圖像分類系統並運行,原理的東西可以參考其他博主

也正是因為我發現網上大多的帖子只是針對原理進行介紹,功能實現的相對很少。

如果您有以上想法,那就找對地方了!

本次項目涉及2個步驟:

  1. 第一步通過一個cnn的分類器,區分出哪些是異常圖片哪些是正常圖片。
  2. 第二步針對異常圖片進行目標檢測。

不多廢話,直接進入正題!

二、項目檢測結果

檢測結果1


檢測結果2


檢測結果3

三、環境安裝

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查看訓練進度:
tensorboard:目標檢測模型訓練

3.目標檢測結果

目標檢測結果

五、訓練自己的數據

1.項目目錄如下

項目目錄

2.分類模型訓練

需要將自己的數據集整理后放入以下項目目錄中:

./data/img/

下目錄設置,一個類別的圖片放入一個文件夾中,如下:
分類圖片路徑
然后執行

1分類識別模型訓練.ipynb

即可開始分類模型訓練


3.目標檢測模型訓練

需要將自己的數據集整理后放入以下項目目錄中:

./data/yolo_data/

圖像檢測目錄
其中:

  1. Annotations:放入圖像標注的xml文件,命名方式為:圖片名.xml
  2. ImageSets:圖像預處理后生成的文件,放數據時不用管它。
  3. 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

六、完整代碼地址

由於項目代碼量和數據集較大,感興趣的同學可以下載完整代碼,使用過程中如遇到任何問題可以在評論區評論或者私信我,我都會一一解答。

完整代碼下載:
【代碼分享】手把手教你:鐵路異物侵入的目標檢測系統


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM