컴퓨터 비전 프로젝트
소개
이 저장소는 Mehmet와 Jean이 콜로라도 광산대학에서 2020년 가을 학기 동안 수강한 CSCI437 수업 동안 작업한 모든 코딩 프로젝트(랩)를 보여줍니다. 기간은 2020년 8월 28일부터 2020년 12월 14일까지입니다. 이 랩들은 Python, OpenCV 및 기본 컴퓨터 비전 개념을 학습하기 위한 포괄적인 플랫폼을 제공했습니다.
수업 소개
나는 2020년 가을 학기에 컴퓨터 비전 입문 (CSCI437)을 수강했습니다. 이 기간 동안 Dr. William Hoff와 Dr. Tom Williams가 강의를 했습니다. CSCI437. 다음은 CSCI437의 공식 수업 설명입니다:
(I) Computer vision is the process of using computers to acquire images, transform images, and extract symbolic descriptions from images. This course provides an introduction to this field, covering topics in image formation, feature extraction, location estimation, and object recognition. Design ability and hands-on projects will be emphasized, using popular software tools. The course will be of interest both to those who want to learn more about the subject and to those who just want to use computer imaging techniques. Must be Senior level standing. 3 hours lecture; 3 semester hours. Prerequisite: (MATH201 or MATH334 or EENG311),and,MATH332,and,(CSCI200 or CSCI261).
크레딧
일부 Python 스크립트 및/또는 코드 조각들은 강의, 슬라이드 또는 Canvas를 통해 CSCI437 수업에서 제공되었습니다. CSCI437 수업은 콜로라도 광산대학에서 제공되었습니다. 이 랩들은 다음 파트너들과 함께 수행되었습니다:
- Jean Duong
- Mehmet Yilmaz
랩 설명
랩 1
랩 1은 Python과 함께 OpenCV를 사용하는 기초에 중점을 둡니다. 참가자들은 비디오 파일을 읽고, 각 프레임에 정사각형을 형성하는 네 점을 투영하며, 각 점의 Z 좌표를 점진적으로 조정하여 정사각형이 멀어지는 것을 시뮬레이션하는 Python 프로그램을 작성해야 합니다. 또한 각 프레임에 프레임 번호를 표시하고, 그래픽 오버레이가 포함된 최종 비디오를 업로드하여 평가받아야 합니다.
랩 2
랩 2는 이미지 변환을 다루며, 특히 “XYZ 고정각” 관습을 사용한 X, Y 및 Z 축 주변 회전에 중점을 둡니다. 학생들은 회전 행렬을 계산하고, 카메라 자세에 대한 동차 변환 행렬을 계산하며, 보정 행렬을 만들고, OpenCV의 line 함수를 사용하여 점들을 이미지에 투영하여 친숙한 객체를 형성해야 합니다. 이 랩은 컴퓨터 비전에서 카메라 기하학과 변환 행렬에 대한 이해를 강조합니다.
랩 3
랩 3은 템플릿 매칭에 관한 것으로, 학생들은 정규화된 교차 상관을 사용하여 영화 파일의 각 프레임을 통해 템플릿 서브이미지를 추적해야 합니다. 과제는 사용자가 영화의 첫 이미지에서 템플릿을 선택하도록 허용하고, 이후 이미지들에서 이 템플릿을 추적하며, 각 이미지에서 템플릿의 위치를 표시하기 위해 사각형을 그리고, 이러한 위치를 보여주는 출력 영화 파일을 생성하는 것을 포함합니다. 학생들은 어떤 템플릿이 가장 좋은 추적을 허용하는지 및 그 이유를 이해하기 위해 다양한 템플릿으로 실험하고, 일치가 올바르게 식별될 때 관찰되는 상관 점수에 대해 논의하도록 권장됩니다.
랩 4
랩 4는 색상 이미지를 처리하는 데 효과적인 것으로 강의에서 논의된 HSV 색공간을 사용한 색상 분할에 중점을 둡니다. 학생들은 제공된 이미지에서 정지 표지판 픽셀을 분할하기 위해 임계값 연산을 적용하는 Python/OpenCV 프로그램을 작성해야 합니다. 과제는 정지 표지판 픽셀을 가장 잘 감지하는 임계값 값을 찾고, 결과를 정리하기 위해 형태학적 연산을 수행하며, 분할된 이미지와 함께 사용된 임계값 및 형태학적 연산 매개변수와 Python 프로그램을 제출하는 것을 요구합니다.
랩 5
랩 5는 기존 이미지의 특정 영역에 새로운 이미지 텍스처를 삽입하여 투영이 올바르게 보이도록 하는 작업과 관련됩니다. 이 과정은 평면 대체로 알려져 있으며, 학생들은 프로젝트 변환(호모그래피) 기법을 사용하여 새 이미지를 기존 이미지의 평면 영역에 맵핑해야 합니다. 이 랩은 원근법의 정확성을 유지하면서 이미지 내용을 수정하기 위한 호모그래피의 실용적 적용을 강조합니다. 학생들은 원본 이미지, 대체 텍스처가 적용된 이미지, 결합된 이미지 및 Python 프로그램을 랩 제출물로 제출해야 합니다.
랩 6
랩 6은 이미지에서 다섯 개의 대비되는 동심원(CCC)으로 구성된 표적의 검출 및 자세 계산을 학생들에게 지시합니다. 작업은 OpenCV를 사용하여 CCC 표적을 검출하고, 이를 올바르게 정렬하며, OpenCV의 solvePnP() 함수를 사용하여 자세를 계산하고, 이미지에 좌표 축과 자세를 그리는 것을 포함합니다. 이 랩은 표적 검출, 자세 추정 및 시각적 출력 형식화와 같은 개념의 적용을 강조합니다.
랩 7
랩 7은 이미지 간 SIFT 특징 검출 및 매칭에 초점을 맞춥니다. 목표는 한 이미지에서 다른 이미지로의 SIFT 특징의 올바른 매칭을 식별하고 이러한 매칭의 정확도를 분석하는 것입니다. 이 랩은 주어진 Python 코드와 데이터셋의 이미지를 사용하고, 매칭 검출을 최적화하기 위해 알고리즘 매개변수를 조정하며, 특징 매칭 프로세스의 성능을 평가하기 위해 정밀도와 재현율 지표를 계산하는 것을 포함합니다. 학생들은 Python 프로그램과 서로 다른 매개변수 설정에 대한 계산된 정밀도 및 재현율 값을 제출해야 합니다.
랩 8
랩 8은 특징 매칭과 아핀 변환 적합을 사용하여 학습 이미지의 객체를 쿼리 이미지에 검출하고 오버레이하는 객체 검출에 중점을 둡니다. 이 랩은 다양한 시나리오에서 객체를 검출하고, 거짓 양성을 줄이기 위해 내부자(inlier) 매칭의 임계값 수를 조정하며, 객체 검출 시스템의 성능을 평가하기 위해 정밀도, 재현율 및 정확도 지표를 계산하는 것을 포함합니다. 학생들은 제공된 Python 코드를 수정하고 실행하며, 다양한 조건에서 시스템의 성능을 분석하고, 결과 및 수정된 코드를 제출해야 합니다.
랩 9
랩 9은 학습 이미지 내의 객체에 주석 포인트를 배치하고, 이후 쿼리 이미지에서 해당 포인트들을 자동으로 올바르게 표시하도록 하는 작업을 포함합니다. 이 랩은 특징 추출, 모호한 매칭을 제거하기 위한 비율 검정(ratio test)을 사용한 매칭 제거, 이상치를 제거하기 위한 RANSAC을 사용한 2D 아핀 변환 적합, 그리고 학습 이미지에서 쿼리 이미지로 주석 포인트를 맵핑하기 위한 변환 적용을 강조합니다. 핵심 과제는 거짓 양성과 거짓 음성 사이의 균형을 맞추기 위해 내부자 매칭의 임계값 수를 조정하여 이미지를 올바르게 분류하는 데 있어 가장 높은 정확도를 달성하는 것입니다.
랩 10
랩 10은 허프 변환을 사용하여 선분을 찾고 이미지 내에서 평행한 선들의 집합을 식별하는 데 전념합니다. 이는 OpenCV의 cv2.HoughLinesP() 함수를 통한 확률적 허프 변환을 사용하여 끝점으로 표현되는 선분을 검출합니다. 이 랩은 또한 이러한 선분의 방향 벡터를 분석하여 소실점을 식별하는 것을 포함하여, 2D 이미지 평면에 나타나는 3D 공간의 평행선들의 방향을 이해하는 것을 목표로 합니다. 학생들은 테스트 이미지를 처리하여 평행한 선분을 찾고, 검출을 최적화하기 위해 매개변수로 실험하며, 결과와 함께 Python 프로그램을 제출해야 합니다.
참고
- 이 스크립트/랩을 실행하려면 다음 서드파티 파이썬 패키지가 필요합니다: cv2 및 numpy.
- 이들 중 일부 랩은 특정 버전의 cv2를 사용해야 할 수 있습니다. 안타깝게도 요구 사항이 문서화되지 않았으므로 직접 알아내야 할 것입니다. 만약 알아내거나 막힌 부분이 있다면, 이슈 폼에 보고해 주세요.