2017/05/31 Wantedly技術見学会 iOS編
Wantedly PeopleͷεΩϟϯը໘ͷཪଆɹ2017/05/31 Wantedlyٕज़ݟֶձ iOSฤshingt (Shinichi Goto) @ Wantedly, Inc.
View Slide
shingt (Shinichi Goto)GitHub: @shingtTwi5er: @_shingt
Outline• εΩϟϯը໘ͷॲཧͷྲྀΕ• ٕज़ཁૉ / ߏ• ෆ҆ఆͳݕग़݁Ռͷରॲ• σόοά൛ͷ
εΩϟϯը໘ͷॲཧͷྲྀΕ
ٕज़ཁૉ / ߏ
• AVFounda*on• OpenCV• ίϯϐϡʔλϏδϣϯ༻ͷϥΠϒϥϦ• ໊ྖҬͷݕग़ɺͦͷଞը૾ॲཧʹར༻• ಛผͳͷ͍ͬͯͳ͍
໊ݕग़ͷOpenCVҎ֎ͷબࢶ• CoreImage• Accerelate (BNNS)• Metal (CNN)• TensorFlow
ݕग़ϩδοΫAndroidͱڞ௨Խ͍ͨ͠ʢগͳ͘ͱॳظϦϦʔεͰʣ
=> Accerelate / Metal / CoreImage ݟૹΓʢલऀ2ͭiOS9Ͱར༻Ͱ͖ͳ͍ʣ
TensorFlow• ΞϓϦʹΈࠐΈɺผ్ֶशࡁͷϞσϧΛద༻ɺͱ͍͏ͱ͜Ζ·Ͱࢼͨ͠• ໊ݕग़෦ͷ࣮ࡍͷ׆༻ʹࢸΒͣ• ։ൃظؒɺσʔληοτɺਫ਼ͷ
༨ஊ: Google I/O '17pod 'TensorFlow-experimental'ɹ• Android Meets TensorFlow: How to Accelerate Your App with AI• "experimental" Ͱͳ͍ํ "Coming soon" ͱͳͬͯΔ• h?ps://cocoapods.org/pods/TensorFlow
ߏ
ɹ• OpenCV• C++Ͱهड़͞ΕͨΠϯλʔϑΣΠεΛར༻• => Swi/͔Βͷͷݺͼग़͠ෆՄ• ʢඞવతʹʣݕग़ؔ࿈ͷϩδοΫObjec3ve-C++ଆʹدͤΔ
// CardDetector.mm- (NSArray *)cardFeaturesInMat:(const cv::Mat &)mat{std::vector cards = ... // Detect cards on C++ layerNSMutableArray *cardFeatures = [NSMutableArray array];for (const auto& card : cards) {if (!card.is_namecard) continue;CardFeature *cardFeature = [[CardFeature alloc] initWithDTCTCard:card];[cardFeatures addObject:cardFeature];}return cardFeatures;}
CardDetector• C++ͷϨΠϠͷProxyʹ͍ۙҐஔ• ࣮ࡍʹ͋Δఔը૾ॲཧϩδοΫؚΉ• ࠲ඪิਖ਼ɺಁࢹมɺetc.• σόΠεଆͰಈ͔ͯ͠ΈͯॳΊͯݟ͔ͭΔɺͱ͍͏͋ͬͨͨΊ
C++ͷϨΠϠ• Γग़ͯ͠։ൃ & ୯ಠͰϏϧυ• ΞϓϦશମΛϏϧυ͢Δͷʹൺͯѹతʹ͍ͨΊ• ݕग़෦ͷϩδοΫΛվળ͍͢͠ʢͬͱجຊతͳ෦PythonͰ࣮ݧʣ• దٓiOSϓϩδΣΫτऔΓࠐΈ
ෆ҆ఆͳݕग़݁Ռͷରॲ
໊ྖҬͷݕग़
AVCaptureStillImageOutput ʢ੩ࢭը༻ʣORAVCaptureVideoDataOutputʢಈը༻ʣ
໊εΩϟϯʹγϟολʔԻ໐Βͨ͘͠ͳ͍=> AVCaptureVideoDataOutput
: iPhone༳ΕΔ
=> ϒϨΔ
ղܾࡦ: γʔέϯεͱͯ͠ѻ͏
ݕग़݁Ռͷථ• ϑϨʔϜͷ໌ʢͲΕ͚ͩϒϨ͍ͯͳ͍͔ʣ• ϥϓϥγΞϯϑΟϧλΛ͔͚ͨ݁ՌͷࢄʢͰ͋ΔఔݟΕΔʣ• ݕग़໊ຕ• ͲΕ͚ͩۙͷϑϨʔϜ͔
ࢀߟ: ໌ͷԋࢉ@implementation UIImage (CVExtension)- (double)sharpness{cv::Mat mat, gray, laplacian;UIImageToMat(self, mat);cv::cvtColor(mat, gray, CV_BGR2GRAY);cv::Laplacian(gray, laplacian, CV_64F);cv::Scalar mean, stddev;cv::meanStdDev(laplacian, mean, stddev, cv::Mat());return stddev.val[0] * stddev.val[0];}@end
τϥοΩϯά࣌
ɹ• ݁ߏ҆ͳղܾࡦͰ͋Δ• ͱ͍͑ܶతʹମݧ্ !
σόοά൛ͷ
ϦΞϧλΠϜͳը૾ॲཧΞϓϦͷ։ൃͰࠔΔ͜ͱ• ൃੜ࣌ɺݱঢ়Ѳʹ͕͔͔࣌ؒΓ͍͢• ϓϩηεͷͲͷ෦͕ѱ͍ͷ͔• ઢݕग़ʁ࠲ඪมʁ໌ͷԋࢉʁ
Debug, QAͰ• ԋࢉঢ়گɺϦιʔεঢ়گΛදࣔ• ໌, γʔέϯεॲཧ, CPU, etc.• ը૾ॲཧͷաఔΛදࣔ
ɹ• ࢹ֮తʹ͔Γ͍ͨ͢ΊΛݟ͚͍ͭ͢• ͍͚ͦ͏ײ͕CEOʹΘΔ
·ͱΊ• εΩϟϯը໘ͷॲཧͷྲྀΕ / ٕज़ཁૉ / ߏ Λհ• ෆ҆ఆͳݕग़݁Ռͷରॲ => γʔέϯεຖʹॲཧ• "ΊͪΌͪ͘ΌεϚʔτʂ" ͳ͜ͱͯ͠ͳ͍ʢݱঢ়ʣ• Debug/QA൛ͰॲཧաఔɺϦιʔεঢ়گΛग़͓ͯ͘͠• ΓޙBlogͰެ։ʢ͢Δ͔ʣ
Thanks!