분류 전체보기 (55) 썸네일형 리스트형 7.c# 에서 탐지 위와 같이 새프로젝트를 만들고 픽처박스 하나와 버튼을 하나 추가한다. Nuget 패키지 관리에 들어간다. 찾아보기에서 onnxruntime 으로 검색하면 위와 같이 나오는데 그중 onnxruntime 과 onnxruntime.extensions 를 설치한다. System.Drawing.common 도 검색해서 설치한다. using System;using System.Collections.Generic;using System.Drawing;using System.IO;using System.Linq;using System.Windows.Forms;using Microsoft.ML.OnnxRuntime;using Microsoft.ML.OnnxRuntime.Tensors;namespace onn.. 6.ONNX 모델 검증 파이썬에서 위와 같이 입력해서 output 값을 확인하자.import onnxruntimeimport numpy as np# ONNX 모델 로드onnx_model_path = "C:/Users/L/runs/detect/train/weights/best.onnx"session = onnxruntime.InferenceSession(onnx_model_path)# 입력 이름 확인input_name = session.get_inputs()[0].nameprint(f"Input name: {input_name}")# 출력 이름 확인output_names = [output.name for output in session.get_outputs()]print(f"Output names: {output_names}").. 5. ONNX 파일로 변환 https://docs.ultralytics.com/ko/integrations/onnx/#usage pt 파일을 onnx 파일로 변경하기 위해 위와 같이 작업을 진행한다.참고로 위와 같이 경로를 역슬래시를 쓸경우 오류가 나는데 역슬래시를 슬래시로 바꾸면 된다.---------------------------------------------------------------------------------------from ultralytics import YOLOmodel = YOLO("C:/Users/L/runs/detect/train/weights/best.pt")model.export(format="onnx", opset=12)----------------------------------.. 4. labelimg 설치및 사용법 https://github.com/HumanSignal/labelImg GitHub - HumanSignal/labelImg: LabelImg is now part of the Label Studio community. The popular image annotation tool created byLabelImg is now part of the Label Studio community. The popular image annotation tool created by Tzutalin is no longer actively being developed, but you can check out Label Studio, the open source ...github.com위 경로로 들어가자. 우측하단의.. 3.YOLO11 모델로 학습 데이터를 학습하기 위해 어떤 대상을 찾아낼지 먼저 선정한다.개인적으로 강아지를 찾아내기위해 강아지 사진을 백여장 수집했다.학습할때 내부적으로 자동으로 리사이징 하기 때문에 학습할 이미지의 크기나 비율은 통일할 필요는 없고 너무 과도하게 크지만 않으면 된다(GPU 메모리 이내).이미지 사이즈를 640x640 으로 통일하면 학습속도는 약간더 빠를수있지만 만들어진 모델을 사용할때 속도는 동일하다. 이미지를 학습할때 이미지 전체를 학습하는게 아닌 위 이미지와 같이 빡간네모박스 표시한 부분만 학습할 예정이다.위와 같이 전체이미지의 일부분만 학습하던지 아니면 이미지 전체를 학습한다해도 욜로로 학습시 이미지의 어느 위치에 어느정도 크기를 학습할지 내용을 전달해줄 텍스트파일이 필요하다. 위와 같은경우 txt .. 2. ultralytics 설치 파이썬을 설치한뒤에 위와 같이 cmd 창에서 pip install ultralytics 을 입력해서 ultralytics 을 설치하자. 설치된뒤 cmd 창에서 위와같이 입력해서 제대로 설치됐는지 확인할수 있다.python from ultralytics import YOLOimport ultralyticsprint("Ultralytics YOLO version:", ultralytics.__version__) 파이썬을 실행해서 위와 같이 한줄씩 입력한뒤 Ultralytics YOLO version: 8.3.59이런내용이 나오면 정상적으로 설치된것이다.exit()로 종료하면 다시 cm 창으로 나갈수 있다. 1. 파이썬 설치 https://www.python.org/ Welcome to Python.orgThe official home of the Python Programming Languagewww.python.org인터넷에서 파이썬을 검색해서 공식 홈페이지로 들어간다. 메인 페이지에 다운로드가 있는데 다운로드 해서 파일을 받자.위와 같이 다운로드에 마우스를 올리면 창이 열리면서 받을수 있는 창이 뜨는데 Python. 3.13.1 되있는 버튼을 클릭해서 다운로드 하자. 위와 같이 다운 받아진 파일을 실행한다. 아래 항목두가지 다 체크하고 위쪽 Install Now 를 클릭하자. 위와 같이 완료되면 파이썬 설치가 완료 된 상태다. cmd 창에서 위와 같이 입력해서 버전이 정상적으로 출력 되는지 확인.. Yolo11 을 c# 에서 사용해보기 위한 내용정리 1. 파이썬 설치 - https://studypoland.tistory.com/532. ultralytics 설치 - https://studypoland.tistory.com/543. YOLO11 모델로 학습 - https://studypoland.tistory.com/554. labelimg 설치및 사용법 - https://studypoland.tistory.com/565. ONNX 파일로 변환 - https://studypoland.tistory.com/576. ONNX 모델 검증 - https://studypoland.tistory.com/587. C# 에서 탐지 - https://studypoland.tistory.com/598.USB 카메라 (UVC 지원) 테스트 - 보류 테스트에서 사용한 이미.. 47. 유즈케이스 모든 프로그램을 만들때는 과정이 단순하지는 않다. 보통 어떤 동작을 해야하는지 파악하고 해당 동작에 대해 이상없이 작동할수 있게 정리한후 해당 프로그램을 제작한다. 최종적으로 같은동작을 하더라도 사람마다 충분히 다르게 생각할수 있고 다른형태로 구성할수 있다. 그리고 같은사람이 같은 행동을 하는 프로그램을 만들더라도 매번 다른형태로 만들수도 있다. 프로그램이 간단해서 잠깐의 시간동안 제작가능한거라면 위의 생각하는 전체 과정을 머리속에 생각하면서 할수 있을것이다. 그런데 만약 프로그램이 하루만에 불가능하고 오래 걸린다면 내 머리속의 전체 과정을 계속 같은형태로 유지할수 있을까? 물론 다 기억할수도 있겠지만 간단하게 기록해두거나 하면 그 기록을 보면서 제작의 일관성을 높일수도 있고 생각하지못해 빠뜨린부분도 체.. 46. 엑셀파일읽기 ***숙제 : 위그림처럼 엑셀파일경로를 지정해서 내용을 읽어오는 프로그램을 만들어보자. 45. 파일읽기/쓰기 파일을 읽고 쓸려면 File 클래스를 사용하면 된다. https://docs.microsoft.com/ko-kr/dotnet/api/system.io.file?view=net-5.0 File 클래스 (System.IO) 단일 파일에 대한 만들기, 복사, 삭제, 이동 및 열기를 위한 정적 메서드를 제공하고 FileStream 개체 만들기를 지원합니다.Provides static methods for the creation, copying, deletion, moving, and opening of a single file docs.microsoft.com 기본적인 내용은 위 경로를 읽어보자. 파일이나 DB 또는 네트워크로 데이터를 전송할때 대부분의 경우 내용을 변환해서 서로 주고 받게 되는데 이과정에서 데.. 44. 로또생성기만들기 ***숙제 : 위그림처럼 번호받기 누르면 번호와 보너스 번호가 출력되는 로또생성기를 만들어보자. 43. 제네릭 제네릭은 한마디로 이야기하면 배열을 어떤형식으로 사용할지 미리 정해주는것이다. 프로그램에서 형변환은 자원을 많이 먹는 작업이다. 예를 들면 int > object > int 로 형변환을 차례로 한다고 치면 상당히 쓸모없는작업이 많아진다. 이전에 잠시 설명했지만 arrayList 에 인자를 추가하면 어떤값이든 object 로 변환해서 들어가진다. 그상태에서 사용할때는 해당형식으로 또 변환을 해줘야한다. 특별한 근거없이 생각해봐도 아무 쓸모없는행동이 많아진다. 가장기본적인 형식중 하나인 List 예제를 보자. List 변수 = new List(); 위와같이 지정하고 쓰기만 하면된다. 타입에는 내가 해당 List 에서 사용할 실제 타입을 넣어주면 된다. 예를들면 int , string, 개인이 만든클래스 , .. 42. 상속 상속은 쉽게 생각하면 진짜 말그대로의 의미이다. 부모클래스를 그대로 받아온다. 간단히 몇가지 형태를 알아보자. 그림1에 몇가지 기본형태에 대한 예제를 올려놨다. 일단 parent_class0 과 chile_class0 은 완전히 서로 다른 클래스이다. 다만 상속을 받아서 편의상 부모클래스와 자식 클래스라고 불렀으니 해당 단어에 너무 집착하지는 말고 예제를 보자. 기본적으로 생각하면 child_class0 은 parent_class0 을 상속 받았으니 자식클래스인 child_class0 에서는 부모클래스인 parent_class0 의 모든메서드(함수)를 사용가능하다. 위 내용을 기본으로 load 에서 객체로 만든 한줄씩 살펴보자. (load 는 프로그램이 시작되자마자 실행됨을뜻한다. 디자이너에 있는 For.. 41.arraylist / List / StringBuilder / 참조추가법 이제까지 배운내에서 배열은 꼭 필요하지만 상당히 불편한 존재였다. 아니 다른걸 배우지 않으면 불편하다고 느끼지 못했을지도 모르겠다. 기존의 배열은 항상 길이를 정해두거나 초기화 할때 값을 넣어줘야했다. 그런데 만약 값이 몇개가 들어갈지 모르는 상황이 온다면 어떻게 해야할까? 당연히 프로그램을 하다보면 그런상황이 수도없이 발생한다. 예를 들면 소수(1과 자신만을 약수로 가지는수) 의 개수를 1000이내에서 구하는 배열을 만들려면 길이를 몇개로 해야할까? 외우고 있는 사람아니면 보통사람은 알수 없다. 그래서 동적으로 할당할수 있는 배열이 있다. 다음예제를 보자. ArrayList myAL = new ArrayList(); myAL.Add("Hello"); myAL.Add(1); myAL.Add(false);.. 40.using/garbage collection 우리가 클래스 객체를 생성할때 new 를 사용하여 객체를 생성했다. 그런데 객체를 계속 생성하기만 하면 어떻게 될까 라고 생각해볼수 있다. pc의 메모리는 유한하기때문에 계속객체를 생성하기만 하면 메모리에 수많은 객체가 올라갈것이고 결국 피씨는 다운되거나 제기능을 할수 없을것이다. 그래서 c# 이나 자바에서는 가비지 컬렉션이라는 기능이 있다. 쉽게 생각하면 자동으로 사용하지않는객체를 없애주고 메모리를 청소해주는 기능이라고 생각하면된다. 이 가비지 컬렉션에 대해서는 인터넷에 찾아보면 다양한 의견들이 있고 이야기가 있는데 전체적으로 보면 임의로 호출하는데 상당히 부정적인것을 알수 있다. 결국 알아서 잘하니 임의로 가비지 컬렉션을 하지말고 놔두면 프로그램에 가장좋다고들 이야기한다. 그런데 개인적으로 얼마전 어.. 39.property(속성) 클래스의 맴버필드값을 직접적으로 접속해서 값을 바꾸고 값을 가져오고 하는 행위를 대신해주는 속성이라는것이 있다. 보통 클래스를 만들면 클래스의 맴버필드값에 따라 어떤 행위를 할지 정해주는 경우가 많은데 그렇게 하다보면 실수가 발생할수 있다. 아래 예제를 보자. 그림1과 같은 코드의 경우에 _dclass 의 _classcreatetime 값을 마음대로 변경해서 출력해버렸다. 최초 클래스 작성자의 의도는 그것이 아니었을텐데 이런경우 잘못된 행동을 한다고 할수 있다. 이런경우 그림2처럼 맴버필드는 private 으로 변경하고 속성은 get 만 놔둔다면 위와같은 문제는 발생하지 않을것이다. 이렇게 맴버필드를 숨기는걸 은닉화한다고 한다. 위와같은경우 속성대신 함수를 사용해도 충분히 같은 역할을 할수 있다. 나는 .. 38.const/enum/struct 여러값을 하나의 형태로 묶어서 사용하고 싶을때 사용할수 있는 enum 이라는 것이 있다. msdn에 찾아보면 다음과 같이 정의 되어있다. 열거형 형식은 명명 된 상수 집합을 선언 하는 고유한 값 형식 (값 형식)입니다. 상수는 우리가 배우지 않았는데 변수의 반대개념이라고 생각하면 된다. 한번 정의해 놓고 프로그램내에서 계속 사용할때 해당값을 변수에 담지 않고 상수로 선언해주고 사용할수 있다. 그림1에서 보면 상수와 변수의 차이를 알수 있다. c# 에서는 상수를 사용할때 const 나 readonly 를 사용할수 있는데 const는 컴파일 타임상수 이고 readonly 는 런타임 상수이다. 즉 const 는 처음 빌드할때 만들어져서 값이 변하지 않는채로 고정되고 고정할수도 없다. member_name1 을.. 37.DateTime,static 프로그램을 만들면서 상당히 자주 사용되는 형식과 컨트롤등을 몇가지 알아보고 넘어가자. DateTime 는 날짜 형식인데, 일반적인 변수처럼 사용하면 된다. 단, DateTime 은 클래스이기때문에 new 로 객체를 생성해서 사용해야한다. DateTime 변수를 하나 만들고 우클릭으로 정의로 이동해서 내용을 살펴보자. 내부에 들어가보면 수많은 생성자와 함수들이 있다. 그런데 함수중에 보면 static 이 붙은 함수들이 있다. 이함수들은 객체화 시키지 않아도 사용할수 있다는 의미이다. 그림1처럼 dt 라는 새로운 변수를 지정하고 new 로 새로운 객체를 만들었다. 그리고 dt.AddDays(10); 를 해주면 dt 의 기본값에 10일을 더해주게 된다. 이런형태가 기본적인 클래스를 객체로 만들고 객체에 속해있.. 36.클래스(전역변수/지역변수), 실제사용법 클래스로 들어오면서 구역개념이 생긴다. 다음예제를 보자. public class testc { private int _num = 10; public int getnum() { return _num; } public void addnum(int num) { int n = _num; n += num; _num = n; } public void multyplenum(int num) { int n = _num; n *= num; _num = n; } } 참고로 일부러 쓸데없는 코드들이 추가 되있다. 위 클래스에서 addnum 메서드(=함수)를 보자. num 을 파라미터(=매개변수=인자) 로 받고 함수내부에 n 을 정의하고 더해줬다. 그리고 _num 인 필드에는 파라미터로 받은 num 을 더해줬다. 그리고 밑에 .. 35.클래스(생성자오버로딩) 생성자는 오버로딩도 가능하다. 글자만 보면 무슨말이지 할수도 있다. 둘다 앞에서 각각 배운개념이다. 다시 우리가 계속 사용하던 MessageBox 를 살펴보자. 그림1을 보면 이제 이해가 좀 될것이다. MessageBox 라는 클래스 였던것이다. 이클래스는 닷넷프레임워크 내에 미리 만들어져있다. 그리고 Show 함수는 앞에도 이야기 했지만 여러형태로 사용할 수 있게 오버로딩이 되어있다. MessageBox 에서 마우스 우클릭하면 위와 같이 나오는데 정의로 이동을 눌러보자. 모든클래스에서(내가 직접만든 클래스도) 우클릭으로 정의로 이동하여 찾아갈수 있다. 정의로 이동해서 옴겨가면 그림3과 같은 화면이 나온다. 왼쪽에 + 누르면 펼쳐지는데 한번씩 열어서 읽어보자. 제일위에 어셈블리는 실제 물리적인 파일을 의.. 34.클래스(생성자,소멸자) 앞에서 은근히 계속 이야기하던 클래스라는것에 대해서 배워보자. 클래스는 쉽게 말하면 함수들을 모아놓은것이다. 앞에 그림에서도 이야기했지만 네임스페이스 ᑐ 클래스 ᑐ 함수 로 생각하면 된다. 함수에 비해서 클래스는 범위도 넓고 더 많은 내용을 가질수 있다. 뿐만아니라 아예 파일을 분리하는것도 가능하다. 그리고 클래스는 앞에서 말하던 하나의 객체로 만들수 있다. 기본적인 클래스의 형태는 대체로 다음과 같다. 참고로 메서드 = 함수 이다. class 클래스명 { 필드 메서드() { } } 위에서 필드라고 했는데 필드 = 변수 라고 생각하면된다. 필드가 없을수도 있고 메서드가 없을수도 있다. 심지어 둘다 아무것도 없이 만들수도 있다.(당연히 아무의미 없겠지만) 클래스는 객체로 만들수 있는데 객체로 만들때는 ne.. 33.갑자기실습 우리 프로그램에 프레임이 9개가 있다. 그런데 각 사용자가 제외할 프레임만 입력하면 그프레임이 작동하지 않게 하고 싶다. 당연히 사용자는 어떤 프레임을 제외하고 싶은지 알수없다. 텍스트박스에 사용자가 제외할 프레임을 이어서 작성하면 제외될 프레임이 순서대로 출력되게 만들자. 프레임은 9개다. ex) 사용자가 텍스트박스에 4825 입력하면 2,4,5,8 이 팝업창에 떠야함. ex) 사용자가 텍스트박스에 9,4 입력하면 4,9 이 팝업창에 떠야함. ex) 사용자가 텍스트박스에 a428 입력하면 2,4,8 이 팝업창에 떠야함. hint) 0 ~ 9 까지만 정렬하면 된다. ***숙제 : 위에 설명한 프로그램 만들기가 숙제. 32.인텔리센스/오버로딩 인텔리센스는 프로그램을 편하게 할수있게 해주는 가이드이다. 비주얼스튜디오 에서 제공하는 내용으로 이클립스에서도 비슷한 기능이 있다. 우리는 메세지 출력할때 MessageBox 를 입력하고 . 을 누르면 Show 라는 함수를 쉽게 쓸수있고 파라미터로 어떤값을 넣어줘야하는지도 나온다. 만약 우리가 비주얼스튜디오가 아닌 메모장에서 해당코드들을 직접입력하면 저런도움을 받을수 없다. 내가 아는 한도내에서는 비쥬얼스튜디오처럼 인텔리센스 기능이 잘되있는 툴은 없다. 우리가 계속 사용하고 있는 MessageBox 기준으로 알아보자. MessageBox 를 코딩하고 . 을 찍으면 MessageBox 에 있는 사용가능한 것들이 나온다. MessageBox 라는 클래스에 속하는 함수들인데 그중 우리는 Show 를 선택해서 .. 31.업데이트내역 프로그램만들기 / splite string 에는 여러가지 사용가능한 함수들이 있다.(string 은 클래스다.) 그중 splite 함수는 상당히 자주쓰이는데 문자를 특정기준으로 잘라서 배열로 만들때 사용한다. 아래 예제를 보자. 그림1은 str string 을 , 기준으로 나눠서 변수에 담는다는 의미이다. 그러면 strarray 에는 [0] 번에는 "가" , [1] 번에는 "나" 이런식으로 "사" 까지 글자가 자동으로 잘라져서 들어간다. 위 예제에서는 , 기준으로 잘라서 그렇게 들어가는것이고 만약 str.Split('다') 라고 했다면 어떻게 잘라질지 확인해보자.(숙제) ***숙제 : 위 그림처럼 "업데이트함" 버튼을 누르면 업데이트할 호기중 해당 호기가 빠진 나머지 업데이트할 호기가 남은 업데이트 호기에 보이게 프로그램을 만들어보자.. 30.함수2 함수에 대한 기본적인 내용은 앞장들에서 다 설명한거같다. 참고로 함수 = 메서드 라고도 부른다. 다시 내용을 상기시켜보면 함수의 기본형식은 다음과 같다. 함수명() { 작업할내용 } ( ) 괄호가 특정이름뒤에 붙어있으면 함수이고 최소 단위라고 생각하면 된다. 당연한 말이지만 한 클래스 내에는 여러개의 함수가 존재할 수 있다. 물론 한 네임스페이스 내에 여러개의 클래스도 존재할 수 있다. 함수에서 받는 파라미터는 몇가지 형태가 있다. 가장기본적인 형태는 다음과같다. 함수명(형식 변수명) { 작업할 내용 } 예제는 다음과 같다. public string testf(string str) { return $"{str} 을 리턴함"; } 위 예제는 이제 다 이해할수 있을거라 생각한다. 그림1 과 같은 예제가 있다.. 29.접근제한자, 네임스페이스 , 클래스 프로그램을 하면 혼자 다하는게 아니라 여러사람이 함께 하게 된다. 그런데 한명이 작업중에 다른사람이 같이 작업하는건 상당히 난감한일이 된다. 같은 부분을 어떤사람은 이렇게 만들고 다른사람은 다르게 만들수도있다. 그래서 함수만으로는 분업이 힘들거라 생각한 똑똑한 사람들이 그 윗단계로 나눌수 있는 덩어리들도 만들어뒀다. 그게 클래스이다. 자세한 내용은 나중에 다시 하고 함수처럼 특정행동을 할수 있는 더 큰 단위로 클래스가 있다 라고만 알고 넘어가자. 네임스페이스 역시 같은 의미이다. 네임스페이스는 자바에서는 패키지라고부르고 사용한다. 별로 어렵게 생각할거없이 그림1과 같은 구조이다. 주의 할점은 상위그룹내에 하위 그룹의 명칭은 유일해야한다는 것이다. aa 라는 클래스가 있다면 그내부에 bb() 라는 함수가 .. 28.함수1 프로그램에서 거의 모든 기본 개념은 함수에서 출발한다. 함수는 특정행동을 하는 내용을 모아놓은 덩어리라고 생각하면 된다. 우리가 이때까지 만들던 프로그램은 버튼클릭했을때 작동하게 만들었다. 만약 버튼이 여러개 있는데 다 똑같은 동작을해야할때 어떻게 해야할까? 물론 버튼마다 다 실행되야하는 내용을 적어주면 된다. 그런데 너무 소스가 길어지고 만들어야할게 많다. 비슷한동작이나 같은동작을 할경우는 해당 내용을 한군데 적어놓고 그거 실행하라고 하면 더 편할것이다. 함수의 기본형식은 다음과 같다. 함수명() { 실행할내용 } 언어에 따라 아래와같이 함수명 앞에 function 을 붙여 주는 언어도 있다. function 함수명() { 실행할내용 } c#이나 자바같은경우는 위 기본형식외에 추가적으로 몇가지 내용을 .. 27.Object 나도 잘하지않지만 모르는게 나오면 msdn 을 찾아보면 좋다. 전체적인 내용이 잘나와있는데 사실 풀어쓴 사람들의 블로그같은 글이 보기 더좋지 사전같은 msdn 은 찾아보기 힘들긴하다. docs.microsoft.com/ko-kr/dotnet/api/system.object.-ctor?view=net-5.0#System_Object__ctor Object 생성자 (System) Object 클래스의 새 인스턴스를 초기화합니다.Initializes a new instance of the Object class. docs.microsoft.com docs.microsoft.com/ko-kr/dotnet/api/system.string?view=net-5.0 String 클래스 (System) 텍스트를 UTF-.. 26.구구단출력기 만들기 ***숙제 : 그림1과 같은 프로그램을 만들어보자. 버튼을 누르면 결과값이 나와야한다. 이전 1 2 다음