CVPR 2015 Code List

카테고리 없음 2015. 7. 26. 02:58

글자수 제한 같은거 있어서 짤릴지 모르겠는데, 암튼 올려 봅니다.

학생들에게 논문은 두 종류로 나뉘죠. 소스코드가 있는 것과 그렇지 않은 걸로....

cvpr 2015 논문 중에서 소스코드가 있는 것들만 추려 봤는데, 다는 못 찾은 거 같고 절반 이상은 찾은 거 같습니다.

이미 공개된 것과 공개 예정인 것으로 나눠봤습니다. 

논문에는 공개했다고 써놓고, 실제로 사이트 가보면 coming soon이라고 되있는 것들도 꽤 있네요.

========================================================

이미 공개

Andelo Martinovic et. al.
3D All The Way: Semantic Segmentation of Urban Scenes From Start to End in 3D
https://bitbucket.org/amartino/facade3d

Z. Wu, S. Song, A. Khosla, F. Yu, L. Zhang, X. Tang and J. Xiao
3D ShapeNets: A Deep Representation for Volumetric Shape Modeling
http://3dshapenets.cs.princeton.edu/3DShapeNetsCode.zip

Sebastian Haner, Kalle Åström
Absolute Pose for Cameras Under Flat Refractive Interfaces
http://github.com/sebhaner/refractive_pose

Hae-Gon Jeon, Jaesik Park, Gyeongmin Choe, Jinsun Park, Yunsu Bok, Yu-Wing Tai and In So Kweon
Accurate Depth Map Estimation from a Lenslet Light Field Camera
https://drive.google.com/…/0B2553ggh3QTcS01zU0RjOG5FTjQ/view

Christoph Käding, Alexander Freytag, Erik Rodner, Paul Bodesheim, and Joachim Denzler
Active Learning and Discovery of Object Categories in the Presence of Unnameable Instances
https://github.com/cvjena/

Epameinondas Antonakos, Joan Alabort-i-Medina, Stefanos Zafeiriou
Active Pictorial Structures
http://www.menpo.org/

Fabian Caba Heilbron, Victor Escorcia, Bernard Ghanem and Juan Carlos Niebles
ActivityNet: A Large-Scale Video Benchmark for Human Activity Understanding
http://activity-net.org

David Perra, Rohit Kumar Gupta, Jan-Micheal Frahm
Adaptive Eye-Camera Calibration for Head-Worn Devices
http://cs.unc.edu/~jmf/publications/gaze_release.7z

Neel Shah, Vladimir Kolmogorov and Christoph H. Lampert.
A Multi-Plane Block-Coordinate Frank-Wolfe Algorithm for Training Structural SVMs with a Costly max-Oracle.
http://pub.ist.ac.at/~vnk/software/SVM-v1.02.zip

Bo Xin, Yuan Tian, Yizhou Wang, Wen Gao
Background Subtraction via Generalized Fused Lasso Foreground Modeling
http://idm.pku.edu.cn/st…/wangyizhou/code/code_bs_cvpr15.rar

Peixian Chen, Naiyan Wang, Nevin L. Zhang, and Dit-Yan Yeung. 
Bayesian adaptive matrix factorization with automatic model selection 
http://peixianc.me/amf_codes.zip

Tali Dekel, Shaul Oron, Michael Rubinstein, Shai Avidan, William T. Freeman
Best-Buddies Similarity for Robust Template Matching
http://people.csail.mit.edu/…/BBS_code_and_data_release_v1.…

Balntas, Vassileios and Tang, Lilian and Mikolajczyk, Krystian,
BOLD - Binary Online Learned Descriptor For Efficient Image Matching,
https://github.com/vbalnt/bold

C. Xu, S.-H. Hsieh, C. Xiong, and J. J. Corso. 
Can humans fly? Action understanding with multiple classes of actors
http://web.eecs.umich.edu/~jjcorso/r/a2d/

amélie royer, christoph h. lampert. 
"classifier adaptation at prediction time"
http://pub.ist.ac.at/…/Classifier_Adaptation_At_Prediction_…

Nebehay, Georg and Pflugfelder, Roman
Clustering of Static-Adaptive Correspondences for Deformable Object Tracking
https://github.com/gnebehay/CppMT

Xiao, Yao and Lu, Cewu and Tsougenis, Efstratios and Lu, Yongyi and Tang, Chi-Keung,
Complexity-Adaptive Distance Metric for Object Proposals Generation
http://www.cse.ust.hk/~yxiaoab/cvpr2015/files/Release.zip

Chris Sweeney Laurent Kneip Tobias H¨ollerer Matthew Turk
Computing Similarity Transformations from Only Image Correspondences
http://cs.ucsb.edu/~cmsweeney/theia/

Seungryung Kim, Dongbo Min, Bumsub Ham, Seungchul Ryu, Minh N. Do, and Kwanghoon Sohn,
DASC: Dense Adaptive Self-Correlation Descriptor for Multi-modal and Multi-spectral Correspondence
http://seungryong.github.io/…/DASCdescriptor_CVPR2015_v1.0.…

Nguyen A, Yosinski J, Clune J. 
"Deep Neural Networks are Easily Fooled: High Confidence Predictions for Unrecognizable Images".
https://github.com/Evolving-AI-Lab/fooling

Andrej Karpathy, Li Fei-Fei
Deep Visual-Semantic Alignments for Generating Image Descriptions
https://github.com/karpathy/neuraltalk

Fatma Güney and Andreas Geiger
Displets: Resolving Stereo Ambiguities using Object Knowledge
http://www.cvlibs.net/projects/displets/

J. Dong and S. Soatto. 
Domain-Size Pooling in Local Descriptors: DSP-SIFT.
http://vision.ucla.edu/~jingmi…/…/dsp/dsp_toolbox_v0.0.2.zip

Wulff and Black, 
"Efficient Sparse-to-Dense Optical Flow Estimation using a Learned Basis and Layers
https://github.com/jswulff/pcaflow

Philippe Weinzaepfel, Jerome Revaud, Zaid Harchaoui and Cordelia Schmid
EpicFlow: Edge-Preserving Interpolation of Correspondences for Optical Flow
http://pascal.inrialpes.fr/…/epicf…/files/EpicFlow_v1.00.zip

Yan Li et. al.
Face Video Retrieval with Image Query via Hashing across Euclidean Space and Riemannian Manifold
http://vipl.ict.ac.cn/resources/codes

Jon Long, Evan Shelhamer, Trevor Darrell
Fully Convolutional Networks for Semantic Segmentation
http://www.cs.berkeley.edu/~jonlong/

Xiangyu Zhu, Zhen Lei, Junjie Yan, Dong Yi, Stan Z. Li, 
“High-Fidelity Pose and Expression Normalization for Face Recognition in the Wild”
http://www.cbsr.ia.ac.cn/…/xiangyuzhu/projects/HPEN/main.htm

S. H. Khatoonabadi, N. Vasconcelos, I. V. Bajić, and Y. Shan, 
How many bits does it take for a stimulus to be salient?"
http://mcl.ensc.sfu.ca/software/kvbs_cvpr2015.rar
http://www.svcl.ucsd.edu/projects/hossein/kvbs_cvpr2015.rar

Yuting Zhang, Kihyuk Sohn, Ruben Villegas, Gang Pan, Honglak Lee, 
Improving Object Detection with Deep Convolutional Networks via Bayesian Optimization and Structured Prediction
https://github.com/YutingZhang/fgs-obj

Hoo-Chang Shin Le Lu Lauren Kim Ari Seff Jianhua Yao Ronald M. Summers
Interleaved Text/Image Deep Mining on a Large-Scale Radiology Database
https://github.com/rsummers11/CADLab

A. Milan, L. Leal-Taixe, K. Schindler and I. Reid
Joint Tracking and Segmentation of Multiple Targets
https://bitbucket.org/amilan/segtracking

Ganzhao Yuan, and Bernard Ghanem. 
l0TV: A New Method for Image Restoration in the Presence of Impulse Noise.
http://yuanganzhao.weebly.com/uploa…/…/7/5/10759809/l0tv.zip

D. Sun, E. B. Sudderth, and H. Pfister 
Layered RGBD Scene Flow Estimation
http://people.seas.harvard.edu/…/2015/rgbd_layered_flow_cod…

Sergey Zagoruyko, Nikos Komodakis, 
Learning to Compare Image Patches via Convolutional Neural Networks"
https://github.com/szagoruyko/cvpr15deepcompare

Jeff Donahue et. al.
Long-term Recurrent Convolutional Networks for Visual Recognition and Description},
http://jeffdonahue.com/lrcn/

A. Shekhovtsov, P. Swoboda and B. Savchynskyy
Maximum Persistency via Iterative Relaxed Inference with Graphical Models
http://cmp.felk.cvut.cz/~shekhovt/persistency/

Zhibin Hong, Zhe Chen, Chaohui Wang, Xue Mei, Danil Prokhorov, and Dacheng Tao
MUlti-Store Tracker (MUSTer): a Cognitive Psychology Inspired Approach to Object Tracking", 
https://sites.google.com/…/multistore…/MUSTer_code_v1.1.zip…

Visesh Chari Simon Lacoste-Julieny Ivan Laptev Josef Sivic
On Pairwise Costs for Network Flow Multi-Object Tracking
https://github.com/viseshchari/TrackingNetFlow

Shengcai Liao, Yang Hu, Xiangyu Zhu, and Stan Z. Li, 
"Person Re-identification by Local Maximal Occurrence Representation and Metric Learning."
http://www.cbsr.ia.ac.cn/users/scliao/projects/lomo_xqda/

Ijaz Akhter and Michael J. Black
Pose-Conditioned Joint Angle Limits for 3D Human Pose Reconstruction
http://poseprior.is.tue.mpg.de/

G. Tzimiropoulos, 
"Project-Out Cascaded Regression with an application to Face Alignment",
https://www.dropbox.com/s/wtiuv36lji6ds60/po_cr_code_v1.zip…

YiChang Shih, Dilip Krishnan, Fredo Durand, William T. Freeman
Reflection Removal Using Ghosting Cues
https://www.dropbox.com/s/gah3aw…/dereflection_06102015.zip…

B. Ham, M. Cho, J. Ponce
Robust Image Filtering Using Joint Static and Dynamic Guidance
http://www.di.ens.fr/…/sdfil…/code/sdfilter-release-v1.1.zip

Changyang Li, Yuchen Yuan, Weidong Cai1, Yong Xia, and David Dagan Feng
Robust Saliency Detection via Regularized Random Walks Ranking
http://sydney.edu.au/…/~y…/cvpr2015/rrwr_matlab_cvpr2015.zip

W. Wang, J. Shen, F. Porikli, 
Saliency-aware geodesic video object segmentation, 
https://github.com/shenjianbing/SaliencySeg

Yin Wang, Caglayan Dicle, Mario Sznaier and Octavia Camps
Self Scaled Regularized Robust Regression
http://robustsystems.coe.neu.edu/…/sys…/code/CVPR15_S2R3.zip

Jia-Bin Huang, Abhishek Singh, and Narendra Ahuja, 
Single Image Super-Resolution from Transformed Self-Exemplars
https://github.com/jbhuang0604/SelfExSR

Fang Wang, Le Kang, and Yi Li
Sketch-based 3D Shape Retrieval using Convolutional Neural Networks
http://users.cecs.anu.edu.au/~yili/cnnsbsr/

Julian Straub, Trevor Campbell, Jonathan P. How, John W. Fisher III. 
"Small-Variance Nonparametric Clustering on the Hypersphere"
https://github.com/jstraub/dpMMlowVar

Yan Xia, Kaiming He, Pushmeet Kohli, and Jian Sun
Sparse Projections for High-Dimensional Binary Codes
http://research.microsoft.com/…/people/kahe/cvp…/spbe_v1.zip

Fumin Shen, Chunhua Shen, Wei Liu, Heng Tao Shen, 
"Supervised Discrete Hashing"
https://github.com/bd622/DiscretHashing

Zuffi, Silvia and Black, Michael J.
The Stitched Puppet: A Graphical Model of 3D Human Shape and Pose,
http://stitch.is.tue.mpg.de/pre_download

Y. Verdie, K. M. Yi, P. Fua, and V. Lepetit. 
"TILDE: A Temporally Invariant Learned DEtector.",
https://github.com/kmyid/TILDE/tree/v1.0.1

Abhijit Bendale, Terrance Boult
Towards OpenWorld Recognition
http://vast.uccs.edu/OpenWorld

Simone Frintrop, Thomas Werner, and Germán Martín García
Traditional Saliency Reloaded: A Good Old Model in New Shape 
http://www.iai.uni-bonn.de/~frintrop/vocus2-version1.0.tgz

Aravindh Mahendran and Andrea Vedaldi. 
"Understanding deep image representations by inverting them."
https://github.com/aravindhm/deep-goggle

Joan Alabort-i-Medina1, Stefanos Zafeiriou1
Unifying Holistic and Parts-Based Deformable Model Fitting
http://www.menpo.org/

M. Cho, S. Kwak, C. Schmid, J. Ponce
Unsupervised Object Discovery and Localization in the Wild: Part-based Matching with Bottom-up Region Proposals
http://www.di.ens.fr/w…/research/objectdiscovery/UODL_v1.zip

Chenxia Wu et. al. 
Watch-n-Patch: Unsupervised Understanding of Actions and Relations
http://watchnpatch.cs.cornell.edu/

Fatemeh Shokrollahi Yancheshmeh et. al.
Unsupervised Visual Alignment with Similarity Graphs
https://bitbucket.org/kamara…/image_alignment-code/wiki/Home

=========================================================
공개 예정

Yongfang Cheng, Jose A Lopez, Octavia Camps, Mario Sznaier
A Convex Optimization Approach to Robust Fundamental Matrix Estimation
http://robustsystems.coe.neu.edu/?q=content/publications

L. Wang, Y. Qiao, and Xiaoou Tang, 
Action Recognition with Trajectory-Pooled Deep-Convolutional Descriptors,
https://wanglimin.github.io/tdd/index.html

Marcus A. Brubaker, Ali Punjani and David Fleet
"Building Proteins in a Day: Efficient 3D Molecular Reconstruction"
http://www.cs.toronto.edu/~mbrubake/

Ross Girshick Forrest Iandola Trevor Darrell Jitendra Malik
Deformable Part Models are Convolutional Neural Networks
http://www.cs.berkeley.edu/~rbg/

Ching L. Teo, Cornelia Fermüller, Yiannis Aloimonos
Fast 2D Border Ownership Assignment
http://www.umiacs.umd.edu/~cteo/BOWN_SRF/

Saurabh Singh, Derek Hoiem and David Forsyth. 
Learning a Sequential Search for Landmarks 
http://vision.cs.uiuc.edu/projects/lssland/

Paul Wohlhart and Vincent Lepetit
Learning Descriptors for Object Recognition and 3D Pose Estimation
https://cvarlab.icg.tugraz.at/projects/3d_object_detection/

Philippe Weinzaepfel Jerome Revaud Zaid Harchaoui Cordelia Schmid
Learning to Detect Motion Boundaries
http://lear.inrialpes.fr/research/motionboundaries/

Mi Zhang, Jian Yao*, Menghan Xia, Yi Zhang, Kai Li, and Yaping Liu. 
"Line-Based Multiple Label Energy Optimization for Fisheye Image Rectification and Calibration
http://cvrs.whu.edu.cn/projects/FIRC/

Xufeng Han et. at.
MatchNet: Unifying Feature and Metric Learning for Patch-based Matching
http://www.cs.unc.edu/~xufeng/matchnet/

Sean Bell, Paul Upchurch, Noah Snavely, Kavita Bala
Material Recognition in the Wild with the Materials in Context Database
http://opensurfaces.cs.cornell.edu/publications/minc/…

Yu-Wei Chao, Zhan Wang, Rada Mihalcea, and Jia Deng. 
Mining Semantic Affordances of Visual Object Categories
http://www-personal.umich.edu/~ywchao/semantic_affordance/

Moritz Menze and Andreas Geiger
Object Scene Flow for Autonomous Vehicles
http://www.cvlibs.net/projects/objectsceneflow/

Jeong-Kyun Lee and Kuk-Jin Yoon
Real-time Joint Estimation of Camera Orientation and Vanishing Points
https://cvl.gist.ac.kr/…/real-time-joint-estimation-of-came…

Hyung Jin Chang Yiannis Demiris
Unsupervised Learning of Complex Articulated Kinematic Structures combining Motion and Skeleton Information
https://hyungjinchang.wordpress.com/…/kinematic-structure-…/

High Dynamic Range Imaging(HDR)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// Reference : http://docs.opencv.org/3.0.0/d3/db7/tutorial_hdr_imaging.html
// Examples : High Dynamic Range Imaging(HDR)
 
#include <cv.hpp>
#include <iostream>
#include <fstream>
 
using namespace std;
using namespace cv;
 
void loadExposureSqe(String path, vector<Mat>& images, vector<float>&times)
{
    path = path + std::string("/");
    ifstream list_file((path + "list.txt").c_str());
 
    string name;
    float val;
 
    while (list_file >> name >> val) {
        Mat img = imread(path + name);
        images.push_back(img);
        times.push_back(1 / val);
    }
 
    list_file.close();
}
 
int main()
{
    vector<Mat> images;
    vector<float> times;
    loadExposureSqe("hdr/exposures", images, times);
 
    Mat response;
    Ptr<CalibrateDebevec>  calibrate = createCalibrateDebevec();
    calibrate->process(images, response, times);
 
    Mat hdr;
    Ptr<MergeDebevec> merge_debevec = createMergeDebevec();
    merge_debevec->process(images, hdr, times, response);
 
    Mat ldr;
    Ptr<TonemapDurand> tonemap = createTonemapDurand(2.2f);
    tonemap->process(hdr, ldr);
 
    Mat fusion;
    Ptr<MergeMertens> merge_mertens = createMergeMertens();
    merge_mertens->process(images, fusion);
 
    imwrite("hdr/fusion.png", fusion * 255);
    imwrite("hdr/ldr.png", ldr * 255);
    imwrite("hdr/hdr.hdr", hdr);
    
    return 0;
}
cs






 

    hdr.zip





OpenCV Principal Component Analysis(PCA)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <cv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
 
void drawAxis(Mat &img, Point p, Point q, Scalar colour, const float scale = 0.2)
{
    double angle;
    double hypotenuse;
    angle = atan2((double)p.y - q.y, (double)p.x - q.x);
    hypotenuse = sqrt((double)(p.y - q.y) * (p.y - q.y) + (p.x - q.x) * (p.x - q.x));
 
    // Here we lengthen the arrow by a factor of scale
    q.x = (int)(p.x - scale * hypotenuse * cos(angle));
    q.y = (int)(p.y - scale * hypotenuse * sin(angle));
    line(img, p, q, colour, 1, CV_AA);
 
    // create the arrow hooks
    p.x = (int)(q.x + 9 * cos(angle + CV_PI / 4));
    p.y = (int)(q.y + 9 * sin(angle + CV_PI / 4));
    line(img, p, q, colour, 1, CV_AA);
    
    p.x = (int)(q.x + 9 * cos(angle - CV_PI / 4));
    p.y = (int)(q.y + 9 * sin(angle - CV_PI / 4));
    line(img, p, q, colour, 1, CV_AA);
}
 
double getOrientation(const vector<Point> &pts, Mat &img)
{
    // construct a buffer used by the pca analysis
    int sz = static_cast<int>(pts.size());
    Mat data_pts = Mat(sz, 2, CV_64FC1);
 
    for (int i = 0; i < data_pts.rows; ++i)
    {
        data_pts.at<double>(i, 0= pts[i].x;
        data_pts.at<double>(i, 1= pts[i].y;
    }
 
    //Perform PCA analysis
    PCA pca_analysis(data_pts, Mat(), CV_PCA_DATA_AS_ROW);
 
    //Store the center of the object
    Point cntr = Point(static_cast<int>(pca_analysis.mean.at<double>(00)), 
        static_cast<int>(pca_analysis.mean.at<double>(01)));
 
    //Store and eigenvalues and eigenvectors
    vector<Point2d> eigen_vecs(2);
    vector<double> eigen_val(2);
 
    for (int i = 0; i < 2++i)
    {
        eigen_vecs[i] = Point2d(pca_analysis.eigenvectors.at<double>(i, 0),
            pca_analysis.eigenvectors.at<double>(i, 1));
 
        eigen_val[i] = pca_analysis.eigenvalues.at<double>(i, 0);
    }
 
    //Draw the principal components
    circle(img, cntr, 3, Scalar(2550255), 2);
    Point p1 = cntr + 0.02 * Point(static_cast<int>(eigen_vecs[0].x * eigen_val[0]), 
        static_cast<int>(eigen_vecs[0].y * eigen_val[0]));
    Point p2 = cntr - 0.02 * Point(static_cast<int>(eigen_vecs[1].x * eigen_val[1]), 
        static_cast<int>(eigen_vecs[1].y * eigen_val[1]));
    
    drawAxis(img, cntr, p1, Scalar(02550), 1);
    drawAxis(img, cntr, p2, Scalar(2552550), 5);
    
    // orientation in radins
    double angle = atan2(eigen_vecs[0].y, eigen_vecs[0].x);
 
    return angle;
}
 
int main()
{
    Mat src = imread("img/pca_test1.jpg");
 
    if (!src.data || src.empty())
    {
        cout << "can't not load image" << endl;
        return EXIT_FAILURE;
    }
 
    imshow("Src", src);
 
    //Convert Image to grayScale
    Mat gray;
    cvtColor(src, gray, COLOR_BGR2GRAY);
 
    // Convert image to Binary
    Mat bw;
    threshold(gray, bw, 50.255., CV_THRESH_BINARY || CV_THRESH_OTSU);
    
    // Find all the contours in the thresholded image
    vector<Vec4i> hierarchy;
    vector<vector<Point>> contours;
    findContours(bw, contours, hierarchy, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
 
    for (size_t i = 0; i < contours.size(); ++i)
    {
        // Calculate the area of each contour
        double area = contourArea(contours[i]);
 
        if (area < 1e2 || 1e5 < area)
            continue;
 
        drawContours(src, contours, static_cast<int>(i), Scalar(00255), 28, hierarchy, 0);
        getOrientation(contours[i], src);
    }
 
    imshow("output", src);
    
    waitKey(0);
    return 0;
}
cs





OpenCV Scene Change Detection(장면 전환 검출)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// http://docs.opencv.org/3.0.0/d5/dc4/tutorial_video_input_psnr_ssim.html
// Base Examples : Video Input with OpenCV and similarity measurement
 
#include <cv.hpp>
#include <string>
#include <iostream>
 
using namespace std;
using namespace cv;
 
double getPSNR(const Mat& I1, const Mat& I2)
{
    Mat s1;
    absdiff(I1, I2, s1);       // |I1 - I2|
    s1.convertTo(s1, CV_32F);  // cannot make a square on 8 bits
    s1 = s1.mul(s1);           // |I1 - I2|^2
    Scalar s = sum(s1);        // sum elements per channel
    double sse = s.val[0+ s.val[1+ s.val[2]; // sum channels
 
    if (sse <= 1e-10// for small values return zero
        return 0;
    
    double mse = sse / (double)(I1.channels() * I1.total());
    double psnr = 10.0*log10((255 * 255/ mse);
    return psnr;
}
 
void merge(const Mat &m1, const Mat &m2, Mat &result)
{
    resize(result, result, Size(m1.cols + m2.cols, m1.rows));
    
    m1.copyTo(result(Rect(00, m1.cols, m1.rows)));
    m2.copyTo(result(Rect(m1.cols, 0, m2.cols, m2.rows)));
 
    putText(result, "Normal Video", cvPoint(3030),
        FONT_HERSHEY_COMPLEX_SMALL, 1.0, cvScalar(200200250), 1, CV_AA);
 
    putText(result, "Scene Change Detection", cvPoint(m1.cols + 3030),
        FONT_HERSHEY_COMPLEX_SMALL, 1.0, cvScalar(200200250), 1, CV_AA);
}
 
int main()
{
    stringstream conv;
    char c;
    int frameNum = -1// Frame counter
    double psnrV, CHANGE_DETECT_RATIO = 15.0;
    string videoPath = "video/Megamind.avi";
 
    VideoCapture cap(videoPath);
        
    // file open
    if (!cap.isOpened()) {
        cout << "Could not open video - " << videoPath << endl;
        return -1;
    }
    Size s = Size((int)cap.get(CAP_PROP_FRAME_WIDTH), (int)cap.get(CAP_PROP_FRAME_HEIGHT));
    Mat prevFrame, currFrame, changeFrame, result(s, CV_8UC3);
    
    namedWindow("Scene Change Detection");
    resizeWindow("Scene Change Detection", s.width * 2, s.height);
    
    while (1)
    {
        ++frameNum;
        cap >> currFrame;
 
        if (frameNum < 1) {
            prevFrame = currFrame.clone();
            changeFrame = currFrame.clone();
            continue;
        }
        
        if (currFrame.rows == 0 && currFrame.cols == 0)
            break;
 
        psnrV = getPSNR(prevFrame, currFrame);
        
        if (psnrV < CHANGE_DETECT_RATIO)
            changeFrame = currFrame.clone();
        
        merge(currFrame, changeFrame, result);
        imshow("Scene Change Detection", result);
 
        if (frameNum % 2 == 0)
            prevFrame = currFrame.clone();
 
        c = (char)waitKey(10);
        
        if (c == 27)
            break;
    }
 
    return 0;
}
cs




Image Segmentation with Distance Transform and Watershed Algorithm


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <cv.hpp>
#include <iostream>
 
using namespace std;
using namespace cv;
 
int DELAY_CAPTION = 1500;
char window_name[] = "Watershed Demo";
Mat src;
 
int display_caption(char *caption, Mat input);
 
int main()
{
    src = imread("img/card2.png");
 
    if (!src.data)
        return -1;
        
    display_caption("source Image", src);
 
    for (int x = 0; x < src.rows; x++) {
        for (int y = 0; y < src.cols; y++) {
            if (src.at<Vec3b>(x, y) == Vec3b(255255255)) {
                src.at<Vec3b>(x, y)[0= 0;
                src.at<Vec3b>(x, y)[1= 0;
                src.at<Vec3b>(x, y)[2= 0;
            }
        }
    }
 
    Mat kernel = (Mat_<float>(3,3<< 111,
                                      1-81,
                                      111);
 
    Mat imgLaplacian;
    Mat sharp = src;
    filter2D(sharp, imgLaplacian, CV_32F, kernel);
    src.convertTo(sharp, CV_32F);
    Mat imgResult = sharp - imgLaplacian;
 
    imgResult.convertTo(imgResult, CV_8UC3);
    imgLaplacian.convertTo(imgLaplacian, CV_8UC3);
 
    display_caption("New Sharped Image", imgResult);
    display_caption("New Sharped Image Laplacian", imgLaplacian);
 
    src = imgResult;
 
    Mat bw;
    cvtColor(src, bw, CV_BGR2GRAY);
    threshold(bw, bw, 40255, CV_THRESH_BINARY | CV_THRESH_OTSU);
 
    Mat dist;
 
    // CV_DIST_L2 = Euclidean distance
    distanceTransform(bw, dist, CV_DIST_L2, 3);
 
    normalize(dist, dist, 01., NORM_MINMAX);
    display_caption("Distance Transform Image", dist);
 
    threshold(dist, dist, .41., CV_THRESH_BINARY);
 
    Mat kernel1 = Mat::ones(33, CV_8UC1);
    dilate(dist, dist, kernel1);
    display_caption("peaks point", dist);
 
    Mat dist_8U;
    dist.convertTo(dist_8U, CV_8U);
    
    vector<vector<Point>> contours;
    findContours(dist_8U, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
 
    Mat markers = Mat::zeros(dist.size(), CV_32SC1);
 
    for (size_t i = 0; i < contours.size(); i++)
        drawContours(markers, contours, static_cast<int>(i), Scalar::all(static_cast<int>(i)+1));
 
    circle(markers, Point(55), 3, CV_RGB(255255255), -1);
    display_caption("Marker", markers * 10000);
 
    watershed(src, markers);
 
    Mat mark = Mat::zeros(markers.size(), CV_8UC1);
    markers.convertTo(mark, CV_8UC1);
    bitwise_not(mark, mark);
    
    display_caption("Markers_v2", mark);
 
    vector<Vec3b>colors;
 
    for (size_t i = 0; i < contours.size(); i++)
    {
        int b = theRNG().uniform(0255);
        int g = theRNG().uniform(0255);
        int r = theRNG().uniform(0255);
 
        colors.push_back(Vec3b((uchar)b, (uchar)g, (uchar)r));
    }
 
    Mat dst = Mat::zeros(markers.size(), CV_8UC3);
 
    for (int i = 0; i < markers.rows; i++)
    {
        for (int j = 0; j < markers.cols; j++)
        {
            int index = markers.at<int>(i, j);
            if (index > 0 && index <= static_cast<int>(contours.size()))
                dst.at<Vec3b>(i, j) = colors[index - 1];
            else
                dst.at<Vec3b>(i, j) = Vec3b(000);
        }
    }
 
    display_caption("Final", dst);
 
    waitKey(0); 
    
    return 0;
}
 
int display_caption(char *caption, Mat input)
{
    Mat dst;
    dst = Mat::zeros(input.size(), input.type());
    
    putText(dst, caption, Point(src.cols / 4, src.rows / 2), FONT_HERSHEY_COMPLEX, 1, Scalar(255255255));
 
    imshow(window_name, dst);
    int c = waitKey(DELAY_CAPTION);
 
    if (c >= 0)
        return -1;
 
    imshow(window_name, input);
    
    c = waitKey(DELAY_CAPTION);
 
    if (c >= 0)
        return -1;
    return 0;
}
 
cs

 




OpenCV Image Filtering

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// Reference : http://docs.opencv.org/3.0.0/dc/dd3/tutorial_gausian_median_blur_bilateral_filter.html
// Examples : Smoothing Images
 
#include <iostream>
#include <cv.hpp>
#include <windows.h>
 
using namespace std;
using namespace cv;
 
int DELAY_CAPTION = 1500;
int DELAY_BLUR = 100;
int MAX_KERNEL_LENGTH = 31;
 
int display_caption(char *caption);
int display_dst(int delay);
char window_name[] = "Filter Demo 1";
 
Mat src, dst;
 
int main()
{
    namedWindow(window_name);
    
    Sleep(2000);
 
    src = imread("img/lena.bmp");
 
    if (display_caption("Original Image"!= 0)
        return 0;
 
    dst = src.clone();
    if (display_dst(DELAY_CAPTION) != 0)
        return 0;
    
    
    for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2)
    {
        blur(src, dst, Size(i, i), Point(-1-1));
        if (display_dst(DELAY_BLUR) != 0)
            return 0;
 
        if (display_caption("Gaussian Blur"!= 0)
            return 0;
 
        for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2)
        {
            GaussianBlur(src, dst, Size(i, i), 00);
            if (display_dst(DELAY_BLUR) != 0)
                return 0;
        }
 
        if (display_caption("Median Blur"!= 0)
            return 0;
 
        for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2)
        {
            medianBlur(src, dst, i);
            if (display_dst(DELAY_BLUR) != 0)
                return 0;
        }
 
        if (display_caption("Bilateral Blur"!= 0)
            return 0;
        
        for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2)
        {
            bilateralFilter(src, dst, i, i * 2, i / 2);
            if (display_dst(DELAY_BLUR) != 0)
                return 0;
        }
 
        display_caption("End");
 
        waitKey(0);
        return 0;
    }
}
 
int display_caption(char *caption)
{
    dst = Mat::zeros(src.size(), src.type());
    putText(dst, caption, Point(src.cols / 4, src.rows / 2), FONT_HERSHEY_COMPLEX, 1, Scalar(255255255));
 
    imshow(window_name, dst);
    int c = waitKey(DELAY_CAPTION);
    if (c >= 0)
        return -1;
    
    return 0;
}
 
int display_dst(int delay)
{
    imshow(window_name, dst);
    int c = waitKey(delay);
    if (c >= 0)
        return -1;
    
    return 0;
}
cs





CVPR 2015 컴퓨터 비전 및 패턴인식 워크샵

컴퓨터비전/영상처리 2015. 7. 4. 00:28

2015 컴퓨터 비전 및 패턴인식 워크샵이 15년 7월 3일 금요일에 숙명여대에서 젬마홀에서 개최되었습니다.


프로그램은 아래 일정과 같이 진행되었습니다.



전반적인 강의 내용은 자동주행 자동차와 관련된 컴퓨터비전 이론(3D reconstruction, face recognition, 

object tracking etc..)


을 기반으로 강의가 구성되었습니다.



각각의 강의 내용을 간략히 요약하자면 다음과 같습니다.



Tutorial 1. 현대모비스 신광근 박사


 전반적으로 자율주행 기술동향을 여러 나라의 자동차 회사를 기반으로 소개하며 overview해주셨습니다.


2005년, 스텐포드와 카네기 대학에서 자율주행로봇에 관한 연구를 진행하였고, 자동 주행 자동차가 등장하기 시작하였습니다.


2010년, 구글이 자율주행 자동차 산업에 뛰어들며 현재 많은 IT기업들이 자율주행 자동차 산업 발전에 기여하고 있습니다.


또한 최근 Apple 또한 자율주행 자동차 산업에 뛰어 들어 많은 기업들이 시제품 출시를 위해 경쟁하고 있다고 설명해주셨습니다.


자율 주행 자동차 산업의 기반 시스템으로는 cloud computing, 우버(자율주행 taxi), 지도 시스템이 있다고 말씀하셨습니다.



 현재는 보통 주행환경이 단순한 고속도로 부터 자율주행 시스템을 도입할 예정이고 점차 복잡한 시내로 퍼져나갈 것이며


현대자동차는 Highway Driving Assist(고속도로 운전 도움 System)을 현재 자동차에 탑제해 판매중이라고 말씀하셧씁니다.


2020년 까지 고속도로에서 완벽한 자율주행을 목표하고 있다고 말씀하셧습니다.



 물체인식 기반 시스템은 많이 발전하였지만(거의 완성), 자동차가 주행하고 있는 주행공간 인식은 아직 걸음마 단계고 많이


부족하다며 이쪽 분야 연구가 많이 이루어 저야 한다고 하셧습니다.(터널, 가로등, 고가도로, 신호등 등..)


또한 자동주행시 초음파, 레이더, 카메라 종류를 현재 사용하고 있으며 고가의 레이더, 초음파 장비를 사용하면


높은 정확성을 보장할 수 있지만, 가격으로 인해 양산이 불가능 하다며 현재는 보다 값 싼 장비로 최상의 성능을 끌어 올리는


방향으로 연구 중이라고 하셧습니다.



 앞으로 정밀지도(차선위치, 현재위치, 차선좌표, 가로등, 가드레일, 횡단보도)를 개발하여 현재 자동차의 


주행 위치(Localization-도로와 지도를 보고 현재 위치 매칭, 도로 위에 marker를 설정하고 지도에 표시된


정보를 비교해 현재 위치를 파악, Visual SLAM과 유사) 를 기반으로 다양한 어플리케이션(주차 가능 위치 파악 등..)


을 개발중이라고 말씀하셨습니다.




Tutorial 2. 한양대학교 정호기 교수


주제 : stixel기반 장애물 Depth 추정(각각의 객체에 대한 움직임 optical flow추정)


Stixel을 기반으로 추출한 데이터를 기반으로 각각 객체에 대한 object recognition을 수행해 상황 인지 및 판단 연구를 진행


과정을 설명해 주셨습니다.



지도의 feature와 현재 검출된 feature descriptor를 비교해 현재 자동차의 위치를 도출하는 것은 아직 도로 변화 대응에 미숙


하다는 문제가 있습니다. 따라서 변화(날씨, 온도, 눈, 비) 등에 강건한 descriptor 생성은 어려운 문제라고 하셧습니다.


따라서 descriptor를 기반으로 현재 위치를 파악하는 것 보다 도로위에 존재하는 각각의 물체(신호등, 도로 위 화살표, 마커) 등을 


미리 지도에 입력해 두고 자동차에서 카메라로 물체를 detect하게 되면 검출된 물체 위치를 기반으로 물체에 대한 거리를 판단해


현재 위치를 판단하는 방법을 사용중이며 인식률이 좋은 결과를 도출하셧다고 하셧습니다.


현재 자율 주행 자동차의 성능 평가를 위해 데이터 수집의 어려움이 있지만, [KITTI]를 사용하면 데이터 셋을 오픈소스로


제공해 주어 데이터 수집에 관한 어려움이 적어졌다고 하셧고 또한 [Cityscape DataSet] 이 15년도 말에 공개될 것이라고 


하셧습니다.



초청강의1. 아주대학교 허용석 교수


3D reconstruction에 관해 설명하셧습니다. 이론적인 내용이라 따로 정리하지 않겠습니다.


여러장의 사진을 사용할 경우 보통 Epipolar Line을 사용하는 경우가 많고,


parzen filter보다 MRF가 더 좋은 성능을 내는 것을 말씀해 주셨습니다.



초청강의2. 서강대학교 박운상 교수


스마트 카에 관련된 강의를 해 주셨고 앞으로의 발전 방향에 대해 언급하셧습니다.


또한 랩실에서 진행했던 과제와 얼굴 인식과 관련된 정보를 공유해 주셨습니다.



초청강의3. 광주과학기술원 윤국진 교수


자율 주행 자동차를 동적 상황인식을 통해 인지해 가는 방법을 랩실에서 진행하신 방법을 토대로 설명해 주셨습니다.


또한 ADAS 주행환경 인지에 초점을 맞춰 진행중이었습니다.



카메라의 장점으로는 방대한 량과 정보, 풍부한 량의 정보를 기반으로 주변 상황인지가 가능하며 센서들 간의 간섭이 없는


장점이 있으며, 단점으로는 야간, 눈, 비에는 카메라 정보가 많이 외곡되거나 부족한 단점을 설명해 주셨습니다.


동적 상황이란 움직이는 중에 발생하는 문제를 말하며 분야로는 스트레오 비전, 객체 검출 추적, 의미론적 영상 분할(도로, 차)


, 비주얼 오토메트리(자동차 위치 방향) 등의 문제로 세분화 할수 있습니다. 



초청강의4. UNIST 심재영 교수


single object tracking에 대해 강의하셧습니다. 추적 물체에 대해 배경과 물체를 잘 분리해 추적하면 높은 성능을 


낼수 있는 것을 실험적 결과로 보여주셨습니다.(HSV color, 48 histogram bin 사용)


patch안에 유사한 patch를 묶어 연결해서 물체의 bounding을 만듭니다.

(중앙에는 중요한 정보가 있다고 가정하고, 테두리에는 배경 정보가 많은 경우를 기초)


tracking은 Bayesian Tracking를 사용하였습니다. 연구 결과가 tracking에 있어 스케일 변화에 대응하지 못한 점이 아쉬웠습니다.


최소자승법(Least Sequence Method)

수학 2015. 5. 23. 19:47

어떤 데이터를 가장 잘 표현하는 모델을 설계할때 가장 좋은 방법은 무엇일까?





만약 위와 같은 데이터가 분포 한다고 할때 위 데이터를 가장 잘 표현할 수 있는 모델은 아마도 직선 아니면 타원일 

것이다. 이해를 쉽게 하기 위해 데이터 분포를 가장 잘 표현하는 직선을 구한다고 하면 아래 사진과 같은 직선을 예상할

것이다. 하지만 가장 좋은(표현력 높은) 직선을 구하기 위해서는 모든 데이터를 고려해 가장 잘 표현하는 것을 선택해야 할 것이다. 수많은 직선 중 가장 잘 표현하는 직선을 찾기 위해 사용되는 방법 중 하나가 최소자승법이다.




최소 자승법(Least Sequence Method)은 모델의 파라메타를 구하기 위한 대표적인 방법이다. 

모델과 데이터의 관계를 고려해 가장 좋은 파라메타를 선택한다. 이때 설계한 모델과 데이터 간의 합 혹은 제곱 합이 

가 되도록 파라메타를 계산한다. 한마디로 오류의 합 혹은 제곱 합이 가장 작은 것을 찾는것이다.



최소 자승법은 위와 같은 여러 모델로 부터 가장 최적의 파라메타를 찾는것을 도와준다.

위 데이터 모델을 찾기 위해 1차원 방정식을 구성하면, y = ax+b로 방정식을 설계할 수 있다.


이제 최소자승법을 이용해 미지수 a,b를 선택하면 된다. 

위 2차원 좌표계에서 데이터를 (x1,y1), (x2, y2), ... , (xn,yn)이라고 하면 데이터로 모델을 설계하기 위해 각각의

데이터로 2차 방정식을 계산하면



로 여러개 만들 수 있다. 이것으로 가장 오류가 적은 방정식을 선택하면 된다.

하지만 여러개의 방정식이 존재하고 a,b를 찾으려면 어떤것을 선택해야 할지 애매하다.


따라서 위를 계산하기 위해 행렬식으로 변환하여



,로 치환하면


B = AX가 된다. X를 구하기 위해 A의 역행렬을 B로 넘기면


 를 계산하면 X만 남게 되어 한번에 X를 구할 수 있겠지만, 

A는 정방행렬이 아니므로 역행렬이 존재하지 않을 수도 있다.


따라서 이때 Pseudo inverse를 사용한다.


 



위 식을 다시 변형하면



최종적으로 X를 계산할 수 있다.


이미지 Labeling 알고리즘(fu chang)

컴퓨터비전/영상처리 2015. 5. 23. 17:50

현재까지 가장 빠른 레이블링 알고리즘은 중국 교수 Chang, Fu가 2004년에 쓴 논문

Chang, Fu, Chun-Jen Chen, and Chi-Jen Lu. "A linear-time component-labeling algorithm using contour tracing technique."computer vision and image understanding 93.2 (2004): 206-220.

입니다. 4-연결, 8-연결 레이블링과는 다르게 한번의 탐색으로 이미지의 연결성을 검사해 레이블링 합니다.


 위 논문의 레이블링 방법은 크게 4방법으로 소개하고 있습니다.

기본적으로 레이블 순서는 위에서 오른쪽 방향으로 탐색하며 이진 이미지를 대상으로 수행합니다.


 첫번째로 Figure1.a의 경우 탐색중에 색인되지않은 픽셀을 만나면 외곽선을 추적(시계방향)합니다. 

외곽선 탐색 한 이후로 다시 A픽셀로 돌아오면 외곽선 탐색을 종료합니다. 외곽선 탐색시 모두 A픽셀과 같은 레이블 번호로 지정합니다.

 두번째 사진 Figure1.b를 보면 외곽선을 추적하다 보면 같은 줄 안에 비어있는 홀을 확인할 수 있습니다. 

B 까지 A'와 같은 레이블 번호를 할당하고, 이때 B를 안쪽 외곽선으로 지정하고안쪽 외곽선 또한 같은 레이블 번호로 지정합니다.(안쪽 영역 외곽선 추적)

Figure1.c을 보면 내부 외과선 추적시 반시계 방향으로 추적합니다. 이때 Figure1.d와 같이 검정 픽셀을 오른쪽 방향

으로 탐색할 경우 B'와 같은 레이블 번호를 할당합니다.









Optical Flow(옵티컬 플로우)

컴퓨터비전/영상처리 2015. 5. 23. 15:34

Optical Flow 루카스-카나데(LK) 알고리즘





Optical Flow중 가장 많이 사용하는 루카스-카나데 알고리즘에 대해 정리합니다.


루카스 카나데 알고리즘은 3가지 가정을 기초로 구성되어 있습니다.


1. 밝기 항상성 : 어떤 객체 상의 픽셀은 프레임이 바뀌어도 그 값이 변하지 않는다.

2. 시간 지속성 : 영상 내에서의 움직임은 빠르지 않다. 즉, 영상에서의 객체 움직임에 비하여 시간 변화가

                  더 빨리 진행된다.(연속된 프레임 상에서 보면 이동량이 크지 않다는 것을 의미)

3. 공간 일관성 : 공간적으로 인접한 객체는 동일 객체일 확률이 높다.


 한가지씩 살펴보면, 첫번째로 밝기 항상성은 추적되고 있는 영역 안의 픽셀들은 시간이 지나도 그 값이 일정함을 

나타내며, 이를 다음과 같은 수식으로 나타낼 수 있습니다.



밝기 값은 시간이 지나도 변하지 않는것을 의미합니다.



 두 번째, 시간 지속성은 프레임 사이의 움직임이 작다는 것을 의미합니다. 변화는 시간에 비한 밝기값의 미분이라고 

볼 수 있는데 연속적인 프레임 상에서의 변화는 매우 작다고 가정하는 것입니다.


1차원 공간에서의 경우를 생각해 보면






 위 그림에서 1차원의 경우 움직임 속도는 시간축 미분(시간의 변화량) It와 x축에 대한 미분(공간의 변화량) Ix를 갖고



으로 구할 수 있습니다.




 위 그림은 옵티컬 플로우 수식에 대한 또 다른 관점을 볼 수 있습니다. 앞에서 제시한 가정이 상항 맞는것은 아닙니다.

만약 객체의 움직임에 비해 카메라 촬영 시간이 느릴 경우도 있으므로 반복으로 정확한 해를 구할 수 있습니다. 위 그림

의 경우 추정된 속도를 시작점으로 하여 반복 연산을 수행하여 정확한 해를 구합니다. 밝기 항상성 가정으로 인해 x축 

방향으로의 공간 미분값은 첫 번째 프레임에서 계산된 값이 그대로 유지됩니다.(재 계산을 줄여 속도 향상)

시간축으로의 미분값은 매 프레임에서 매번 다시 계산해야 합니다. 그러나 만약 충분히 비슷한 값에서 시작 할  경우 

대략 5번 정도의 반복이라면 정확한 해를 구할 수 있습니다. 이 방법을 뉴턴방법(Newton's method)라고 부릅니다. 만약

첫 번째 측정이 충분히 유사하지 않으면, 뉴턴 방법은 발산합니다.


 위의 경우 1차원의 문제에 대한 해석이미만, 2차원 영상에서의 문제로 확장해 보면 단순히 y축을 추가하는것 만으로 

해결할 수 있습니다. 

표기법을 변형시켜 y축 방향으로의 속도 성분을 v라 하고, x축 방향으로의 속도 성분을 u라고 한다면

아래와 같은 수식으로 정리 할 수 있습니다.



 하나의 픽셀에 대해서 구성되는 이 방정식은 두 개의 미지수를 가지고 있습니다. 따라서 하나의 픽셀에서 구한

측정 값으로 2차원 움직임에 대한 유일해를 구할 수 없지만, 선형 방정식에 의해 기술되는 직선에 대해 수직 또는 

법선 방향의 움직임 성분을 구할 수 있습니다.