圖片數據處理

處理GTSRB的原始數據集,從GTSRB官網上下載的文件由2個壓縮文件組成,分別爲GTSRB_Final_Test_Images.zip, GTSRB_Final_Training_Images.zip。測試

下載地址:http://benchmark.ini.rub.de/?section=gtsrb&subsection=datasetspa

從官網說明得知共有43個類別的交通標誌牌,解壓後分別獲得訓練集和測試集,其中訓練集圖片按類別分別存儲在不一樣文件夾下,每一個類別分別有200到2000多張圖片不等。code

圖片以PPM格式存儲,每一個文件夾下都有一個CSV文件,存儲着不一樣圖片的大小信息以及交通標識在圖片上的位置座標,blog

下面的程序要作的是遍歷圖片文件,根據CSV提供的信息,對圖片進行裁剪,並以JPG格式保存到指定文件夾,經過此次練習,對os.path(), os.walk()等一些API有了必定了解,圖片

處理後的數據做爲接下來製做TFFrecords文件提供材料ip

 1 # -*- coding: utf-8 -*-
 2 
 3 from PIL import Image
 4 import os
 5 import re
 6 
 7 # 獲取當前路徑(不光如下的方法,還有其它方法,如os.getcwd())
 8 cur_path = os.path.abspath(os.curdir)
 9 # print(cur_path)
10 
11 new_dir = ['test_file_dir', 'train_file_dir']
12 for dir in new_dir:
13     dir = os.path.join(cur_path, dir)
14     if os.path.exists(dir):  # 不然會報錯
15         pass
16     else:
17         os.mkdir(dir)
18 
19 # resize後的大小
20 width = 128
21 height = 128
22 
23 test_source_dir = 'E:\CV\VGGnet\GTSRB_Final_Test_Images\GTSRB\Final_Test\Images'
24 train_source_dir = 'E:\CV\VGGnet\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images'
25 
26 # 處理測試集
27 # with open('\GTSRB_Final_Test_Images\GT-final_test.test.csv') as file:
28 with open(test_source_dir + '\GT-final_test.test.csv', 'r') as file:
29     print('lala')
30     content = []
31     i = 0
32     for line in file:
33         print(line)
34         i += 1
35         if i == 1:
36             continue
37         content = content + line.split(';')
38         print(content)
39         pic = Image.open(test_source_dir + '\\' + content[0]) # 若是使用os.path.join()的話,中間不用加'\\'
40         pic = pic.crop((float(content[3]), float(content[4]), float(content[5]), float(content[6][:-1]))) # content[6]裏有一個換行符
41         # 調整圖像大小(Image.BILINEAR指定採用雙線性法對像素點插值)
42         pic.resize((width, height), Image.BILINEAR).save(r'%s\%s.jpg' % (os.path.join(cur_path, new_dir[0]), content[0][0:-4]))
43         content[:] = []
44 
45 # 處理訓練集
46 
47 # dirs, files分別是子文件夾和文件的名稱的list,注意不是路徑!!! root即walk()裏的路徑
48 for (root, dirs, files) in os.walk(train_source_dir):  # os.walk()不返回任何東西,不能用=號, 只能用for...in...的方式得到
49     for sub_dir in dirs:
50         new_folder = os.path.join(cur_path, new_dir[1], sub_dir)
51         # print(new_folder)
52         if os.path.exists(new_folder):
53             pass
54         else:
55             os.mkdir(new_folder)
56         for (_, _, filename) in os.walk(os.path.join(root, sub_dir)):
57             for sub_file in filename:
58                 if sub_file.endswith('.csv'):
59                     with open(os.path.join(root, sub_dir, sub_file), 'r') as csv_file:
60                         print('lala')
61                         content = []
62                         i = 0
63                         for line in csv_file:
64                             print(line)
65                             i += 1
66                             if i == 1:
67                                 continue
68                             content = content + line.split(';')
69                             print(content)
70                             pic = Image.open(os.path.join(root, sub_dir, content[0]))
71                             pic = pic.crop((float(content[3]), float(content[4]), float(content[5]),
72                                             float(content[6])))
73                             # 調整圖像大小(Image.BILINEAR指定採用雙線性法對像素點插值)
74                             pic.resize((width, height), Image.BILINEAR).save(r'%s\%s.jpg' % (new_folder, content[0][0:-4]))
75                             content[:] = []
相關文章
相關標籤/搜索