본문 바로가기

Python/Open_CV

Python - Machine Running

####### test 이미지 만들기 #######
test_digits= cv2.imread('./Data/digits.jpg')
#크기확인
re_digits= cv2.resize(test_digits,(int(test_digits.shape[1]*0.2),
                                 int(test_digits.shape[0]*0.2))) #사이즈 줄이기
crop_digits=re_digits[0:int(re_digits.shape[0]-10),
                          15:int(re_digits.shape[1]-40)] #불필요한부분 자르기

gray_digits = cv2.cvtColor(crop_digits,cv2.COLOR_BGR2GRAY)#그레이화

retval,bin_digits= cv2.threshold(gray_digits, 170, 255, cv2.THRESH_BINARY_INV)

bin_digits = cv2.morphologyEx(bin_digits, cv2.MORPH_OPEN , 
                    cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2,2)), iterations = 2)



src,contours,hierarchy= cv2.findContours(bin_digits, cv2.RETR_EXTERNAL,
                                         cv2.CHAIN_APPROX_SIMPLE)

cv2.imshow('src',bin_digits) #모폴로지 확인
bR_arr = []
digit_arr = []
digit_arr2 = []
count = 0

## 숫자별 Bounding Rect 구하기
bounding_rects = []
rect_digits = crop_digits.copy()
num = 1
for c in contours:
    num = 1 +len(c)
    x, y, w, h = cv2.boundingRect(c)
    if w > 2 and h > 10:
        bounding_rects.append([x,y,w,h])
        bR_arr = sorted(bounding_rects, key=lambda num : num[0], reverse = False)# sorted
        cv2.rectangle(rect_digits, (x, y), (x+w, y+h),(255,0,0), 2)
        cv2.putText(rect_digits, str(num), (int(x), int(y)), cv2.FONT_HERSHEY_COMPLEX,
                    0.8, (0, 0, 0), 2)
#         for i in range(0,len(bounding_rects)):
#             a = bin_digits[bounding_rects[i][1]:bounding_rects[i][1]+bounding_rects[i][3],bounding_rects[i][0]:bounding_rects[i][0]+bounding_rects[i][2]]
#             cv2.imwrite('kNN/testPNGs/%d.png' %i ,a )

cv2.imshow('test',rect_digits )


cv2.waitKey()
cv2.destroyAllWindows()


for x,y,w,h in bR_arr :
    count += 1 
    digit_arr.append(bin_digits[y-2:y+h+2,x-2:x+w+2])
    if count == 12 : #마지막줄에왔을떄 digit_arr2에 옮겨주고 digit_arr와 count는 초기화한다.
            digit_arr2.append(digit_arr)
            digit_arr = []
            count = 0

#리스트에 저장된 이미지를 32x32의 크기로 리사이즈해서 순서대로 저장
for i in range(0,len(digit_arr2)) :
    for j in range(len(digit_arr2[i])) :
        count += 1 
        if i == 0 :         #1일 경우 비율 유지를 위해 마스크를 만들어 그위에 얹어줌
            width = digit_arr2[i][j].shape[1]
            height = digit_arr2[i][j].shape[0]
            tmp = (height - width)/2
            mask = np.zeros((height,height))
            mask[0:height,int(tmp):int(tmp)+width] = digit_arr2[i][j]
            digit_arr2[i][j] = cv2.resize(mask,(32,32))
        else:
            digit_arr2[i][j] = cv2.resize(digit_arr2[i][j],(32,32))
        if i == 9 : i = -1
        cv2.imwrite('./kNN/testPNGs/'+str(i+1)+'_'+str(j)+'.png',digit_arr2[i][j])
        
        

def preprocessing_txt(path):
    txtPaths = [os.path.join(path,f) for f in os.listdir(path)]
    count = 0
    #파일읽기
    for txtPath in txtPaths :
        count += 1
        filename = os.path.basename(txtPath)
        f = open(txtPath)
        img = []
        while True :
            tmp=[]
            text = f.readline()
            if not text :
                break
            for i in range(0,len(text)-1) :
                #라인을 일어올때 text가 1일경우 255로 변경
                if int(text[i]) == 1 :
                    tmp.append(np.uint8(255))
                else :
                    tmp.append(np.uint8(0))
            img.append(tmp)
        img = np.array(img)
        cv2.imwrite('./kNN/trainingPNGs/'+filename.split('.')[0]+'.png',img)
    print('\n'+str(count)+'files are saved(preprocessing_txt2png)')
    
def KNN(train_x,train_y,test_x,test_y):     #knn알고리즘 결과출력
    clf = KNeighborsClassifier(n_neighbors=3)
    clf.fit(train_x,train_y)
    pre_arr = clf.predict(test_x)
    pre_arr = pre_arr.reshape(10,12)
    
    print('kNN의 테스트 세트 예측 :\n{}'.format(pre_arr))
    print('kNN의 테스트 세트 정확도 : {0:0.2f}%'.format(clf.score(test_x,test_y)*100))
    print('------------------------------------------------------')
    
def GNB(train_x,train_y,test_x,test_y):     #GaussianNB알고리즘 결과출력
    gnb = GaussianNB()
    gnb.fit(train_x,train_y)
    pre_arr = gnb.predict(test_x)
    pre_arr = pre_arr.reshape(10,12)
    
    print('GaussianNB의 테스트 세트 예측 :\n{}'.format(pre_arr))
    print('GaussianNB의 테스트 세트 정확도 : {0:0.2f}%'.format(gnb.score(test_x,test_y)*100))
    print('------------------------------------------------------')
    
def MNB(train_x,train_y,test_x,test_y):     #MultinomialNB알고리즘 결과출력
    mnb = MultinomialNB()
    mnb.fit(train_x,train_y)
    pre_arr = mnb.predict(test_x)
    pre_arr = pre_arr.reshape(10,12)
    
    print('MultinomialNB의 테스트 세트 예측 :\n{}'.format(pre_arr))
    print('MultinomialNB의 테스트 세트 정확도 : {0:0.2f}%'.format(mnb.score(test_x,test_y)*100))
    print('------------------------------------------------------')
    
def CNB(train_x,train_y,test_x,test_y):     #ComplementNB알고리즘 결과출력
    cnb = ComplementNB()
    cnb.fit(train_x,train_y)
    pre_arr = cnb.predict(test_x)
    pre_arr = pre_arr.reshape(10,12)
    
    print('ComplementNB의 테스트 세트 예측 :\n{}'.format(pre_arr))
    print('ComplementNB의 테스트 세트 정확도 : {0:0.2f}%'.format(cnb.score(test_x,test_y)*100))
    print('------------------------------------------------------')
    
def BNB(train_x,train_y,test_x,test_y):     #BernoulliNB알고리즘 결과출력
    bnb = BernoulliNB()
    bnb.fit(train_x,train_y)
    pre_arr = bnb.predict(test_x)
    pre_arr = pre_arr.reshape(10,12)
    
    print('BernoulliNB의 테스트 세트 예측 :\n{}'.format(pre_arr))
    print('BernoulliNB의 테스트 세트 정확도 : {0:0.2f}%'.format(bnb.score(test_x,test_y)*100))
    print('------------------------------------------------------')
    
def createdataset(directory):       #sklearn사용을 위해 데이터세트를 생성
    files = os.listdir(directory)
    x = []
    y = []
    for file in files:
        attr_x = cv2.imread(directory+file, cv2.IMREAD_GRAYSCALE)
        attr_x = attr_x.flatten()
        attr_y = file[0]
        x.append(attr_x)
        y.append(attr_y)
        
    x = np.array(x)
    y = np.array(y)
    return x , y


preprocessing_txt('./kNN/trainingDigits')

print('Machine learning Calculating Result..')

train_dir = './kNN/trainingPNGs/'
train_x ,train_y = createdataset(train_dir)

test_dir = './kNN/testPNGs/'
test_x , test_y = createdataset(test_dir)

KNN(train_x, train_y, test_x, test_y)
GNB(train_x, train_y, test_x, test_y)
MNB(train_x, train_y, test_x, test_y)
CNB(train_x, train_y, test_x, test_y)
BNB(train_x, train_y, test_x, test_y)