簡體   English   中英

如何為神經網絡分割一批豆子

[英]How to segment a batch of beans for neural network

我遇到了一個問題,我想在混合物中識別不同的咖啡豆。 我創建了一個神經網絡,它能夠單獨識別不同的豆子。 但在實踐中,我想開發一種算法,可以在更大的批次中檢測這些 bean。 沒有必要識別圖片中的所有豆子,但是當我能夠識別更大批次中的 10-15 個豆子時,這就足夠了。

現在的問題是,當只有一層具有對比背景的 bean 時,我能夠分割 bean,但是當第一層下面有多層 bean 時,它變得非常困難。

我嘗試使用 openCV 中的距離變換和分水嶺算法,如前所述,這僅適用於單個 bean 和 bean 之間的一些小的重疊(就像在這個例子中一樣)。 下圖為結果:單層分割的結果

我使用的代碼基於前面提到的示例:

import cv2 
import numpy as np
from matplotlib import pyplot as plt
from scipy.ndimage import label
from scipy.ndimage import morphology

# load the image as normal and grayscale 
img_path = "FINAL/segmentation/IMG_6699.JPG"
img= cv.imread(img_path,0)
img0 = cv.imread(img_path)

#preprocess the image
img= cv.medianBlur(img,5)
ret,th1 = cv.threshold(img,80,255,cv.THRESH_BINARY_INV)
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(th1, cv2.MORPH_OPEN, kernel)
dilation = cv2.dilate(opening, None, iterations=2)
erosion = cv2.erode(dilation,kernel,iterations = 50)
border_nonseg = dilation - cv2.erode(dilation, None, iterations = 1)


#distance transform 
#dt = morphology.distance_transform_bf(dilation, metric='chessboard')
dt = cv2.distanceTransform(dilation, 2, 5)   
dt = ((dt - dt.min()) / (dt.max() - dt.min()) * 255).astype(np.uint8)
hier, dt1 = cv2.threshold(dt, 170, 255, cv2.THRESH_BINARY)

# label the centers found by the distance transform 
lbl, ncc = label(dt1)
lbl = lbl * (255/ncc)      
# Completing the markers now. 
lbl[border_nonseg == 255] = 255
lbl = lbl.astype(np.int32)

# Watershed algorithm 
cv2.watershed(img0, lbl)

lbl[lbl == -1] = 0
lbl = lbl.astype(np.uint8)
result = 255 - lbl
lbl_cont = result

# Draw the borders 
result[result != 255] = 0
result = cv2.dilate(result, None, iterations=1)
img0[result == 255] = (255, 0, 0)
cv2.imwrite("output.png", img0)
contours, _ = cv.findContours(result, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

titles = ['Original Image', 'dilation',
            'gradient morph', 'erode']
images = [ border_nonseg, dt, lbl_cont, img0]
plt.figure(figsize=(20,20))
for i in range(4):
    plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()

但是當有這樣的圖片時問題就開始了(這是一個真實的情況):多層分割更難的多層分割

我不認為我能夠重用前面提到的代碼,我需要一種不同的方法。 因為第一層和第二層的反差太小了,因為豆子很小,所以沒有大的陰影,這會產生很好的對比,而且豆子的顏色也很暗,並沒有讓它變得更容易。
那么您對解決此問題的不同方法有什么建議,或者可能調整當前代碼以解決我的問題?

我很想聽到對此有不同的看法!

如果我理解正確,您只需要一些圖像分割方法將豆子從大圖片中分離成許多小圖片,其中只有一個豆子,這樣您就可以將它們提供給您的神經網絡進行訓練/測試。

對於你展示的那種圖片,分割本身幾乎就是一種識別。 我的意思是,你幾乎需要一個訓練有素的神經網絡來識別圖片中的豆子,然后將它們分開並將它們輸入你的非訓練神經網絡。

對於這類問題,我相信有一些 NN 架構(非監督)經過訓練可以為您提取相關特征。 我認為自動編碼器是其中一種選擇,但我現在不確定。

另一種方法是使用某種更通用的模式識別:

a) 基於形狀:他們嘗試在梯度圖像上匹配輪廓 model

b) 基於相關性他們嘗試使用灰度相關性在原始圖像上匹配樣本圖像

這些方法使用金字塔搜索來提高速度,但您可能還想為圖像的每個金字塔級別嘗試 model 的不同金字塔級別以分析以應對顆粒的不同縮放,這相當於具有縮放的匹配方法。 您還需要多個 bean 模型(單個 bean 的不同視角)來增加每個圖像的結果數量。

您也可以嘗試c) 在某些條件下基於顏色平滑度將種子區域擴展到相鄰像素的區域擴展方法,或d) 結合某些輪廓閉合算法的邊界查找器 但我擔心它們會根據您的圖像可變性給您帶來很多問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM