मैं वियोला-जोन्स के फेस डिटेक्शन एल्गोरिदम के एक अनुकूलन को लागू कर रहा हूं । यह तकनीक एक छवि के भीतर 24x24 पिक्सेल की सबफ़्रेम रखने पर निर्भर करती है, और बाद में हर आकार के साथ हर स्थिति में इसके अंदर आयताकार विशेषताओं को रखती है।
इन सुविधाओं में दो, तीन या चार आयत शामिल हो सकते हैं। निम्नलिखित उदाहरण प्रस्तुत है।
वे दावा करते हैं कि संपूर्ण सेट 180k (धारा 2) से अधिक है:
यह देखते हुए कि डिटेक्टर का आधार रिज़ॉल्यूशन 24x24 है, आयत सुविधाओं का संपूर्ण सेट 180,000 से अधिक है। ध्यान दें कि Haar आधार के विपरीत, आयत सुविधाओं का सेट अधूरा है।
निम्नलिखित कथनों को स्पष्ट रूप से कागज में नहीं बताया गया है, इसलिए वे मेरी ओर से मान्य हैं:
- केवल 2 दो-आयत सुविधाएँ, 2 तीन-आयत सुविधाएँ और 1 चार-आयत सुविधाएँ हैं। इसके पीछे तर्क यह है कि हम हाइलाइट किए गए आयतों के बीच के अंतर को देख रहे हैं , न कि स्पष्ट रूप से रंग या चमक या उस तरह की किसी भी चीज़ को।
- हम 1x1 पिक्सेल ब्लॉक के रूप में सुविधा प्रकार ए को परिभाषित नहीं कर सकते हैं; यह कम से कम 1x2 पिक्सेल का होना चाहिए। इसके अलावा, टाइप डी कम से कम 2x2 पिक्सेल होना चाहिए, और यह नियम अन्य विशेषताओं के अनुसार है।
- हम फ़ीचर प्रकार A को 1x3 पिक्सेल ब्लॉक के रूप में परिभाषित नहीं कर सकते क्योंकि मध्य पिक्सेल को विभाजित नहीं किया जा सकता है, और इसे खुद से घटाकर 1x2 पिक्सेल ब्लॉक के समान है; यह सुविधा प्रकार केवल चौड़ाई के लिए भी परिभाषित किया गया है। साथ ही, सुविधा प्रकार C की चौड़ाई 3 से विभाज्य होनी चाहिए, और यह नियम अन्य विशेषताओं के अनुसार है।
- हम ०.० की चौड़ाई और / या ऊंचाई के साथ एक सुविधा को परिभाषित नहीं कर सकते हैं, इसलिए हम x और y को २४ शून्य से सुविधा के आकार में बदल देते हैं।
इन मान्यताओं के आधार पर, मैंने संपूर्ण सेट को गिना है:
const int frameSize = 24;
const int features = 5;
// All five feature types:
const int feature[features][2] = {{2,1}, {1,2}, {3,1}, {1,3}, {2,2}};
int count = 0;
// Each feature:
for (int i = 0; i < features; i++) {
int sizeX = feature[i][0];
int sizeY = feature[i][1];
// Each position:
for (int x = 0; x <= frameSize-sizeX; x++) {
for (int y = 0; y <= frameSize-sizeY; y++) {
// Each size fitting within the frameSize:
for (int width = sizeX; width <= frameSize-x; width+=sizeX) {
for (int height = sizeY; height <= frameSize-y; height+=sizeY) {
count++;
}
}
}
}
}
परिणाम 162,336 है ।
एक ही तरीका है कि मैं "180,000 से अधिक" वियोला और जोन्स के बारे में बात करने के लिए पाया, # 4 धारणा को छोड़ रहा है और कोड में बगों को पेश करके। इसमें क्रमशः चार लाइनें बदलना शामिल है:
for (int width = 0; width < frameSize-x; width+=sizeX)
for (int height = 0; height < frameSize-y; height+=sizeY)
परिणाम फिर 180,625 है । (ध्यान दें कि यह प्रभावी रूप से सुविधाओं को कभी भी सबफ़्रेम के दाएं और / या नीचे छूने से रोक देगा।)
अब निश्चित रूप से सवाल: क्या उन्होंने अपने कार्यान्वयन में गलती की है? क्या यह शून्य की सतह के साथ सुविधाओं पर विचार करने के लिए कोई मतलब है? या मैं इसे गलत तरीके से देख रहा हूं?