etc./StackOverFlow

이미지 처리: '코카콜라 캔' 인식을 위한 알고리즘 개선

청렴결백한 만능 재주꾼 2022. 1. 6. 11:11
반응형

질문자 :Charles Menguy


지난 몇 년 동안 내가 작업한 가장 흥미로운 프로젝트 중 하나는 이미지 처리 에 관한 프로젝트였습니다. 목표는 코카콜라 '캔' 을 인식할 수 있는 시스템을 개발하는 것이었습니다. 아래 샘플을 볼 수 있습니다. 캔은 크기와 회전이 있는 녹색 사각형으로 인식됩니다.

템플릿 매칭

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

  • 배경이 매우 시끄러울 수 있습니다.
  • 은 크기 , 회전 또는 방향을 가질 수 있습니다(합리적인 제한 내에서).
  • 이미지가 어느 정도 흐릿할 수 있습니다(윤곽선이 완전히 직선이 아닐 수 있음).
  • 이 이미지의 코카콜라 병이 될 수 있고, 알고리즘은 캔을 감지합니다!
  • 이미지의 밝기는 많이 다를 수 있습니다(따라서 색상 감지에 "너무" 의존할 수 없습니다).
  • 은 측면이나 중앙에 부분적으로 숨겨져 있을 수 있고 병 뒤에 부분적으로 숨겨져 있을 수도 있습니다.
  • 이미지에는 깡통 이 전혀 없을 수 있으며, 이 경우 아무 것도 찾지 못하고 그렇게 말하는 메시지를 작성해야 했습니다.

따라서 다음과 같은 까다로운 작업으로 끝날 수 있습니다(이 경우 내 알고리즘이 완전히 실패했습니다).

총 실패

나는 이 프로젝트를 얼마 전에 했고, 그것을 하는 데 많은 재미를 느꼈고, 괜찮은 구현을 했습니다. 내 구현에 대한 몇 가지 세부 정보는 다음과 같습니다.

언어 : OpenCV 라이브러리를 사용하여 C++로 작성되었습니다.

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

  1. 색상 영역을 RGB에서 HSV로 변경하고 "빨간색" 색조를 기반으로 필터링하고, 주황색과 유사한 색상을 피하기 위해 특정 임계값 이상의 채도, 어두운 색조를 피하기 위해 낮은 값을 필터링합니다. 최종 결과는 모든 흰색 픽셀이 이 임계값과 일치하는 픽셀을 나타내는 이진 흑백 이미지였습니다. 분명히 이미지에는 여전히 많은 쓰레기가 있지만 이것은 작업해야 하는 차원의 수를 줄입니다.이진화된 이미지
  2. 중간 필터링(모든 이웃의 중간 픽셀 값을 취하여 이 값으로 픽셀을 대체)을 사용하여 잡음을 필터링하여 잡음을 줄입니다.
  3. Canny Edge Detection Filter 를 사용하여 2개의 선행 단계 후에 모든 항목의 윤곽을 얻습니다.윤곽 감지

알고리즘 : 이 작업을 위해 선택한 알고리즘 자체는 기능 추출에 관한 멋진 책에서 가져왔으며 일반화된 Hough Transform (일반 Hough Transform과 매우 다름)이라고 합니다. 기본적으로 몇 가지를 말합니다.

  • 분석 방정식을 모른 채 공간에서 물체를 설명할 수 있습니다(여기의 경우).
  • 기본적으로 스케일 팩터와 회전 팩터의 모든 조합에 대해 이미지를 테스트하므로 스케일링 및 회전과 같은 이미지 변형에 강합니다.
  • 알고리즘이 "학습"할 기본 모델(템플릿)을 사용합니다.
  • 윤곽 이미지에 남아 있는 각 픽셀은 모델에서 학습한 내용을 기반으로 개체의 중심(중력 측면에서)이 될 다른 픽셀에 투표합니다.

결국, 당신은 투표의 히트 맵으로 끝납니다. 예를 들어 여기에서 캔 윤곽의 모든 픽셀은 중력 중심에 대해 투표할 것이므로 동일한 픽셀에서 많은 투표를 하게 될 것입니다. 아래와 같이 히트 맵에서 피크를 볼 수 있습니다.

GHT

일단 당신이 그것을 가지고 있다면, 간단한 임계값 기반 휴리스틱은 당신에게 중심 픽셀의 위치를 줄 수 있습니다. 여기에서 당신은 스케일과 회전을 도출한 다음 그 주위에 작은 사각형을 그릴 수 있습니다(최종 스케일과 회전 계수는 분명히 당신의 원본 템플릿). 적어도 이론상으로는...

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

  • 그것은 매우 느립니다 ! 나는 이것을 충분히 강조하지 않는다. 30개의 테스트 이미지를 처리하는 데 거의 하루 종일 필요했습니다. 일부 캔은 매우 작았기 때문에 회전 및 변환에 대한 배율이 매우 높았기 때문입니다.
  • 병이 이미지에 있을 때 완전히 사라졌고, 어떤 이유로 거의 항상 캔 대신 병을 찾았습니다(아마도 병이 더 커서 더 많은 픽셀이 있어 더 많은 표를 얻었기 때문일 수 있습니다).
  • 퍼지 이미지도 좋지 않았습니다. 투표가 중앙 주변의 임의 위치에서 픽셀 단위로 끝나서 매우 시끄러운 히트 맵으로 끝나기 때문입니다.
  • 변환 및 회전의 불변은 달성되었지만 방향은 아니었습니다. 즉, 카메라 대물렌즈를 직접 향하지 않는 캔은 인식되지 않았습니다.

언급된 네 가지 특정 문제를 해결하기 위해 독점적으로 OpenCV 기능을 사용하여 특정 알고리즘을 개선하는 데 도움을 줄 수 있습니까?

나는 질문을 하는 사람만이 배워야 하는 것이 아니라 결국 그것을 통해 어떤 사람들도 그것을 통해 무언가를 배우기를 바랍니다. :)



다른 접근 방식은 SIFT( Scale-Invariant Feature Transform ) 또는 SURF( Speed Up Robust Features )를 사용하여 기능(키포인트)을 추출하는 것입니다.

이 페이지 Java , C++Python OpenCV 코드 예제를 찾을 수 있습니다 . Features2D + Homography to find a known object

두 알고리즘 모두 크기 조정 및 회전에 불변합니다. 기능과 함께 작동하기 때문에 오클루전도 처리할 수 있습니다(충분한 키포인트가 표시되는 한).

여기에 이미지 설명 입력

이미지 출처: 튜토리얼 예시

처리는 SIFT의 경우 수백 ms가 걸리며 SURF는 약간 빠르지만 실시간 응용 프로그램에는 적합하지 않습니다. ORB는 회전 불변성이 약한 FAST를 사용합니다.

원본 논문


stacker

작업 속도를 높이기 위해 임의의 이미지/물체를 찾는 것이 아니라 특히 Coca-Cola 로고가 있는 이미지/물체를 찾으라는 사실을 이용합니다. 이것은 이 로고가 매우 독특하고 주파수 영역, 특히 RGB의 빨간색 채널에서 특징적인 스케일 불변 시그니처를 가져야 하기 때문에 중요합니다. 즉, 수평 스캔 라인(가로 정렬된 로고에서 훈련됨)이 만나는 빨간색-흰색-빨간색의 교대 패턴은 로고의 중심 축을 통과할 때 독특한 "리듬"을 갖게 됩니다. 그 리듬은 다른 규모와 방향에서 "속도를 높이거나" "느리게"하지만 비례적으로 동일하게 유지됩니다. 로고를 통해 수평 및 수직으로 그리고 더 많은 대각선을 통해 스타버스트 패턴으로 수십 개의 스캔라인을 식별/정의할 수 있습니다. 이것을 "서명 스캔 라인"이라고 합니다.

서명 스캔 라인

대상 이미지에서 이 서명을 검색하는 것은 이미지를 가로 스트립으로 스캔하는 간단한 문제입니다. 빨간색 채널에서 고주파수를 찾고(빨간색 영역에서 흰색 영역으로 이동하는 것을 나타냄) 일단 발견되면 훈련 세션에서 식별된 주파수 리듬 중 하나가 뒤에 오는지 확인합니다. 일치하는 항목이 발견되면 로고에서 스캔 라인의 방향과 위치를 즉시 알 수 있으므로(교육 중에 이러한 항목을 추적하는 경우) 거기에서 로고의 경계를 식별하는 것은 간단합니다.

이것이 선형 효율적인 알고리즘이 아니거나 거의 그렇지 않다면 놀랄 것입니다. 그것은 분명히 당신의 병에 대한 차별을 다루지 않지만 적어도 당신은 당신의 로고를 가질 것입니다.

(업데이트: 병 인식을 위해 로고 옆에 있는 콜라(갈색 액체), 즉 병 내부를 찾습니다. 또는 빈 병의 경우 항상 뚜껑이 있는 뚜껑을 찾습니다. 로고에서 기본 모양, 크기 및 거리가 동일하며 일반적으로 모두 흰색 또는 빨간색입니다. 로고를 기준으로 캡이 있어야 하는 단색 타원형 모양을 검색합니다. 물론 완벽한 것은 아니지만 여기에서 목표는 다음과 같아야 합니다. 쉬운 것을 빨리 찾으십시오.)

(이미지를 처리한 지 몇 년이 흘렀기 때문에 이 제안을 높은 수준의 개념으로 유지했습니다. 인간의 눈이 어떻게 작동하는지, 또는 적어도 내 뇌가 어떻게 작동하는지에 약간 근접할 수 있다고 생각합니다!)


kmote

재미있는 문제: 병 이미지를 보았을 때 저도 캔인 줄 알았습니다. 그러나 인간으로서 내가 그 차이를 구별하기 위해 한 것은 그것이 병이기도하다는 것을 깨달았다는 것입니다 ...

캔과 병을 구분하려면 먼저 병을 스캔하는 것이 어떻습니까? 하나를 찾으면 캔을 찾기 전에 레이블을 가립니다.

이미 캔을 사용하고 있다면 구현하기 어렵지 않습니다. 진짜 단점은 처리 시간이 두 배가 된다는 것입니다. (그러나 실제 응용 프로그램을 미리 생각하면 어쨌든 병을 만들고 싶어하게 될 것입니다 ;-)


Darren Cook

두 번째 이미지에서 사람도 병과 캔을 구별하기 어렵지 않습니까(병의 투명 영역이 숨겨져 있는 경우)?

아주 작은 부분을 제외하고는 거의 동일합니다.

가장 먼저 떠오른 것은 병의 빨간 뚜껑을 확인하는 것이었습니다. 그러나 병의 상단이 없거나 부분적으로 숨겨져 있는 경우(위에서 언급한 것처럼) 여전히 문제입니다.

두 번째로 생각한 것은 병의 투명도였습니다. OpenCV에는 이미지에서 투명한 개체를 찾는 작업이 있습니다. 아래 링크를 확인하세요.

특히 유리를 얼마나 정확하게 감지하는지 보려면 다음을 살펴보십시오.

구현 결과를 참조하십시오.

여기에 이미지 설명 입력

그들은 이것이 K. McHenry와 J. Ponce가 작성한 "A Geodesic Active Contour Framework for Finding Glass" 논문의 구현이라고 말합니다. CVPR 2006 .

귀하의 경우에는 조금 도움이 될 수 있지만 병이 채워지면 문제가 다시 발생합니다.

그래서 여기에서 병의 투명한 몸체를 먼저 검색하거나 측면에서 분명히 병인 두 개의 투명한 물체에 연결된 빨간색 영역을 검색할 수 있다고 생각합니다. (이상적으로 작업할 때 이미지는 다음과 같습니다.)

여기에 이미지 설명 입력

이제 노란색 영역, 즉 병의 레이블을 제거하고 알고리즘을 실행하여 캔을 찾을 수 있습니다.

어쨌든, 이 솔루션도 다른 솔루션과 다른 문제가 있습니다.

  1. 병이 비어 있는 경우에만 작동합니다. 이 경우 두 개의 검은색(코카콜라 액체가 검은색인 경우) 사이의 빨간색 영역을 검색해야 합니다.
  2. 투명한 부분이 덮이면 또 다른 문제입니다.

하지만 어쨌든 위의 문제가 사진에 없다면 이 방법이 더 나은 것 같습니다.


Abid Rahman K

나는 이 문제에 대한 Darren Cookstacker의 답변 을 정말 좋아합니다. 나는 그것에 대한 의견에 내 생각을 던지고 있었지만 여기에서 떠나지 않기에는 내 접근 방식이 너무 답변 형식이라고 생각합니다.

간단히 말해서, Coca-Cola 로고가 우주의 특정 위치에 있는지 확인하는 알고리즘을 확인했습니다. 이제 임의의 방향 및 임의의 크기 조정 요소에 대해 , 광고판 , 광고 및 이 상징적인 로고와 관련된 Coca-Cola 도구를 포함하여 다른 물체 와 Coca-Cola 캔을 구별하는 데 적합한 휴리스틱을 결정하려고 합니다. 문제 설명에서 이러한 추가 사례를 많이 언급하지는 않았지만 알고리즘의 성공에 중요하다고 생각합니다.

여기서 비밀은 캔에 포함된 시각적 기능을 결정하거나, 음의 공간을 통해 캔에는 없는 다른 코크스 제품에는 어떤 기능이 있는지 결정하는 것입니다. 이를 위해 현재 최고 답변 은 병뚜껑, 액체 또는 기타 유사한 시각적 휴리스틱의 존재에 의해 "병"이 식별되지 않는 경우에만 "캔"을 선택하기 위한 기본 접근 방식을 스케치합니다.

문제는 이것이 무너진다는 것입니다. 예를 들어 병이 비어 있고 뚜껑이 없으면 오탐이 발생할 수 있습니다. 또는 추가 기능이 포함된 부분 병 이 잘못 감지되어 다시 잘못 감지될 수 있습니다. 말할 필요도 없이 이것은 우아하지도 않고 우리의 목적에도 효과적이지 않습니다.

이를 위해 가장 정확한 캔 선정 기준은 다음과 같다.

  • 질문에서 스케치한 대로 개체 실루엣의 모양이 맞습니까? 그렇다면 +1.
  • 자연광이나 인공광이 있다고 가정하면, 이것이 알루미늄으로 만들어졌는지 여부를 나타내는 병의 크롬 윤곽선을 감지할 수 있습니까? 그렇다면 +1.
  • 광원과 관련하여 물체의 반사 속성 이 올바른지 확인합니까( 광원 감지 에 대한 설명 비디오 링크 )? 그렇다면 +1.
  • 로고의 토폴로지 이미지 왜곡, 물체의 방향, 물체의 병치(예: 평면 테이블과 같이 또는 다른 캔의 맥락에서) 및 당김 탭이 있습니까? 그렇다면 각각에 대해 +1입니다.

그러면 분류가 다음과 같이 표시될 수 있습니다.

  • 각 후보 일치에 대해 Coca Cola 로고가 감지되면 회색 테두리를 그립니다.
  • +2 이상의 각 경기에 대해 빨간색 테두리를 그립니다.

이것은 사용자에게 감지된 내용을 시각적으로 강조 표시하고, 제대로 망가진 캔으로 감지될 수 있는 약한 양성을 강조합니다.

각 속성의 감지는 매우 다른 시간과 공간 복잡성을 수반하며, 각 접근 방식에 대해 http://dsp.stackexchange.com을 통한 빠른 통과는 귀하의 목적에 가장 정확하고 가장 효율적인 알고리즘을 결정하는 데 합리적입니다. 여기서 내 의도는 순수하고 간단하게 후보 감지 공간의 작은 부분을 무효화하여 캔 인지 감지하는 것이 이 문제에 대한 가장 강력하거나 효과적인 솔루션이 아니며 이상적으로는 적절한 조치를 취해야 한다는 점을 강조하는 것입니다. 따라서.

안녕하세요, Hacker News 게시를 축하합니다! 전반적으로, 이것은 그것이 받은 홍보에 합당한 꽤 훌륭한 질문입니다. :)


MrGomez

모양을보고

캔/병의 빨간색 부분의 모양을 살펴보십시오. 병 라벨은 직선인 반면 캔은 맨 위에서 어떻게 약간 가늘어지는지 확인하십시오. 길이에 걸쳐 빨간색 부분의 너비를 비교하여 이 둘을 구별할 수 있습니다.

하이라이트를 보면

병과 캔을 구별하는 한 가지 방법은 재료입니다. 병은 플라스틱으로 만들어지고 캔은 알루미늄 금속으로 만들어집니다. 조명이 충분히 밝은 상황에서 반사광을 보는 것은 캔 라벨에서 병 라벨을 구별하는 한 가지 방법이 될 것입니다.

내가 말할 수 있는 한, 그것이 인간이 두 가지 유형의 레이블을 구별하는 방법입니다. 조명 조건이 좋지 않으면 어쨌든 둘을 구별하는 데 약간의 불확실성이 있게 마련입니다. 이 경우 투명/반투명 병 자체의 존재를 감지할 수 있어야 합니다.


tskuzzy

Zdenek Kalal의 Predator 추적기를 살펴보십시오. 약간의 훈련이 필요하지만 추적된 물체가 다른 방향과 크기에서 어떻게 보이는지 실시간으로 학습할 수 있습니다!

소스 코드는 그의 사이트에서 사용할 수 있습니다. MATLAB 에 있지만 커뮤니티 구성원이 이미 수행한 Java 구현이 있을 수 있습니다. C#에서 TLD의 추적기 부분을 성공적으로 다시 구현했습니다. 제 기억이 맞다면 TLD는 Ferns를 키포인트 감지기로 사용하고 있습니다. 추적기에 의해 개체가 손실된 경우 개체를 다시 획득하기 위해 대신 SURF 또는 SIFT(이미 @stacker에서 제안함)를 사용합니다. 추적기의 피드백은 시간이 지남에 따라 매우 높은 정밀도로 개체를 재획득할 수 있는 sift/surf 템플릿의 동적 목록을 시간이 지남에 따라 쉽게 구축할 수 있도록 합니다.

추적기의 C# 구현에 관심이 있으시면 언제든지 문의하십시오.


user1222021

제약 조건 중 하나에 없는 카메라에만 국한되지 않는 경우 Xbox Kinect 와 같은 범위 센서를 사용하도록 이동할 수 있습니다. 이를 통해 이미지의 깊이 및 색상 기반 일치 분할을 수행할 수 있습니다. 이렇게 하면 이미지에서 개체를 더 빠르게 분리할 수 있습니다. 그런 다음 ICP 일치 또는 유사한 기술을 사용하여 윤곽이나 색상이 아닌 캔의 모양을 일치시킬 수 있으며 원통형이므로 대상의 이전 3D 스캔이 있는 경우 모든 방향에 유효한 옵션일 수 있습니다. 이러한 기술은 특히 속도 문제를 해결해야 하는 특정 목적에 사용할 때 매우 빠릅니다.

또한 정확성이나 속도를 위해 반드시 필요한 것은 아니지만 재미를 위해 색조 분할 이미지에서 훈련된 신경망을 사용하여 캔의 모양을 식별할 수 있다고 제안할 수 있습니다. 이들은 매우 빠르며 종종 최대 80/90%까지 정확할 수 있습니다. 각 이미지에서 캔을 수동으로 식별해야 하기 때문에 훈련은 다소 긴 과정이 될 것입니다.


Fantastic Mr Fox

나는 빨간색 사각형을 감지합니다: RGB -> HSV, 필터 빨간색 -> 이진 이미지, 닫기 (확대 후 침식, matlab에서 imclose

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

이렇게 하면 빨간색 직사각형이 남게 되며, 로고가 빨간색 직사각형인지 콜라 캔인지 구분하기 위해 어떻게든 로고를 감지해야 합니다. OCR과 비슷하지만 알려진 로고가 있습니까?


Alex L

이것은 매우 순진한 생각일 수 있지만(또는 전혀 작동하지 않을 수 있음) 모든 콜라 캔의 크기는 고정되어 있습니다. 동일한 이미지에 캔과 병이 모두 포함된 경우 크기 고려 사항으로 구분할 수 있습니다(병이 더 커질 것입니다). 이제 깊이가 없기 때문에(즉, 3D 매핑에서 2D 매핑으로) 병이 줄어들고 크기 차이가 없을 수 있습니다. 스테레오 이미징을 사용하여 일부 깊이 정보를 복구한 다음 원래 크기로 복구할 수 있습니다.


Sharad

흠, 사실 제가 뭔가 를 하고 있다고 생각합니다(이것은 가장 흥미로운 질문과 같습니다. 따라서 수용 가능한 답변을 찾았더라도 "완벽한" 답변을 계속 찾으려고 노력하지 않는 것은 부끄러운 일입니다.). .

로고를 찾으면 문제가 반은 완료된 것입니다. 그런 다음 로고 주변 의 차이점만 파악하면 됩니다. 또한, 우리는 가능한 한 적은 추가 작업을 하고 싶습니다. 사실 이게 쉬운 부분인 것 같아요...

로고 주위에 무엇입니까? 캔의 경우 조명의 영향에도 불구하고 기본 색상이 전혀 변하지 않는 금속을 볼 수 있습니다. 레이블의 각도를 아는 한 레이블 바로 위에 무엇이 있는지 알 수 있으므로 다음과 같은 차이점을 살펴봅니다.

여기에서 로고 위와 아래는 완전히 어둡고 일관된 색상입니다. 그런 면에서 비교적 쉽습니다.

여기에서 위와 아래는 밝지만 색상은 여전히 일관적입니다. 전체 은색이며 전체 은색 금속은 일반적으로 은색뿐만 아니라 실제로 매우 희귀해 보입니다. 또한, 그것은 얇은 미끄럽고 이미 식별된 빨간색에 충분히 가깝기 때문에 전체 길이에 대한 모양을 추적하여 캔의 금속 링으로 간주될 수 있는 백분율을 계산할 수 있습니다. 사실, 당신은 그것이 그것의 일부라는 것을 알기 위해 캔을 따라 어디에서나 그것의 아주 작은 부분만 필요로 합니다. 그러나 당신은 여전히 그것이 뒤에 금속으로 된 무언가가 있는 빈 병이 아니라는 것을 보증하는 균형을 찾아야 합니다.

그리고 마지막으로, 까다로운 것. 하지만 그렇게 까다롭지는 않습니다. 일단 빨간색 래퍼 바로 위(아래)에서 볼 수 있는 것만 살펴봅니다. 투명해서 뒤에 무엇이 있는지 보여줍니다. 그 뒤에 있는 것들이 캔의 은색 원형 금속만큼 색상이 일정하지 않을 가능성이 높기 때문입니다. 그 뒤에는 여러 가지 다른 것들이 있을 수 있는데, 이는 그것이 비어 있는(또는 투명한 액체로 채워진) 병이라는 것을 말하거나 일관된 색상을 말하는데, 이는 병이 액체로 채워져 있거나 병이 단순히 앞에 있음을 의미할 수 있습니다. 단색. 우리는 상단과 하단에 가장 가까운 것으로 작업하고 있으며 올바른 색상이 올바른 위치에 있을 가능성은 상대적으로 희박합니다. 우리는 그것이 병이라는 것을 압니다. 왜냐하면 병 뒤에 있을 수 있는 것에 비해 상대적으로 단순한 깡통의 핵심 시각적 요소가 없기 때문입니다.

(마지막 것은 비어 있는 큰 코카콜라 병 중에서 내가 찾을 수 있는 최고였습니다. 흥미롭게도 뚜껑과 고리가 노란색으로 되어 있어 뚜껑이 붉어지는 것에 의존해서는 안 됨을 나타냅니다.)

플라스틱을 추상화한 후에도 병 뒤에 비슷한 은색 음영이 있는 드문 상황에서, 또는 병이 어떻게든 동일한 은색 액체로 채워져 있는 경우, 우리는 대략적으로 다음과 같이 추정할 수 있는 것으로 되돌아갈 수 있습니다. 내가 언급한 대로 은의 모양은 원형이고 깡통의 모양을 따릅니다. 그러나 이미지 처리에 대한 특정 지식이 부족하더라도 느리게 들립니다. 더 나은 방법은 로고 측면 을 한 번 확인하여 동일한 은색이 없는지 확인하는 것입니다. 아, 하지만 캔 뒤에 같은 은색이 있다면? 그런 다음 캔의 상단과 하단을 다시 보면서 모양에 더 많은주의를 기울여야합니다.

이 모든 것이 얼마나 완벽해야 하는지에 따라 매우 느릴 수 있지만, 제 기본 개념은 가장 쉽고 가까운 것을 먼저 확인하는 것입니다. 다른 요소의 모양을 작업하기 전에 이미 일치된 모양(어쨌든 가장 사소한 부분인 것 같습니다) 주변의 색상 차이를 살펴보십시오. 나열하자면 다음과 같습니다.

  • 주요 어트랙션 찾기(빨간색 로고 배경 및 방향을 위한 로고 자체일 수 있지만 캔을 버릴 경우 빨간색에만 집중해야 함)
  • 모양과 방향을 확인하고 매우 독특한 발적을 통해 다시 한 번 확인
  • 모양 주변의 색상 확인(빠르고 고통스럽지 않기 때문에)
  • 마지막으로 필요한 경우 올바른 원형을 위해 주요 명소 주변의 색상 모양을 확인합니다.

이렇게 할 수 없는 경우에는 아마도 캔의 상단과 하단이 덮여 있다는 의미일 수 있으며 인간이 캔과 병을 확실하게 구별하는 데 사용할 수 있는 유일한 가능한 것은 폐색 및 반사입니다. 처리하기가 훨씬 더 어려운 전투가 될 수 있습니다. 그러나 더 나아가기 위해 다른 답변에서 언급한 반투명 스캔 기술을 사용하여 캔/병의 각도를 따라 더 많은 병과 같은 특성을 확인할 수 있습니다.

흥미로운 추가 악몽에는 캔의 금속이 라벨 위와 아래에 표시되는 거리에서 병 뒤에 편리하게 앉을 수 있는 캔이 포함될 수 있습니다. 라벨 - 실수로 깡통을 포함하여 실제로 병을 감지한다고 생각하는 것과는 대조적으로, 있을 수 있는 깡통을 감지하지 못하기 때문에 실제로 더 문제입니다. 이 경우 잔은 반만 비어 있습니다!


면책 조항으로, 나는 이 질문 외의 이미지 처리에 대한 경험이나 생각한 적이 없지만 너무 흥미롭기 때문에 그것에 대해 꽤 깊이 생각하게 되었고, 다른 모든 답변을 읽은 후에는 이것이 가능하다고 생각합니다. 가장 쉽고 효율적인 방법은 그것을 수행하세요. 개인적으로, 나는 실제로 이것을 프로그래밍하는 것에 대해 생각할 필요가 없다는 것이 기쁩니다!

편집하다

MS 페인트에서 캔의 나쁜 그림 덧붙여서, 제가 MS Paint로 그린 이 그림을 보세요... 정말 끔찍하고 불완전하지만, 모양과 색깔만 보아도 어떤 그림일지 짐작할 수 있습니다. 본질적으로 이것들은 스캔을 귀찮게 해야 하는 유일한 것입니다. 매우 독특한 모양과 색상의 조합을 이렇게 가까이서 보면 다른 무엇이 있을 수 있습니까? 내가 칠하지 않은 부분인 흰색 배경은 "일치하지 않는 모든 것"으로 간주되어야 합니다. 배경이 투명한 경우 거의 모든 다른 이미지를 덮을 수 있으며 여전히 볼 수 있습니다.


Deji

나는 OpenCV에 대해 잘 모르지만 논리적으로 문제를 보면 코카콜라와 같이 찾고 있는 이미지를 변경하여 병과 캔을 구별할 수 있다고 생각합니다. 캔의 경우 코카콜라 상단에 은색 라이닝이 있고 병의 경우 은색 라이닝이 없는 것처럼 캔의 상단 부분까지 통합해야 합니다.

그러나 분명히 이 알고리즘은 캔의 상단이 숨겨져 있는 경우 실패하지만 이러한 경우에는 인간조차도 둘을 구분할 수 없습니다(병/캔의 코카콜라 부분만 보이는 경우).


techExplorer

이 질문에 답하는 데 몇 년이 늦었습니다. 지난 5년 동안 CNN에 의해 최첨단 기술이 한계에 도달했기 때문에 지금은 이 작업을 수행하기 위해 OpenCV를 사용하지 않을 것입니다! ( 나는 당신이 질문에서 OpenCv 기능을 특별히 원했다는 것을 알고 있습니다 ) Faster-RCNN, YOLO, SSD 등과 같은 객체 감지 알고리즘이 OpenCV 기능에 비해 상당한 마진으로 이 문제를 해결할 것이라고 생각합니다. 지금(6년 후 !!) 이 문제를 해결하려면 Faster-RCNN 을 사용하겠습니다.


Abhijit Balaji

나는 도전을 좋아하고 문제를 해결하는 답변을 제공하고 싶었습니다.

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

캡의 감지는 또 다른 문제입니다. 복잡하거나 간단할 수 있습니다. 내가 당신이라면 간단한 결정을 위해 ROI에서 색상 히스토그램을 확인하기만 하면 됩니다.

제가 틀렸다면 피드백을 주세요. 감사 해요.


Community Wiki

주제와 상관없이 귀하의 질문을 좋아합니다 :P

흥미로운 제쳐두고; 저는 로봇과 컴퓨터 비전을 다루는 학위 과정에서 한 과목을 마쳤습니다. 학기 동안 우리의 프로젝트는 당신이 설명하는 것과 믿을 수 없을 정도로 유사했습니다.

우리는 Xbox Kinect를 사용하여 다양한 조명 및 환경 조건에서 모든 방향에서 콜라 병과 캔을 감지하는 로봇을 개발해야 했습니다. 우리의 솔루션은 Hue 채널에서 Hough circle 변환과 함께 대역 통과 필터를 사용하는 것과 관련되었습니다. 우리는 환경을 약간 제한할 수 있었습니다(로봇과 Kinect 센서의 위치와 방법을 선택할 수 있음). 그렇지 않으면 SIFT 또는 SURF 변환을 사용하려고 했습니다.

주제에 대한 내 블로그 게시물에서 우리의 접근 방식에 대해 읽을 수 있습니다. :)


aaronsnoswell

딥러닝

콜라 캔이 포함된 최소 수백 개의 이미지를 수집하고, 주변의 경계 상자에 포지티브 클래스로 주석을 달고, 콜라 병 및 기타 콜라 제품을 포함하여 네거티브 클래스와 임의의 개체에 레이블을 지정합니다.

매우 큰 데이터 세트를 수집하지 않는 한 작은 데이터 세트에 대해 딥 러닝 기능을 사용하는 트릭을 수행하십시오. 심층 신경망과 SVM(Support Vector Machines)의 조합을 사용하는 것이 이상적입니다.

이전에 훈련된 딥 러닝 모델(예: 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


Semih Korkmaz

물체를 인식하는 데 사용되는 색상 설명자는 여러 가지가 있으며, 아래의 논문에서는 이를 많이 비교합니다. SIFT 또는 SURF와 결합할 때 특히 강력합니다. SURF 또는 SIFT만으로는 많은 관심 지점을 인식하지 못하기 때문에 코카콜라 캔 이미지에서 그다지 유용하지 않습니다. 도움이 되는 색상 정보가 필요합니다. 나는 프로젝트에서 SURF와 함께 BIC(Border/Interior Pixel Classification)를 사용하고 물체를 인식하는 데 훌륭하게 작동했습니다.

웹 이미지 검색을 위한 색상 설명자: 비교 연구


Guilherme Defreitas

경험을 통해 분류 정확도를 유기적으로 배우고 향상시키는 프로그램이 필요합니다.

저는 딥 러닝을 제안할 것입니다. 딥 러닝에서는 이것이 사소한 문제가 됩니다.

Tensorflow에서 시작 v3 모델을 다시 학습시킬 수 있습니다.

새로운 카테고리에 대한 Inception의 최종 레이어를 재교육하는 방법 .

이 경우 코카콜라로 분류할 수 있는지 없는지 분류하기 위해 합성곱 신경망을 훈련할 것입니다.


Nuelsian

이 모든 훌륭한 솔루션에 대한 대안으로 고유한 분류기를 훈련하고 애플리케이션을 오류에 강력하게 만들 수 있습니다. 예를 들어 Haar Training 을 사용하여 대상에 대한 많은 양의 긍정적이고 부정적인 이미지를 제공할 수 있습니다.

캔만 추출하는 것이 유용할 수 있으며 투명한 물체 감지와 결합할 수 있습니다.


madduci

데모를 통해 좋은 알고리즘 아이디어를 얻을 수 있는 MVTec 의 HALCON이라는 컴퓨터 비전 패키지가 있습니다. 데모 모드에서 실행한 다음 코드의 연산자를 보고 기존 OpenCV 연산자에서 이를 구현하는 방법을 볼 수 있는 문제와 유사한 예제가 많이 있습니다.

저는 이 패키지를 사용하여 이와 같은 문제에 대한 복잡한 알고리즘의 프로토타입을 빠르게 만든 다음 기존 OpenCV 기능을 사용하여 구현하는 방법을 찾았습니다. 특히 귀하의 경우 find_scaled_shape_model 연산자에 포함된 기능을 OpenCV에서 구현하려고 시도할 수 있습니다. 일부 운영자는 OpenCV에서 유사한 작업을 수행하는 방법을 찾는 데 도움이 될 수 있는 알고리즘 구현에 관한 과학 논문을 지적합니다. 도움이 되었기를 바랍니다...


Darien Pardinas

너무 많은 세월이 지났을 수도 있지만 그럼에도 불구하고 시도할 이론입니다.

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

업데이트: 캔과 병은 각각의 크기 차이로 인해 로고 영역의 가로 곡률이 다릅니다. 이것은 로봇이 캔/병을 집어야 하고 그에 따라 그립을 결정해야 하는 경우에 특히 유용할 수 있습니다.


banerjk

실시간에 관심이 있다면 전처리 필터를 추가하여 중장비로 스캔할 대상을 결정해야 합니다. 코카콜라 캔일 가능성이 더 높은 것을 스캔할 수 있게 해주는 빠르고, 매우 실시간인 사전 처리 필터는 다음과 같습니다. 이미지에서 가장 큰 패치를 검색하십시오. 코카콜라 캔 sqrt(pow(red,2) + pow(blue,2) + pow(green,2)) 에서 특정 허용 오차를 벗어나는 색상. 매우 엄격한 색상 허용 오차로 시작하여 보다 관대한 색상 허용 오차로 이동합니다. 그런 다음 로봇이 현재 프레임을 처리하는 데 할당된 시간이 다되면 현재 발견된 병을 용도에 사용합니다. RGB 색상을 올바르게 조정하려면 sqrt(pow(red,2) + pow(blue,2) + pow(green,2)) 에서 RGB 색상을 조정해야 합니다.

또한 이것은 정말 어리석은 것처럼 보이지만 C 코드를 컴파일할 때 -oFast


user7892745

내가 가장 먼저 찾는 것은 RED와 같은 색상입니다. 이미지에서 적목 감지를 수행할 때 감지할 특정 색상 범위가 있습니다. 실제로 이미지에서 볼 수 있습니다.

1: 첫 번째 특성은 색상이고 빨간색이 매우 지배적입니다. Coca Cola Red를 감지한 후 몇 가지 관심 항목이 있습니다. 1A: 이 빨간색 영역의 크기(진짜 캔을 판별하기에 충분한 양입니까? - 10픽셀로는 충분하지 않을 수 있음), 1B: 다음을 포함합니까? 라벨의 색상 - "Coca-Cola" 또는 웨이브. 1B1: 레이블일 가능성이 높다고 생각할 만큼 충분한가.

항목 1은 일종의 지름길입니다. 이미지에 코딱지가 존재하지 않는 경우 전처리합니다. 계속 진행합니다.

그렇다면 내 이미지의 해당 부분을 활용하고 문제의 영역을 조금 더 확대하여 보기 시작할 수 있습니다. 기본적으로 주변 영역/가장자리를 보세요...

2: 위의 이미지 영역 ID가 1로 지정되어 있는 경우 - 해당 항목의 주변 지점[가장자리]를 확인합니다. A: 캔 상단이나 하단으로 보이는 것이 은색입니까? B: 병이 투명해 보일 수 있지만 유리 테이블도 마찬가지입니다. 유리 테이블/선반이나 투명한 영역도 있습니다. 그렇다면 여러 가능성이 나옵니다. 병에는 빨간색 뚜껑이 있을 수 있지만 그렇지 않을 수도 있지만 병 뚜껑 모양이나 나사 모양 또는 뚜껑이 있어야 합니다. C: 이것이 A 및 B에 실패하더라도 여전히 캔 부분일 수 있습니다. 부분 병/부분 캔이 동일하게 보일 수 있기 때문에 부분적일 때 더 복잡하므로 빨간색 영역 가장자리의 측정 처리를 좀 더 처리합니다. to edge.. 작은 병은 크기가 비슷할 수 있습니다.

3: 위의 분석 후 글자와 물결 로고를 볼 때 - 단어의 일부 글자에 대한 검색 방향을 지정할 수 있기 때문입니다. 수, 웨이브는 텍스트에 대한 특정 지점에서 정렬되므로(거리에 따라) 해당 확률을 검색하고 거리 x에서 웨이브의 해당 지점에 어떤 문자가 있어야 하는지 알 수 있습니다.


Ken

출처 : http:www.stackoverflow.com/questions/10168686/image-processing-algorithm-improvement-for-coca-cola-can-recognition

반응형