• Show All Code
  • Hide All Code

xwMOOC 딥러닝

캡챠 회전목마(carousel, merry-go-round): slickR

Tidyverse Korea

Tidyverse Korea

2020-06-24

1 회전목마를 만나다

slick 자바스크립트를 htmlwidget으로 변환시켜 R로 가져와서 사용하기 편하게 구현된 것이 slickR 팩키지다.

1.1 PDF 논문

slickR with PDFs 내용을 참조하여 [1] 논문을 회전목마로 신나게 돌려봅시다.

library(tidyverse)
library(slickR)
library(pdftools)

mnist_pdf <- pdf_convert("data/1702.05373v1.pdf",format = 'png',verbose = FALSE)
mv *.png data/
mnist_pdf_df <- tibble(page = glue::glue("data/{mnist_pdf}") )
  
slickR(mnist_pdf_df$page, height = 600)

1.2 PDF 문서 브라우징

%synch%와 settings() 함수를 연결하면 근사한 발표자료 생성이 가능하겠습니다.

bottom_opts <- settings(arrows = TRUE,
                        slidesToShow = 3,
                        slidesToScroll = 1,
                        centerMode = TRUE, 
                        focusOnSelect = TRUE,
                        initialSlide = 0)

slickR(mnist_pdf_df$page, height = 600) %synch% 
  (slickR(mnist_pdf_df$page, height = 100) + bottom_opts)

2 캡챠 회전목마

2.1 데이터셋 만들기

먼저 캡차 이미지를 데이터프레임으로 만든다.

library(glue)

file_names <- list.files("data/captcha_dataset/")

captcha_labels <- str_extract(file_names, "[\\w\\d]+?(?=\\.)")

captcha_df <- tibble(label = captcha_labels, 
                     captcha = glue("data/captcha_dataset/{file_names}"),
                     score = runif(1070, min = 0, max = 1))

captcha_df
# A tibble: 1,070 x 3
   label captcha                        score
   <chr> <glue>                         <dbl>
 1 226md data/captcha_dataset/226md.png 0.955
 2 22d5n data/captcha_dataset/22d5n.png 0.836
 3 2356g data/captcha_dataset/2356g.png 0.863
 4 23mdg data/captcha_dataset/23mdg.png 0.415
 5 23n88 data/captcha_dataset/23n88.png 0.799
 6 243mm data/captcha_dataset/243mm.png 0.126
 7 244e2 data/captcha_dataset/244e2.png 0.129
 8 245y5 data/captcha_dataset/245y5.png 0.834
 9 24f6w data/captcha_dataset/24f6w.png 0.423
10 24pew data/captcha_dataset/24pew.png 0.784
# … with 1,060 more rows

2.2 회전목마 태우기

앞쪽에 자바스크립트 함수를 정의하고 캡챠 이미지를 회전목마에 태위기 위한 환경설정 작업을 수행한다. 그리고 나서 정답 라벨과 캡챠이미지를 살펴볼 수 있도록 준비한다.

captcha_num <- htmlwidgets::JS("function(slick,index) {
                            return '<a>'+(index+1)+'</a>';
                       }")

captcha_opts <- settings(
  dots = TRUE,
  initialSlide = 0,
  slidesToShow = 10, 
  slidesToScroll = 10, 
  focusOnSelect = TRUE,
  customPaging = captcha_num,
  arrows = FALSE)

slickR(obj = captcha_df$captcha, height = 100, width = "100%") %synch%
  ( slickR(captcha_df$label, slideType = 'p') + captcha_opts ) 

1. Cohen G, Afshar S, Tapson J, Schaik A van. EMNIST: An extension of mnist to handwritten letters. arXiv preprint arXiv:170205373. 2017.