컴퓨터 네트워크 수업을 수강하며 소켓프로그래밍 실습을 하였다.

TCP / UDP 방식을 통해 간단하게 데이터 패킷을 송수신하는 프로그램을 만들었다.

이 때 IP를 입력하여 데이터 패킷을 전송하는데, 이때 의문이 생겼다.

평소에 ip주소는 공유기내에서는 같다고 알고 있었는데, 같은 네트워크 상에서는 어떻게 통신을 할까?

답의 시작은 우리가 통상적으로 쓰이는 ip주소는 2개로 나뉜다는 것 이었다.

공인ip와 사설ip로 나뉜다.

 

1. 공인 IP (Public IP)

인터넷 사용자의 로컬 네트워크를 식별하기 위해 ISP(인터넷 서비스 공급자)가 제공하는 IP 주소이다.

공용 IP 주소라고도 불리며 외부에 공개되어 있는 IP 주소이다.

  • 공인 IP는 전세계에서 유일한 IP 주소를 갖는다
  • 공인 IP 주소가 외부에 공개되어 있기에 인터넷에 연결된 다른 PC로부터의 접근이 가능하다.

 

2. 사설 IP (Private IP)

일반 가정이나 회사 내 등에 할당된 네트워크의 IP 주소이다.

  • IPv4의 주소부족으로 인해 서브넷팅된 IP이기 때문에 라우터에 의해 로컬 네트워크상의 PC 나 장치에 할당된다.

 

3. 사설 IP와 공인 IP의 차이

💻➡🌏 : 사설 IP를 할당받은 스마트폰 혹은 개인 PC가 데이터 패킷을 인터넷으로 전송하면, 라우터(공유기)가 해당 사설 IP를 공인 IP로 바꿔서 전송한다.

🌏➡💻 : 인터넷에서 오는 데이터 패킷의 목적지도 해당하는 사설 IP로 변경한 후 개인 스마트폰 혹은 PC에 전송한다.

 

내가 실습했던 UDP와 TCP 프로그램은 같은 네트워크 상에서, 즉 사설 IP로 통신하는 프로그램이었다.

따라서 같은 네트워크 상에서 다른 기기들은 공인 IP가 같을지라도, 각각 고유의 사설 IP를 부여 받기 떄문에, 무리없이 통신이 가능했던 것이었다.

 

 

4. 고정 IP와 유동 IP

고정 IP란?

  • 컴퓨터에 고정적으로 IP가 한번 부여되면 IP를 반납하기 전까지는 다른 장비에 부여할 수 없는 IP 주소를 말한다.

유동 IP란?

  • 장비에 고정적으로 IP를 부여하지 않고 컴퓨터를 사용할 때 남아 있는 IP 중에서 돌아가면서 부여하는 IP를 뜻한다.

인터넷 상에서 서버를 운영하고자 할 때는 공인 IP를 고정 IP로 부여해야 한다는 것이 중요하다. 즉, 공인 IP를 부여받지 못하면 다른 사람이 내 서버에 접속할 수가 없고, 고정 IP를 부여하지 않으면 내 서버가 아닌 다른 사람의 서버로 접속이 될 수도 있기 때문이다.

반면에 우리가 집에서 사용하는 인터넷 서비스 업체는 각 가정마다 공인 IP를 유동 IP로 부여하고, 공유기 내부에서는 사설 IP를 유동 IP로 부여하는 것이 일반적이라고 보면 될 것이다.

 

출처 : 공인(Public) && 사설(Private) IP의 차이점 (velog.io)

1. 기존 Tesseract방식의 문제점

 - 번호판의 해상도와 관계없이 글자 일부를 잘못 인식하는 등 정확성이 다소 떨어짐.

 - 숫자나 문자 이외에 특수문자 또한 인식하여 추출하므로 특수문자가 여럿 섞여 정확도가 더욱 떨어짐.

 

글자 인식오류

2. LPR Net

참고 : https://arxiv.org/pdf/1806.10447.pdf

 - NinV의 자동차 번호판 글자인식 알고리즘

 - 다양한 번호판 데이터를 이용한 학습으로 번호판 글자인식에 최적화

 - 번호판에서 나올 수 있는 한글만을 가지고 구분하여 정확성 향상

 

기존에 있는 코드에서 글자인식부분만 tesseract -> LPR Net 으로 바꾸어 진행

 

출처 : http://happy-car.kr/model/DetailView.asp?ShopNo=30150806&MemberNo=1000182962&OnCarNo=201830382374

1. Tesseract란?

 

 - 이미지속 글자를 자동으로 인식하여 글자로 변환해주는 광학 문자 인식 OCR(Optical character recognition)

 - 문자 인식의 정확성을 높이기위해 이미지의 전처리과정이 필수적임.

 - 이미지의 흑백 반전, 수평 보정, 노이즈제거 등을 통해 문자 인식이 정확하게 이루어지도록 해야함.

 


2. Tesseract를 이용한 번호판 텍스트 추출

 

 (1) 이미지의 흑백 반전

opencv의 cvtColor를 이용하여 이미지를 흑백반전 처리 하였다.

이미지의 흑백반전

 (2) 이미지의 수평보정

 - Tesseract로 글자인식의 정확성을 높이기 위해 기울여진 사진을 보정하는 과정.

 - 허프변환으로 번호판 외곽의 기울기를 구하고 해당 기울기만큼 사진을 회전시켜 수평보정 진행

 

 ※ 허프변환?

 - 영상내에서 직선을 검출하는 대표적 알고리즘 중 하나.

 - Opencv에서 기본적인 허프 변환 직선 검출 방법 제공

 

  - canny함수를 통해 에지 검출후 HoughLines을 통해 거리와 각도를 저장

  - 최소 각도를 구하여 따로 저장, 이때 최소 각도를 이용하여 사진을 회전시킴.

 

허프변환 직선검출결과

  - 허프변환 과정에서 얻은 최소 각도를 이용해 사진 회전

수평보정 결과

 (3) Tesseract로 텍스트 추출

최종적으로 전처리한 이미지를 가지고 Tesseract를 이용하여 글자를 인식하게 되면

 

다음과 같이 번호판을 인식하고 번호를 텍스트로 추출하는 것이 가능하다. 

 

참고 : https://bkshin.tistory.com/entry/OpenCV-23-%ED%97%88%ED%94%84-%EB%B3%80%ED%99%98Hough-Transformation

             https://crmn.tistory.com/53

1. 데이터 학습하기

 - Colab환경에서 darknet을 실행시켜 YOLO를 위한 환경을 설정해준다.

 - 이 때, 기존 darknet 파일은 모두 윈도우용 파일이므로, dos2unix를 통해 유닉스용으로 변환한다.

 - 처음 학습시, 비교대상 weights 파일은 미리 설치된 darknet53.conv.74를 사용한다.

 

 - 최종적으로 2200번의 학습을 끝낸 weights 파일을 얻어냈다.


 

2. 차량번호판 추출하기

 

  Opencv 라이브러리를 사용, 파이썬으로 구현했다.

 

- cv2의 dnn 모듈을 사용하여 학습해둔 파일을 불러와 테스트를 진행했다.

- 가중치 파일인 weight 파일, 구성파일인 cfg 파일, 객체의 이름이 담긴 Name파일을 각각 불러온다.

- 이미지를 불러오고 너비와 높이도 따로 저장한다.

- 가져온 이미지는 바로 사용이 불가하므로 blob의 형태로 변환한다.

 

 - 객체 탐지후 탐지결과 신뢰도 50%이상인 객체(번호판)만을 따로 저장한다.

 - 객체(번호판)의 주변으로 직사각형을 그리고, 객체이름 또한 삽입한다.

실행결과, 차량의 이미지에서 번호판을 따로 인식하여 Box처리가 되었음을 알 수 있다.

 

 

 

참고 : YOLO object detection using Opencv with Python - Pysource

+ Recent posts