본문 바로가기

딥러닝/개인구현 정리

[DeepLearning] GPU-Net을 활용한 이미지 분류_2_feat.강아지

320x100

 

GPU Net은 특히 단일 객체 - 동물들의 분류에 강한 성능을 보였습니다

 

이번 시간에는 지난 모델의 미리 훈련된 버전을 통해 새로운 이미지들을 몇가지 더 진행해보겠습니다.

잠시 GPU-Net의 기능에 대해서 요약하자면 검색 영역과 검색 알고리즘을 활용하고, NAS 시스템을 활용해

네트워크에서 추론을 탐지하며, TensorRT와 Inverted Residual block을 사용하는 모델이었습니다.

 

위 LA-MCTS 기법에 대한 설명 (이전 게시글에 대한 보충입니다)

 

[DeepLearning] LA-MCTS에 관하여 (tistory.com)

 

[DeepLearning] LA-MCTS에 관하여

본 문서는 GPU-Net과 블랙박스 최적화 기법에 대한 설명 중 LA-MCTS에 대한 설명은 찾기 어려워 직접 정리하고자 한 게시글 입니다. 개념에 대해서 길게 설명한 글도 존재하지만, 수학적인 베이스가

astart.tistory.com

 

위와 같은 과정을 거쳐 모바일넷이나 EfficientNet에서 더 높은 지연시간을 보여줍니다.

 

앞선 추론 탐지 모델에서 영향을 받아 추론의 정확도를 최적화한 GPU-Net이 탄생했었습니다.

이미지 추론에서 특히나 강점을 가지는 모델이었고, 7개 모델 중 [GPU-Net D2]가 속도, 정확도 등 모든 부분에서

강력한 모델로 평가되었습니다.

 

GPU NET의 고양이 분류 예시

gpu net은 이전 이미지 모델중 필자가 시도했던 resnet에 비해 다운로드 되는 속도도 탁월하고

꽤 깊지 않은 layer로도 수준 높은 추론이 가능했었습니다.

 

gpunet -0 (기본) 모델 이후의 진행 과정입니다.

 

GPU-Net -1부터 시작

 

GPU-Net 0보다 layer가 한겹 더 많습니다.

비교

각 layer에 등장한 용어들에 대한 설명입니다.

 

 

se 부분에 대한 추가 참조

 

[논문 읽기] SENet(2018) 리뷰, Squeeze-and-Excitation Networks (tistory.com)

 

[논문 읽기] SENet(2018) 리뷰, Squeeze-and-Excitation Networks

이번에 읽어볼 논문은 SENet, Squeeze-and-Excitation Networks 입니다. SENet은 ILSVRC 2017에서 1등을 한 모델입니다. SENet은 채널간의 상호작용에 집중하여 성능을 끌어올린 모델입니다. 채널 간의 상호작용은

deep-learning-study.tistory.com

 

나머지는 익숙하실 것이라고 생각됩니다.

 

지난 이미지 샘플과 동일한 이미지로 추론을 진행합니다.

 

지난 시간을 생략하고 오신 분들을 위한 이미지 샘플들 입니다.

model_type = "GPUNet-1" # 위에서 하나 선택
with torch.no_grad():
    output = torch.nn.functional.softmax(gpunet(batch), dim=1)
results = utils.pick_n_best(predictions=output, n=5)

 

결과입니다.

추상화 부분이 ruler가 추가된 점, 포옹하는 사람이 stole이 추가된 점이 눈에 띄입니다.

 

sample 0: [('pizza, pizza pie', '73.4%'), ('pomegranate', '3.4%'), ('manhole cover', '1.1%'), ('pretzel', '0.4%'), ('strawberry', '0.4%')]
sample 1: [('German shepherd, German shepherd dog, German police dog, alsatian', '63.3%'), ('malinois', '19.0%'), ('Leonberg', '1.0%'), ('briard', '0.5%'), ('Border terrier', '0.4%')]
sample 2: [('pillow', '23.1%'), ('stole', '18.8%'), ('backpack, back pack, knapsack, packsack, rucksack, haversack', '4.4%'), ('cellular telephone, cellular phone, cellphone, cell, mobile phone', '4.2%'), ('sleeping bag', '3.8%')]
sample 3: [('valley, vale', '58.3%'), ('barn', '3.4%'), ('park bench', '2.2%'), ('viaduct', '1.5%'), ('lakeside, lakeshore', '1.5%')]
sample 4: [('rule, ruler', '13.9%'), ('gas pump, gasoline pump, petrol pump, island dispenser', '13.4%'), ('book jacket, dust cover, dust jacket, dust wrapper', '6.8%'), ('chainlink fence', '5.1%'), ('padlock', '3.0%')]
sample 5: [('crayfish, crawfish, crawdad, crawdaddy', '80.1%'), ('triceratops', '9.4%'), ('spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish', '2.9%'), ('American lobster, Northern lobster, Maine lobster, Homarus americanus', '2.7%'), ('cock', '0.3%')]

 

 

stole이 등장했는데요. 어떠한 첩보영화처럼 본다면 물건을 훔친다고 볼수도 있겠네요.

 

GPU-NET -2
이 모델부터 tqdm notebook을 사용해서 시간을 확인했습니다.

 

추론 결과입니다.

 

sample 0: [('pizza, pizza pie', '91.5%'), ('pomegranate', '0.6%'), ('manhole cover', '0.4%'), ('bottlecap', '0.2%'), ('dough', '0.1%')]
sample 1: [('German shepherd, German shepherd dog, German police dog, alsatian', '95.0%'), ('malinois', '4.6%'), ('briard', '0.1%'), ('Leonberg', '0.1%'), ('Australian terrier', '0.0%')]
sample 2: [('accordion, piano accordion, squeeze box', '11.3%'), ('cellular telephone, cellular phone, cellphone, cell, mobile phone', '9.5%'), ('bulletproof vest', '3.7%'), ('gondola', '3.3%'), ('streetcar, tram, tramcar, trolley, trolley car', '2.9%')]
sample 3: [('valley, vale', '59.5%'), ('lakeside, lakeshore', '6.1%'), ('volcano', '2.3%'), ('barn', '1.8%'), ('alp', '1.3%')]
sample 4: [('chainlink fence', '6.4%'), ('shower curtain', '4.1%'), ('gas pump, gasoline pump, petrol pump, island dispenser', '3.1%'), ('tray', '1.9%'), ('prayer rug, prayer mat', '1.5%')]
sample 5: [('crayfish, crawfish, crawdad, crawdaddy', '38.6%'), ('American lobster, Northern lobster, Maine lobster, Homarus americanus', '16.1%'), ('triceratops', '6.9%'), ('spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish', '5.5%'), ('bow', '4.2%')]
6/? [00:01<00:00, 4.76it/s]

 

GPUNet-P1
P1부터는 동등한 latency를 갖지만 GPUNet 기본 모델보다 정확도를 높인 모델입니다.

 

모델의 형태부터 보겠습니다.

 

 

Layer가 또 늘어났고, 처음 시작되는 레이어에서 output 사이즈도 24→32로 늘어났습니다.

 

sample 0: [('pizza, pizza pie', '85.3%'), ('manhole cover', '0.1%'), ('vending machine', '0.1%'), ('pomegranate', '0.1%'), ('strawberry', '0.1%')]
sample 1: [('German shepherd, German shepherd dog, German police dog, alsatian', '69.0%'), ('malinois', '4.4%'), ('Leonberg', '2.2%'), ('groenendael', '0.7%'), ('briard', '0.5%')]
sample 2: [('cellular telephone, cellular phone, cellphone, cell, mobile phone', '41.9%'), ('parking meter', '5.4%'), ('accordion, piano accordion, squeeze box', '3.9%'), ('whistle', '2.0%'), ('tripod', '1.7%')]
sample 3: [('valley, vale', '35.1%'), ('lakeside, lakeshore', '11.3%'), ('barn', '10.3%'), ('park bench', '5.5%'), ('worm fence, snake fence, snake-rail fence, Virginia fence', '2.5%')]
sample 4: [('book jacket, dust cover, dust jacket, dust wrapper', '21.1%'), ('chainlink fence', '4.4%'), ('walking stick, walkingstick, stick insect', '2.9%'), ('lampshade, lamp shade', '2.2%'), ('padlock', '1.9%')]
sample 5: [('triceratops', '66.1%'), ('crayfish, crawfish, crawdad, crawdaddy', '3.2%'), ('rhinoceros beetle', '2.2%'), ('American lobster, Northern lobster, Maine lobster, Homarus americanus', '1.6%'), ('cock', '1.3%')]

 

이번엔 악마 이미지가 트리케라톱스가 되었군요.

 

출처 : 쥬라기공원 위키

 

이쯤에서 의문을 느꼈습니다.

다른 이미지들은 전부 다 추론 텍스트가 바뀌거나, 각 검증값의 순위가 바뀌거나 하는데 유독 져먼 셰퍼드는 똑같이 유지되고 있습니다. 어쩌면 이 모델은 강아지를 특출나게 많이 학습시킨게 아닐까, 하는 의문이 들었습니다.

 

#강아지 이미지 로드
1 https://cdn.pixabay.com/photo/2018/03/31/06/31/dog-3277416_1280.jpg

2 https://cdn.pixabay.com/photo/2019/08/19/07/45/corgi-4415649_1280.jpg

3 https://cdn.pixabay.com/photo/2018/05/07/10/48/husky-3380548_1280.jpg

4 https://cdn.pixabay.com/photo/2013/07/07/04/58/weimaraner-143753_1280.jpg

5 https://cdn.pixabay.com/photo/2017/07/31/21/15/dog-2561134_1280.jpg

#주로 흔하지 않은 품종
6 https://cdn.pixabay.com/photo/2014/04/05/11/40/dog-316598_1280.jpg

7 https://cdn.pixabay.com/photo/2016/11/23/18/06/dog-1854119_1280.jpg

8 https://cdn.pixabay.com/photo/2017/12/29/10/23/nature-3047194_1280.jpg

9 https://cdn.pixabay.com/photo/2020/11/24/17/54/dog-5773397_1280.jpg

10 https://cdn.pixabay.com/photo/2020/03/22/15/25/fetch-4957501_1280.jpg

 

그래서 준비했습니다. 1번부터 5번까지는 그래도 한번정도 본적은 있는 강아지들입니다.

반대로 6번부터 10번까지는 정확히 무슨 품종인지 예상이 안되는 강아지를 가져왔습니다.

모두 pixabay 출처입니다.

 

여러분은 '사루키'라는 품종을 들어본적이 있으신가요?

uris = ['https://cdn.pixabay.com/photo/2018/03/31/06/31/dog-3277416_1280.jpg',
        'https://cdn.pixabay.com/photo/2019/08/19/07/45/corgi-4415649_1280.jpg',
        'https://cdn.pixabay.com/photo/2018/05/07/10/48/husky-3380548_1280.jpg',
        'https://cdn.pixabay.com/photo/2013/07/07/04/58/weimaraner-143753_1280.jpg',
        'https://cdn.pixabay.com/photo/2017/07/31/21/15/dog-2561134_1280.jpg',
        'https://cdn.pixabay.com/photo/2014/04/05/11/40/dog-316598_1280.jpg',
        'https://cdn.pixabay.com/photo/2016/11/23/18/06/dog-1854119_1280.jpg',
        'https://cdn.pixabay.com/photo/2017/12/29/10/23/nature-3047194_1280.jpg',
        'https://cdn.pixabay.com/photo/2020/11/24/17/54/dog-5773397_1280.jpg',
        'https://cdn.pixabay.com/photo/2020/03/22/15/25/fetch-4957501_1280.jpg']
model_type = "GPUNet-0" 
precision = "fp64" 

gpunet = torch.hub.load('NVIDIA/DeepLearningExamples:torchhub', 'nvidia_gpunet', pretrained=True, model_type=model_type, model_math=precision)
utils = torch.hub.load('NVIDIA/DeepLearningExamples:torchhub', 'nvidia_convnets_processing_utils')

gpunet.to(device)

uris = uris

# batch크기 : uris에서 지원
batch = torch.cat(
    [utils.prepare_input_from_uri(uri) for uri in uris]
).to(device)

if precision == "fp16":
    batch = batch.half()
    
print("추론을 진행중입니다....")
with torch.no_grad():
    output = torch.nn.functional.softmax(gpunet(batch), dim=1)
    
results = utils.pick_n_best(predictions=output, n=5)

for uri, result in zip(uris, results):
    img = Image.open(requests.get(uri, stream=True).raw)
    img.thumbnail((256,256), Image.ANTIALIAS)
    plt.axis('off')
    plt.imshow(img)
    plt.show()
    
    print(result)
model_type= GPUNet-0
mapped model latency= 0.65ms
testing:  batch= 1  latency= 0.65ms  gpu= GV100
Using cache found in /root/.cache/torch/hub/NVIDIA_DeepLearningExamples_torchhub
175259648/? [00:24<00:00, 16467052.46B/s]
Using cache found in /root/.cache/torch/hub/NVIDIA_DeepLearningExamples_torchhub
추론을 진행중입니다....
sample 0: [('vizsla, Hungarian pointer', '75.8%'), ('Rhodesian ridgeback', '5.0%'), ('Weimaraner', '1.8%'), ('English foxhound', '0.3%'), ('redbone', '0.3%')]
sample 1: [('Cardigan, Cardigan Welsh corgi', '26.6%'), ('Pembroke, Pembroke Welsh corgi', '24.9%'), ('brambling, Fringilla montifringilla', '1.9%'), ('basenji', '1.2%'), ('goldfish, Carassius auratus', '0.9%')]
sample 2: [('Eskimo dog, husky', '74.7%'), ('Siberian husky', '14.6%'), ('timber wolf, grey wolf, gray wolf, Canis lupus', '1.9%'), ('dogsled, dog sled, dog sleigh', '0.7%'), ('white wolf, Arctic wolf, Canis lupus tundrarum', '0.3%')]
sample 3: [('Great Dane', '17.8%'), ('Doberman, Doberman pinscher', '8.9%'), ('black-and-tan coonhound', '5.9%'), ('boxer', '4.7%'), ('Weimaraner', '4.7%')]
sample 4: [('Gordon setter', '77.5%'), ('cocker spaniel, English cocker spaniel, cocker', '1.2%'), ('Irish setter, red setter', '1.0%'), ('Sussex spaniel', '0.8%'), ('Rottweiler', '0.4%')]
sample 5: [('Border collie', '28.0%'), ('boxer', '5.3%'), ('Staffordshire bullterrier, Staffordshire bull terrier', '4.7%'), ('Border terrier', '3.9%'), ('Scottish deerhound, deerhound', '2.0%')]
sample 6: [('cocker spaniel, English cocker spaniel, cocker', '24.2%'), ('Sussex spaniel', '17.1%'), ('Blenheim spaniel', '10.6%'), ('Irish setter, red setter', '3.2%'), ('clumber, clumber spaniel', '2.2%')]
sample 7: [('Saluki, gazelle hound', '90.9%'), ('borzoi, Russian wolfhound', '1.7%'), ('Eskimo dog, husky', '1.1%'), ('Siberian husky', '0.5%'), ('malamute, malemute, Alaskan malamute', '0.3%')]
sample 8: [('Border collie', '38.7%'), ('collie', '17.4%'), ('Australian terrier', '2.4%'), ('Shetland sheepdog, Shetland sheep dog, Shetland', '2.1%'), ('Cardigan, Cardigan Welsh corgi', '1.7%')]
sample 9: [('English springer, English springer spaniel', '16.9%'), ('Shih-Tzu', '5.4%'), ('Lhasa, Lhasa apso', '5.3%'), ('Japanese spaniel', '4.0%'), ('papillon', '3.6%')]

 

그렇습니다. 수상할정도로 품종에 진심인 이미지 학습 모델입니다.

[('vizsla, Hungarian pointer', '75.8%'), ('Rhodesian ridgeback', '5.0%'), ('Weimaraner', '1.8%'), ('English foxhound', '0.3%'), ('redbone', '0.3%')]
[('Cardigan, Cardigan Welsh corgi', '26.6%'), ('Pembroke, Pembroke Welsh corgi', '24.9%'), ('brambling, Fringilla montifringilla', '1.9%'), ('basenji', '1.2%'), ('goldfish, Carassius auratus', '0.9%')]
[('Eskimo dog, husky', '74.7%'), ('Siberian husky', '14.6%'), ('timber wolf, grey wolf, gray wolf, Canis lupus', '1.9%'), ('dogsled, dog sled, dog sleigh', '0.7%'), ('white wolf, Arctic wolf, Canis lupus tundrarum', '0.3%')]
[('Great Dane', '17.8%'), ('Doberman, Doberman pinscher', '8.9%'), ('black-and-tan coonhound', '5.9%'), ('boxer', '4.7%'), ('Weimaraner', '4.7%')]
[('Gordon setter', '77.5%'), ('cocker spaniel, English cocker spaniel, cocker', '1.2%'), ('Irish setter, red setter', '1.0%'), ('Sussex spaniel', '0.8%'), ('Rottweiler', '0.4%')]
[('Border collie', '28.0%'), ('boxer', '5.3%'), ('Staffordshire bullterrier, Staffordshire bull terrier', '4.7%'), ('Border terrier', '3.9%'), ('Scottish deerhound, deerhound', '2.0%')]
[('cocker spaniel, English cocker spaniel, cocker', '24.2%'), ('Sussex spaniel', '17.1%'), ('Blenheim spaniel', '10.6%'), ('Irish setter, red setter', '3.2%'), ('clumber, clumber spaniel', '2.2%')]
[('Saluki, gazelle hound', '90.9%'), ('borzoi, Russian wolfhound', '1.7%'), ('Eskimo dog, husky', '1.1%'), ('Siberian husky', '0.5%'), ('malamute, malemute, Alaskan malamute', '0.3%')]
[('Border collie', '38.7%'), ('collie', '17.4%'), ('Australian terrier', '2.4%'), ('Shetland sheepdog, Shetland sheep dog, Shetland', '2.1%'), ('Cardigan, Cardigan Welsh corgi', '1.7%')]
[('English springer, English springer spaniel', '16.9%'), ('Shih-Tzu', '5.4%'), ('Lhasa, Lhasa apso', '5.3%'), ('Japanese spaniel', '4.0%'), ('papillon', '3.6%')]

 

7번째 이미지. 사루키

 

살루키 - 위키백과, 우리 모두의 백과사전 (wikipedia.org)

 

살루키 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

 

필자는 사루키라는 종을 한번도 들어본적이 없습니다. 이 뿐만 아니라 고든 세터, 잉글리쉬 스프링거, 비즐라 등 해외에서는

각광받아도 국내에는 흔하지 않은 품종들도 놀라울 정도로 잘 맞추는 것을 확인했습니다.

 

고양이의 품종은 어떨까요?

 

uris = ['https://cdn.pixabay.com/photo/2017/11/09/21/41/cat-2934720_1280.jpg',
        'https://cdn.pixabay.com/photo/2023/01/30/11/17/maine-coon-7755424_1280.jpg',
        'https://cdn.pixabay.com/photo/2017/02/15/12/12/cat-2068462_1280.jpg',
        'https://cdn.pixabay.com/photo/2020/09/18/13/05/lynx-5581792_1280.jpg',
        'https://cdn.pixabay.com/photo/2016/12/10/13/03/cat-1897232_1280.jpg']

 

gpunet-0 추론 결과

 

[('tabby, tabby cat', '32.7%'), ('Egyptian cat', '29.1%'), ('tiger cat', '11.4%'), ('tiger, Panthera tigris', '3.3%'), ('zebra', '0.5%')]
[('tabby, tabby cat', '28.4%'), ('tiger cat', '27.9%'), ('lynx, catamount', '6.6%'), ('tiger, Panthera tigris', '2.3%'), ('Egyptian cat', '1.2%')]
[('Siamese cat, Siamese', '93.5%'), ('window screen', '0.2%'), ('cougar, puma, catamount, mountain lion, painter, panther, Felis concolor', '0.1%'), ('Egyptian cat', '0.1%'), ('black-footed ferret, ferret, Mustela nigripes', '0.1%')]
[('lynx, catamount', '91.9%'), ('Egyptian cat', '0.5%'), ('cougar, puma, catamount, mountain lion, painter, panther, Felis concolor', '0.5%'), ('tiger cat', '0.4%'), ('grey fox, gray fox, Urocyon cinereoargenteus', '0.2%')]
[('Persian cat', '71.9%'), ('lynx, catamount', '2.4%'), ('white wolf, Arctic wolf, Canis lupus tundrarum', '1.4%'), ('tabby, tabby cat', '1.3%'), ('snow leopard, ounce, Panthera uncia', '1.1%')]

 

2번째 이미지는 tabby가 아닌 메인 쿤으로, 아예 어긋난 추론입니다.

하지만 그 이외에는 모두 맞추었습니다. lynx(스라소니속) 같은 타 품종도 맞추는데요.

 

영장류 종으로도 진행해보겠습니다.

 

오랑우탄
https://cdn.pixabay.com/photo/2018/06/09/20/54/orangutan-3465130_1280.jpg
침팬지
https://cdn.pixabay.com/photo/2018/09/25/21/32/monkey-3703230_1280.jpg
보노보
https://cdn.pixabay.com/photo/2015/06/15/20/21/bonobo-810549_1280.jpg
일본 원숭이
https://cdn.pixabay.com/photo/2020/02/01/04/05/snow-monkey-4809479_1280.jpg
고릴라
https://cdn.pixabay.com/photo/2013/11/28/09/50/baby-219683_1280.jpg
다람쥐원숭이
https://cdn.pixabay.com/photo/2018/11/11/11/27/spider-monkey-3808553_1280.jpg

 

[('orangutan, orang, orangutang, Pongo pygmaeus', '81.6%'), ('siamang, Hylobates syndactylus, Symphalangus syndactylus', '0.8%'), ('chimpanzee, chimp, Pan troglodytes', '0.7%'), ('howler monkey, howler', '0.5%'), ('gibbon, Hylobates lar', '0.2%')]
[('chimpanzee, chimp, Pan troglodytes', '84.2%'), ('siamang, Hylobates syndactylus, Symphalangus syndactylus', '1.1%'), ('guenon, guenon monkey', '0.5%'), ('gorilla, Gorilla gorilla', '0.4%'), ('macaque', '0.3%')]
[('spider monkey, Ateles geoffroyi', '39.0%'), ('chimpanzee, chimp, Pan troglodytes', '33.3%'), ('orangutan, orang, orangutang, Pongo pygmaeus', '2.8%'), ('macaque', '1.1%'), ('Gordon setter', '1.0%')]
[('macaque', '94.4%'), ('titi, titi monkey', '0.3%'), ('baboon', '0.1%'), ('patas, hussar monkey, Erythrocebus patas', '0.1%'), ('squirrel monkey, Saimiri sciureus', '0.1%')]
[('gorilla, Gorilla gorilla', '78.8%'), ('chimpanzee, chimp, Pan troglodytes', '2.5%'), ('orangutan, orang, orangutang, Pongo pygmaeus', '0.6%'), ('guenon, guenon monkey', '0.4%'), ('torch', '0.2%')]
[('squirrel monkey, Saimiri sciureus', '49.2%'), ('titi, titi monkey', '23.8%'), ('spider monkey, Ateles geoffroyi', '4.8%'), ('patas, hussar monkey, Erythrocebus patas', '1.6%'), ('guenon, guenon monkey', '0.5%')]

 

오랑우탄, 침팬지, 일본원숭이(macaque; 긴꼬리원숭이아과 총칭), 고릴라, 다람쥐원숭이 정도도 무난히 추론합니다.

추가적으로 보노보 원숭이의 경우 침팬지와 거의 흡사한 종으로, 이번 모델에서는 거미 원숭이와 비등하게 나오는데요.

콩고강을 기준으로 남쪽에 위치하면 보노보 원숭이, 북쪽과 아프리카 서부에 살면 침팬지라는 점이 다를뿐 거의 흡사한 종입니다.

 

이처럼 이미지 추론도 추론이지만 동물종과 개 품종에 대해 탁월한 성능을 보이는 것을 알 수 있습니다.

 

이상으로 모델 설명은 마치겠습니다.

728x90