caffe目標檢測模型訓練全過程(三)目標檢測第一步
阿新 • • 發佈:2018-12-01
遍歷整圖查詢蝴蝶位置
2018/04/22
訓練模型對於識別背景和蝴蝶有比較好的效果,基本對不會識別錯誤,接下來,將通過整圖遍歷的原始而又野蠻的方式對一張原始圖片進行處理,進而查詢到蝴蝶的具體位置。具體思路如下圖。對原圖進行縮放成理想大小,例如,
最小邊長縮放為227*6畫素,最大邊長等比縮放:
設定滑動窗大小為227*227畫素
設定滑動窗移動步長為
# 自動step_size scale =min(img.shape[0],(227*6.0)/img.shape[1])*1.0 step_size = int(min(img.shape[0]*scale,img.shape[1]*scale))/20 print("scale",img.shape[0]*scale,img.shape[1]*scale) #resize image scale_img = cv2.resize(img,((int(img.shape[1] * scale), int(img.shape[0] * scale)))) 然後通過模型預測每個滑動框的類別,若是蝴蝶(類別1)的概率大於99%,則記錄滑動框位置,其後繪製在圖片上 具體程式碼: # 自動step_size scale =min(img.shape[0],(227*6.0)/img.shape[1])*1.0 print(scale) step_size = int(min(img.shape[0]*scale,img.shape[1]*scale))/20 print("scale",img.shape[0]*scale,img.shape[1]*scale) #resize image scale_img = cv2.resize(img,((int(img.shape[1] * scale), int(img.shape[0] * scale)))) temp2=scale_img[:] print(scale_img.shape,temp2.shape,img.shape) while x+227 < img.shape[0]*scale: while y+227 < img.shape[1]*scale: # cv2.rectangle(scale_img,(x,y),(x+227,y+227),(0,0,255),1) temp = scale_img[x:x+227,y:y+227] cv2.imwrite("scale_img.jpg",temp) im = caffe.io.load_image('scale_img.jpg') print(im.shape) transformer = caffe.io.Transformer({'data': net_full_conv.blobs['data'].data.shape}) #transformer.set_mean('data', np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy').mean(1).mean(1)) transformer.set_transpose('data', (2,0,1)) transformer.set_channel_swap('data', (2,1,0)) transformer.set_raw_scale('data', 255.0) transformed_image = transformer.preprocess('data', im) net_full_conv.blobs['data'].data[...] = transformed_image net_full_conv.blobs['data'].reshape(1,3,227,227) ### perform classification out = net_full_conv.forward() # make classification map by forward and print prediction indices at each location # out = net_full_conv.forward_all(data=np.asarray([transformer.preprocess('data', im)])) print (out['prob'],(x,y)) if (out['prob'][0][1]>0.99): cv2.rectangle(temp2,(y,x),(y+227,x+227),(0,0,255),2) # print (out['prob'][0,1].shape,(x,y)) del im y += step_size y = 0 x += step_size cv2.imwrite(imgFile.split('.')[0]+"_result.jpg",temp2)
其程式執行效果如下:
圖1 執行效果
從圖中可以看出,所標記的框的數量很多,但交際支出就是蝴蝶的維治所在,因此通過演算法即可準確畫出蝴蝶的位置,此步下次筆記提出。以上圖所示,滑動窗的移動粒度step_size比較小,引起蝴蝶位置比較精確,但是消耗的時間比較長,我們試著1.縮放圖片;2.調整step_size大小;看看最終效果。
圖2 縮放圖片後的效果
圖3 調整step_size大小
經過上述效果,最終課調整最佳尺寸。
同時,對於檢測物件和背景區分度不大的情況下,模型表現力不是很好,如下圖所示:
圖4 模型變現比較差
圖5 模型變現比較差
其原因個人猜測如下:
1. 訓練集加測試集樣本只選擇了100張圖片,train datas中沒有包含此類資訊
2. 模型過擬合比較嚴重
3. 其他原因
附件:
其他測試結果圖如下:
附圖1
附圖2
附圖3