나름 최신 교수학습 방법을 연구하는 사람으로서 AI접목한 교육에 대해서 준비과정으로 AI전문 기업에 다니며 웹서비스를 어떻게 접목을 해야하는지 경험을 해보았습니다.
결국 핵심업무에 해당하는 것을 할때만 그 내용을 알 수 있다는 결론이 나왔고 해당 내용은 직접 해봐야 한다는 결론 또한 얻을 수 있었습니다.
그렇다면 어떤 방향성을 가지고 접근하여 할 것인지가 중요하고 해당하는 것을 어떻게 접근할지 가이드하는 것이 중요하다고 볼 수 있습니다.
그래서 이번에 영상처리관련해서 python, anaconda, openCV, yolo(You Only Look Once) 기반으로 경험하고 학습해볼까 합니다.
학습에 앞서 목표는 필기입력한 것을 원하는 글씨체로 변경 저장하는 것으로 하였습니다.(2024.07.05 am09:13) 업무를 보면서 학습한 내용을 적을 예정이라 얼마나 걸릴지 확인겸 시간도 적어 봅니다. 교수자가 없을 경우 프로그램을 어느정도는 알지만 파이썬과 인공지능관련해서는 직접 핸들링 안해본 상황에서 얼마나 걸리는지 측정하기 위함입니다. 단 AI연동 시스템을 여러차례 웹서비스로 개발한 사람이라 완전 문외한으로 보기도 어려우니 참고해주세요. 나름 관심있어서 연동하는 내용은 어느정도 알고 있는 상황입니다.
시작하기 앞서 변인이 될만한 사전학습된 내용을 간단히 기록해 보았습니다.
우선 이전에 고민하면서 자료를 적은 분들의 글들을 참고해서 기본지식을 쌓아봅시다.
YOLO 논문 리뷰: You Only Look Once: Unified, Real-Time Object Detection
안녕하세요 공돌준입니다. 오늘은 컴공이면 모두가 한 번쯤 들어봤을 YOLO 논문을 리뷰 해보도록 하겠습니다.
medium.com
YOLO란 무엇인가?

Object Detection에는 두 가지 방식이 존재합니다. Image Classification과 Localization을 구분 짓는 Two-stage Detector와 두 과정을 구분 짓지 않는 One-stage Detector가 있습니다. Two-stage Detector는 성능이 뛰어나지만, 속도가 느리다는 단점이 있습니다. 대표적인 모델로 Faster R-CNN이 있는데, 실행 속도가 5FPS입니다. 반면 YOLO는 성능이 떨어지지 않지만, 속도가 빠르다는 장점을 갖고 있습니다. 한 번만 봐도 된다는 의미의 You Only Look Once에서 YOLO라는 이름이 나오게 되었습니다.
장점 3가지
1. 빠른 처리 속도
2. 전체 이미지 검토를 통한 정확성
3. 객체의 Generalizable Representation을 학습
객체 탐지에 있어 'yOLO' 알고리즘을 주목해야 하는 이유
https://fastcampus.co.kr/pages/31530
객체 탐지에 있어 'YOLO' 알고리즘을 주목해야 하는 이유 | 패스트캠퍼스
블로거 <Daddy makers>가 말하는 YOLO 모델을 주목해야하는 이유에 대해 알아보세요!
fastcampus.co.kr
해당 알고리즘에 대한 고민들과 현직강사님의 의견을 들을 수 있는 글입니다. (am11:30)
업무처리로 왔다갔다 오늘도 바쁘게 시작하네요...오전 일과를 하면서 무언가 배운다는 것이 어려운 현실이라 기록으로 남겨봅니다. 노력하는 직장인 여러분 부자되세요.
--- 계속 작성중....
다시 시작.. 시간 타임으로 문서 작성 도전을 하는 것이 오랜만이네요.
대략적인 yolo에 대한 사용처와 왜 필요한지 어떤 알고리즘기반인지 알아봤으니 이제 설치를 해볼까 합니다.
YOLO v8 설치
pip --version
pip install ultralytics
사전조건 : anaconda 설치 후 Anaconda Prompt 창에서 설치
2024.07.03 - [프로그램/python] - 아나콘다(Anaconda) 설치 (window, 2024.07.03)
https://docs.ultralytics.com/ko
홈
발견하다 Ultralytics YOLOv8 - 최신 실시간 물체 감지 및 이미지 분할. 그 기능을 배우고 프로젝트에서 잠재력을 극대화하십시오.
docs.ultralytics.com
yolo v8 관련해서 필요 한 것들을 같이 설치해준다고 합니다.


----- 작성중... 공식 페이지 공부좀 하고 와야 겠네요.
오 공식 사이트에 참고할 만한 내용이 나와있네요.
>pip install ultralytics
......
>python
>>> import ultralytics
>>> import torch
>>> torch.cuda.is_available()
True
>>>
PyTorch에 대해서도 나오네요.
PyTorch 란
https://www.ibm.com/kr-ko/topics/pytorch
PyTorch란 무엇인가요? | IBM
PyTorch는 신경망을 구축하기 위한 소프트웨어 기반 오픈 소스 딥 러닝 프레임워크로, Torch 머신 러닝 라이브러리와 Python 기반 API를 결합한 것입니다.
www.ibm.com
신경망 구축에 사용되는 소프트웨어 기반 오픈 소스 딥러닝 프레임워크로, Torch의 모신 러닝 라이브러리와 Python 기반의 고급 API를 결합한 것입니다.
머신 러닝 프레임 워크!!
IBM 페이지에 검색된 이유는 2023년에 PyTorch Foundation의 프리미어 멤버가 되어서 나온것 같습니다.(2024.7)
--- 용어가 나와서 용어 정리 하고 오겠습니다.
--- 업무하면서 정리는 어렵네요... 오늘은 여기까지... 모르는 영역을 다시 도전하는 분들을 응원합니다.
설치 이후에 일단 필기체 알고리즘 프로그램 검색, 이미지 라벨링 관련해서 진행하면 될것 같네요.(2024.07.08 12:25 다시 시작...)
그다음 학습데이터 검색 모델데이터 ...
그동안 알게된 지식 기반으로 표면적인 내용을 다시 정리하면 다음과 같다.
1. 인식 알고리즘( 학습을 위해서는 특정하나의 알고리즘을 선택 )
2. 예제 학습 모델링 이미지와 라벨링 정보
3. 학습 데이터를 적용한 모듈
4. 테스트 자연어 문자 이미지 - 테스트 적용 결과 값
5. 추후 필요내용 - 신뢰성을 올리기 위해 충분한 학습데이터 확보. 비교 알고리즘과 테스트 후 결과 비교,
이렇게 될것 같고 추후 일정을 제외하고 알고리즘 정해서 학습하고 테스트 하는 부분까지 한 싸이클을 돌려보면 될것 같습니다.
--- 알고리즘 검색... google, git( 2024.07.08.13:26)
ocr 학습경쟁 대상 tesseract ( google ocr )
결국 학습 결과 만들어지는 것은 ocr 프로그램인데 비슷한 정도의 결과가 안나온다면 테스트 경험만 얻는데 목표를 가지면 되는 상황입니다.
https://github.com/UB-Mannheim/tesseract/wiki
Home
Tesseract Open Source OCR Engine (main repository) - UB-Mannheim/tesseract
github.com
최종 만들어진 프로그램 다운로드해서 선행학습으로 문자인식 경험해보기.
tesseract-ocr-w64-setup-5.4.0.20240606.exe 다운받아 설치하면서 언어 모델 체크(영어만 기본이라 한글을 하기 위해 추가선택이 필요함)
파이썬용 테세렉트 설치
!pip install pytesseract
import pytesseract
from PIL import Image
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = 'utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = 'utf-8')
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
a = Image.open('testbill.JPG')
result = pytesseract.image_to_string(a,lang='kor')
print(result)
## 각 줄에 어느 정도의 인식율을 보여주지만 오입력 글자를 찾아서 처리하기에는 많은 수고가 있어 보입니다.
## 2024.06.06 업데이트 기준이라 아직 한글OCR 관련해서는 글자인식율 좋은 것은 상업성이 있어 보입니다.
오픈cv를 사용한 바코드 리드
openCV => 카메라 연동
import cv2
import pyzbar.pyzbar as pyzbar
font = cv2.FONT_HERSHEY_SIMPLEX
# 바코드 인식 및 테두리 설정
def read_frame(frame):
try:
# 바코드 정보 decoding
barcodes = pyzbar.decode(frame)
# 바코드 정보가 여러개 이기 때문에 하나씩 해석
for barcode in barcodes:
# 바코드 rect정보
x, y, w, h = barcode.rect
# 바코드 데이터 디코딩
barcode_info = barcode.data.decode('utf-8')
# 인식한 바코드 사각형 표시
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
# 인식한 바코드 사각형 위에 글자 삽입
cv2.putText(frame, barcode_info, (x , y - 20), font, 0.5, (0, 0, 255), 1)
return frame
except Exception as e:
print(e)
def main():
try:
# 동영상 불러오기
cap = cv2.VideoCapture(0)
# 동영상 연결 되었는지 확인 및 영상 재생
while cap.isOpened():
# 실행 내역 및 프레임 가져오기
ret, frame = cap.read()
# 실행 내역이 true이면 프레임 출력
if ret:
# 바코드 인식
frame = read_frame(frame)
# 프레임 출력
cv2.imshow("barcode reader", frame)
if cv2.waitKey(1) == 27:
break
else:
print("예외")
break
except Exception as e:
print(e)
finally:
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
main()
흠음... 결국 내가 목표한 것은 캠을 통해 입력된 비디오이미지에 yolov8를 통해 글자를 실시간 인식해서 필기체 글자 인식이었네요. 옆으로 많이 가고 있는데 다시 yolov8 객체 인식과 문자인식의 문제는 일단 접고 yolov8에서 인식되는 것부터 해봐야 겠네요.
(2024.07.11 17:20)yolo를 사용하기 위해서는 실행할 딥러닝 프레임워크가 필요한데 내가 선택한 OpenCV가 ... 이건 테스트 성공 이후에 더 자세히 공부해 보고...
https://panggu15.github.io/detection/%EA%B0%84%EB%8B%A8%ED%95%9C-YOLO-%EA%B5%AC%ED%98%84(OpenCV)/
간단한 YOLO 구현(OpenCV)
panggu15.github.io
- Darknet : YOLO 개발자가 만든 프레임워크. YOLO를 위해 특별히 제작되었다.
단점 : 리눅스에서만 호환…
장점 : 빠르다. GPU또는 CPU와 함께 사용가능 - Darkflow : Darknet을 텐서플로우에 적용한것
단점 : 설치 복잡
장점 : 빠르고 GPU 또는 CPU와 함께 사용 가능하고 리눅스, 윈도우, 맥에서 호환 - OpenCV : 최소 3.4.2버전 필요
단점 : CPU에서만 작동하기 때문에 비디오를 실시간으로 처리하는 데 속도가 빠르진 않다
장점 : openCV외에 설치할 것이 없다
OpenCV DNN YOLO
알고리즘을 실행하기 위해서 3개의 파일이 필요하고 참고 사이트는 v3이라 v10관련 자료를 찾아야 테스트가 가능할 것 같네요. 아직 데이터셋과 모델 학습 등 접근 전인 관계로...
- Weight file : 훈련된 model
- Cfg file : 구성파일. 알고리즘에 관한 모든 설정이 있다.
- Name files : 알고리즘이 감지할 수 있는 객체의 이름을 포함한다.
ㅡ.ㅡ;;; 용어가 또 나왔네요... (2024.07.11 17:41) 용어공부하러...갑니다.
OpenCV YOLOv10
오늘도 새로운 마음으로 업무를 2024.7.15 14:00 까지 진행하고... opencv, yolo 사용법을 다시 정리시작합니다.
회의 갔다와서 얼마 못한거 같은데 시간이 벌써 6시가 넘어 가네요.
그래도 OpenCV YOLOv10으로 일단 기본 디텍팅 표시까지 테스트 완료했네요.( 6시15분 불필요 코드 제거 및 정리 )
# 바코드와 객체 검출까지
import cv2
import pyzbar.pyzbar as pyzbar
from ultralytics import YOLO
font = cv2.FONT_HERSHEY_SIMPLEX
# Load a pre-trained YOLOv10n model
model = YOLO("yolov10l.pt")
# 바코드 인식 및 테두리 설정
def read_frame(frame):
try:
# 바코드 정보 decoding
barcodes = pyzbar.decode(frame)
# 바코드 정보가 여러개 이기 때문에 하나씩 해석
for barcode in barcodes:
# 바코드 rect정보
x, y, w, h = barcode.rect
# 바코드 데이터 디코딩
barcode_info = barcode.data.decode('utf-8')
# 인식한 바코드 사각형 표시
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
# 인식한 바코드 사각형 위에 글자 삽입
cv2.putText(frame, barcode_info, (x , y - 20), font, 0.5, (0, 0, 255), 1)
return frame
except Exception as e:
print(e)
def predict(chosen_model, img, classes=[], conf=0.5):
if classes:
results = chosen_model.predict(img, classes=classes, conf=conf)
else:
results = chosen_model.predict(img, conf=conf)
return results
def predict_and_detect(chosen_model, img, classes=[], conf=0.5, rectangle_thickness=2, text_thickness=1):
results = predict(chosen_model, img, classes, conf=conf)
for result in results:
for box in result.boxes:
cv2.rectangle(img, (int(box.xyxy[0][0]), int(box.xyxy[0][1])),
(int(box.xyxy[0][2]), int(box.xyxy[0][3])), (255, 0, 0), rectangle_thickness)
cv2.putText(img, f"{result.names[int(box.cls[0])]}",
(int(box.xyxy[0][0]), int(box.xyxy[0][1]) - 10),
cv2.FONT_HERSHEY_PLAIN, 1, (255, 0, 0), text_thickness)
return img, results
# 객체 인식 및 테두리 설정
def read_detect_yolov10(frame):
try:
# 객체 detect
result_img, _ = predict_and_detect(model, frame, classes=[], conf=0.5)
return result_img
except Exception as e:
print(e)
def main():
try:
# 동영상 불러오기
cap = cv2.VideoCapture(0)
print("try start")
# 동영상 연결 되었는지 확인 및 영상 재생
while cap.isOpened():
# 실행 내역 및 프레임 가져오기
ret, frame = cap.read()
# 실행 내역이 true이면 프레임 출력
if ret:
# 바코드 인식
frame = read_frame(frame)
frame2 = read_detect_yolov10(frame)
# 프레임 출력
cv2.imshow("test view", frame2)
if cv2.waitKey(1) == 27:
break
else:
print("예외")
break
except Exception as e:
print(e)
finally:
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
main()
자 이제 출판 문자 인식 관련해서 적용하고, 그 다음 필기체로... 아직 가야 할 길이 멀게 느껴지네요
'프로그램 > python&&AI' 카테고리의 다른 글
기계학습 개발 환경 (1) | 2024.07.10 |
---|---|
용어 정리_yolo학습시작부터(2024.07.05~ 진행중) (0) | 2024.07.05 |
아나콘다(Anaconda) 설치 (window, 2024.07.03) (1) | 2024.07.03 |
Django 웹 프레임 워크 간단 설명 (0) | 2023.05.10 |
django 로컬 개발 서버 알아보기(2023.05) (1) | 2023.05.10 |