Test Automation

연구에는 실험이 많이 필요하다.
구체적으로, 내가 하는 H.264 Intra Prediction 연구에는, 특정 알고리즘을 적용했을 때, bitrate와 PSNR이 어떻게 변하는지 실험을 해야 한다.  실험을 어떤 데이터를 대상으로 하는지도 중요한데,

  • 여러 종류의 이미지 : foreman, mobile, parkrun
  • 여러 size의 이미지 : QCIF(172×144), CIF(352×288), 720p(1280×720), 1080p(1920×1080)
  • 여러 QP 값 : 16, 20, 24, 28

등 여러 변화를 줄 수 있다.
더 많은 실험을 할 수록 더 많은 특성을 파악할 수 있는데, 모든 경우에 대해 실험을 하려면 많은 시간이 필요하다.
이럴 때, 실험을 얼마나 자동화하여, 별도의 조작을 하지 않고 실험을 많이 할 수 있는지가 중요하게 된다.
이러한 automation의 중요성을 근래 연구를 하게 되면서 많이 실감했다.
몇 단계를 걸쳐, 수작업으로 하던 것을 어떻게 편리하게 바꿨는지에 대해 설명하겠다.

현재 연구에 추출해야 하는 데이터는 YUV raw data를 encoding한 후 bitrate와 PSNR이다.
본래 H.264 encoder의 reference software인 JM 7.3과, JM 7.3 기반에서 우리가 추가한 사항들의 encoder가 얼마나 성능 차이를 보이는지 확인하고자 한다.
두 가지 version의 encoder로 여러 YUV 파일에 대해 encoding을 한다.
stat.dat 파일에

 ————————————————————–
  This file contains statistics for the last encoded sequence  
 ————————————————————–
 Sequence                     : ../IMAGES/akiyo_cif.yuv
 No.of coded pictures         :  300
 Freq. for encoded bitstream  :   30
 Bitrate(kb/s)                : 4266.30
 Hadamard transform           : Not used
 Image format                 : 352×288
 Error robustness             : Off
 Search range                 : 16
 No of frame used in P pred   : 1
 Entropy coding method        : CAVLC
 Search range restrictions    : none
 RD-optimized mode decision   : not used
 ——————-|—————|—————|
     Item           |     Intra     |   All frames  |
 ——————-|—————|—————|
 SNR Y(dB)          | 47.42         | 47.40         |
 SNR U/V (dB)       | 48.52/49.42   | 48.49/49.37   |
 Average quant      |    16         |  0.00         |

과 같이 결과가 남는데, 우리가 필요로 하는 것은 굵은 글씨로 표시한 bitrate와 PSNR이다.
encoder.cfg 파일에

InputFile             = “./IMAGES/foreman_qcif.yuv”       # Input sequence, YUV 4:2:0,
InputHeaderLength     = 0      # If the inputfile has a header, state it’s length in byte here
FramesToBeEncoded     = 300    # Number of frames to be coded  
SourceWidth           = 176    # Image width in Pels, must be multiple of 16
SourceHeight          = 144    # Image height in Pels, must be multiple of 16

TraceFile             = “trace_enc.txt”
ReconFile             = “test_rec.yuv”
OutputFile            = “test.264″

IntraPeriod           =  1   # Period of I-Frames (0=only first)
QPFirstFrame          = 28  # Quant. param for first frame (intra) (0-51)
QPRemainingFrame      = 28  # Quant. param for remaining frames (0-51)

굵은 글씨로 표시한 값들을 바꿔서, 이미지 size, 종류, 그리고 QP 값을 조정할 수 있다.

1. 수작업

encoder.cfg를 메모장에 띄워서 수정하고, lencod.exe를 돌린다.
encoding이 완료되면, stat.dat에서 필요한 값들을 뽑아서 excel에 입력한다.
QCIF 이미지에 대해서는 encoding이 20초 가량, CIF는 1~2분 가량 걸린다.
오랜 시간 동안 복사-붙여넣기를 해야 하며 그 동안 다른 작업을 못 한다.
불행히도 처음에는 이 방법으로 실험 데이터를 수집하였다;
조금 개선한 것은 stat.dat를 메모장 대신 AcroEdit으로 열어서, 새로 열 필요 없이 F5(새로고침)하였다는 정도?ㅎㅎ
처음 한 번은 할만한데, encoder이 바뀔 때마다 다시 해야 하니 죽을 맛이었다;

2. Perl Script

그러다가 진수 형을 통해 서버에서 script를 돌려서 이 작업을 자동화 할 수 있음을 알게 되었다.
해당 lencod.exe를 Linux에서 재컴파일 후 (다행히 JM이 기본적으로 linux용 makefile도 제공한다)
shell에서 다음 script를 돌리는 것이다:

#!/bin/bash
mkdir STAT

perl -pi -e ‘s/FramesToBeEncoded += +[0-9]+/FramesToBeEncoded     = 300/g’ encoder.cfg
perl -pi -e ‘s/SourceWidth += +[0-9]+/SourceWidth = 352/g’ encoder.cfg
perl -pi -e ‘s/SourceHeight += +[0-9]+/SourceHeight = 288/g’ encoder.cfg

######################## QP = 16 #########################
mkdir STAT/QP16
perl -pi -e ‘s/QPFirstFrame += +[0-9]+/QPFirstFrame       = 16/g’ encoder.cfg
perl -pi -e ‘s/QPRemainingFrame += +[0-9]+/QPRemainingFrame       = 16/g’ encoder.cfg

perl -pi -e ‘s/[a-zA-Z0-9_]+.yuv/foreman_cif.yuv/g’ encoder.cfg
./lencod.exe
cat stat.dat > ./STAT/QP16/stat_foreman.dat
perl -pi -e ‘s/[a-zA-Z0-9_]+.yuv/akiyo_cif.yuv/g’ encoder.cfg
./lencod.exe
cat stat.dat > ./STAT/QP16/stat_akiyo.dat
perl -pi -e ‘s/[a-zA-Z0-9_]+.yuv/mobile_cif.yuv/g’ encoder.cfg

script가 알아서 encoder.cfg 파일을 수정해 가면서,
생성된 stat.dat 파일을 이름을 바꿔서 분류된 폴더로 복사 해 준다.
이 정도로 자동화 되면, 우선 서버에 작업을 걸어놓고, 완료되면 stat 파일들을 열어서 excel에 입력하면 된다.
하지만 여기에도 stat 파일을 일일이 열어서 excel에 입력해 주는 수고를 해야 한다.

3. Perl Script + Custom Stat

이를 극복하기 위하여 최종적으로 도입한 방법이 CustomStat.txt 파일을 만드는 것이다.
우리가 필요로 하는 stat.dat 결과는 lencod.exe에서 생성하는 것이다.
따라서 lencod C code 내부에 어딘가 stat.dat를 fprintf 해 주는 부분이 있다.
이를 매 encoding마다 별도의 파일에 출력하지 않고, 하나의 파일에 계속 append 하면, 일일이 여러 개 파일을 열어 볼 필요가 없다.
또한 excel에 일일이 입력이 귀찮으므로, excel에서 자동으로 읽을 수 있는 tab으로 분리하면 훨씬 편하다.

다음과 같은 코드를 추가하였다:

   FILE *fp = fopen( “CustomStats.txt”, “a” );

   fprintf( fp, “%s\t%d\t%6.2f\t%5.2f\t%2.3f\t%2.3f\n”,
    input->infile, // Filename
    absm(input->qp0), // QP
    stat->bitrate/1000, // Bitrate
    snr->snr_ya, // PSNR
    fI16Selection, // I16Selection
    fPercentageI16Skipped // EarlyTermination
    );

이와 같은 코드가 추가된 상태에서 Perl script를 수행하면

../IMAGES/parkrun_ter_720p.yuv 16 128794.95 45.65 0.111 58.219
../IMAGES/shields_ter_720p.yuv 16 88204.45 45.82 3.811 55.537
../IMAGES/stockholm_ter_720p.yuv 16 87674.95 45.73 8.589 52.459
../IMAGES/blue_sky_1920x1072.yuv 16 97491.12 47.34 47.846 36.483
../IMAGES/pedestrian_area_1920x1072.yuv 16 86616.49 46.87 17.506 41.591
../IMAGES/rush_hour_1920x1072.yuv 16 75639.1 46.74 26.155 34.994
../IMAGES/tractor_1920x1072.yuv 16 125658.59 46.83 5.165 -49.684
../IMAGES/parkrun_ter_720p.yuv 20 98964.88 41.7 0.158 56.513
../IMAGES/shields_ter_720p.yuv 20 59571.22 42.16 8.863 51.714

와 같이 CustomStat.txt 파일에 결과가 깔끔하게 정리된다.
이는 excel에서 한번에 쉽게 정리되며, 평균치를 바로 알 수 있다.

여기에 추가로, 두 가지 version을 비교하려면, 특정 수식에 데이터를 복사 하는 작업을 거치는데,
이도 하려고 하면, 더 쉽게 자동화 할 수 있을 것이다.
그렇다고 멋진 UI를 갖춘 시스템을 개발해서, 2개 lencod.exe만 지정하면, 모든 이미지에 대해 상세 수치와, 비교 그래프까지 만들어주는 프로그램을 만드는 것은 overkill이니… (사실 이래서 웬만한 영화에 나오는 멋진 UI들은 말이 안 된다;; )
자동화와 수작업, 그리고 실험량의 적절한 조화를 찾는 것이 중요하겠다.

Perl에 대해서 좀 더 공부할 가치가 있을 듯 :)

This entry was posted in Electrical Engineering. Bookmark the permalink.

5 Responses to Test Automation

  1. Lynn says:

    안녕하세요..
    H.264 encoder 관련해서 자료를 찾던 중에 우연히 들어오게 되었습니다..^^;

    이제 막 영상 압축에 대해서 공부를 시작한 완전 초보인데..사실 어디서 부터 시작을 해야할지 잘 모르겠습니다..
    최종적으로는 H.264라는 놈을 마음대로 주무를수 있을 만큼 실력을 쌓는게 목표인데..아직까지는 정신없이 휘둘리고 있습니다..^^;

    답답한 심정으로 여기저기 알아보고 있는 와중에 님의 블로그에 제가 앞으로 하고자 하는 공부에 대해서 써 놓으신 글이 있어서 그걸 보고 님께서 공부 하시면서 도움이 되었던 책이나 자료 또는 공부 방법 등에 대한 조언을 구하고자 이렇게 염치 불구하고..글을 남깁니다..^^;

    잠시동안만이라도 시간을 내주셔서 조언해주시면 정말 감사하겠습니다.

  2. tigrage says:

    안녕하세요 ^^

    저는 H.264 처음 접할 때 이 책을 봤습니다:
    http://www.vcodex.com/h264mpeg4/index.html
    한글판도 있고요,
    http://www.vcodex.com/h264.html
    책 저자의 사이트인데, H.264 기본적인 것에 대해 잘 설명되어 있는 것 같습니다.
    그 외에 http://iphome.hhi.de/suehring/tml/ 에 있는 JM을 다운 받아서, 실행 해 보고, 소스 코드를 분석해 보는 것도 좋을 것 같네요. JM은 H.264 encoder/decoder의 C 구현입니다.

    좋은 하루 보내시고, 건승하시길 바랍니다 :)

  3. Lymm says:

    안녕하세요..
    일전에 주신 답변 정말 감사합니다..^^

    다름이 아니라 전에 쓰신 글을 보니깐
    H.264의 Intra Prediction 부분을 하드웨어(VHDL? Verilog?)로 설계를 하신다는것을 본것 같은데..
    설계하실때 프레임 메모리는 어떻게 사용하고 계시는지 좀 궁금해서요..^^;
    H.264를 완전히 다 구현하려면 제 생각에는 상당한 프레임 메모리가 필요할 것 같은데..
    각 프레임별로 따로 메모리를 고려 하시는지, 아니면 타이밍에 따라서 공유를 하지는지 등..^^;
    프레임 메모리 처리를 어떻게 하신 상태에서 설계를 하시는지가 궁금해서 다시 문의 드립니다..
    꼭 좀 .. 답변 부탁드리겠습니다..^^;

  4. tigrage says:

    Intra Predictor 자체에는 다음 3가지 외부 메모리가 필요한 것으로 알고 있습니다:
    1. Source Image
    Read only로 소스 이미지 저장. 소스 이미지와 예측값의 차분을 encoding
    2. Upper Line
    예측할 때 상위 pixel이 필요한데, 상위 block은 시간상 한참 전에 예측되었으므로, 메모리에 보관
    3. Quantized Coefficients
    VLC에 전달할 Quantize 결과

    이렇게 3가지는 RAM 형식 (Addr, WE, DataIn, DataOut)으로 설계하고, 나머지는 register과 combinational logic으로 설계할 수 있을 것 같네요 :)

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>