tensorflow에서 slim에 사용할 채널 이미지 생성 에 대해서 알아봅시다.
여기서 수집되는 이미지를 이용해서 tensorflow의 slim에 넣을 이미지 분류기를 제작하고자 합니다.
tensorflow에서 slim에 사용할 채널 이미지 생성 순서
다음과 같은 순서로 진행합니다.
- 방송사별 이미지 캡쳐 방법 학습
- OMVS 다운로드 및 수정
- 자동 캡쳐를 위한 쉘 스크립트 작성
- 채널별(폴더별) 분류하여 이미지 학습 준비
방송사별 이미지 캡처 방법 학습
S*B 방송 캡처하는 방법은 다음의 블로그에서 참고하였습니다.
강좌 관련해서는 이미 충분히 잘 다뤄진 글이 있기 때문에 생략하겠습니다.
관련 링크
위 방법을 이용하여 사전에 omvs를 이용해서 미리 IP에 대한 채널 스캔을 완료 했습니다.
그 중에서 손이 가장 많이 가는 채널 위주로 20개를 선정했습니다.
OMVS 다운로드 및 수정
omvs는 오! 멀티캐스트 비디오 스캐너~ 의 약자입니다. 처음에는 이름이 뭘까 했는데 매우 재미있게 잘 지었습니다.
해당 소스를 다운로드 받아서 보시면 IP별로 스캔을 하고 있을 경우, 해당 캡쳐 이미지를 남기게 됩니다.
저 같은 경우에는 동일한 채널에 대해서도 이미지가 필요하기 때문에, 기존의 파일 이름 결정하는 방식에 시간 정보를 추가했습니다.
위 캡쳐 이미지에 보시면 년월일시분초가 추가된걸 보실 수 있습니다.
소스중에 omvs_main.c 파일에 보면 filename을 결정하는 부분이 있는데, 그 부분에 시간 정보를 추가하면 됩니다.
관련하여 간단히 추가된 소스 부분만 정보를 남기면 다음과 같습니다.
파일 이름 부분에 시간 정보 추가
// 소스 상단에 시간 함수를 사용하기 위한 헤더 추가 #include <time.h> // ... // 시간 정보를 표시할 파일 이름 부분 변경 time_t t_1 = time(NULL); struct tm tm = *localtime(&t_1); filename = g_strdup_printf("%s/%s-%d-%d-%d-%d-%d-%d-%d.png", _omvs_outdir, addr_str, udp_port, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
관련 링크
자동 캡쳐를 위한 쉘 스크립트 작성
tensorflow에서 slim에 사용할 채널 이미지 생성 을 위해서는 다음과 같은 쉘 스크립트가 필요합니다.
해당 쉘스크립트는 Linux 용으로 제작한 것입니다.
#!/bin/bash for j in {1..600} do sudo ./omvs -i 0 -j 1 -u -t 3000 2xx.xxx.3x.x 2xx.xxx.3x.x 2xx.xxx.4x.xx 2xx.xxx.4x.x 2xx.xxx.4x.1 2xx.xxx.x2.x 2xx.xxx.4x.x 2xx.xxx.4x.x 2xx.xxx.xx.5 2xx.xxx.xx.3 2xx.xxx.xx.x 2xx.xxx.5x.8 2xx.xxx.x3.7 2xx.xxx.xx.7 2xx.xxx.xx.x 2xx.xxx.xx.x 2xx.xxx.xx.x 2xx.xxx.xx.xx 2xx.xxx.6x.3 2xx.xxx.xx.x done
- for j in {1..600} : 600회에 걸쳐서 해당 작업을 반복 실행합니다. for 문에 j가 있는 이유는 i가 현재 생략되었고, 최초 채널을 스캔할때 가져오기 위함입니다.
- sudo : root(sudo)권한으로 실행합니다.
- -i 0 : 채널 스캔에 사용할 인터페이스 카드는 0번입니다.
- -j 1 : 작업은 1개씩 진행합니다. 동시에 여러개 할 수 있지만, 채널 스캔에 실패할 가능성이 높아지기 때문에, 1개씩 합니다.
- -u : udp 프로토콜을 사용하는 패킷을 검출하기 위해서 사용합니다. (S*B는 이 옵션이 필요합니다.)
- -t 3000 : 스캔에 최대 3초씩 사용합니다. 1초, 2초, 3초 다 써 봤는데, 제 기준으로는 3초가 가장 안전했습니다.
- 2xx.xxx.xx.xx : 채널 스캔에 사용할 IP 주소입니다.
위 스크립트는 회선 및 PC 환경에 따라서 상이할 수 있기 때문에 자신에게 가장 맞는 최적의 값을 찾아서 진행하시면 됩니다.
600개를 모은 이유는, 서버 하드 용량이 부족한 관계로(HP Microserver Gen8에 나머지 가상 서버 2개 사용하고 남은 용량으로 설치해서..) 그냥 600개만 일단 해 봅니다.
채널별(폴더별) 분류하여 이미지 학습 준비
이미지를 모두 캡쳐하면 쓸데 없는 이미지는 제거해 주어야 합니다.
학습할 때, 이미지에 채널을 유추할 수 있는 정보가 없다면(광고시간 등) 이 이미지는 학습에 오히려 혼란을 야기하는 정보가 될 것이기 때문입니다.
일단 채널별로 폴더 분류를 해서, 채널 정보가 보이지 않는 이미지는 일괄 삭제를 합니다.
LINUX 지만 Ubuntu도 Desktop 모드에서 쉽게 이미지 확인 및 제거가 가능합니다만, 가상서버에 비디오 메모리도 낮기 때문에 윈도우로 파일 옮겨서 작업합니다.
FullHD 캡쳐 PNG 이미지이기 때문에 용량이 만만치 않습니다. 이건 JPG로 변환할 예정입니다. (어차피 SLIM에 넣을때 용량도 줄이는게 나을것 같습니다.)
현재 몇 가지 고민이 있는데, 일단 FULL HD 그대로의 이미지를 학습할 예정입니다.
추후 채널 부분만 추려서 학습해볼 예정입니다.(이미지 전처리 부분을 수정하여 모서리 네 부분만 떼어내서 새로운 이미지로 조합하는 방법을 사용할 예정)
아마 당연한 이야기겠지만 모서리 네부분만 떼어내서 학습하는게 처리 속도도 효과도 더 좋을 것으로 예상됩니다.
이 부분에 대해서는 http://dev.studydev.com/에 별도의 자료를 만들어서 확인해보고자 합니다.
Linux 에서 이미지 개수 확인 방법
find . -type f -name "2xx.xxx.xxx.xx*" | wc -l
현재 이미지가 총 480장 정도 만들어진 상태입니다.
채널 1개당 이미지 생성하는데 3초씩 걸리기에, 20채널을 1회 스캔하려면 1분이 필요합니다.
600여장을 우선적으로 만들 예정인데, 약 600분, 즉 10시간 정도 필요합니다.
그리고 이미지는 장당 약 3MByte 입니다.
20개 채널 600장씩 하면 36GB 정도 모입니다.
모두 수집되면, 이미지 캡쳐 샷을 한번 기념으로 남겨볼 수 있겠네요.
그럼 이제 slim을 설치하고 flower 예제를 미리 한번 돌려 봅시다.