最近一直在學習神經網絡,一方面是課題需要,另一方面是因為機器學習已經逐漸成為社會的潮流,各行各業都可以見到神經網絡的應用,不學習一下都覺得自己落伍了。趁着這段時間沒辦法開學,好好學習了一些神經網絡的基礎內容,也試着把神經網絡運用到自己的課題中來,今天在試驗SSD目標檢測網絡的時候,發現要制作自己的訓練集首先需要有訓練的圖片,可是一張一張找實在麻煩,找到了,逐個保存,最好還要改成統一的名稱。百度找圖找了幾張,放棄了。。。幾百張下去可能眼睛瞎了。
如果可以有一個程序自動找到我要的圖片類型,還可以順便修改統一名稱保存到一個目錄就好了。。。
又開始了百度:如何爬取網頁里的圖片? 畢竟對網頁代碼不熟悉,只能求助於百度了(面向百度編程呀。。。)
大概原理分析:
1、首先打開chorm瀏覽器,進入百度搜索 “自己要搜的圖片”,按下F12,進入開發者模式,就會看到如下所示,右邊就是網頁代碼(看不懂沒關系,我也不懂)
2、點擊右側的Network,鼠標滾輪在左邊圖片區域往下滑兩下(圖片是動態加載出來的,不滑兩下Network下看不到東西)
點擊XHR,在Name區域選擇一個acjson?.......雙擊,就會出現右下角的小框,選擇Headers,鼠標往下滑,找到Querry String Paramters。
Querry String Paramters表示什么呢,主要是發現這里有一個參數querryWord:工業指針式儀表 --------是的這就是我的查詢關鍵字
其中的 word 指的是搜索關鍵字, pn 指的是第幾頁圖片, rn 值得是每頁有30張圖片,那程序的目的就是對百度圖片網址+這一系列參數進行解析
百度圖片搜索的url為 https://image.baidu.com/search/acjson
將Querry String Paramters里面的搜索關鍵字設置為可改變的參數。如上圖所示,設置為keyword
得到網址解析后的數據后就可以對其中的圖片進行下載保存了參考https://www.jianshu.com/p/46287bd8559b
利用request.get()對網頁進行請求訪問,再調用json()方法進行解析,實現對圖片的爬取保存,總體代碼如下:
要記得在python中安裝requests module :pip install requests 即可
import requests import os def getManyPages(keyword, pages): params = [] for i in range(30, 30 * pages + 30, 30): params.append({ 'tn': 'resultjson_com', 'ipn': 'rj', 'ct': 201326592, 'is': '', 'fp': 'result', 'queryWord': keyword, 'cl': 2, 'lm': -1, 'ie': 'utf-8', 'oe': 'utf-8', 'adpicid': '', 'st': -1, 'z': '', 'ic': 0, 'word': keyword, 's': '', 'se': '', 'tab': '', 'width': '', 'height': '', 'face': 0, 'istype': 2, 'qc': '', 'nc': 1, 'fr': '', 'pn': i, 'rn': 30, 'gsm': '1e', '1488942260214': '' }) url = 'https://image.baidu.com/search/acjson' urls = [] for i in params: urls.append(requests.get(url, params=i).json().get('data')) return urls def getImg(dataList, localPath): if not os.path.exists(localPath): # 新建文件夾 os.mkdir(localPath) x = 0 for list in dataList: for i in list: if i.get('thumbURL') != None: print('正在下載中:%s' % i.get('thumbURL')) ir = requests.get(i.get('thumbURL')) open(localPath + '%d.jpg' % x, 'wb').write(ir.content) x += 1 else: print('該圖片鏈接不存在') if __name__ == '__main__': dataList = getManyPages('工業指針式儀表', 2) # 參數1:關鍵字,參數2:要下載的頁數 getImg(dataList, 'data/yibiao/') # 參數2:指定保存的路徑
運行結果:
保存到本地文件夾的圖片:
爬取到圖片后人工對圖片進行適當的篩選,刪掉部分不符和要求的圖片,就可以利用Labelimg進行圖片的標注了
首先確定安裝有labelimg 安裝方式也簡單: 打開python終端運行 pip install labelImg 即可
安裝后在python終端下輸入labelimg運行即可,因為我使用的是anaconda3的python開發環境,因此打開的是anaconda prompt
運行后就會出現運行界面
點擊open dir 選擇到自己下載的圖片的路徑
選擇Changes Save Dir :新建一個Annotations文件夾專門用來存放標簽數據
點擊creat/nRectBox 或者直接快捷鍵w 可以標注圖片,框選目標最小區域,保存為對應的類別如cat,保存xmlz標注文件(在Annotations里面),點擊切換到下一張繼續標注。希望快一點的可以設置view下的自動保存,用快捷鍵 A和D實現上一張、下一張的切換。
標注是沒有辦法偷懶的,只能一張一張進行標注,幾個小時標注是很正常的哈,如果一張圖片里有多個目標物,就多次創建標注框即可
保存的標注文件:
打開一個看一看:
yibiao是類別名稱
有文件路徑,文件名,圖片的尺寸大小,目標框的邊框點坐標bndBox等信息
<annotation> <folder>yibiao</folder> <filename>1.jpg</filename> <path>E:\CV\qianyixuexi\ssd-keras-master\data\yibiao\1.jpg</path> <source> <database>Unknown</database> </source> <size> <width>286</width> <height>285</height> <depth>3</depth> </size> <segmented>0</segmented> <object> <name>class1</name> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>5</xmin> <ymin>3</ymin> <xmax>283</xmax> <ymax>279</ymax> </bndbox> </object> </annotation>