c++ - 튜토리얼 - 이미지 처리:'코카콜라 캔'인식을위한 알고리즘 개선




www opencv org c (16)

지난 몇 년 동안 제가 해왔 던 가장 흥미로운 프로젝트 중 하나는 이미지 프로세싱 에 관한 프로젝트였습니다. 목표는 코카콜라 '캔' 을 인식 할 수있는 시스템을 개발하는 것이 었습니다. (필자는 '캔'이라는 단어를 강조하고 있습니다. 아래에있는 샘플을 볼 수 있으며, 녹색 사각형 에서 눈금과 회전으로 인식 할 수 있습니다.

프로젝트에 대한 몇 가지 제약 사항 :

  • 배경이 매우 시끄 럽습니다.
  • 규모회전 또는 오리엔테이션을 합리적인 한도 내에서 가질 수 있습니다.
  • 이미지가 어느 정도 퍼지 어질 수 있습니다 (윤곽선이 완전히 직선이 아닐 수도 있음).
  • 이미지에 코카콜라 병이있을 수 있으며 알고리즘은 깡통 만 탐지해야합니다!
  • 이미지의 밝기는 매우 다양 할 수 있으므로 색상 감지에 "너무 많이"의존해서는 안됩니다.
  • 깡통 은 부분적으로 옆이나 중간에 숨어있을 수 있으며 병 뒤에 숨어있을 수도 있습니다.
  • 어떤 경우에도 이미지에 아무 것도 없을 수 있습니다 .이 경우 아무 것도 찾지 말고 메시지를 써야합니다.

그래서 당신은 이것과 같은 까다로운 일들로 끝날 수 있습니다 (이 경우에는 제 알고리즘이 완전히 실패했습니다) :

나는이 프로젝트를 오래 전에 했었고, 그것을하는 데 많은 즐거움을 가지고 있었고, 나는보기 흉한 구현을했다. 내 구현에 대한 몇 가지 세부 사항은 다음과 같습니다.

언어 : C ++에서 OpenCV 라이브러리를 사용합니다.

전처리 : 이미지 전처리, 즉 이미지를보다 원시 형태로 변환하여 알고리즘에 제공하기 위해 두 가지 방법을 사용했습니다.

  1. 색상 도메인을 RGB에서 HSV 변경하고 "빨간색"색조, 오렌지색과 같은 색을 피하기 위해 특정 임계 값보다 높은 채도 및 어두운 톤을 피하기 위해 낮은 값을 필터링하여 필터링합니다. 최종 결과는 이진 흑백 이미지로 모든 흰색 픽셀은이 임계 값과 일치하는 픽셀을 나타냅니다. 분명히 이미지에는 많은 쓰레기가 있지만, 작업해야하는 차원의 수는 줄어 듭니다.
  2. 노이즈를 줄이기 위해 메디 언 필터링 (모든 이웃의 중간 픽셀 값을 가져 와서이 값으로 대체)을 사용하는 노이즈 필터링.
  3. Canny Edge Detection Filter 를 사용하여 2 가지 선례 단계를 거친 후 모든 항목의 윤곽을 가져옵니다.

알고리즘 :이 작업을 위해 선택한 알고리즘 자체는 피쳐 추출에 관한 this 멋진 책에서 가져 와서 일반화 된 Hough 변환 ( 일반 Hough 변환 과는 매우 다른)이라고합니다. 기본적으로 몇 가지 사항이 있습니다.

  • 분석 방정식을 알지 못해도 공간에서 물체를 설명 할 수 있습니다 (여기서는이 경우).
  • 기본적으로 배율 인수와 회전 인수의 모든 조합에 대해 이미지를 테스트하므로 배율 조정 및 회전과 같은 이미지 변형에 강합니다.
  • 알고리즘이 "학습"할 기본 모델 (템플릿)을 사용합니다.
  • 컨투어 이미지에 남아있는 각 픽셀은 모형에서 배운 것을 토대로 객체의 중심 (중력의 관점에서)으로 추정되는 다른 픽셀에 투표합니다.

결국 투표의 히트 맵으로 끝납니다. 예를 들어 캔의 윤곽선의 모든 픽셀이 중력 중심에 투표 할 것이므로 동일한 픽셀에서 많은 수의 투표를 할 것입니다. 센터와 아래의 히트 맵에서 최고점을 볼 수 있습니다 :

이렇게하면 간단한 임계 값 기반 휴리스틱 스는 중심 픽셀의 위치를 ​​제공 할 수 있습니다.이 중심 픽셀에서 스케일 및 회전을 도출하고 그 주위에 작은 사각형을 그릴 수 있습니다 (최종 스케일 및 회전 요소는 분명히 원본 템플릿). 적어도 이론에서는 ...

결과 : 이제이 접근법은 기본적인 경우에 효과가 있었지만 일부 영역에서는 심각하게 부족했습니다.

  • 매우 느립니다 ! 나는 충분히 강조하지 않고있다. 30 개의 테스트 이미지를 처리하는 데 하루가 거의 걸렸습니다. 왜냐하면 일부 캔은 매우 작았 기 때문에 회전 및 변환에 대한 스케일링 계수가 매우 높았 기 때문입니다.
  • 병이 이미지에있을 때 완전히 잃어 버렸습니다. 어떤 이유로 병을 깡통 대신에 발견했습니다 (아마도 병이 더 크기 때문에 픽셀이 많아서 더 많은 표를 얻었을 것입니다)
  • 퍼지 이미지는 센터 주변의 임의의 위치에서 픽셀로 끝나기 때문에 좋지 않았습니다. 따라서 매우 시끄러운 히트 맵으로 끝납니다.
  • 이동 및 회전의 불균형이 달성되었지만 방향이 아니므로 카메라 목표를 직접 마주 볼 수없는 캔을 인식하지 못했습니다.

언급 된 네 가지 특정 문제를 해결하기 위해 독점적 OpenCV 기능을 사용하여 특정 알고리즘을 향상시킬 수 있습니까?

어떤 사람들은 또한 그것으로 무언가를 배울 것이기를 바랍니다. 결국 나는 질문을하는 사람들 만이 배워야 할 것이 아니라고 생각합니다. :)


Zdenek Kalal의 Predator 추적기를 살펴보십시오. 몇 가지 교육이 필요하지만 추적 된 개체가 다양한 방향과 눈금을 어떻게보고 실시간으로 수행하는지 능동적으로 학습 할 수 있습니다!

그의 사이트에서 소스 코드를 사용할 수 있습니다. MATLAB 에 있지만 이미 커뮤니티 구성원이 수행 한 Java 구현이있을 수 있습니다. 나는 C #에서 TLD의 트래커 부분을 성공적으로 다시 구현했다. 내가 정확하게 기억한다면, TLD는 Ferns를 키포인트 탐지기로 사용하고 있습니다. 트래커에 의해 잃어 버렸을 경우 SURF 또는 SIFT 대신에 (@stacker에 의해 이미 제안 된) SURF 또는 SIFT를 사용하여 오브젝트를 다시 획득합니다. 추적기의 피드백을 통해 시프트 / 서프 템플릿의 동적 목록을 쉽게 구축 할 수 있으며, 시간에 따라 매우 높은 정밀도로 대상을 다시 가져올 수 있습니다.

트래커의 C # 구현에 관심이 있으시면 언제든지 물어보십시오.


객체를 인식하는 데 사용되는 색상 설명 자의 무리가 있습니다. 아래의 논문은 그 중 많은 부분을 비교합니다. 그들은 SIFT 또는 SURF와 결합 할 때 특별히 강력합니다. SURF 또는 SIFT만으로는 코카콜라가 매우 흥미롭지 않습니다. 왜냐하면 그들은 많은 관심 지점을 인식하지 못하기 때문에 색상 정보가 필요합니다. 프로젝트에서 SURF와 함께 BIC (테두리 / 내부 픽셀 분류)를 사용하며 객체를 인식하는 데 큰 효과가있었습니다.

웹 이미지 검색을위한 컬러 디스크립터 : 비교 연구


나는 OpenCV를 알지 못한다. 그러나 문제를 논리적으로 바라 볼 때 나는 당신이 찾고있는 이미지 즉, 코카콜라를 바꾸어서 병과 캔을 구별 할 수 있다고 생각한다. 코카콜라 상단에 실버 라이닝이 있고 병의 경우 실버 라이닝이 없을 수 있으므로 깡통의 맨 위 부분까지 통합해야합니다.

그러나 분명히이 알고리즘은 깡통이 숨겨져있는 경우에는 실패 할 것이지만이 경우에도 인간은 두 병을 구별 할 수 없습니다 (병 / 캔의 코카콜라 부분 만 볼 수 있다면)


나는 도전이 마음에 들고 답을주고 싶다. 문제를 해결한다.

  1. 로고의 특징 (키포인트, SIFT, SURF와 같은 설명자)을 추출합니다.
  2. 포인트를 로고의 모델 이미지와 일치시킵니다 (Brute Force와 같은 Matcher 사용).
  3. 강체의 좌표를 추정합니다 (PnP 문제 - SolvePnP).
  4. 강체에 따라 캡 위치를 예측하십시오.
  5. 역 투영을 수행하고 병 뚜껑의 이미지 픽셀 위치 (ROI)를 계산합니다 (카메라의 고유 매개 변수가 있다고 가정합니다)
  6. 뚜껑이 있는지 여부를 확인하십시오. 거기에 있다면, 이것은 병입니다.

모자 검출은 또 다른 문제입니다. 그것은 복잡하거나 단순 할 수 있습니다. 내가 너라면 간단한 결정을 위해 ROI의 색상 막대 그래프를 확인하기 만하면됩니다.

내가 틀렸다면 피드백을주십시오. 감사.


다른 대안은 SIFT ( scale-invariant feature transform ) 또는 SURF ( Speeded Up Robust Features )를 사용하여 피쳐 (키포인트)를 추출하는 것입니다.

이것은 OpenCV 2.3.1에서 구현됩니다.

Features2D + Homography의 기능을 사용하여 좋은 코드 예제 를 찾아서 알려진 객체를 찾을 수 있습니다

두 알고리즘 모두 스케일링 및 회전에 불변합니다. 기능을 사용하기 때문에 충분한 키포인트가 보이는 한 occlusion 을 처리 할 수도 있습니다.

이미지 소스 : 자습서 예

SIFT를 처리하는 데 수백 밀리 초가 걸리지 만 SURF는 조금 빨라지지만 실시간 응용 프로그램에는 적합하지 않습니다. ORB는 회전 불변성이 약한 FAST를 사용합니다.

원본 논문


데모가 좋은 알고리즘 아이디어를 줄 수있는 MVTecHALCON 이라는 컴퓨터 비전 패키지가 있습니다. 데모 모드에서 실행할 수있는 문제와 유사한 예제가 많이 있으며 코드의 연산자를보고 기존 OpenCV 연산자에서 구현하는 방법을 살펴보십시오.

이 패키지를 사용하여 이와 같은 문제에 대한 복잡한 알고리즘을 신속하게 프로토 타입을 작성한 다음 기존 OpenCV 기능을 사용하여 구현하는 방법을 찾습니다. 특히 귀하의 경우 find_scaled_shape_model 연산자에 포함 된 기능을 OpenCV에서 구현하려고 할 수 있습니다. 일부 연산자는 OpenCV에서 비슷한 작업을 수행하는 방법을 찾는 데 도움이되는 알고리즘 구현과 관련된 과학 논문을 가리 킵니다. 희망이 도움이 ...


아마도 제약 조건이 아닌 카메라에만 국한되지 않으면 Xbox Kinect 와 같은 범위 센서를 사용할 수 있습니다. 이를 통해 이미지의 깊이 및 색상을 기준으로 일치하는 분할을 수행 할 수 있습니다. 이렇게하면 이미지에서 오브젝트를 더 빨리 분리 할 수 ​​있습니다. 그런 다음 ICP 매칭 또는 유사한 기술을 사용하여 캔의 외형 또는 색상보다는 캔의 모양을 일치시킬 수 있으며 원통형임을 감안하여 이전에 3D 스캔이있는 경우 모든 방향에 대해 유효한 옵션이 될 수 있습니다. 이러한 기술은 속도 문제를 해결해야하는 특정 용도로 사용될 때 종종 매우 빠릅니다.

또한 정확성이나 속도가 반드시 필요한 것은 아니라고 제안 할 수도 있지만 재미를 위해 색조 세그먼트 이미지에서 훈련 된 신경망을 사용하여 캔의 모양을 식별 할 수 있습니다. 이들은 매우 빠르며 정확도가 최대 80 / 90 %입니다. 트레이닝은 각 이미지에서 캔을 수작업으로 식별해야하기 때문에 긴 프로세스 일 것입니다.


어쩌면 너무 오랜 세월이긴하지만 그럼에도 불구하고 이론을 시험해 볼 수는 있습니다.

병 / 캔의 전체 치수에 대한 빨간색 로고 영역의 경계 사각형의 비율이 다릅니다. 캔의 경우, 1 : 1이어야하지만, 병의 경우 (뚜껑 유무에 관계없이) 다를 수 있습니다. 이렇게하면이 둘을 쉽게 구별 할 수 있습니다.

업데이트 : 로고 영역의 수평 곡률은 각각의 크기 차이로 인해 캔과 병 사이에서 달라집니다. 로봇이 캔 / 병을 집어 올리면 그에 따라 그립을 결정할 때 특히 유용 할 수 있습니다.


이것은 매우 순진한 아이디어 일 수도 있고 전혀 작동하지 않을 수도 있습니다. 그러나 모든 코카인 캔의 크기는 고정되어 있습니다. 동일한 이미지에 캔과 병이 모두 들어있는 경우 크기 고려 사항에 따라 병을 구분할 수 있습니다 (병은 더 커질 수 있습니다). 이제 깊이가 빠져서 (즉 3D 맵핑에서 3D 맵핑으로) 병이 줄어들고 크기 차이가 없을 수도 있습니다. stereo-imaging 사용하여 깊이 정보를 복구 한 다음 원본 크기를 복구 할 수 있습니다.


이러한 모든 훌륭한 솔루션의 대안으로, 자체 분류자를 교육하고 오류에 강건한 응용 프로그램을 만들 수 있습니다. 예를 들어 Haar Training을 사용하면 대상의 긍정적이고 부정적인 이미지를 많이 제공 할 수 있습니다.

캔만을 추출하는 것이 유용 할 수 있으며 투명 오브젝트 감지와 결합 될 수 있습니다.


작업 속도를 높이려면 임의의 이미지 / 오브젝트를 찾지 말고 코카콜라 로고가있는 이미지 / 오브젝트를 묻는 것이 좋습니다. 이 로고는 매우 독특하기 때문에 중요합니다. 특히 주파수 영역에서, 특히 RGB의 빨간색 채널에서 특성 불규칙 서명이 있어야합니다. 즉, 수평 주사선 (수평으로 정렬 된 로고에 대해 훈련 된)에 의해 발생하는 적색에서 백색으로의 교대 패턴은 로고의 중심 축을 통과 할 때 특유한 "리듬"을 가질 것입니다. 이 리듬은 다양한 비율과 방향에서 "속도를 높이거나"느려지지만 비례하여 동일하게 유지됩니다. 가로 세로로 수십 개의 주사선을 식별 / 정의 할 수 있으며, 대각선으로는 별 모양의 패턴을 사용합니다. 이것들을 "서명 스캔 라인"이라고 부릅니다.

대상 이미지에서이 서명을 검색하는 것은 이미지를 가로 스트립으로 스캔하는 간단한 작업입니다. 빨간색 채널에서 높은 주파수를 찾으십시오 (빨간색 영역에서 흰색 영역으로 이동 함을 나타냄). 일단 발견되면 교육 세션에서 확인 된 주파수 리듬 중 하나가 뒤 따르는지 확인하십시오. 일단 일치 항목이 발견되면 로고에서 스캔 라인의 방향과 위치를 즉시 알 수 있습니다 (트레이닝 중에 해당 항목을 추적하는 경우). 따라서 로고 경계를 쉽게 식별 할 수 있습니다.

이 알고리즘이 선형 적으로 효율적인 알고리즘이 아니면 거의 놀랄 것입니다. 분명히 캔병 차별을 다루지는 않지만, 적어도 당신은 로고를 가지고있을 것입니다.

(업데이트 : 병 인식을 위해 로고 옆에있는 코크스 (갈색 액체), 즉 병 내부를 찾는다. 또는 빈 병의 경우에는 항상 병이있는 을 찾는다. 로고와 동일한 기본 모양, 크기 및 거리이며 일반적으로 모두 흰색 또는 빨간색입니다. 로고와 관련하여 뚜껑이 있어야 하는 단색 색상의 정사각형 모양을 검색하십시오. 물론 확실하지만 사용자의 목표는 다음과 같아야합니다. 쉬운 것들을 빨리 찾으십시오.)

(이미지 프로세싱이 끝난 지 몇 년이 지났기 때문에, 나는이 제안을 고차원적이고 개념적으로 유지했다. 인간의 눈이 어떻게 작동하는지, 아니면 적어도 내 뇌가 어떻게 작용 하는지를 대략적으로 생각할 수있다.)


재미있는 문제 : 병 이미지를 훑어 보았을 때 나는 그것이 할 수 있다고 생각했습니다. 그러나 인간으로서, 제가 그 차이점을 말하기 위해 한 것은 제가 병이라고 또한 인식했습니다.

그래서 캔과 병을 구분하기 위해 병을 먼저 스캔하는 방법은 무엇입니까? 캔을 찾으려면 캔을 찾기 전에 라벨을 가려 둡니다.

벌써 캔을하고 있다면 구현하기가 너무 어렵지 않습니다. 진짜 단점은 처리 시간이 두 배가된다는 것입니다. (하지만 실제 응용 프로그램을 생각하면 어쨌든 병을 원한다는 결론을 내릴 수 있습니다 ;-)


흠, 실제로 나는 뭔가에 있다고 생각 합니다. (이것은 가장 흥미로운 질문과 같습니다. 그래서 받아 들일 수있는 것이 발견 되더라도 "완벽한"대답을 찾기 위해 계속 노력하지 않는 것은 수치 스러울 것입니다.) .. .

로고를 찾으면 문제는 반으로 완료됩니다. 그런 다음 로고 주변 의 차이점을 파악하면됩니다. 또한 우리는 가능한 한 여분의 일을하고 싶습니다. 나는 이것이 실제로이 쉬운 부분이라고 생각한다 ...

로고 주변에는 어떤 것들이 있습니까? 깡통 들어, 우리는 조명의 효과에도 불구하고, 기본 색상에서 무엇이든지 바뀌지 않는 금속을 볼 수 있습니다. 레이블의 각도를 알기 만하면 바로 위에 레이블이 무엇인지 알 수 있으므로이 두 레이블의 차이점을 살펴 보겠습니다.

여기에서 로고 위와 아래는 완전히 어둡고 색상이 일정합니다. 그 점에서 상대적으로 쉽습니다.

여기서 위와 아래는 가볍지 만 여전히 일관된 색상입니다. 그것은 모든 은색이며, 모든 은색 금속은 실제로 은색으로 보입니다. 또한 얇은 슬라이더에 있으며 이미 식별 된 빨간색에 충분히 가까워 지므로 깡통의 금속 링으로 간주 될 수있는 것의 비율을 계산하기 위해 전체 길이에 대한 모양을 추적 할 수 있습니다. 실제로, 당신은 그것의 일부라고 말할 수있는 곳곳의 작은 부분 만 필요합니다. 그러나 그것 뒤에 금속이있는 빈 병이 아닌 것을 보장하는 균형을 찾아야합니다.

그리고 마침내, 까다로운 하나. 그러나 너무 까다로울 필요는 없습니다. 일단 우리가 빨간색 래퍼 바로 위 (아래)에서 볼 수있는 것만으로 이동하면됩니다. 그것의 투명성은 그것 뒤에 어떤 것이 든 나타날 것이라는 것을 의미합니다. 그것 뒤에있는 것들이 캔의 은색 원형 금속처럼 색깔이 일관 적이 지 않기 때문에 좋았습니다. 그 뒤에는 여러 가지 다른 것들이있을 수 있습니다. 그것은 비어있는 (또는 맑은 액체로 채워진) 병 또는 일관된 색으로, 액체로 채워지거나 병이 병의 바로 앞에 있다는 것을 나타낼 수 있습니다. 단색. 우리는 위와 아래에 가장 근접한 것들로 작업하고 있으며 적절한 색상이 올바른 위치에있을 가능성은 상대적으로 희박합니다. 우리는 이것이 병이라는 것을 알고 있습니다. 왜냐하면 그것은 병의 주요 시각 요소를 가지지 않았기 때문입니다. 병의 뒤에있을 수있는 것에 비해 상대적으로 단순합니다.

(그 마지막 하나는 내가 비어있는 큰 코카콜라 병을 발견 할 수있는 최고였다 - 흥미롭게도 모자와 반지는 뚜껑의 붉은 색이 의존해서는 안된다는 것을 나타내는 노란색이다)

아주 드물기는하지만, 은색과 비슷한 그늘이 병 뒤에 있으며 플라스틱을 추상화 한 후에도 병이 은색 액체와 같은 색으로 채워진 경우에도 우리는 대략 우리가 대략적으로 추정 할 수있는 것으로 돌아갈 수 있습니다 내가 말했듯이, 은의 모양은 원형이고 깡통의 모양을 따른다. 그러나 이미지 처리에 대한 지식이 부족하더라도 느리게 들립니다. 더 나은 아직, 왜 로고의 측면 주위에 한 번 확인을 위해 거기에 같은 은색의 아무것도없는 것을 보장하기 위해 이것을 추론하지? 아,하지만 깡통 뒤에 은색과 같은 색이 있으면 어쩌지? 그런 다음, 실제로 깡통의 상단과 하단을 다시보고 모양에 더 많은주의를 기울여야합니다.

이 모든 것이 얼마나 완벽해야하는지에 따라 매우 느릴 수 있지만 기본적으로 가장 쉽고 가까운 것을 먼저 확인하는 것이 기본 개념입니다. 다른 요소의 모양을 만들기 위해 노력하기 전에 이미 일치 된 모양 (이 중 가장 사소한 것으로 보이는 부분) 주변의 색상 차이로 이동하십시오. 그것을 나열하려면, 그것은 간다 :

  • 주요 관광 명소 (빨간색 로고 배경 및 오리 엔테이션을위한 로고 자체를 찾으십시오.하지만 캔을 뒤집어 놓았을 경우 빨간색만으로 집중해야합니다)
  • 모양과 방향을 다시 한번 확인하십시오.
  • 모양 주변의 색상을 확인하십시오 (빠르고 쉽기 때문에).
  • 마지막으로, 필요한 경우, 오른쪽 원형에 대한 주요 매력 주위에 그 색상의 모양을 확인하십시오.

당신이 이것을 할 수없는 경우, 그것은 아마도 캔의 상단과 하단이 덮여 있다는 것을 의미하며, 사람이 캔과 병을 확실하게 구별하는 데 사용할 수 있었던 유일한 것들이 교합과 반성입니다 캔을 처리하는 것이 훨씬 어려워 질 것입니다. 그러나 더 나아가려면 다른 답변에서 언급 한 반투명 스캔 기술을 사용하여 병 / 병의 각도를 따라 병 모양을 확인하십시오.

흥미로운 추가 악몽은 병의 뒤편에 편리하게 자리 잡고있을 수있는 거리의 거리에 편리하게 앉아있을 수 있습니다. 라벨의 위와 아래에 금속이 나타나기 때문에 빨간색의 전체 길이를 스캔하는 한 실패합니다. 라벨 - 사실 당신이 가질 수있는 곳을 감지하지 못하기 때문에 실제로 문제가됩니다. 실제로 당신이 실수로 캔을 포함하여 병을 감지하고있는 것과는 대조적입니다. 유리는 반쯤 비어 있습니다.

면책 조항으로, 나는이 질문의 외부에서 이미지 처리에 대한 경험이 없거나 생각해 본 적이 없지만, 매우 흥미로웠다. 그리고 다른 모든 대답을 읽은 후에 나는 이것을 아마도 생각한다. 가장 쉽고 효율적인 방법입니다. 개인적으로, 나는 실제로 이것을 프로그래밍하는 것에 대해 생각할 필요가 없기 때문에 기쁩니다!

편집하다

또한 MS Paint에서했던이 그림을 보아라. 그것은 절대적으로 끔찍하고 아주 불완전하다. 그러나 모양과 색상만으로도 그것이 무엇 일지를 짐작할 수있다. 본질적으로 이것들은 스캔을 방해 할 수있는 유일한 것입니다. 그 아주 독특한 모양과 색의 조합을 가까이에서 볼 때 그 밖의 무엇이있을 수 있습니까? 내가 페인트하지 않은 비트, 흰색 배경은 "모순 된 것"으로 간주되어야합니다. 배경이 투명하면 거의 모든 다른 이미지를 볼 수 있으며 여전히 볼 수 있습니다.


깊은 학습

콜라 캔을 포함하는 수백 개 이상의 이미지를 수집하고, 그 주위의 경계 상자에 양성 클래스로 주석을 추가하고, 콜라 병 및 기타 콜라 제품에 음화 클래스뿐만 아니라 임의의 객체를 레이블을 지정하십시오.

매우 큰 데이터 세트를 수집하지 않으면 작은 데이터 세트에 깊은 학습 기능을 사용하는 트릭을 수행하십시오. 깊은 신경망과 함께 SVM (Support Vector Machine)의 조합을 사용하는 것이 이상적입니다.

이전에 훈련 된 심층 학습 모델 (예 : GoogleNet)에 이미지를 제공하면 신경망의 결정 (최종) 레이어를 사용하여 분류를 수행하는 대신 이전 레이어의 데이터를 기능으로 사용하여 분류자를 교육합니다.

OpenCV 및 Google Net : http://docs.opencv.org/trunk/d5/de7/tutorial_dnn_googlenet.html

OpenCV 및 SVM : http://docs.opencv.org/2.4/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html


나는 빨간색 직사각형을 감지 할 것이다 : RGB -> HSV, 적색 -> 이진 이미지, close (팽창, 침식, matlab에서 imclose 로 알려진)

그런 다음 가장 큰 것부터 가장 작은 것까지 직사각형을 살펴보십시오. 알려진 위치 / 스케일에서 더 작은 직사각형을 갖는 직사각형은 모두 제거 될 수 있습니다 (병 비율이 일정하다고 가정하면 작은 직사각형이 병 뚜껑이됩니다).

이렇게하면 붉은 색 직사각형으로 남을 것입니다. 그러면 붉은 색 직사각형인지 코카콜라인지를 알기 위해 어떻게 든 로고를 감지해야합니다. OCR과 비슷하지만 알려진 로고가 있습니까?


대런 쿡 과 스태커 가이 문제에 대한 답 을 정말 좋아합니다. 나는 그 문제에 대한 의견에 내 생각을 던지고 있었지만, 내 접근 방식이 너무 답답해서 여기를 떠나지 않을 것이라고 생각합니다.

간단히 요약하자면 우주의 특정 위치에 코카콜라 로고가 있는지를 결정하는 알고리즘을 찾아 냈습니다. 병목 , 간판 , 광고 , 코카콜라 도구 등을 포함하는 다른 객체와 코카콜라 을 구별하기에 적합한 휴리스틱 (heuristic)을 임의의 방향 및 임의 배율 요소로 결정하려고합니다. 문제 설명문에 이러한 추가 사례를 많이 부른 적은 없지만 알고리즘의 성공에 필수적이라고 생각합니다.

여기에있는 비밀은 어떤 시각적 기능에 포함될 있는지 또는 음수 공간을 통해 캔용으로 제공되지 않는 다른 코카인 제품에 어떤 기능이 있는지 결정하는 것입니다. 이를 위해, 현재의 최고 답변 은 병 뚜껑, 액체 또는 다른 유사한 시각적 발견 방법의 존재 여부에 따라 "병"이 식별되지 않는 경우에만 "캔"을 선택하는 기본 접근법을 설명합니다.

문제는 이것입니다. 병은 예를 들어 비어있을 수 있으며 모자가 없어서 거짓 긍정을 유발할 수 있습니다. 또는 병목 현상 이 추가 된 부분 병 일 수도있어 잘못된 검색으로 이어질 수 있습니다. 말할 필요도없이, 이것은 우아하지도 않고, 우리의 목적에도 효과적이지 않습니다.

이를 위해 캔에 대한 가장 올바른 선택 기준은 다음과 같습니다.

  • 질문에서 스케치 한 것처럼 대상의 실루엣 모양이 맞습니까? 그렇다면 +1.
  • 자연광이나 인공 광선이 존재한다고 가정하면, 병이 알루미늄으로 만들어 졌는지를 나타내는 크롬 외곽선을 감지합니까? 그렇다면 +1.
  • 우리는 우리의 광원 ( 광원 탐지 에 대한 예시 비디오 링크) 에 비해 물체의 반사 특성 이 정확하다고 결정합니까? 그렇다면 +1.
  • 로고의 위상적인 이미지 비뚤어 짐, 객체의 방향, 객체의 병치 (예 : 평평한 표면)를 포함하여 객체를 식별 할 수있는 객체에 대한 다른 모든 속성을 확인할 수 있습니까? 테이블처럼 또는 다른 캔의 컨텍스트에서), 풀 탭이 있는지 여부를 나타냅니다. 그렇다면 +1에 +1하십시오.

그런 다음 분류가 다음과 같이 보일 수 있습니다.

  • 각 후보 경기에서 코카콜라 로고가 발견되면 회색 테두리를 그립니다.
  • +2 이상의 매치마다 빨간색 테두리를 그립니다.

이것은 감지 된 것을 사용자에게 시각적으로 강조 표시하고 올바르게 맹 글링 된 캔으로 감지 될 수있는 약한 긍정을 강조합니다.

각 속성의 탐지에는 매우 다른 시간과 공간의 복잡성이 따르므로 각 접근법에 대해 http://dsp.stackexchange.com을 신속하게 통과하는 것이 가장 정확하고 효율적인 알고리즘을 결정하는 것 이상입니다. 저의 의도는 순전히 간단 합니다. 후보 탐지 공간의 일부를 무효화함으로써 무언가가 깡통인지탐지하는 것이이 문제에 대한 가장 강력하거나 효과적인 해결책이 아니며 이상적으로는 적절한 조치를 취해야한다는 것을 강조하는 것입니다 따라서.

안녕하세요, 해커 뉴스 게시대해 축하드립니다 . 전반적으로, 이것은 그것이받은 홍보에 합당한 매우 훌륭한 질문입니다. :)





opencv